@_linked/core 1.2.0-next.20260303081922 → 1.2.0-next.20260312041833

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 (211) hide show
  1. package/CHANGELOG.md +32 -49
  2. package/README.md +401 -54
  3. package/lib/cjs/expressions/Expr.d.ts +58 -0
  4. package/lib/cjs/expressions/Expr.js +217 -0
  5. package/lib/cjs/expressions/Expr.js.map +1 -0
  6. package/lib/cjs/expressions/ExpressionMethods.d.ts +81 -0
  7. package/lib/cjs/expressions/ExpressionMethods.js +3 -0
  8. package/lib/cjs/expressions/ExpressionMethods.js.map +1 -0
  9. package/lib/cjs/expressions/ExpressionNode.d.ts +95 -0
  10. package/lib/cjs/expressions/ExpressionNode.js +349 -0
  11. package/lib/cjs/expressions/ExpressionNode.js.map +1 -0
  12. package/lib/cjs/index.d.ts +14 -2
  13. package/lib/cjs/index.js +38 -8
  14. package/lib/cjs/index.js.map +1 -1
  15. package/lib/cjs/interfaces/IQuadStore.d.ts +1 -1
  16. package/lib/cjs/package.d.ts +1 -1
  17. package/lib/cjs/queries/CreateBuilder.d.ts +38 -0
  18. package/lib/cjs/queries/CreateBuilder.js +100 -0
  19. package/lib/cjs/queries/CreateBuilder.js.map +1 -0
  20. package/lib/cjs/queries/CreateQuery.d.ts +3 -3
  21. package/lib/cjs/queries/CreateQuery.js.map +1 -1
  22. package/lib/cjs/queries/DeleteBuilder.d.ts +36 -0
  23. package/lib/cjs/queries/DeleteBuilder.js +112 -0
  24. package/lib/cjs/queries/DeleteBuilder.js.map +1 -0
  25. package/lib/cjs/queries/DeleteQuery.d.ts +5 -5
  26. package/lib/cjs/queries/DeleteQuery.js.map +1 -1
  27. package/lib/cjs/queries/FieldSet.d.ts +206 -0
  28. package/lib/cjs/queries/FieldSet.js +549 -0
  29. package/lib/cjs/queries/FieldSet.js.map +1 -0
  30. package/lib/cjs/queries/IRCanonicalize.d.ts +10 -3
  31. package/lib/cjs/queries/IRCanonicalize.js +10 -1
  32. package/lib/cjs/queries/IRCanonicalize.js.map +1 -1
  33. package/lib/cjs/queries/IRDesugar.d.ts +43 -10
  34. package/lib/cjs/queries/IRDesugar.js +165 -134
  35. package/lib/cjs/queries/IRDesugar.js.map +1 -1
  36. package/lib/cjs/queries/IRLower.d.ts +19 -2
  37. package/lib/cjs/queries/IRLower.js +105 -20
  38. package/lib/cjs/queries/IRLower.js.map +1 -1
  39. package/lib/cjs/queries/IRMutation.d.ts +31 -1
  40. package/lib/cjs/queries/IRMutation.js +68 -15
  41. package/lib/cjs/queries/IRMutation.js.map +1 -1
  42. package/lib/cjs/queries/IntermediateRepresentation.d.ts +34 -4
  43. package/lib/cjs/queries/MutationQuery.d.ts +1 -1
  44. package/lib/cjs/queries/MutationQuery.js +17 -8
  45. package/lib/cjs/queries/MutationQuery.js.map +1 -1
  46. package/lib/cjs/queries/PropertyPath.d.ts +38 -0
  47. package/lib/cjs/queries/PropertyPath.js +82 -0
  48. package/lib/cjs/queries/PropertyPath.js.map +1 -0
  49. package/lib/cjs/queries/ProxiedPathBuilder.d.ts +14 -0
  50. package/lib/cjs/queries/ProxiedPathBuilder.js +29 -0
  51. package/lib/cjs/queries/ProxiedPathBuilder.js.map +1 -0
  52. package/lib/cjs/queries/QueryBuilder.d.ts +154 -0
  53. package/lib/cjs/queries/QueryBuilder.js +391 -0
  54. package/lib/cjs/queries/QueryBuilder.js.map +1 -0
  55. package/lib/cjs/queries/QueryFactory.d.ts +2 -1
  56. package/lib/cjs/queries/QueryFactory.js.map +1 -1
  57. package/lib/cjs/queries/SelectQuery.d.ts +66 -136
  58. package/lib/cjs/queries/SelectQuery.js +111 -526
  59. package/lib/cjs/queries/SelectQuery.js.map +1 -1
  60. package/lib/cjs/queries/UpdateBuilder.d.ts +46 -0
  61. package/lib/cjs/queries/UpdateBuilder.js +133 -0
  62. package/lib/cjs/queries/UpdateBuilder.js.map +1 -0
  63. package/lib/cjs/queries/UpdateQuery.d.ts +5 -5
  64. package/lib/cjs/queries/UpdateQuery.js.map +1 -1
  65. package/lib/cjs/queries/WhereCondition.d.ts +18 -0
  66. package/lib/cjs/queries/WhereCondition.js +3 -0
  67. package/lib/cjs/queries/WhereCondition.js.map +1 -0
  68. package/lib/cjs/queries/queryDispatch.d.ts +20 -0
  69. package/lib/cjs/queries/queryDispatch.js +15 -0
  70. package/lib/cjs/queries/queryDispatch.js.map +1 -0
  71. package/lib/cjs/queries/resolveShape.d.ts +10 -0
  72. package/lib/cjs/queries/resolveShape.js +23 -0
  73. package/lib/cjs/queries/resolveShape.js.map +1 -0
  74. package/lib/cjs/shapes/SHACL.js +7 -5
  75. package/lib/cjs/shapes/SHACL.js.map +1 -1
  76. package/lib/cjs/shapes/Shape.d.ts +39 -52
  77. package/lib/cjs/shapes/Shape.js +32 -50
  78. package/lib/cjs/shapes/Shape.js.map +1 -1
  79. package/lib/cjs/sparql/SparqlAlgebra.d.ts +6 -1
  80. package/lib/cjs/sparql/SparqlStore.js +15 -0
  81. package/lib/cjs/sparql/SparqlStore.js.map +1 -1
  82. package/lib/cjs/sparql/algebraToString.js +10 -0
  83. package/lib/cjs/sparql/algebraToString.js.map +1 -1
  84. package/lib/cjs/sparql/irToAlgebra.d.ts +34 -3
  85. package/lib/cjs/sparql/irToAlgebra.js +386 -33
  86. package/lib/cjs/sparql/irToAlgebra.js.map +1 -1
  87. package/lib/cjs/test-helpers/query-capture-store.d.ts +8 -2
  88. package/lib/cjs/test-helpers/query-capture-store.js +80 -34
  89. package/lib/cjs/test-helpers/query-capture-store.js.map +1 -1
  90. package/lib/cjs/test-helpers/query-fixtures.d.ts +453 -3046
  91. package/lib/cjs/test-helpers/query-fixtures.js +143 -25
  92. package/lib/cjs/test-helpers/query-fixtures.js.map +1 -1
  93. package/lib/cjs/test-helpers/test-utils.d.ts +18 -0
  94. package/lib/cjs/test-helpers/test-utils.js +47 -0
  95. package/lib/cjs/test-helpers/test-utils.js.map +1 -0
  96. package/lib/cjs/utils/LinkedStorage.d.ts +3 -4
  97. package/lib/cjs/utils/LinkedStorage.js +12 -6
  98. package/lib/cjs/utils/LinkedStorage.js.map +1 -1
  99. package/lib/cjs/utils/Package.d.ts +8 -8
  100. package/lib/cjs/utils/Package.js.map +1 -1
  101. package/lib/cjs/utils/ShapeClass.d.ts +2 -2
  102. package/lib/cjs/utils/ShapeClass.js +4 -22
  103. package/lib/cjs/utils/ShapeClass.js.map +1 -1
  104. package/lib/esm/expressions/Expr.d.ts +58 -0
  105. package/lib/esm/expressions/Expr.js +214 -0
  106. package/lib/esm/expressions/Expr.js.map +1 -0
  107. package/lib/esm/expressions/ExpressionMethods.d.ts +81 -0
  108. package/lib/esm/expressions/ExpressionMethods.js +2 -0
  109. package/lib/esm/expressions/ExpressionMethods.js.map +1 -0
  110. package/lib/esm/expressions/ExpressionNode.d.ts +95 -0
  111. package/lib/esm/expressions/ExpressionNode.js +341 -0
  112. package/lib/esm/expressions/ExpressionNode.js.map +1 -0
  113. package/lib/esm/index.d.ts +14 -2
  114. package/lib/esm/index.js +28 -4
  115. package/lib/esm/index.js.map +1 -1
  116. package/lib/esm/interfaces/IQuadStore.d.ts +1 -1
  117. package/lib/esm/package.d.ts +1 -1
  118. package/lib/esm/queries/CreateBuilder.d.ts +38 -0
  119. package/lib/esm/queries/CreateBuilder.js +96 -0
  120. package/lib/esm/queries/CreateBuilder.js.map +1 -0
  121. package/lib/esm/queries/CreateQuery.d.ts +3 -3
  122. package/lib/esm/queries/CreateQuery.js.map +1 -1
  123. package/lib/esm/queries/DeleteBuilder.d.ts +36 -0
  124. package/lib/esm/queries/DeleteBuilder.js +108 -0
  125. package/lib/esm/queries/DeleteBuilder.js.map +1 -0
  126. package/lib/esm/queries/DeleteQuery.d.ts +5 -5
  127. package/lib/esm/queries/DeleteQuery.js.map +1 -1
  128. package/lib/esm/queries/FieldSet.d.ts +206 -0
  129. package/lib/esm/queries/FieldSet.js +545 -0
  130. package/lib/esm/queries/FieldSet.js.map +1 -0
  131. package/lib/esm/queries/IRCanonicalize.d.ts +10 -3
  132. package/lib/esm/queries/IRCanonicalize.js +10 -1
  133. package/lib/esm/queries/IRCanonicalize.js.map +1 -1
  134. package/lib/esm/queries/IRDesugar.d.ts +43 -10
  135. package/lib/esm/queries/IRDesugar.js +160 -130
  136. package/lib/esm/queries/IRDesugar.js.map +1 -1
  137. package/lib/esm/queries/IRLower.d.ts +19 -2
  138. package/lib/esm/queries/IRLower.js +102 -19
  139. package/lib/esm/queries/IRLower.js.map +1 -1
  140. package/lib/esm/queries/IRMutation.d.ts +31 -1
  141. package/lib/esm/queries/IRMutation.js +63 -14
  142. package/lib/esm/queries/IRMutation.js.map +1 -1
  143. package/lib/esm/queries/IntermediateRepresentation.d.ts +34 -4
  144. package/lib/esm/queries/MutationQuery.d.ts +1 -1
  145. package/lib/esm/queries/MutationQuery.js +17 -8
  146. package/lib/esm/queries/MutationQuery.js.map +1 -1
  147. package/lib/esm/queries/PropertyPath.d.ts +38 -0
  148. package/lib/esm/queries/PropertyPath.js +77 -0
  149. package/lib/esm/queries/PropertyPath.js.map +1 -0
  150. package/lib/esm/queries/ProxiedPathBuilder.d.ts +14 -0
  151. package/lib/esm/queries/ProxiedPathBuilder.js +26 -0
  152. package/lib/esm/queries/ProxiedPathBuilder.js.map +1 -0
  153. package/lib/esm/queries/QueryBuilder.d.ts +154 -0
  154. package/lib/esm/queries/QueryBuilder.js +387 -0
  155. package/lib/esm/queries/QueryBuilder.js.map +1 -0
  156. package/lib/esm/queries/QueryFactory.d.ts +2 -1
  157. package/lib/esm/queries/QueryFactory.js.map +1 -1
  158. package/lib/esm/queries/SelectQuery.d.ts +66 -136
  159. package/lib/esm/queries/SelectQuery.js +105 -515
  160. package/lib/esm/queries/SelectQuery.js.map +1 -1
  161. package/lib/esm/queries/UpdateBuilder.d.ts +46 -0
  162. package/lib/esm/queries/UpdateBuilder.js +129 -0
  163. package/lib/esm/queries/UpdateBuilder.js.map +1 -0
  164. package/lib/esm/queries/UpdateQuery.d.ts +5 -5
  165. package/lib/esm/queries/UpdateQuery.js.map +1 -1
  166. package/lib/esm/queries/WhereCondition.d.ts +18 -0
  167. package/lib/esm/queries/WhereCondition.js +2 -0
  168. package/lib/esm/queries/WhereCondition.js.map +1 -0
  169. package/lib/esm/queries/queryDispatch.d.ts +20 -0
  170. package/lib/esm/queries/queryDispatch.js +11 -0
  171. package/lib/esm/queries/queryDispatch.js.map +1 -0
  172. package/lib/esm/queries/resolveShape.d.ts +10 -0
  173. package/lib/esm/queries/resolveShape.js +20 -0
  174. package/lib/esm/queries/resolveShape.js.map +1 -0
  175. package/lib/esm/shapes/SHACL.js +7 -5
  176. package/lib/esm/shapes/SHACL.js.map +1 -1
  177. package/lib/esm/shapes/Shape.d.ts +39 -52
  178. package/lib/esm/shapes/Shape.js +32 -47
  179. package/lib/esm/shapes/Shape.js.map +1 -1
  180. package/lib/esm/sparql/SparqlAlgebra.d.ts +6 -1
  181. package/lib/esm/sparql/SparqlStore.js +16 -1
  182. package/lib/esm/sparql/SparqlStore.js.map +1 -1
  183. package/lib/esm/sparql/algebraToString.js +10 -0
  184. package/lib/esm/sparql/algebraToString.js.map +1 -1
  185. package/lib/esm/sparql/irToAlgebra.d.ts +34 -3
  186. package/lib/esm/sparql/irToAlgebra.js +380 -33
  187. package/lib/esm/sparql/irToAlgebra.js.map +1 -1
  188. package/lib/esm/test-helpers/query-capture-store.d.ts +8 -2
  189. package/lib/esm/test-helpers/query-capture-store.js +45 -33
  190. package/lib/esm/test-helpers/query-capture-store.js.map +1 -1
  191. package/lib/esm/test-helpers/query-fixtures.d.ts +453 -3046
  192. package/lib/esm/test-helpers/query-fixtures.js +143 -25
  193. package/lib/esm/test-helpers/query-fixtures.js.map +1 -1
  194. package/lib/esm/test-helpers/test-utils.d.ts +18 -0
  195. package/lib/esm/test-helpers/test-utils.js +41 -0
  196. package/lib/esm/test-helpers/test-utils.js.map +1 -0
  197. package/lib/esm/utils/LinkedStorage.d.ts +3 -4
  198. package/lib/esm/utils/LinkedStorage.js +12 -6
  199. package/lib/esm/utils/LinkedStorage.js.map +1 -1
  200. package/lib/esm/utils/Package.d.ts +8 -8
  201. package/lib/esm/utils/Package.js.map +1 -1
  202. package/lib/esm/utils/ShapeClass.d.ts +2 -2
  203. package/lib/esm/utils/ShapeClass.js +4 -22
  204. package/lib/esm/utils/ShapeClass.js.map +1 -1
  205. package/package.json +3 -3
  206. package/lib/cjs/queries/QueryParser.d.ts +0 -17
  207. package/lib/cjs/queries/QueryParser.js +0 -55
  208. package/lib/cjs/queries/QueryParser.js.map +0 -1
  209. package/lib/esm/queries/QueryParser.d.ts +0 -17
  210. package/lib/esm/queries/QueryParser.js +0 -51
  211. package/lib/esm/queries/QueryParser.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,69 +4,52 @@
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - [#9](https://github.com/Semantu/linked/pull/9) [`381067b`](https://github.com/Semantu/linked/commit/381067b0fbc25f4a0446c5f8cc0eec57ddded466) Thanks [@flyon](https://github.com/flyon)! - Replaced internal query representation with a canonical backend-agnostic IR AST. `SelectQuery`, `CreateQuery`, `UpdateQuery`, and `DeleteQuery` are now typed IR objects with `kind` discriminators, compact shape/property ID references, and expression trees replacing the previous ad-hoc nested arrays. The public Shape DSL is unchanged; what changed is what `IQuadStore` implementations receive. Store result types (`ResultRow`, `SelectResult`, `CreateResult`, `UpdateResult`) are now exported. All factories expose `build()` as the primary method. See `documentation/intermediate-representation.md` for the full IR reference and migration guidance.
7
+ - [#31](https://github.com/Semantu/linked/pull/31) [`eb88865`](https://github.com/Semantu/linked/commit/eb8886564f2c9663805c4308a834ca615f9a1dab) Thanks [@flyon](https://github.com/flyon)! - Properties in `select()` and `update()` now support expressionsyou can compute values dynamically instead of just reading or writing raw fields.
8
8
 
9
- - [#14](https://github.com/Semantu/linked/pull/14) [`b65e156`](https://github.com/Semantu/linked/commit/b65e15688ac173478e58e1dbb9f26dbaf5fc5a37) Thanks [@flyon](https://github.com/flyon)! - Add SPARQL conversion layer — compiles Linked IR queries into executable SPARQL and maps results back to typed DSL objects.
9
+ ### What's new
10
10
 
11
- **New exports from `@_linked/core/sparql`:**
11
+ - **Computed fields in queries** — chain expression methods on properties to derive new values: string manipulation (`.strlen()`, `.ucase()`, `.concat()`), arithmetic (`.plus()`, `.times()`, `.abs()`), date extraction (`.year()`, `.month()`, `.hours()`), and comparisons (`.gt()`, `.eq()`, `.contains()`).
12
12
 
13
- - **`SparqlStore`** — abstract base class for SPARQL-backed stores. Extend it and implement two methods to connect any SPARQL 1.1 endpoint:
14
-
15
- ```ts
16
- import { SparqlStore } from "@_linked/core/sparql";
17
-
18
- class MyStore extends SparqlStore {
19
- protected async executeSparqlSelect(
20
- sparql: string
21
- ): Promise<SparqlJsonResults> {
22
- /* ... */
23
- }
24
- protected async executeSparqlUpdate(sparql: string): Promise<void> {
25
- /* ... */
26
- }
27
- }
13
+ ```typescript
14
+ await Person.select((p) => ({
15
+ name: p.name,
16
+ nameLen: p.name.strlen(),
17
+ ageInMonths: p.age.times(12),
18
+ }));
28
19
  ```
29
20
 
30
- - **IR SPARQL string** convenience functions (full pipeline in one call):
31
-
32
- - `selectToSparql(query, options?)` — SelectQuery → SPARQL string
33
- - `createToSparql(query, options?)` — CreateQuery → SPARQL string
34
- - `updateToSparql(query, options?)` — UpdateQuery → SPARQL string
35
- - `deleteToSparql(query, options?)` — DeleteQuery → SPARQL string
36
-
37
- - **IR → SPARQL algebra** (for stores that want to inspect/optimize the algebra before serialization):
38
-
39
- - `selectToAlgebra(query, options?)` — returns `SparqlSelectPlan`
40
- - `createToAlgebra(query, options?)` — returns `SparqlInsertDataPlan`
41
- - `updateToAlgebra(query, options?)` — returns `SparqlDeleteInsertPlan`
42
- - `deleteToAlgebra(query, options?)` — returns `SparqlDeleteInsertPlan`
43
-
44
- - **Algebra → SPARQL string** serialization:
45
-
46
- - `selectPlanToSparql(plan, options?)`, `insertDataPlanToSparql(plan, options?)`, `deleteInsertPlanToSparql(plan, options?)`, `deleteWherePlanToSparql(plan, options?)`
47
- - `serializeAlgebraNode(node)`, `serializeExpression(expr)`, `serializeTerm(term)`
21
+ - **Expression-based WHERE filters** filter using computed conditions, not just equality checks. Works on queries, updates, and deletes.
48
22
 
49
- - **Result mapping** (SPARQL JSON results → typed DSL objects):
50
-
51
- - `mapSparqlSelectResult(json, query)` handles flat/nested/aggregated results with XSD type coercion
52
- - `mapSparqlCreateResult(uri, query)` — echoes created fields with generated URI
53
- - `mapSparqlUpdateResult(query)` — echoes updated fields
23
+ ```typescript
24
+ await Person.select((p) => p.name).where((p) => p.name.strlen().gt(5));
25
+ await Person.update({ verified: true }).where((p) => p.age.gte(18));
26
+ ```
54
27
 
55
- - **All algebra types** re-exported: `SparqlTerm`, `SparqlTriple`, `SparqlAlgebraNode`, `SparqlExpression`, `SparqlSelectPlan`, `SparqlInsertDataPlan`, `SparqlDeleteInsertPlan`, `SparqlDeleteWherePlan`, `SparqlPlan`, `SparqlOptions`, etc.
28
+ - **Computed updates** when updating data, calculate new values based on existing ones instead of providing static values. Pass a callback to `update()` to reference current field values.
56
29
 
57
- **Bug fixes included:**
30
+ ```typescript
31
+ await Person.update((p) => ({ age: p.age.plus(1) })).for(entity);
32
+ await Person.update((p) => ({
33
+ label: p.firstName.concat(" ").concat(p.lastName),
34
+ })).for(entity);
35
+ ```
58
36
 
59
- - Fixed `isNodeReference()` in MutationQuery.ts nested creates with predefined IDs (e.g., `{id: '...', name: 'Bestie'}`) now correctly insert entity data instead of only creating the link.
37
+ - **`Expr` module**for expressions that don't start from a property, like the current timestamp, conditional logic, or coalescing nulls.
60
38
 
61
- See [SPARQL Algebra Layer docs](./documentation/sparql-algebra.md) for the full type reference, conversion rules, and store implementation guide.
39
+ ```typescript
40
+ await Person.update({ lastSeen: Expr.now() }).for(entity);
41
+ await Person.select((p) => ({
42
+ displayName: Expr.firstDefined(p.nickname, p.name),
43
+ }));
44
+ ```
62
45
 
63
- ### Patch Changes
46
+ Update expression callbacks are fully typed — `.plus()` only appears on number properties, `.strlen()` only on strings, etc.
64
47
 
65
- - [#17](https://github.com/Semantu/linked/pull/17) [`0654780`](https://github.com/Semantu/linked/commit/06547807a7bae56e992eba73263f83e092b7788b) Thanks [@flyon](https://github.com/flyon)! - Preserve nested array sub-select branches in canonical IR so `build()` emits complete traversals, projection fields, and `resultMap` entries for nested selections.
48
+ ### New exports
66
49
 
67
- This fixes cases where nested branches present in `toRawInput().select` were dropped during desugar/lowering (for example nested `friends.select([name, hobby])` branches under another sub-select).
50
+ `ExpressionNode`, `Expr`, `ExpressionInput`, `PropertyRefMap`, `ExpressionUpdateProxy<S>`, `ExpressionUpdateResult<S>`, and per-type method interfaces (`NumericExpressionMethods`, `StringExpressionMethods`, `DateExpressionMethods`, `BooleanExpressionMethods`, `BaseExpressionMethods`).
68
51
 
69
- Also adds regression coverage for desugar preservation, IR lowering completeness, and updated SPARQL golden output for nested query fixtures.
52
+ See the [README](./README.md#computed-expressions) for the full method reference and more examples.
70
53
 
71
54
  ## 1.1.0
72
55