@_linked/core 1.0.0 → 1.2.0-next.20260302120536

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.
Files changed (187) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +321 -43
  3. package/lib/cjs/index.js +4 -0
  4. package/lib/cjs/index.js.map +1 -1
  5. package/lib/cjs/interfaces/IQuadStore.d.ts +19 -7
  6. package/lib/cjs/queries/CreateQuery.d.ts +7 -8
  7. package/lib/cjs/queries/CreateQuery.js +4 -4
  8. package/lib/cjs/queries/CreateQuery.js.map +1 -1
  9. package/lib/cjs/queries/DeleteQuery.d.ts +7 -8
  10. package/lib/cjs/queries/DeleteQuery.js +4 -4
  11. package/lib/cjs/queries/DeleteQuery.js.map +1 -1
  12. package/lib/cjs/queries/IRAliasScope.d.ts +20 -0
  13. package/lib/cjs/queries/IRAliasScope.js +52 -0
  14. package/lib/cjs/queries/IRAliasScope.js.map +1 -0
  15. package/lib/cjs/queries/IRCanonicalize.d.ts +36 -0
  16. package/lib/cjs/queries/IRCanonicalize.js +121 -0
  17. package/lib/cjs/queries/IRCanonicalize.js.map +1 -0
  18. package/lib/cjs/queries/IRDesugar.d.ts +98 -0
  19. package/lib/cjs/queries/IRDesugar.js +244 -0
  20. package/lib/cjs/queries/IRDesugar.js.map +1 -0
  21. package/lib/cjs/queries/IRLower.d.ts +8 -0
  22. package/lib/cjs/queries/IRLower.js +272 -0
  23. package/lib/cjs/queries/IRLower.js.map +1 -0
  24. package/lib/cjs/queries/IRMutation.d.ts +23 -0
  25. package/lib/cjs/queries/IRMutation.js +77 -0
  26. package/lib/cjs/queries/IRMutation.js.map +1 -0
  27. package/lib/cjs/queries/IRPipeline.d.ts +8 -0
  28. package/lib/cjs/queries/IRPipeline.js +25 -0
  29. package/lib/cjs/queries/IRPipeline.js.map +1 -0
  30. package/lib/cjs/queries/IRProjection.d.ts +38 -0
  31. package/lib/cjs/queries/IRProjection.js +98 -0
  32. package/lib/cjs/queries/IRProjection.js.map +1 -0
  33. package/lib/cjs/queries/IntermediateRepresentation.d.ts +210 -0
  34. package/lib/cjs/queries/IntermediateRepresentation.js +3 -0
  35. package/lib/cjs/queries/IntermediateRepresentation.js.map +1 -0
  36. package/lib/cjs/queries/MutationQuery.js +9 -23
  37. package/lib/cjs/queries/MutationQuery.js.map +1 -1
  38. package/lib/cjs/queries/QueryFactory.d.ts +0 -2
  39. package/lib/cjs/queries/QueryFactory.js +0 -3
  40. package/lib/cjs/queries/QueryFactory.js.map +1 -1
  41. package/lib/cjs/queries/QueryParser.d.ts +6 -1
  42. package/lib/cjs/queries/QueryParser.js +14 -22
  43. package/lib/cjs/queries/QueryParser.js.map +1 -1
  44. package/lib/cjs/queries/SelectQuery.d.ts +18 -27
  45. package/lib/cjs/queries/SelectQuery.js +54 -45
  46. package/lib/cjs/queries/SelectQuery.js.map +1 -1
  47. package/lib/cjs/queries/UpdateQuery.d.ts +8 -9
  48. package/lib/cjs/queries/UpdateQuery.js +4 -4
  49. package/lib/cjs/queries/UpdateQuery.js.map +1 -1
  50. package/lib/cjs/shapes/SHACL.d.ts +1 -0
  51. package/lib/cjs/shapes/SHACL.js +82 -2
  52. package/lib/cjs/shapes/SHACL.js.map +1 -1
  53. package/lib/cjs/shapes/Shape.d.ts +11 -10
  54. package/lib/cjs/shapes/Shape.js +11 -5
  55. package/lib/cjs/shapes/Shape.js.map +1 -1
  56. package/lib/cjs/sparql/SparqlAlgebra.d.ts +158 -0
  57. package/lib/cjs/sparql/SparqlAlgebra.js +4 -0
  58. package/lib/cjs/sparql/SparqlAlgebra.js.map +1 -0
  59. package/lib/cjs/sparql/SparqlStore.d.ts +52 -0
  60. package/lib/cjs/sparql/SparqlStore.js +81 -0
  61. package/lib/cjs/sparql/SparqlStore.js.map +1 -0
  62. package/lib/cjs/sparql/algebraToString.d.ts +13 -0
  63. package/lib/cjs/sparql/algebraToString.js +298 -0
  64. package/lib/cjs/sparql/algebraToString.js.map +1 -0
  65. package/lib/cjs/sparql/index.d.ts +9 -0
  66. package/lib/cjs/sparql/index.js +40 -0
  67. package/lib/cjs/sparql/index.js.map +1 -0
  68. package/lib/cjs/sparql/irToAlgebra.d.ts +39 -0
  69. package/lib/cjs/sparql/irToAlgebra.js +927 -0
  70. package/lib/cjs/sparql/irToAlgebra.js.map +1 -0
  71. package/lib/cjs/sparql/resultMapping.d.ts +36 -0
  72. package/lib/cjs/sparql/resultMapping.js +501 -0
  73. package/lib/cjs/sparql/resultMapping.js.map +1 -0
  74. package/lib/cjs/sparql/sparqlUtils.d.ts +32 -0
  75. package/lib/cjs/sparql/sparqlUtils.js +89 -0
  76. package/lib/cjs/sparql/sparqlUtils.js.map +1 -0
  77. package/lib/cjs/test-helpers/FusekiStore.d.ts +29 -0
  78. package/lib/cjs/test-helpers/FusekiStore.js +82 -0
  79. package/lib/cjs/test-helpers/FusekiStore.js.map +1 -0
  80. package/lib/cjs/test-helpers/fuseki-test-store.d.ts +43 -0
  81. package/lib/cjs/test-helpers/fuseki-test-store.js +144 -0
  82. package/lib/cjs/test-helpers/fuseki-test-store.js.map +1 -0
  83. package/lib/cjs/test-helpers/query-capture-store.d.ts +5 -0
  84. package/lib/cjs/test-helpers/query-capture-store.js +59 -0
  85. package/lib/cjs/test-helpers/query-capture-store.js.map +1 -0
  86. package/lib/cjs/test-helpers/query-fixtures.d.ts +700 -117
  87. package/lib/cjs/test-helpers/query-fixtures.js +39 -1
  88. package/lib/cjs/test-helpers/query-fixtures.js.map +1 -1
  89. package/lib/cjs/utils/LinkedStorage.d.ts +7 -7
  90. package/lib/cjs/utils/LinkedStorage.js +4 -3
  91. package/lib/cjs/utils/LinkedStorage.js.map +1 -1
  92. package/lib/esm/index.js +4 -0
  93. package/lib/esm/index.js.map +1 -1
  94. package/lib/esm/interfaces/IQuadStore.d.ts +19 -7
  95. package/lib/esm/queries/CreateQuery.d.ts +7 -8
  96. package/lib/esm/queries/CreateQuery.js +4 -4
  97. package/lib/esm/queries/CreateQuery.js.map +1 -1
  98. package/lib/esm/queries/DeleteQuery.d.ts +7 -8
  99. package/lib/esm/queries/DeleteQuery.js +4 -4
  100. package/lib/esm/queries/DeleteQuery.js.map +1 -1
  101. package/lib/esm/queries/IRAliasScope.d.ts +20 -0
  102. package/lib/esm/queries/IRAliasScope.js +47 -0
  103. package/lib/esm/queries/IRAliasScope.js.map +1 -0
  104. package/lib/esm/queries/IRCanonicalize.d.ts +36 -0
  105. package/lib/esm/queries/IRCanonicalize.js +116 -0
  106. package/lib/esm/queries/IRCanonicalize.js.map +1 -0
  107. package/lib/esm/queries/IRDesugar.d.ts +98 -0
  108. package/lib/esm/queries/IRDesugar.js +240 -0
  109. package/lib/esm/queries/IRDesugar.js.map +1 -0
  110. package/lib/esm/queries/IRLower.d.ts +8 -0
  111. package/lib/esm/queries/IRLower.js +268 -0
  112. package/lib/esm/queries/IRLower.js.map +1 -0
  113. package/lib/esm/queries/IRMutation.d.ts +23 -0
  114. package/lib/esm/queries/IRMutation.js +71 -0
  115. package/lib/esm/queries/IRMutation.js.map +1 -0
  116. package/lib/esm/queries/IRPipeline.d.ts +8 -0
  117. package/lib/esm/queries/IRPipeline.js +21 -0
  118. package/lib/esm/queries/IRPipeline.js.map +1 -0
  119. package/lib/esm/queries/IRProjection.d.ts +38 -0
  120. package/lib/esm/queries/IRProjection.js +92 -0
  121. package/lib/esm/queries/IRProjection.js.map +1 -0
  122. package/lib/esm/queries/IntermediateRepresentation.d.ts +210 -0
  123. package/lib/esm/queries/IntermediateRepresentation.js +2 -0
  124. package/lib/esm/queries/IntermediateRepresentation.js.map +1 -0
  125. package/lib/esm/queries/MutationQuery.js +9 -23
  126. package/lib/esm/queries/MutationQuery.js.map +1 -1
  127. package/lib/esm/queries/QueryFactory.d.ts +0 -2
  128. package/lib/esm/queries/QueryFactory.js +0 -3
  129. package/lib/esm/queries/QueryFactory.js.map +1 -1
  130. package/lib/esm/queries/QueryParser.d.ts +6 -1
  131. package/lib/esm/queries/QueryParser.js +14 -23
  132. package/lib/esm/queries/QueryParser.js.map +1 -1
  133. package/lib/esm/queries/SelectQuery.d.ts +18 -27
  134. package/lib/esm/queries/SelectQuery.js +54 -45
  135. package/lib/esm/queries/SelectQuery.js.map +1 -1
  136. package/lib/esm/queries/UpdateQuery.d.ts +8 -9
  137. package/lib/esm/queries/UpdateQuery.js +4 -4
  138. package/lib/esm/queries/UpdateQuery.js.map +1 -1
  139. package/lib/esm/shapes/SHACL.d.ts +1 -0
  140. package/lib/esm/shapes/SHACL.js +82 -2
  141. package/lib/esm/shapes/SHACL.js.map +1 -1
  142. package/lib/esm/shapes/Shape.d.ts +11 -10
  143. package/lib/esm/shapes/Shape.js +11 -5
  144. package/lib/esm/shapes/Shape.js.map +1 -1
  145. package/lib/esm/sparql/SparqlAlgebra.d.ts +158 -0
  146. package/lib/esm/sparql/SparqlAlgebra.js +3 -0
  147. package/lib/esm/sparql/SparqlAlgebra.js.map +1 -0
  148. package/lib/esm/sparql/SparqlStore.d.ts +52 -0
  149. package/lib/esm/sparql/SparqlStore.js +77 -0
  150. package/lib/esm/sparql/SparqlStore.js.map +1 -0
  151. package/lib/esm/sparql/algebraToString.d.ts +13 -0
  152. package/lib/esm/sparql/algebraToString.js +289 -0
  153. package/lib/esm/sparql/algebraToString.js.map +1 -0
  154. package/lib/esm/sparql/index.d.ts +9 -0
  155. package/lib/esm/sparql/index.js +13 -0
  156. package/lib/esm/sparql/index.js.map +1 -0
  157. package/lib/esm/sparql/irToAlgebra.d.ts +39 -0
  158. package/lib/esm/sparql/irToAlgebra.js +917 -0
  159. package/lib/esm/sparql/irToAlgebra.js.map +1 -0
  160. package/lib/esm/sparql/resultMapping.d.ts +36 -0
  161. package/lib/esm/sparql/resultMapping.js +496 -0
  162. package/lib/esm/sparql/resultMapping.js.map +1 -0
  163. package/lib/esm/sparql/sparqlUtils.d.ts +32 -0
  164. package/lib/esm/sparql/sparqlUtils.js +82 -0
  165. package/lib/esm/sparql/sparqlUtils.js.map +1 -0
  166. package/lib/esm/test-helpers/FusekiStore.d.ts +29 -0
  167. package/lib/esm/test-helpers/FusekiStore.js +78 -0
  168. package/lib/esm/test-helpers/FusekiStore.js.map +1 -0
  169. package/lib/esm/test-helpers/fuseki-test-store.d.ts +43 -0
  170. package/lib/esm/test-helpers/fuseki-test-store.js +135 -0
  171. package/lib/esm/test-helpers/fuseki-test-store.js.map +1 -0
  172. package/lib/esm/test-helpers/query-capture-store.d.ts +5 -0
  173. package/lib/esm/test-helpers/query-capture-store.js +55 -0
  174. package/lib/esm/test-helpers/query-capture-store.js.map +1 -0
  175. package/lib/esm/test-helpers/query-fixtures.d.ts +700 -117
  176. package/lib/esm/test-helpers/query-fixtures.js +38 -0
  177. package/lib/esm/test-helpers/query-fixtures.js.map +1 -1
  178. package/lib/esm/utils/LinkedStorage.d.ts +7 -7
  179. package/lib/esm/utils/LinkedStorage.js +4 -3
  180. package/lib/esm/utils/LinkedStorage.js.map +1 -1
  181. package/package.json +7 -3
  182. package/lib/cjs/interfaces/IQueryParser.d.ts +0 -13
  183. package/lib/cjs/interfaces/IQueryParser.js +0 -10
  184. package/lib/cjs/interfaces/IQueryParser.js.map +0 -1
  185. package/lib/esm/interfaces/IQueryParser.d.ts +0 -13
  186. package/lib/esm/interfaces/IQueryParser.js +0 -7
  187. package/lib/esm/interfaces/IQueryParser.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { Prefix } from '../utils/Prefix.js';
2
+ import { ulid } from 'ulid';
3
+ /**
4
+ * Format a URI for SPARQL output.
5
+ * Returns prefixed form (e.g. `rdf:type`) if a prefix is registered and the
6
+ * suffix doesn't contain `/`. Otherwise returns `<full-uri>`.
7
+ */
8
+ export function formatUri(uri) {
9
+ const prefixed = Prefix.toPrefixed(uri);
10
+ if (prefixed)
11
+ return prefixed;
12
+ return `<${uri}>`;
13
+ }
14
+ /**
15
+ * Escapes special characters in a string for use inside SPARQL double-quoted literals.
16
+ * Per SPARQL 1.1 §19.7 (Escape sequences in strings).
17
+ */
18
+ export function escapeSparqlString(value) {
19
+ return value
20
+ .replace(/\\/g, '\\\\')
21
+ .replace(/"/g, '\\"')
22
+ .replace(/\n/g, '\\n')
23
+ .replace(/\r/g, '\\r')
24
+ .replace(/\t/g, '\\t');
25
+ }
26
+ /**
27
+ * Format a literal value for SPARQL output.
28
+ * Returns a quoted string with optional `^^<datatype>` suffix.
29
+ * Special characters in the value are escaped per SPARQL spec.
30
+ */
31
+ export function formatLiteral(value, datatype) {
32
+ let lexical;
33
+ if (value instanceof Date) {
34
+ lexical = value.toISOString();
35
+ }
36
+ else {
37
+ lexical = String(value);
38
+ }
39
+ const escaped = escapeSparqlString(lexical);
40
+ if (datatype) {
41
+ return `"${escaped}"^^${formatUri(datatype)}`;
42
+ }
43
+ return `"${escaped}"`;
44
+ }
45
+ /**
46
+ * Collect the minimal set of prefix→URI mappings needed for a set of URIs.
47
+ * Only includes prefixes that are actually used (i.e. `Prefix.toPrefixed`
48
+ * returns a value for at least one URI in the list).
49
+ */
50
+ export function collectPrefixes(usedUris) {
51
+ const result = {};
52
+ for (const uri of usedUris) {
53
+ const match = Prefix.findMatch(uri);
54
+ if (match.length > 0) {
55
+ const [ontologyUri, prefix, postFix] = match;
56
+ // Only include if the postfix is actually prefixable (no `/`)
57
+ if (!postFix.includes('/')) {
58
+ result[prefix] = ontologyUri;
59
+ }
60
+ }
61
+ }
62
+ return result;
63
+ }
64
+ /**
65
+ * Generate a new entity URI for a create mutation.
66
+ * Format: `{dataRoot}/{lowercaseShapeLabel}_{ulid}`
67
+ */
68
+ export function generateEntityUri(shape, options) {
69
+ const dataRoot = (options === null || options === void 0 ? void 0 : options.dataRoot) || process.env.DATA_ROOT || 'http://example.org/data';
70
+ // Extract the shape label from the full URI (last segment after # or /)
71
+ let label;
72
+ const hashIdx = shape.lastIndexOf('#');
73
+ if (hashIdx >= 0) {
74
+ label = shape.substring(hashIdx + 1);
75
+ }
76
+ else {
77
+ const slashIdx = shape.lastIndexOf('/');
78
+ label = slashIdx >= 0 ? shape.substring(slashIdx + 1) : shape;
79
+ }
80
+ return `${dataRoot}/${label.toLowerCase()}_${ulid()}`;
81
+ }
82
+ //# sourceMappingURL=sparqlUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparqlUtils.js","sourceRoot":"","sources":["../../../src/sparql/sparqlUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { SparqlStore } from '../sparql/SparqlStore.js';
2
+ import type { SparqlJsonResults } from '../sparql/resultMapping.js';
3
+ import type { SparqlOptions } from '../sparql/sparqlUtils.js';
4
+ /**
5
+ * Concrete SparqlStore implementation for Apache Jena Fuseki.
6
+ *
7
+ * Demonstrates how to extend SparqlStore with a real SPARQL endpoint.
8
+ * Used by the integration tests to implicitly validate the base class.
9
+ *
10
+ * Usage:
11
+ * ```ts
12
+ * const store = new FusekiStore('http://localhost:3030', 'my-dataset');
13
+ * await store.init();
14
+ * const result = await store.selectQuery(irSelectQuery);
15
+ * ```
16
+ */
17
+ export declare class FusekiStore extends SparqlStore {
18
+ private readonly queryEndpoint;
19
+ private readonly updateEndpoint;
20
+ private readonly baseUrl;
21
+ private readonly dataset;
22
+ private readonly adminAuth?;
23
+ constructor(baseUrl: string, dataset: string, options?: SparqlOptions & {
24
+ adminPassword?: string;
25
+ });
26
+ init(): Promise<void>;
27
+ protected executeSparqlSelect(sparql: string): Promise<SparqlJsonResults>;
28
+ protected executeSparqlUpdate(sparql: string): Promise<void>;
29
+ }
@@ -0,0 +1,78 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { SparqlStore } from '../sparql/SparqlStore.js';
11
+ /**
12
+ * Concrete SparqlStore implementation for Apache Jena Fuseki.
13
+ *
14
+ * Demonstrates how to extend SparqlStore with a real SPARQL endpoint.
15
+ * Used by the integration tests to implicitly validate the base class.
16
+ *
17
+ * Usage:
18
+ * ```ts
19
+ * const store = new FusekiStore('http://localhost:3030', 'my-dataset');
20
+ * await store.init();
21
+ * const result = await store.selectQuery(irSelectQuery);
22
+ * ```
23
+ */
24
+ export class FusekiStore extends SparqlStore {
25
+ constructor(baseUrl, dataset, options) {
26
+ super(options);
27
+ this.baseUrl = baseUrl;
28
+ this.dataset = dataset;
29
+ this.queryEndpoint = `${baseUrl}/${dataset}/sparql`;
30
+ this.updateEndpoint = `${baseUrl}/${dataset}/update`;
31
+ if (options === null || options === void 0 ? void 0 : options.adminPassword) {
32
+ this.adminAuth = `Basic ${Buffer.from(`admin:${options.adminPassword}`).toString('base64')}`;
33
+ }
34
+ }
35
+ init() {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ // Check availability
38
+ const response = yield fetch(this.baseUrl, {
39
+ method: 'HEAD',
40
+ signal: AbortSignal.timeout(2000),
41
+ });
42
+ if (response.status !== 200) {
43
+ throw new Error(`Fuseki not available at ${this.baseUrl}`);
44
+ }
45
+ });
46
+ }
47
+ executeSparqlSelect(sparql) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const response = yield fetch(this.queryEndpoint, {
50
+ method: 'POST',
51
+ headers: {
52
+ 'Content-Type': 'application/sparql-query',
53
+ Accept: 'application/sparql-results+json',
54
+ },
55
+ body: sparql,
56
+ });
57
+ if (!response.ok) {
58
+ const body = yield response.text();
59
+ throw new Error(`SPARQL query failed: ${response.status} ${response.statusText}\n${sparql}\n${body}`);
60
+ }
61
+ return response.json();
62
+ });
63
+ }
64
+ executeSparqlUpdate(sparql) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const response = yield fetch(this.updateEndpoint, {
67
+ method: 'POST',
68
+ headers: { 'Content-Type': 'application/sparql-update' },
69
+ body: sparql,
70
+ });
71
+ if (!response.ok) {
72
+ const body = yield response.text();
73
+ throw new Error(`SPARQL update failed: ${response.status} ${response.statusText}\n${sparql}\n${body}`);
74
+ }
75
+ });
76
+ }
77
+ }
78
+ //# sourceMappingURL=FusekiStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FusekiStore.js","sourceRoot":"","sources":["../../../src/test-helpers/FusekiStore.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAIrD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IAO1C,YACE,OAAe,EACf,OAAe,EACf,OAAkD;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,GAAG,OAAO,IAAI,OAAO,SAAS,CAAC;QACpD,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO,IAAI,OAAO,SAAS,CAAC;QAErD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAEK,IAAI;;YACR,qBAAqB;YACrB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;KAAA;IAEe,mBAAmB,CACjC,MAAc;;YAEd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE;gBAC/C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,0BAA0B;oBAC1C,MAAM,EAAE,iCAAiC;iBAC1C;gBACD,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,KAAK,IAAI,EAAE,CACrF,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;KAAA;IAEe,mBAAmB,CAAC,MAAc;;YAChD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAC,cAAc,EAAE,2BAA2B,EAAC;gBACtD,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,KAAK,IAAI,EAAE,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;KAAA;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Test helper module for Apache Jena Fuseki integration tests.
3
+ *
4
+ * Provides utilities to:
5
+ * - Check if a Fuseki instance is available
6
+ * - Create / delete an in-memory test dataset
7
+ * - Load N-Triples data
8
+ * - Execute SPARQL queries and updates
9
+ * - Clear all data
10
+ *
11
+ * Uses native fetch (Node 18+). No external HTTP libraries.
12
+ */
13
+ /**
14
+ * Check whether a Fuseki server is reachable.
15
+ * Returns true if a HEAD request to the base URL succeeds with status 200.
16
+ */
17
+ export declare function isFusekiAvailable(): Promise<boolean>;
18
+ /**
19
+ * Create the in-memory test dataset on Fuseki.
20
+ * Ignores 409 Conflict (dataset already exists).
21
+ */
22
+ export declare function createTestDataset(): Promise<void>;
23
+ /**
24
+ * Delete the test dataset from Fuseki.
25
+ */
26
+ export declare function deleteTestDataset(): Promise<void>;
27
+ /**
28
+ * Load N-Triples data into the test dataset.
29
+ */
30
+ export declare function loadTestData(ntriples: string): Promise<void>;
31
+ /**
32
+ * Execute a SPARQL SELECT/ASK/CONSTRUCT query against the test dataset.
33
+ * Returns parsed SPARQL JSON results.
34
+ */
35
+ export declare function executeSparqlQuery(sparql: string): Promise<any>;
36
+ /**
37
+ * Execute a SPARQL UPDATE against the test dataset.
38
+ */
39
+ export declare function executeSparqlUpdate(sparql: string): Promise<void>;
40
+ /**
41
+ * Remove all triples from the test dataset.
42
+ */
43
+ export declare function clearAllData(): Promise<void>;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Test helper module for Apache Jena Fuseki integration tests.
3
+ *
4
+ * Provides utilities to:
5
+ * - Check if a Fuseki instance is available
6
+ * - Create / delete an in-memory test dataset
7
+ * - Load N-Triples data
8
+ * - Execute SPARQL queries and updates
9
+ * - Clear all data
10
+ *
11
+ * Uses native fetch (Node 18+). No external HTTP libraries.
12
+ */
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ const FUSEKI_BASE_URL = process.env.FUSEKI_BASE_URL || 'http://localhost:3030';
23
+ const FUSEKI_ADMIN_PASSWORD = process.env.FUSEKI_ADMIN_PASSWORD || 'admin';
24
+ const DATASET_NAME = 'nashville-test';
25
+ const adminAuth = `Basic ${Buffer.from(`admin:${FUSEKI_ADMIN_PASSWORD}`).toString('base64')}`;
26
+ /**
27
+ * Check whether a Fuseki server is reachable.
28
+ * Returns true if a HEAD request to the base URL succeeds with status 200.
29
+ */
30
+ export function isFusekiAvailable() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ try {
33
+ const response = yield fetch(FUSEKI_BASE_URL, {
34
+ method: 'HEAD',
35
+ signal: AbortSignal.timeout(2000),
36
+ });
37
+ return response.status === 200;
38
+ }
39
+ catch (_a) {
40
+ return false;
41
+ }
42
+ });
43
+ }
44
+ /**
45
+ * Create the in-memory test dataset on Fuseki.
46
+ * Ignores 409 Conflict (dataset already exists).
47
+ */
48
+ export function createTestDataset() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ const response = yield fetch(`${FUSEKI_BASE_URL}/$/datasets`, {
51
+ method: 'POST',
52
+ headers: {
53
+ 'Content-Type': 'application/x-www-form-urlencoded',
54
+ Authorization: adminAuth,
55
+ },
56
+ body: `dbName=${DATASET_NAME}&dbType=mem`,
57
+ });
58
+ if (!response.ok && response.status !== 409) {
59
+ throw new Error(`Failed to create test dataset: ${response.status} ${response.statusText}`);
60
+ }
61
+ });
62
+ }
63
+ /**
64
+ * Delete the test dataset from Fuseki.
65
+ */
66
+ export function deleteTestDataset() {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ const response = yield fetch(`${FUSEKI_BASE_URL}/$/datasets/${DATASET_NAME}`, { method: 'DELETE', headers: { Authorization: adminAuth } });
69
+ if (!response.ok && response.status !== 404) {
70
+ throw new Error(`Failed to delete test dataset: ${response.status} ${response.statusText}`);
71
+ }
72
+ });
73
+ }
74
+ /**
75
+ * Load N-Triples data into the test dataset.
76
+ */
77
+ export function loadTestData(ntriples) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const response = yield fetch(`${FUSEKI_BASE_URL}/${DATASET_NAME}`, {
80
+ method: 'POST',
81
+ headers: { 'Content-Type': 'application/n-triples' },
82
+ body: ntriples,
83
+ });
84
+ if (!response.ok) {
85
+ const body = yield response.text();
86
+ throw new Error(`Failed to load test data: ${response.status} ${response.statusText}\n${body}`);
87
+ }
88
+ });
89
+ }
90
+ /**
91
+ * Execute a SPARQL SELECT/ASK/CONSTRUCT query against the test dataset.
92
+ * Returns parsed SPARQL JSON results.
93
+ */
94
+ export function executeSparqlQuery(sparql) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const response = yield fetch(`${FUSEKI_BASE_URL}/${DATASET_NAME}/sparql`, {
97
+ method: 'POST',
98
+ headers: {
99
+ 'Content-Type': 'application/sparql-query',
100
+ Accept: 'application/sparql-results+json',
101
+ },
102
+ body: sparql,
103
+ });
104
+ if (!response.ok) {
105
+ const body = yield response.text();
106
+ throw new Error(`SPARQL query failed: ${response.status} ${response.statusText}\n${sparql}\n${body}`);
107
+ }
108
+ return response.json();
109
+ });
110
+ }
111
+ /**
112
+ * Execute a SPARQL UPDATE against the test dataset.
113
+ */
114
+ export function executeSparqlUpdate(sparql) {
115
+ return __awaiter(this, void 0, void 0, function* () {
116
+ const response = yield fetch(`${FUSEKI_BASE_URL}/${DATASET_NAME}/update`, {
117
+ method: 'POST',
118
+ headers: { 'Content-Type': 'application/sparql-update' },
119
+ body: sparql,
120
+ });
121
+ if (!response.ok) {
122
+ const body = yield response.text();
123
+ throw new Error(`SPARQL update failed: ${response.status} ${response.statusText}\n${sparql}\n${body}`);
124
+ }
125
+ });
126
+ }
127
+ /**
128
+ * Remove all triples from the test dataset.
129
+ */
130
+ export function clearAllData() {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ yield executeSparqlUpdate('DELETE WHERE { ?s ?p ?o }');
133
+ });
134
+ }
135
+ //# sourceMappingURL=fuseki-test-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuseki-test-store.js","sourceRoot":"","sources":["../../../src/test-helpers/fuseki-test-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Execute a query-producing callback and return whatever
3
+ * the capture intercepted.
4
+ */
5
+ export declare const captureQuery: (runner: () => Promise<unknown>) => Promise<any>;
@@ -0,0 +1,55 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jest } from '@jest/globals';
11
+ import { QueryParser } from '../queries/QueryParser';
12
+ import { UpdateQueryFactory } from '../queries/UpdateQuery';
13
+ import { CreateQueryFactory } from '../queries/CreateQuery';
14
+ import { DeleteQueryFactory } from '../queries/DeleteQuery';
15
+ /**
16
+ * Test utility that intercepts QueryParser methods via jest.spyOn and captures
17
+ * the query object for inspection by test assertions.
18
+ *
19
+ * For select queries, captures the RawSelectInput (pipeline input format).
20
+ * For mutations, captures the IR (canonical format).
21
+ *
22
+ * Import this module and call `captureQuery(runner)` to execute a DSL
23
+ * call (e.g. Person.select(...)) and retrieve the captured query.
24
+ */
25
+ let _lastQuery;
26
+ jest.spyOn(QueryParser, 'selectQuery').mockImplementation((query) => __awaiter(void 0, void 0, void 0, function* () {
27
+ _lastQuery = query.toRawInput();
28
+ return [];
29
+ }));
30
+ jest.spyOn(QueryParser, 'createQuery').mockImplementation((updateObjectOrFn, shapeClass) => __awaiter(void 0, void 0, void 0, function* () {
31
+ const factory = new CreateQueryFactory(shapeClass, updateObjectOrFn);
32
+ _lastQuery = factory.build();
33
+ return {};
34
+ }));
35
+ jest.spyOn(QueryParser, 'updateQuery').mockImplementation((id, updateObjectOrFn, shapeClass) => __awaiter(void 0, void 0, void 0, function* () {
36
+ const factory = new UpdateQueryFactory(shapeClass, id, updateObjectOrFn);
37
+ _lastQuery = factory.build();
38
+ return {};
39
+ }));
40
+ jest.spyOn(QueryParser, 'deleteQuery').mockImplementation((id, shapeClass) => __awaiter(void 0, void 0, void 0, function* () {
41
+ const ids = (Array.isArray(id) ? id : [id]);
42
+ const factory = new DeleteQueryFactory(shapeClass, ids);
43
+ _lastQuery = factory.build();
44
+ return { deleted: [], count: 0 };
45
+ }));
46
+ /**
47
+ * Execute a query-producing callback and return whatever
48
+ * the capture intercepted.
49
+ */
50
+ export const captureQuery = (runner) => __awaiter(void 0, void 0, void 0, function* () {
51
+ _lastQuery = undefined;
52
+ yield runner();
53
+ return _lastQuery;
54
+ });
55
+ //# sourceMappingURL=query-capture-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-capture-store.js","sourceRoot":"","sources":["../../../src/test-helpers/query-capture-store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AACnC,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;GASG;AACH,IAAI,UAAe,CAAC;AAEpB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,kBAAkB,CAAC,CAAO,KAAU,EAAE,EAAE;IAC7E,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,OAAO,EAAS,CAAC;AACnB,CAAC,CAAA,CAAC,CAAC;AAEH,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,kBAAkB,CACvD,CAAO,gBAAqB,EAAE,UAAe,EAAE,EAAE;IAC/C,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACrE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,OAAO,EAAS,CAAC;AACnB,CAAC,CAAA,CACF,CAAC;AAEF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,kBAAkB,CACvD,CAAO,EAAO,EAAE,gBAAqB,EAAE,UAAe,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACzE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,OAAO,EAAS,CAAC;AACnB,CAAC,CAAA,CACF,CAAC;AAEF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,kBAAkB,CACvD,CAAO,EAAO,EAAE,UAAe,EAAE,EAAE;IACjC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAa,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACxD,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC;AACjC,CAAC,CAAA,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAA8B,EAC9B,EAAE;IACF,UAAU,GAAG,SAAS,CAAC;IACvB,MAAM,MAAM,EAAE,CAAC;IACf,OAAO,UAAU,CAAC;AACpB,CAAC,CAAA,CAAC"}