@hydrofoil/talos 0.4.17 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @hydrofoil/talos
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 7f52095: Resources across multiple source directories are now merged in memory and saved as a whole (resolves #271)
8
+
3
9
  ## 0.4.17
4
10
 
5
11
  ### Patch Changes
@@ -1,9 +1,9 @@
1
1
  import { NamedNode } from 'rdf-js';
2
2
  import { StreamClientOptions } from 'sparql-http-client';
3
- declare type Options = StreamClientOptions & {
4
- api: string;
3
+ import type DatasetExt from 'rdf-ext/lib/Dataset';
4
+ declare type Bootstrap = StreamClientOptions & {
5
+ dataset: DatasetExt;
5
6
  apiUri: NamedNode;
6
- cwd: string;
7
7
  };
8
- export declare function bootstrap({ api, apiUri, cwd, ...options }: Options): Promise<void>;
8
+ export declare function bootstrap({ dataset, apiUri, ...options }: Bootstrap): Promise<void>;
9
9
  export {};
package/lib/bootstrap.js CHANGED
@@ -4,76 +4,45 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.bootstrap = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const walk_1 = __importDefault(require("@fcostarodrigo/walk"));
9
7
  const sparql_http_client_1 = __importDefault(require("sparql-http-client"));
10
- const rdf_ext_1 = __importDefault(require("rdf-ext"));
11
8
  const clownface_1 = __importDefault(require("clownface"));
12
9
  const store_1 = require("@hydrofoil/knossos/lib/store");
13
10
  const rdf_ns_builders_1 = require("@tpluscode/rdf-ns-builders");
14
- const term_map_1 = __importDefault(require("@rdfjs/term-map"));
15
- const fileStream_1 = require("./fileStream");
11
+ const is_graph_pointer_1 = require("is-graph-pointer");
12
+ const rdf_ext_1 = __importDefault(require("rdf-ext"));
16
13
  const log_1 = require("./log");
17
- const prefixHandler_1 = require("./prefixHandler");
18
- async function bootstrap({ api, apiUri, cwd, ...options }) {
14
+ const ns_1 = require("./ns");
15
+ async function bootstrap({ dataset, apiUri, ...options }) {
19
16
  const store = new store_1.ResourcePerGraphStore(new sparql_http_client_1.default(options));
20
- for await (const file of (0, walk_1.default)(cwd)) {
21
- const relative = path_1.default.relative(cwd, file);
22
- const resourcePath = path_1.default.relative(cwd, file)
23
- .replace(/\.[^.]+$/, '')
24
- .replace(/\/?index$/, '');
25
- const url = resourcePath === ''
26
- ? encodeURI(api)
27
- : encodeURI(`${api}/${resourcePath}`);
28
- const parserStream = (0, fileStream_1.getPatchedStream)(file, cwd, api, url);
29
- if (!parserStream) {
30
- continue;
31
- }
32
- const resourceOptions = {
33
- existingResource: 'overwrite',
34
- };
35
- parserStream.on('prefix', (0, prefixHandler_1.optionsFromPrefixes)(resourceOptions));
36
- const graphs = new term_map_1.default();
37
- try {
38
- for await (const { subject, predicate, object, graph } of parserStream) {
39
- let dataset = graphs.get(graph);
40
- if (!dataset) {
41
- dataset = rdf_ext_1.default.dataset();
42
- graphs.set(graph, dataset);
43
- }
44
- dataset.add(rdf_ext_1.default.quad(subject, predicate, object));
45
- }
46
- }
47
- catch (e) {
48
- (0, log_1.log)('Failed to parse %s: %s', relative, e.message);
17
+ const graph = (0, clownface_1.default)({ dataset, graph: ns_1.talosNs.resources });
18
+ const resources = graph.has(ns_1.talosNs.action);
19
+ for (const resource of resources.toArray().filter(is_graph_pointer_1.isNamedNode)) {
20
+ const resourceData = dataset.match(null, null, null, resource.term)
21
+ .map(({ subject, predicate, object }) => rdf_ext_1.default.quad(subject, predicate, object));
22
+ const pointer = (0, clownface_1.default)({ dataset: resourceData })
23
+ .namedNode(resource)
24
+ .addOut(rdf_ns_builders_1.hydra.apiDocumentation, apiUri);
25
+ const action = resource.out(ns_1.talosNs.action).value;
26
+ const exists = await store.exists(pointer.term);
27
+ if (exists && action === 'skip') {
28
+ (0, log_1.log)(`Skipping resource ${resource}`);
49
29
  continue;
50
30
  }
51
- for (const [graph, dataset] of graphs) {
52
- const resource = graph.termType === 'DefaultGraph' ? url : graph.value;
53
- const pointer = (0, clownface_1.default)({ dataset })
54
- .namedNode(resource)
55
- .addOut(rdf_ns_builders_1.hydra.apiDocumentation, apiUri);
56
- const exists = await store.exists(pointer.term);
57
- if (exists && resourceOptions.existingResource === 'skip') {
58
- (0, log_1.log)(`Skipping resource ${resource}`);
59
- continue;
60
- }
61
- if (exists) {
62
- if (resourceOptions.existingResource === 'overwrite') {
63
- (0, log_1.log)(`Replacing resource ${resource}`);
64
- }
65
- else {
66
- (0, log_1.log)(`Merging existing resource ${resource}`);
67
- const current = await store.load(pointer.term);
68
- pointer.dataset.addAll(current.dataset);
69
- }
31
+ if (exists) {
32
+ if (action === 'overwrite') {
33
+ (0, log_1.log)(`Replacing resource ${resource}`);
70
34
  }
71
35
  else {
72
- (0, log_1.log)(`Creating resource ${resource}`);
36
+ (0, log_1.log)(`Merging existing resource ${resource}`);
37
+ const current = await store.load(pointer.term);
38
+ pointer.dataset.addAll(current.dataset);
73
39
  }
74
- await store.save(pointer);
75
40
  }
41
+ else {
42
+ (0, log_1.log)(`Creating resource ${resource}`);
43
+ }
44
+ await store.save(pointer);
76
45
  }
77
46
  }
78
47
  exports.bootstrap = bootstrap;
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF1QjtBQUV2QiwrREFBc0M7QUFDdEMsNEVBQXNFO0FBQ3RFLHNEQUEwQjtBQUMxQiwwREFBaUM7QUFDakMsd0RBQW9FO0FBQ3BFLGdFQUFrRDtBQUNsRCwrREFBcUM7QUFFckMsNkNBQStDO0FBQy9DLCtCQUEyQjtBQUMzQixtREFBcUQ7QUFZOUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFXO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLElBQUksNkJBQXFCLENBQUMsSUFBSSw0QkFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFFbEUsSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLElBQUksSUFBQSxjQUFJLEVBQUMsR0FBRyxDQUFDLEVBQUU7UUFDbEMsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsTUFBTSxZQUFZLEdBQUcsY0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO2FBQzFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFM0IsTUFBTSxHQUFHLEdBQUcsWUFBWSxLQUFLLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDaEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRXZDLE1BQU0sWUFBWSxHQUFHLElBQUEsNkJBQWdCLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDMUQsSUFBSSxDQUFD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
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDRFQUFzRTtBQUV0RSwwREFBaUM7QUFDakMsd0RBQW9FO0FBQ3BFLGdFQUFrRDtBQUNsRCx1REFBOEM7QUFDOUMsc0RBQTBCO0FBQzFCLCtCQUEyQjtBQUMzQiw2QkFBOEI7QUFPdkIsS0FBSyxVQUFVLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQWE7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSw2QkFBcUIsQ0FBQyxJQUFJLDRCQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUVsRSxNQUFNLEtBQUssR0FBRyxJQUFBLG1CQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQzlELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyw4QkFBVyxDQUFDLEVBQUU7UUFDOUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDO2FBQ2hFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsaUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sT0FBTyxHQUFHLElBQUEsbUJBQVMsRUFBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQzthQUNqRCxTQUFTLENBQUMsUUFBUSxDQUFDO2FBQ25CLE1BQU0sQ0FBQyx1QkFBSyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRXpDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUNqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9DLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDL0IsSUFBQSxTQUFHLEVBQUMscUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDcEMsU0FBUTtTQUNUO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQzFCLElBQUEsU0FBRyxFQUFDLHNCQUFzQixRQUFRLEVBQUUsQ0FBQyxDQUFBO2FBQ3RDO2lCQUFNO2dCQUNMLElBQUEsU0FBRyxFQUFDLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFBO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM5QyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDeEM7U0FDRjthQUFNO1lBQ0wsSUFBQSxTQUFHLEVBQUMscUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUE7U0FDckM7UUFFRCxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDMUI7QUFDSCxDQUFDO0FBakNELDhCQWlDQyJ9
@@ -1,61 +1,25 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
6
  exports.put = void 0;
30
- const path_1 = __importDefault(require("path"));
31
- const fs = __importStar(require("fs"));
32
7
  const rdf_ext_1 = __importDefault(require("rdf-ext"));
33
8
  const bootstrap_1 = require("../bootstrap");
34
9
  const deleteApi_1 = require("../deleteApi");
35
- const log_1 = require("../log");
10
+ const resources_1 = require("../resources");
36
11
  async function put(directories, { token, api, endpoint, updateEndpoint, user, password, apiPath = '/api' }) {
37
12
  const apiUri = rdf_ext_1.default.namedNode(`${api}${apiPath}`);
38
- for (const dir of directories) {
39
- const cwd = path_1.default.resolve(process.cwd(), dir);
40
- if (!fs.existsSync(cwd)) {
41
- (0, log_1.log)('Skipping path %s which does not exist', dir);
42
- continue;
43
- }
44
- if (!fs.statSync(cwd).isDirectory()) {
45
- (0, log_1.log)('Skipping path %s which is not a directory', dir);
46
- continue;
47
- }
48
- await (0, bootstrap_1.bootstrap)({
49
- api,
50
- apiUri,
51
- cwd,
52
- endpointUrl: endpoint,
53
- updateUrl: updateEndpoint || endpoint,
54
- user,
55
- password,
56
- });
57
- }
13
+ const dataset = await (0, resources_1.fromDirectories)(directories, api);
14
+ await (0, bootstrap_1.bootstrap)({
15
+ dataset,
16
+ apiUri,
17
+ endpointUrl: endpoint,
18
+ updateUrl: updateEndpoint || endpoint,
19
+ user,
20
+ password,
21
+ });
58
22
  await (0, deleteApi_1.deleteApi)({ apiUri, token });
59
23
  }
60
24
  exports.put = put;
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXVCO0FBQ3ZCLHVDQUF3QjtBQUN4QixzREFBMEI7QUFDMUIsNENBQXdDO0FBQ3hDLDRDQUF3QztBQUN4QyxnQ0FBNEI7QUFRckIsS0FBSyxVQUFVLEdBQUcsQ0FBQyxXQUFxQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLE1BQU0sRUFBTztJQUM5SCxNQUFNLE1BQU0sR0FBRyxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFO1FBQzdCLE1BQU0sR0FBRyxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRTVDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUEsU0FBRyxFQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQ2pELFNBQVE7U0FDVDtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25DLElBQUEsU0FBRyxFQUFDLDJDQUEyQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQ3JELFNBQVE7U0FDVDtRQUVELE1BQU0sSUFBQSxxQkFBUyxFQUFDO1lBQ2QsR0FBRztZQUNILE1BQU07WUFDTixHQUFHO1lBQ0gsV0FBVyxFQUFFLFFBQVE7WUFDckIsU0FBUyxFQUFFLGNBQWMsSUFBSSxRQUFRO1lBQ3JDLElBQUk7WUFDSixRQUFRO1NBQ1QsQ0FBQyxDQUFBO0tBQ0g7SUFFRCxNQUFNLElBQUEscUJBQVMsRUFBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUExQkQsa0JBMEJDIn0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUEwQjtBQUMxQiw0Q0FBd0M7QUFDeEMsNENBQXdDO0FBQ3hDLDRDQUE4QztBQVF2QyxLQUFLLFVBQVUsR0FBRyxDQUFDLFdBQXFCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUcsTUFBTSxFQUFPO0lBQzlILE1BQU0sTUFBTSxHQUFHLGlCQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFFakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLDJCQUFlLEVBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBRXZELE1BQU0sSUFBQSxxQkFBUyxFQUFDO1FBQ2QsT0FBTztRQUNQLE1BQU07UUFDTixXQUFXLEVBQUUsUUFBUTtRQUNyQixTQUFTLEVBQUUsY0FBYyxJQUFJLFFBQVE7UUFDckMsSUFBSTtRQUNKLFFBQVE7S0FDVCxDQUFDLENBQUE7SUFFRixNQUFNLElBQUEscUJBQVMsRUFBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFmRCxrQkFlQyJ9
package/lib/log.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- import debug from 'debug';
2
- export declare const log: debug.Debugger;
1
+ import Debugger from 'debug';
2
+ export declare const log: Debugger.Debugger;
3
+ export declare const debug: Debugger.Debugger;
package/lib/log.js CHANGED
@@ -3,8 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.log = void 0;
6
+ exports.debug = exports.log = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
8
  exports.log = (0, debug_1.default)('talos');
9
9
  exports.log.enabled = true;
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUF5QjtBQUVaLFFBQUEsR0FBRyxHQUFHLElBQUEsZUFBSyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ2pDLFdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBIn0=
10
+ exports.debug = exports.log.extend('debug');
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUE0QjtBQUVmLFFBQUEsR0FBRyxHQUFHLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3BDLFdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO0FBRUwsUUFBQSxLQUFLLEdBQUcsV0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQSJ9
package/lib/ns.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /// <reference types="rdfjs__namespace" />
2
+ import namespace from '@rdfjs/namespace';
3
+ declare type TalosTerms = 'resources' | 'action' | 'default' | 'overwrite' | 'skip' | 'merge' | 'environmentRepresentation' | 'replace';
4
+ export declare const talosNs: namespace.NamespaceBuilder<TalosTerms>;
5
+ export {};
package/lib/ns.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.talosNs = void 0;
7
+ const namespace_1 = __importDefault(require("@rdfjs/namespace"));
8
+ exports.talosNs = (0, namespace_1.default)('urn:talos:');
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpRUFBd0M7QUFZM0IsUUFBQSxPQUFPLEdBQUcsSUFBQSxtQkFBUyxFQUFhLFlBQVksQ0FBQyxDQUFBIn0=
@@ -0,0 +1,2 @@
1
+ import type DatasetExt from 'rdf-ext/lib/Dataset';
2
+ export declare function fromDirectories(directories: string[], api: string): Promise<DatasetExt>;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fromDirectories = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const walk_1 = __importDefault(require("@fcostarodrigo/walk"));
10
+ const rdf_ext_1 = __importDefault(require("rdf-ext"));
11
+ const term_set_1 = __importDefault(require("@rdfjs/term-set"));
12
+ const clownface_1 = __importDefault(require("clownface"));
13
+ const rdf_dataset_ext_1 = require("rdf-dataset-ext");
14
+ const log_1 = require("./log");
15
+ const fileStream_1 = require("./fileStream");
16
+ const prefixHandler_1 = require("./prefixHandler");
17
+ const ns_1 = require("./ns");
18
+ async function fromDirectories(directories, api) {
19
+ const validDirs = directories.filter(isValidDir);
20
+ return validDirs.reduce(toGraphs(api), Promise.resolve(rdf_ext_1.default.dataset()));
21
+ }
22
+ exports.fromDirectories = fromDirectories;
23
+ function toGraphs(api) {
24
+ return async function (previousPromise, dir) {
25
+ let previous = await previousPromise;
26
+ const dataset = rdf_ext_1.default.dataset();
27
+ (0, log_1.debug)('Processing dir %s', dir);
28
+ for await (const file of (0, walk_1.default)(dir)) {
29
+ const relative = path_1.default.relative(dir, file);
30
+ const resourcePath = path_1.default.relative(dir, file)
31
+ .replace(/\.[^.]+$/, '')
32
+ .replace(/\/?index$/, '');
33
+ const url = resourcePath === ''
34
+ ? encodeURI(api)
35
+ : encodeURI(`${api}/${resourcePath}`);
36
+ const parserStream = (0, fileStream_1.getPatchedStream)(file, dir, api, url);
37
+ if (!parserStream) {
38
+ continue;
39
+ }
40
+ (0, log_1.debug)('Parsing %s', relative);
41
+ const parsedResourceOptions = {};
42
+ parserStream.on('prefix', (0, prefixHandler_1.optionsFromPrefixes)(parsedResourceOptions));
43
+ const resources = new term_set_1.default();
44
+ const resourceOptions = (0, clownface_1.default)({ dataset: previous, graph: ns_1.talosNs.resources });
45
+ try {
46
+ for await (const { subject, predicate, object, ...quad } of parserStream) {
47
+ const graph = quad.graph.equals(rdf_ext_1.default.defaultGraph()) ? rdf_ext_1.default.namedNode(url) : quad.graph;
48
+ if (!resources.has(graph)) {
49
+ (0, log_1.debug)('Parsed resource %s', graph.value);
50
+ }
51
+ resources.add(graph);
52
+ dataset.add(rdf_ext_1.default.quad(subject, predicate, object, graph));
53
+ }
54
+ }
55
+ catch (e) {
56
+ (0, log_1.log)('Failed to parse %s: %s', relative, e.message);
57
+ }
58
+ resources.forEach(id => {
59
+ const action = parsedResourceOptions.existingResource || 'default';
60
+ const environmentRepresentation = parsedResourceOptions.environmentRepresentation || 'default';
61
+ const options = resourceOptions.node(id);
62
+ options
63
+ .deleteOut(ns_1.talosNs.action, ns_1.talosNs.default)
64
+ .addOut(ns_1.talosNs.action, (0, ns_1.talosNs)(action))
65
+ .deleteOut(ns_1.talosNs.environmentRepresentation, ns_1.talosNs.default)
66
+ .addOut(ns_1.talosNs.environmentRepresentation, (0, ns_1.talosNs)(environmentRepresentation));
67
+ if (options.has(ns_1.talosNs.environmentRepresentation, ns_1.talosNs.replace).terms.length) {
68
+ previous = (0, rdf_dataset_ext_1.deleteMatch)(previous, undefined, undefined, undefined, id);
69
+ }
70
+ });
71
+ }
72
+ previous.addAll(dataset);
73
+ return previous;
74
+ };
75
+ }
76
+ function isValidDir(dir) {
77
+ if (!fs_1.default.existsSync(dir)) {
78
+ (0, log_1.log)('Skipping path %s which does not exist', dir);
79
+ return false;
80
+ }
81
+ if (!fs_1.default.statSync(dir).isDirectory()) {
82
+ (0, log_1.log)('Skipping path %s which is not a directory', dir);
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF1QjtBQUN2Qiw0Q0FBbUI7QUFFbkIsK0RBQXNDO0FBQ3RDLHNEQUEwQjtBQUUxQiwrREFBcUM7QUFDckMsMERBQWlDO0FBQ2pDLHFEQUE2QztBQUM3QywrQkFBa0M7QUFDbEMsNkNBQStDO0FBQy9DLG1EQUFxRDtBQUNyRCw2QkFBOEI7QUFPdkIsS0FBSyxVQUFVLGVBQWUsQ0FBQyxXQUFxQixFQUFFLEdBQVc7SUFDdEUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNoRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDekUsQ0FBQztBQUhELDBDQUdDO0FBRUQsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixPQUFPLEtBQUssV0FBVyxlQUFvQyxFQUFFLEdBQVc7UUFDdEUsSUFBSSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUE7UUFDcEMsTUFBTSxPQUFPLEdBQUcsaUJBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUU5QixJQUFBLFdBQUssRUFBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUUvQixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxJQUFBLGNBQUksRUFBQyxHQUFHLENBQUMsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN6QyxNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7aUJBQzFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hydrofoil/talos",
3
- "version": "0.4.17",
3
+ "version": "0.5.0",
4
4
  "main": "index.js",
5
5
  "bin": {
6
6
  "talos": "bin/talos.js"
@@ -23,7 +23,9 @@
23
23
  "@hydrofoil/knossos": "^0.9.7",
24
24
  "@hydrofoil/vocabularies": "^0.3",
25
25
  "@rdfjs/formats-common": "^2.2.0",
26
+ "@rdfjs/namespace": "^1.1.0",
26
27
  "@rdfjs/term-map": "^1",
28
+ "@rdfjs/term-set": "^1",
27
29
  "@tpluscode/rdf-ns-builders": "^2.0.0",
28
30
  "@tpluscode/rdf-string": "^0.2.26",
29
31
  "@tpluscode/sparql-builder": "^0.3.23",
@@ -32,14 +34,15 @@
32
34
  "commander": "^9.4.0",
33
35
  "debug": "^4.3.4",
34
36
  "is-absolute-url": "^3",
37
+ "is-graph-pointer": "^1.2.2",
35
38
  "mime-types": "^2.1.35",
36
39
  "node-fetch": "^2.6.7",
40
+ "rdf-dataset-ext": "^1.0.1",
37
41
  "rdf-ext": "^1.3.5",
38
42
  "replacestream": "^4.0.3",
39
43
  "sparql-http-client": "^2.4.1"
40
44
  },
41
45
  "devDependencies": {
42
- "@rdfjs/namespace": "^1.1.0",
43
46
  "@types/mime-types": "^2.1.1",
44
47
  "@types/replacestream": "^4.0.1",
45
48
  "@wikibus/vocabularies": "^0.2.2",
@@ -47,6 +50,7 @@
47
50
  "get-stream": "^5",
48
51
  "into-stream": "^6.0.0",
49
52
  "mocha": "^10.0.0",
53
+ "rdf-dataset-ext": "^1.0.1",
50
54
  "rdf-ext": "^1.3.5",
51
55
  "sinon": "^14"
52
56
  }