From a6db734e848af8139f44d4856a3c491881e20329 Mon Sep 17 00:00:00 2001 From: Miel Vander Sande Date: Tue, 9 Apr 2019 16:37:40 +0200 Subject: [PATCH 1/4] Added summary datasource --- lib/datasources/SummaryDatasource.js | 119 +++++++++++++++++++++++++++ package-lock.json | 19 +++++ package.json | 1 + 3 files changed, 139 insertions(+) create mode 100644 lib/datasources/SummaryDatasource.js diff --git a/lib/datasources/SummaryDatasource.js b/lib/datasources/SummaryDatasource.js new file mode 100644 index 00000000..443f9642 --- /dev/null +++ b/lib/datasources/SummaryDatasource.js @@ -0,0 +1,119 @@ +var Datasource = require('./Datasource'), + N3 = require('n3'), + path = require('path'), + fs = require('fs'), + Bloem = require('bloem').Bloem; + +var ACCEPT = 'text/turtle;q=1.0,application/n-triples;q=0.7,text/n3;q=0.6'; + +var DCT = 'http://purl.org/dc/terms/', + AMF = 'http://semweb.mmlab.be/ns/membership#', + DS = 'http://semweb.mmlab.be/ns/summaries#'; + +// Creates a new SummaryDatasource +function SummaryDatasource(options) { + if (!(this instanceof SummaryDatasource)) + return new SummaryDatasource(options); + Datasource.call(this, options); + + // Settings for data summaries + this._summariesFolder = options.dir || '../../summaries'; +} +Datasource.extend(SummaryDatasource, ['triplePattern', 'limit', 'offset']); + +// Prepares the datasource for querying +SummaryDatasource.prototype._initialize = function (done) { + var tripleStore = this._tripleStore = new N3.Store(); + var parser = new N3.Parser(); + var filters = this._filters = {}; + var self = this; + + fs.readdir(this._summariesFolder, function (err, items) { + if (err) { + done(err); + return; + } + + // Store every summary in the store + items.forEach(function (summaryFile) { + var document = self._fetch({ url: path.join(self._summariesFolder, summaryFile), headers: { accept: ACCEPT } }, done); + // N3Parser._resetBlankNodeIds(); + parser.parse(document, function (error, triple) { + if (error) { + done(error); + return; + } + + if (triple) + tripleStore.addTriple(triple.subject, triple.predicate, triple.object, summaryFile); + else { + // Create AMFs + self._storeFilters(); + done(); + } + }); + }); + }); +}; + +SummaryDatasource.prototype._storeFilters = function () { + var filterQuads = this._tripleStore.find(null, DS + 'objFilter', null); + + filterQuads.forEach(function (quad) { + var bitsString = this._tripleStore.find(quad.object, AMF + 'bits', null)[0].object; + var bits = parseInt(N3.Util.getLiteralValue(bitsString), 10); + + var hashesString = this._tripleStore.find(quad.object, AMF + 'hashes', null)[0].object; + var hashes = parseInt(N3.Util.getLiteralValue(hashesString), 10); + + // Decode filter + var filterString = this._tripleStore.find(quad.object, AMF + 'filter', null)[0].object; + var filter = Buffer.from(N3.Util.getLiteralValue(filterString), 'base64'); + + // Find predicate + var predicate = this._tripleStore.find(quad.subject, DS + 'predicate', null, quad.graph)[0].object; + + this._filters[predicate] = this._filters[predicate] || {}; // create entry for predicate if not exists + this._filters[predicate][quad.graph] = new Bloem(bits, hashes, filter); // add filter for the summary + }); +}; + +SummaryDatasource.prototype._findSources = function (term, predicate) { + var filters = predicate ? [predicate] : Object.keys(this._filters); + var sources = []; + for (var i = 0; i < filters.length; i++) { + var filter = this._filters[filters[i]]; + for (var source in filter) { + if (filter[source].has(Buffer.from(term)) && sources.indexOf(source) < 0) + sources.push(source); + } + } + return sources; +}; + +// Writes the results of the query to the given triple stream +SummaryDatasource.prototype._executeQuery = function (query, destination) { + var offset = query.offset || 0, limit = query.limit || Infinity, + triples = this._tripleStore.findByIRI(query.subject, query.predicate, query.object); + + if (query.subject && query.predicate === DCT + 'isPartOf') { + triples = this._findSources(query.subject).map(function (source) { + return { + subject: query.subject, + predicate: query.predicate, + object: source, + }; + }); + } + + // Send the metadata + destination.setProperty('metadata', { totalCount: triples.length, hasExactCount: true }); + // Send the requested subset of triples + for (var i = offset, l = Math.min(offset + limit, triples.length); i < l; i++) + destination._push(triples[i]); + destination.close(); +}; + + + +module.exports = SummaryDatasource; diff --git a/package-lock.json b/package-lock.json index 11d466df..74288e66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -174,6 +174,20 @@ "tweetnacl": "^0.14.3" } }, + "bitbuffer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/bitbuffer/-/bitbuffer-0.1.3.tgz", + "integrity": "sha1-eA/rEpfKrw+snkjPq5Rtbv0r05c=" + }, + "bloem": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/bloem/-/bloem-0.2.4.tgz", + "integrity": "sha1-PCnr7WibOE8oME+nvVbGAm5tWHk=", + "requires": { + "bitbuffer": "0.1.x", + "fnv": "0.1.x" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -692,6 +706,11 @@ "write": "^0.2.1" } }, + "fnv": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fnv/-/fnv-0.1.3.tgz", + "integrity": "sha1-XbMLg+l+eupEjLNhOL2TaXCocA0=" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", diff --git a/package.json b/package.json index cc795bb5..0fa655d5 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "asynciterator": "^1.1.0", + "bloem": "^0.2.4", "forwarded-parse": "^2.0.0", "jsonld": "^0.4.11", "lodash": "^2.4.2", From 7c5845b8107f0e607eaf5e3009d156445a9b3a0f Mon Sep 17 00:00:00 2001 From: Miel Vander Sande Date: Tue, 9 Apr 2019 16:41:16 +0200 Subject: [PATCH 2/4] Fixed mistakes --- lib/datasources/SummaryDatasource.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/datasources/SummaryDatasource.js b/lib/datasources/SummaryDatasource.js index 443f9642..4f61e903 100644 --- a/lib/datasources/SummaryDatasource.js +++ b/lib/datasources/SummaryDatasource.js @@ -25,7 +25,6 @@ Datasource.extend(SummaryDatasource, ['triplePattern', 'limit', 'offset']); SummaryDatasource.prototype._initialize = function (done) { var tripleStore = this._tripleStore = new N3.Store(); var parser = new N3.Parser(); - var filters = this._filters = {}; var self = this; fs.readdir(this._summariesFolder, function (err, items) { @@ -57,24 +56,27 @@ SummaryDatasource.prototype._initialize = function (done) { }; SummaryDatasource.prototype._storeFilters = function () { - var filterQuads = this._tripleStore.find(null, DS + 'objFilter', null); + var filters = this._filters = {}; + var tripleStore = this._tripleStore; + + var filterQuads = tripleStore.find(null, DS + 'objFilter', null); filterQuads.forEach(function (quad) { - var bitsString = this._tripleStore.find(quad.object, AMF + 'bits', null)[0].object; + var bitsString = tripleStore.find(quad.object, AMF + 'bits', null)[0].object; var bits = parseInt(N3.Util.getLiteralValue(bitsString), 10); - var hashesString = this._tripleStore.find(quad.object, AMF + 'hashes', null)[0].object; + var hashesString = tripleStore.find(quad.object, AMF + 'hashes', null)[0].object; var hashes = parseInt(N3.Util.getLiteralValue(hashesString), 10); // Decode filter - var filterString = this._tripleStore.find(quad.object, AMF + 'filter', null)[0].object; + var filterString = tripleStore.find(quad.object, AMF + 'filter', null)[0].object; var filter = Buffer.from(N3.Util.getLiteralValue(filterString), 'base64'); // Find predicate - var predicate = this._tripleStore.find(quad.subject, DS + 'predicate', null, quad.graph)[0].object; + var predicate = tripleStore.find(quad.subject, DS + 'predicate', null, quad.graph)[0].object; - this._filters[predicate] = this._filters[predicate] || {}; // create entry for predicate if not exists - this._filters[predicate][quad.graph] = new Bloem(bits, hashes, filter); // add filter for the summary + filters[predicate] = filters[predicate] || {}; // create entry for predicate if not exists + filters[predicate][quad.graph] = new Bloem(bits, hashes, filter); // add filter for the summary }); }; From b4584c44b8850ad3af83e3972dd6f82ea191f916 Mon Sep 17 00:00:00 2001 From: Miel Vander Sande Date: Thu, 10 Oct 2019 18:17:04 +0200 Subject: [PATCH 3/4] Added feedback mechs --- lib/controllers/SummaryController.js | 2 + lib/datasources/SummaryDatasource.js | 123 ++++++++++++++++++--------- package-lock.json | 111 ++++++++++++++++++++++++ package.json | 1 + 4 files changed, 195 insertions(+), 42 deletions(-) diff --git a/lib/controllers/SummaryController.js b/lib/controllers/SummaryController.js index 149e00ba..6b12e6e4 100644 --- a/lib/controllers/SummaryController.js +++ b/lib/controllers/SummaryController.js @@ -18,6 +18,8 @@ function SummaryController(options) { var summaries = options.summaries || {}; this._summariesFolder = path.join(__dirname, summaries.dir || '../../summaries'); + console.log('The summary folder is ' + this._summariesFolder); + // Set up path matching this._summariesPath = summaries.path || '/summaries/', this._matcher = new RegExp('^' + Util.toRegExp(this._summariesPath) + '(.+)$'); diff --git a/lib/datasources/SummaryDatasource.js b/lib/datasources/SummaryDatasource.js index 4f61e903..f4c409f5 100644 --- a/lib/datasources/SummaryDatasource.js +++ b/lib/datasources/SummaryDatasource.js @@ -2,11 +2,13 @@ var Datasource = require('./Datasource'), N3 = require('n3'), path = require('path'), fs = require('fs'), - Bloem = require('bloem').Bloem; + Bloem = require('bloem').Bloem, + chokidar = require('chokidar'); var ACCEPT = 'text/turtle;q=1.0,application/n-triples;q=0.7,text/n3;q=0.6'; -var DCT = 'http://purl.org/dc/terms/', +var RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + DCT = 'http://purl.org/dc/terms/', AMF = 'http://semweb.mmlab.be/ns/membership#', DS = 'http://semweb.mmlab.be/ns/summaries#'; @@ -17,66 +19,103 @@ function SummaryDatasource(options) { Datasource.call(this, options); // Settings for data summaries - this._summariesFolder = options.dir || '../../summaries'; + this._summariesFolder = (options.dir && path.isAbsolute(options.dir)) ? options.dir : path.join(__dirname, options.dir || '../../summaries'); } Datasource.extend(SummaryDatasource, ['triplePattern', 'limit', 'offset']); // Prepares the datasource for querying SummaryDatasource.prototype._initialize = function (done) { - var tripleStore = this._tripleStore = new N3.Store(); + this._tripleStore = new N3.Store(); + // var parser = new N3.Parser(); + // var self = this; + + // If summaryDir does not exist, create it + if (!fs.existsSync(this._summariesFolder)) { + fs.mkdirSync(this._summariesFolder, { recursive: true }); + } + + // Initialize watcher. + const watcher = chokidar.watch(this._summariesFolder, { + ignored: /(^|[\/\\])\../, + persistent: true + }); + + console.log(`Watching ${this._summariesFolder}`) + watcher.on('add', (summaryFile) => this._storeFile(summaryFile, err => console.log(err))); + done(); +}; + +SummaryDatasource.prototype._storeFile = function (summaryFile, callback) { + console.log(`Adding ${summaryFile} to store`) var parser = new N3.Parser(); + + var document = this._fetch({ url: summaryFile, headers: { accept: ACCEPT } }, callback); + var tripleStore = this._tripleStore; var self = this; + // N3Parser._resetBlankNodeIds(); - fs.readdir(this._summariesFolder, function (err, items) { - if (err) { - done(err); + var graph = decodeURIComponent(summaryFile); + parser.parse(document, function (error, triple) { + if (error) { + callback && callback(error); return; } - - // Store every summary in the store - items.forEach(function (summaryFile) { - var document = self._fetch({ url: path.join(self._summariesFolder, summaryFile), headers: { accept: ACCEPT } }, done); - // N3Parser._resetBlankNodeIds(); - parser.parse(document, function (error, triple) { - if (error) { - done(error); - return; - } - - if (triple) - tripleStore.addTriple(triple.subject, triple.predicate, triple.object, summaryFile); - else { - // Create AMFs - self._storeFilters(); - done(); - } - }); - }); + + if (triple) + tripleStore.addTriple(triple.subject, triple.predicate, triple.object, graph); + else { + tripleStore.addTriple(graph, RDF + 'type' , DS + 'Summary', graph); + // Create AMFs + console.log(`Storing filters of ${graph}`) + self._storeFilter(graph); + callback && callback(null); + } }); -}; +} -SummaryDatasource.prototype._storeFilters = function () { +SummaryDatasource.prototype._storeFilter = function (graph) { var filters = this._filters = {}; var tripleStore = this._tripleStore; - var filterQuads = tripleStore.find(null, DS + 'objFilter', null); - + var filterQuads = tripleStore.find(null, DS + 'objFilter', null, graph); + console.log(`Found ${filterQuads.length} filters for ${graph}`) filterQuads.forEach(function (quad) { - var bitsString = tripleStore.find(quad.object, AMF + 'bits', null)[0].object; - var bits = parseInt(N3.Util.getLiteralValue(bitsString), 10); + try { + var bitsMatches = tripleStore.find(quad.object, AMF + 'bits', null, graph); + + if (bitsMatches.length === 0) return; + + var bitsString = bitsMatches[0].object; + var bits = parseInt(N3.Util.getLiteralValue(bitsString), 10); + + var hashesMatches = tripleStore.find(quad.object, AMF + 'hashes', null, graph); + + if (hashesMatches.length === 0) return; - var hashesString = tripleStore.find(quad.object, AMF + 'hashes', null)[0].object; - var hashes = parseInt(N3.Util.getLiteralValue(hashesString), 10); + var hashesString = hashesMatches[0].object; + var hashes = parseInt(N3.Util.getLiteralValue(hashesString), 10); - // Decode filter - var filterString = tripleStore.find(quad.object, AMF + 'filter', null)[0].object; - var filter = Buffer.from(N3.Util.getLiteralValue(filterString), 'base64'); + // Decode filter + var filterMatches = tripleStore.find(quad.object, AMF + 'filter', null, graph); - // Find predicate - var predicate = tripleStore.find(quad.subject, DS + 'predicate', null, quad.graph)[0].object; + if (filterMatches.length === 0) return; - filters[predicate] = filters[predicate] || {}; // create entry for predicate if not exists - filters[predicate][quad.graph] = new Bloem(bits, hashes, filter); // add filter for the summary + var filterString = filterMatches[0].object; + var filter = Buffer.from(N3.Util.getLiteralValue(filterString), 'base64'); + + // Find predicate + var predicateMatches = tripleStore.find(quad.subject, DS + 'predicate', null, quad.graph); + + if (predicateMatches.length === 0) return; + + var predicate = predicateMatches[0].object; + + filters[predicate] = filters[predicate] || {}; // create entry for predicate if not exists + filters[predicate][quad.graph] = new Bloem(bits, hashes, filter); // add filter for the summary + } catch (er) { + console.log(er) + console.log(filterMatches) + } }); }; diff --git a/package-lock.json b/package-lock.json index 74288e66..dbb9dd2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,6 +71,15 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "anymatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", + "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -174,6 +183,11 @@ "tweetnacl": "^0.14.3" } }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, "bitbuffer": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/bitbuffer/-/bitbuffer-0.1.3.tgz", @@ -198,6 +212,14 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -254,6 +276,21 @@ "supports-color": "^2.0.0" } }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -694,6 +731,14 @@ "object-assign": "^4.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -752,6 +797,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "optional": true + }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -789,6 +840,14 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -953,6 +1012,19 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -962,6 +1034,14 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", @@ -981,6 +1061,11 @@ "xtend": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -1283,6 +1368,11 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -1370,6 +1460,11 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -1487,6 +1582,14 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", + "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "requires": { + "picomatch": "^2.0.4" + } + }, "readline2": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", @@ -1890,6 +1993,14 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", diff --git a/package.json b/package.json index 0fa655d5..504e5c64 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dependencies": { "asynciterator": "^1.1.0", "bloem": "^0.2.4", + "chokidar": "^3.0.2", "forwarded-parse": "^2.0.0", "jsonld": "^0.4.11", "lodash": "^2.4.2", From 73b457e42c8f501634f3b0ad5087882bc761eb4b Mon Sep 17 00:00:00 2001 From: Miel Vander Sande Date: Thu, 10 Oct 2019 18:17:23 +0200 Subject: [PATCH 4/4] Added feedback mechs --- lib/datasources/SummaryDatasource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/datasources/SummaryDatasource.js b/lib/datasources/SummaryDatasource.js index f4c409f5..3fd8c6e9 100644 --- a/lib/datasources/SummaryDatasource.js +++ b/lib/datasources/SummaryDatasource.js @@ -35,7 +35,7 @@ SummaryDatasource.prototype._initialize = function (done) { } // Initialize watcher. - const watcher = chokidar.watch(this._summariesFolder, { + var watcher = chokidar.watch(this._summariesFolder, { ignored: /(^|[\/\\])\../, persistent: true });