@_linked/core 1.3.0 → 2.0.0-next.20260310082533

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 (143) hide show
  1. package/CHANGELOG.md +113 -10
  2. package/README.md +209 -14
  3. package/lib/cjs/index.d.ts +10 -2
  4. package/lib/cjs/index.js +31 -6
  5. package/lib/cjs/index.js.map +1 -1
  6. package/lib/cjs/package.d.ts +1 -1
  7. package/lib/cjs/queries/CreateBuilder.d.ts +38 -0
  8. package/lib/cjs/queries/CreateBuilder.js +100 -0
  9. package/lib/cjs/queries/CreateBuilder.js.map +1 -0
  10. package/lib/cjs/queries/CreateQuery.d.ts +3 -3
  11. package/lib/cjs/queries/CreateQuery.js.map +1 -1
  12. package/lib/cjs/queries/DeleteBuilder.d.ts +39 -0
  13. package/lib/cjs/queries/DeleteBuilder.js +85 -0
  14. package/lib/cjs/queries/DeleteBuilder.js.map +1 -0
  15. package/lib/cjs/queries/DeleteQuery.d.ts +3 -3
  16. package/lib/cjs/queries/DeleteQuery.js.map +1 -1
  17. package/lib/cjs/queries/FieldSet.d.ts +203 -0
  18. package/lib/cjs/queries/FieldSet.js +533 -0
  19. package/lib/cjs/queries/FieldSet.js.map +1 -0
  20. package/lib/cjs/queries/IRDesugar.d.ts +13 -8
  21. package/lib/cjs/queries/IRDesugar.js +143 -132
  22. package/lib/cjs/queries/IRDesugar.js.map +1 -1
  23. package/lib/cjs/queries/IRLower.js +1 -0
  24. package/lib/cjs/queries/IRLower.js.map +1 -1
  25. package/lib/cjs/queries/IntermediateRepresentation.d.ts +1 -0
  26. package/lib/cjs/queries/MutationQuery.d.ts +1 -1
  27. package/lib/cjs/queries/MutationQuery.js +1 -6
  28. package/lib/cjs/queries/MutationQuery.js.map +1 -1
  29. package/lib/cjs/queries/PropertyPath.d.ts +38 -0
  30. package/lib/cjs/queries/PropertyPath.js +82 -0
  31. package/lib/cjs/queries/PropertyPath.js.map +1 -0
  32. package/lib/cjs/queries/ProxiedPathBuilder.d.ts +14 -0
  33. package/lib/cjs/queries/ProxiedPathBuilder.js +29 -0
  34. package/lib/cjs/queries/ProxiedPathBuilder.js.map +1 -0
  35. package/lib/cjs/queries/QueryBuilder.d.ts +141 -0
  36. package/lib/cjs/queries/QueryBuilder.js +334 -0
  37. package/lib/cjs/queries/QueryBuilder.js.map +1 -0
  38. package/lib/cjs/queries/SelectQuery.d.ts +60 -134
  39. package/lib/cjs/queries/SelectQuery.js +67 -526
  40. package/lib/cjs/queries/SelectQuery.js.map +1 -1
  41. package/lib/cjs/queries/UpdateBuilder.d.ts +37 -0
  42. package/lib/cjs/queries/UpdateBuilder.js +84 -0
  43. package/lib/cjs/queries/UpdateBuilder.js.map +1 -0
  44. package/lib/cjs/queries/UpdateQuery.d.ts +3 -3
  45. package/lib/cjs/queries/UpdateQuery.js.map +1 -1
  46. package/lib/cjs/queries/WhereCondition.d.ts +18 -0
  47. package/lib/cjs/queries/WhereCondition.js +3 -0
  48. package/lib/cjs/queries/WhereCondition.js.map +1 -0
  49. package/lib/cjs/queries/resolveShape.d.ts +10 -0
  50. package/lib/cjs/queries/resolveShape.js +23 -0
  51. package/lib/cjs/queries/resolveShape.js.map +1 -0
  52. package/lib/cjs/shapes/SHACL.js +7 -5
  53. package/lib/cjs/shapes/SHACL.js.map +1 -1
  54. package/lib/cjs/shapes/Shape.d.ts +33 -52
  55. package/lib/cjs/shapes/Shape.js +36 -56
  56. package/lib/cjs/shapes/Shape.js.map +1 -1
  57. package/lib/cjs/sparql/SparqlAlgebra.d.ts +6 -1
  58. package/lib/cjs/sparql/algebraToString.js +10 -0
  59. package/lib/cjs/sparql/algebraToString.js.map +1 -1
  60. package/lib/cjs/sparql/irToAlgebra.js +6 -2
  61. package/lib/cjs/sparql/irToAlgebra.js.map +1 -1
  62. package/lib/cjs/test-helpers/query-fixtures.d.ts +568 -3049
  63. package/lib/cjs/test-helpers/query-fixtures.js +59 -18
  64. package/lib/cjs/test-helpers/query-fixtures.js.map +1 -1
  65. package/lib/cjs/test-helpers/test-utils.d.ts +18 -0
  66. package/lib/cjs/test-helpers/test-utils.js +47 -0
  67. package/lib/cjs/test-helpers/test-utils.js.map +1 -0
  68. package/lib/cjs/utils/Package.d.ts +8 -8
  69. package/lib/cjs/utils/Package.js.map +1 -1
  70. package/lib/cjs/utils/ShapeClass.d.ts +2 -2
  71. package/lib/cjs/utils/ShapeClass.js +4 -22
  72. package/lib/cjs/utils/ShapeClass.js.map +1 -1
  73. package/lib/esm/index.d.ts +10 -2
  74. package/lib/esm/index.js +23 -2
  75. package/lib/esm/index.js.map +1 -1
  76. package/lib/esm/package.d.ts +1 -1
  77. package/lib/esm/queries/CreateBuilder.d.ts +38 -0
  78. package/lib/esm/queries/CreateBuilder.js +96 -0
  79. package/lib/esm/queries/CreateBuilder.js.map +1 -0
  80. package/lib/esm/queries/CreateQuery.d.ts +3 -3
  81. package/lib/esm/queries/CreateQuery.js.map +1 -1
  82. package/lib/esm/queries/DeleteBuilder.d.ts +39 -0
  83. package/lib/esm/queries/DeleteBuilder.js +81 -0
  84. package/lib/esm/queries/DeleteBuilder.js.map +1 -0
  85. package/lib/esm/queries/DeleteQuery.d.ts +3 -3
  86. package/lib/esm/queries/DeleteQuery.js.map +1 -1
  87. package/lib/esm/queries/FieldSet.d.ts +203 -0
  88. package/lib/esm/queries/FieldSet.js +529 -0
  89. package/lib/esm/queries/FieldSet.js.map +1 -0
  90. package/lib/esm/queries/IRDesugar.d.ts +13 -8
  91. package/lib/esm/queries/IRDesugar.js +143 -132
  92. package/lib/esm/queries/IRDesugar.js.map +1 -1
  93. package/lib/esm/queries/IRLower.js +1 -0
  94. package/lib/esm/queries/IRLower.js.map +1 -1
  95. package/lib/esm/queries/IntermediateRepresentation.d.ts +1 -0
  96. package/lib/esm/queries/MutationQuery.d.ts +1 -1
  97. package/lib/esm/queries/MutationQuery.js +1 -6
  98. package/lib/esm/queries/MutationQuery.js.map +1 -1
  99. package/lib/esm/queries/PropertyPath.d.ts +38 -0
  100. package/lib/esm/queries/PropertyPath.js +77 -0
  101. package/lib/esm/queries/PropertyPath.js.map +1 -0
  102. package/lib/esm/queries/ProxiedPathBuilder.d.ts +14 -0
  103. package/lib/esm/queries/ProxiedPathBuilder.js +26 -0
  104. package/lib/esm/queries/ProxiedPathBuilder.js.map +1 -0
  105. package/lib/esm/queries/QueryBuilder.d.ts +141 -0
  106. package/lib/esm/queries/QueryBuilder.js +330 -0
  107. package/lib/esm/queries/QueryBuilder.js.map +1 -0
  108. package/lib/esm/queries/SelectQuery.d.ts +60 -134
  109. package/lib/esm/queries/SelectQuery.js +61 -515
  110. package/lib/esm/queries/SelectQuery.js.map +1 -1
  111. package/lib/esm/queries/UpdateBuilder.d.ts +37 -0
  112. package/lib/esm/queries/UpdateBuilder.js +80 -0
  113. package/lib/esm/queries/UpdateBuilder.js.map +1 -0
  114. package/lib/esm/queries/UpdateQuery.d.ts +3 -3
  115. package/lib/esm/queries/UpdateQuery.js.map +1 -1
  116. package/lib/esm/queries/WhereCondition.d.ts +18 -0
  117. package/lib/esm/queries/WhereCondition.js +2 -0
  118. package/lib/esm/queries/WhereCondition.js.map +1 -0
  119. package/lib/esm/queries/resolveShape.d.ts +10 -0
  120. package/lib/esm/queries/resolveShape.js +20 -0
  121. package/lib/esm/queries/resolveShape.js.map +1 -0
  122. package/lib/esm/shapes/SHACL.js +7 -5
  123. package/lib/esm/shapes/SHACL.js.map +1 -1
  124. package/lib/esm/shapes/Shape.d.ts +33 -52
  125. package/lib/esm/shapes/Shape.js +36 -53
  126. package/lib/esm/shapes/Shape.js.map +1 -1
  127. package/lib/esm/sparql/SparqlAlgebra.d.ts +6 -1
  128. package/lib/esm/sparql/algebraToString.js +10 -0
  129. package/lib/esm/sparql/algebraToString.js.map +1 -1
  130. package/lib/esm/sparql/irToAlgebra.js +6 -2
  131. package/lib/esm/sparql/irToAlgebra.js.map +1 -1
  132. package/lib/esm/test-helpers/query-fixtures.d.ts +568 -3049
  133. package/lib/esm/test-helpers/query-fixtures.js +59 -18
  134. package/lib/esm/test-helpers/query-fixtures.js.map +1 -1
  135. package/lib/esm/test-helpers/test-utils.d.ts +18 -0
  136. package/lib/esm/test-helpers/test-utils.js +41 -0
  137. package/lib/esm/test-helpers/test-utils.js.map +1 -0
  138. package/lib/esm/utils/Package.d.ts +8 -8
  139. package/lib/esm/utils/Package.js.map +1 -1
  140. package/lib/esm/utils/ShapeClass.d.ts +2 -2
  141. package/lib/esm/utils/ShapeClass.js +4 -22
  142. package/lib/esm/utils/ShapeClass.js.map +1 -1
  143. package/package.json +1 -1
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PropertyPath = void 0;
4
+ exports.walkPropertyPath = walkPropertyPath;
5
+ const ShapeClass_js_1 = require("../utils/ShapeClass.js");
6
+ /**
7
+ * A value object representing a sequence of property traversals from a root shape.
8
+ *
9
+ * Each segment is a PropertyShape representing one hop in the traversal.
10
+ * For example, `friends.name` on PersonShape produces a PropertyPath with
11
+ * two segments: [friendsPropertyShape, namePropertyShape].
12
+ *
13
+ * This is used by FieldSet and QueryBuilder to describe which properties
14
+ * to select/filter, independent of proxy tracing.
15
+ */
16
+ class PropertyPath {
17
+ constructor(rootShape, segments) {
18
+ this.rootShape = rootShape;
19
+ this.segments = segments;
20
+ }
21
+ /** Append a property traversal hop, returning a new PropertyPath. */
22
+ prop(property) {
23
+ return new PropertyPath(this.rootShape, [...this.segments, property]);
24
+ }
25
+ /** The terminal (leaf) property of this path. */
26
+ get terminal() {
27
+ return this.segments[this.segments.length - 1];
28
+ }
29
+ /** The depth (number of hops) of this path. */
30
+ get depth() {
31
+ return this.segments.length;
32
+ }
33
+ /** String representation using property labels joined by dots. */
34
+ toString() {
35
+ return this.segments.map((s) => s.label).join('.');
36
+ }
37
+ /** Two PropertyPaths are equal if they have the same root shape and same segment sequence. */
38
+ equals(other) {
39
+ if (this.rootShape.id !== other.rootShape.id)
40
+ return false;
41
+ if (this.segments.length !== other.segments.length)
42
+ return false;
43
+ return this.segments.every((s, i) => s.id === other.segments[i].id);
44
+ }
45
+ }
46
+ exports.PropertyPath = PropertyPath;
47
+ /**
48
+ * Resolve a dot-separated property path string into a PropertyPath.
49
+ *
50
+ * Walks the shape's property shapes by label, following valueShape references
51
+ * to traverse into nested shapes.
52
+ *
53
+ * Example: `walkPropertyPath(PersonShape, 'friends.name')` resolves
54
+ * [friendsPropertyShape, namePropertyShape].
55
+ *
56
+ * @throws If any segment cannot be resolved.
57
+ */
58
+ function walkPropertyPath(shape, path) {
59
+ const labels = path.split('.');
60
+ const segments = [];
61
+ let currentShape = shape;
62
+ for (const label of labels) {
63
+ const propertyShape = currentShape.getPropertyShape(label);
64
+ if (!propertyShape) {
65
+ throw new Error(`Property '${label}' not found on shape '${currentShape.label || currentShape.id}' while resolving path '${path}'`);
66
+ }
67
+ segments.push(propertyShape);
68
+ // If there are more segments to resolve, follow the valueShape
69
+ if (segments.length < labels.length) {
70
+ if (!propertyShape.valueShape) {
71
+ throw new Error(`Property '${label}' on shape '${currentShape.label || currentShape.id}' has no valueShape; cannot traverse further in path '${path}'`);
72
+ }
73
+ const shapeClass = (0, ShapeClass_js_1.getShapeClass)(propertyShape.valueShape);
74
+ if (!shapeClass || !shapeClass.shape) {
75
+ throw new Error(`Cannot resolve valueShape '${propertyShape.valueShape.id}' for property '${label}' in path '${path}'`);
76
+ }
77
+ currentShape = shapeClass.shape;
78
+ }
79
+ }
80
+ return new PropertyPath(shape, segments);
81
+ }
82
+ //# sourceMappingURL=PropertyPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropertyPath.js","sourceRoot":"","sources":["../../../src/queries/PropertyPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Shape, ShapeConstructor } from '../shapes/Shape.js';
2
+ import { QueryBuilderObject } from './SelectQuery.js';
3
+ /**
4
+ * Creates the proxy object used as the `p` parameter in query callbacks.
5
+ *
6
+ * Property access on the returned proxy (e.g., `p.name`, `p.friends.name`)
7
+ * creates QueryBuilderObject chains that trace the path of requested properties.
8
+ * This is the shared foundation for both the DSL (`Person.select(p => p.name)`)
9
+ * and the future QueryBuilder API.
10
+ *
11
+ * Originally extracted from SelectQueryFactory.getQueryShape() to enable reuse
12
+ * across the DSL and dynamic query building.
13
+ */
14
+ export declare function createProxiedPathBuilder<S extends Shape>(shape: ShapeConstructor<S> | QueryBuilderObject): QueryBuilderObject;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProxiedPathBuilder = createProxiedPathBuilder;
4
+ const SelectQuery_js_1 = require("./SelectQuery.js");
5
+ /**
6
+ * Creates the proxy object used as the `p` parameter in query callbacks.
7
+ *
8
+ * Property access on the returned proxy (e.g., `p.name`, `p.friends.name`)
9
+ * creates QueryBuilderObject chains that trace the path of requested properties.
10
+ * This is the shared foundation for both the DSL (`Person.select(p => p.name)`)
11
+ * and the future QueryBuilder API.
12
+ *
13
+ * Originally extracted from SelectQueryFactory.getQueryShape() to enable reuse
14
+ * across the DSL and dynamic query building.
15
+ */
16
+ function createProxiedPathBuilder(shape) {
17
+ if (shape instanceof SelectQuery_js_1.QueryBuilderObject) {
18
+ // When a QueryBuilderObject is passed directly (e.g. QueryPrimitives
19
+ // used as the shape for where-clause evaluation), use it as-is.
20
+ return shape;
21
+ }
22
+ // Create a dummy shape instance and wrap it in a QueryShape proxy.
23
+ // The proxy intercepts property access and resolves each property name
24
+ // to its PropertyShape, building a chain of QueryBuilderObjects that
25
+ // records which path was traversed.
26
+ const dummyShape = new shape();
27
+ return SelectQuery_js_1.QueryShape.create(dummyShape);
28
+ }
29
+ //# sourceMappingURL=ProxiedPathBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProxiedPathBuilder.js","sourceRoot":"","sources":["../../../src/queries/ProxiedPathBuilder.ts"],"names":[],"mappings":";;AAcA,4DAcC;AA3BD,qDAAgE;AAEhE;;;;;;;;;;GAUG;AACH,SAAgB,wBAAwB,CACtC,KAA+C;IAE/C,IAAI,KAAK,YAAY,mCAAkB,EAAE,CAAC;QACxC,qEAAqE;QACrE,gEAAgE;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,mEAAmE;IACnE,uEAAuE;IACvE,qEAAqE;IACrE,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC;IAC/B,OAAO,2BAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { Shape, ShapeConstructor } from '../shapes/Shape.js';
2
+ import { SelectQuery, QueryBuildFn, WhereClause, QueryResponseToResultType, SelectAllQueryResponse, QueryComponentLike } from './SelectQuery.js';
3
+ import type { RawSelectInput } from './IRDesugar.js';
4
+ import type { NodeReferenceValue } from './QueryFactory.js';
5
+ import { FieldSet, FieldSetFieldJSON } from './FieldSet.js';
6
+ /** JSON representation of a QueryBuilder. */
7
+ export type QueryBuilderJSON = {
8
+ shape: string;
9
+ fields?: FieldSetFieldJSON[];
10
+ limit?: number;
11
+ offset?: number;
12
+ subject?: string;
13
+ subjects?: string[];
14
+ singleResult?: boolean;
15
+ orderDirection?: 'ASC' | 'DESC';
16
+ };
17
+ /**
18
+ * An immutable, fluent query builder for select queries.
19
+ *
20
+ * Every mutation method (`.select()`, `.where()`, `.limit()`, etc.) returns
21
+ * a **new** QueryBuilder instance — the original is never modified.
22
+ *
23
+ * Implements `PromiseLike` so queries execute on `await`:
24
+ * ```ts
25
+ * const results = await QueryBuilder.from(Person).select(p => p.name);
26
+ * ```
27
+ *
28
+ * Generates IR directly via FieldSet, guaranteeing identical output to the existing DSL.
29
+ */
30
+ export declare class QueryBuilder<S extends Shape = Shape, R = any, Result = any> implements PromiseLike<Result>, Promise<Result> {
31
+ private readonly _shape;
32
+ private readonly _selectFn?;
33
+ private readonly _whereFn?;
34
+ private readonly _sortByFn?;
35
+ private readonly _sortDirection?;
36
+ private readonly _limit?;
37
+ private readonly _offset?;
38
+ private readonly _subject?;
39
+ private readonly _subjects?;
40
+ private readonly _singleResult?;
41
+ private readonly _selectAllLabels?;
42
+ private readonly _fieldSet?;
43
+ private readonly _preloads?;
44
+ private constructor();
45
+ /** Create a shallow clone with overrides. */
46
+ private clone;
47
+ /**
48
+ * Create a QueryBuilder for the given shape.
49
+ *
50
+ * Accepts a shape class (e.g. `Person`), a NodeShape instance,
51
+ * or a shape IRI string (resolved via the shape registry).
52
+ */
53
+ static from<S extends Shape>(shape: ShapeConstructor<S> | string): QueryBuilder<S>;
54
+ /** Set the select projection via a callback, labels, or FieldSet. */
55
+ select<NewR>(fn: QueryBuildFn<S, NewR>): QueryBuilder<S, NewR, QueryResponseToResultType<NewR, S>[]>;
56
+ select(labels: string[]): QueryBuilder<S>;
57
+ select<NewR>(fieldSet: FieldSet<NewR>): QueryBuilder<S, NewR, QueryResponseToResultType<NewR, S>[]>;
58
+ /** Select all decorated properties of the shape. */
59
+ selectAll(): QueryBuilder<S, any, QueryResponseToResultType<SelectAllQueryResponse<S>, S>[]>;
60
+ /** Add a where clause. */
61
+ where(fn: WhereClause<S>): QueryBuilder<S, R, Result>;
62
+ /** Set sort order. */
63
+ orderBy<OR>(fn: QueryBuildFn<S, OR>, direction?: 'ASC' | 'DESC'): QueryBuilder<S, R, Result>;
64
+ /**
65
+ * Alias for orderBy — matches the existing DSL's `sortBy` method name.
66
+ */
67
+ sortBy<OR>(fn: QueryBuildFn<S, OR>, direction?: 'ASC' | 'DESC'): QueryBuilder<S, R, Result>;
68
+ /** Set result limit. */
69
+ limit(n: number): QueryBuilder<S, R, Result>;
70
+ /** Set result offset. */
71
+ offset(n: number): QueryBuilder<S, R, Result>;
72
+ /** Target a single entity by ID. Implies singleResult; unwraps array Result type. */
73
+ for(id: string | NodeReferenceValue): QueryBuilder<S, R, Result extends (infer E)[] ? E : Result>;
74
+ /** Target multiple entities by ID, or all if no ids given. */
75
+ forAll(ids?: (string | NodeReferenceValue)[]): QueryBuilder<S, R, Result>;
76
+ /** Limit to one result. Unwraps array Result type to single element. */
77
+ one(): QueryBuilder<S, R, Result extends (infer E)[] ? E : Result>;
78
+ /**
79
+ * Preload a component's query fields at the given property path.
80
+ *
81
+ * This merges the component's query paths into this query's selection,
82
+ * wrapping them in an OPTIONAL block (handled by the IR pipeline).
83
+ *
84
+ * Equivalent to the DSL's `.preloadFor()`:
85
+ * ```ts
86
+ * // DSL style
87
+ * Person.select(p => p.bestFriend.preloadFor(PersonCard))
88
+ * // QueryBuilder style
89
+ * QueryBuilder.from(Person).select(p => [p.name]).preload('bestFriend', PersonCard)
90
+ * ```
91
+ *
92
+ * NOTE: Preloads hold live component references and are not serializable.
93
+ * They are injected into the selectFn at build time (see buildFactory()),
94
+ * so changes to preload handling must account for the selectFn wrapping logic.
95
+ */
96
+ preload<CS extends Shape, CR>(path: string, component: QueryComponentLike<CS, CR>): QueryBuilder<S, R, Result>;
97
+ /**
98
+ * Returns the current selection as a FieldSet.
99
+ * If the selection was set via a FieldSet, returns that directly.
100
+ * If set via selectAll labels, constructs a FieldSet from them.
101
+ * If set via a callback, eagerly evaluates it through the proxy to produce a FieldSet.
102
+ */
103
+ fields(): FieldSet | undefined;
104
+ /**
105
+ * Serialize this QueryBuilder to a plain JSON object.
106
+ *
107
+ * Selections are serializable regardless of how they were set (FieldSet,
108
+ * string[], selectAll, or callback). Callback-based selections are eagerly
109
+ * evaluated through the proxy to produce a FieldSet.
110
+ *
111
+ * The `where` and `orderBy` callbacks are not serialized (only the direction
112
+ * is preserved for orderBy).
113
+ */
114
+ toJSON(): QueryBuilderJSON;
115
+ /**
116
+ * Reconstruct a QueryBuilder from a JSON object.
117
+ * Resolves shape IRI via getShapeClass() and field paths as label selections.
118
+ */
119
+ static fromJSON<S extends Shape = Shape>(json: QueryBuilderJSON): QueryBuilder<S>;
120
+ /**
121
+ * Get the raw pipeline input.
122
+ *
123
+ * Constructs RawSelectInput directly from FieldSet entries.
124
+ */
125
+ toRawInput(): RawSelectInput;
126
+ /**
127
+ * Build RawSelectInput directly from FieldSet entries.
128
+ */
129
+ private _buildDirectRawInput;
130
+ /** Build the IR (run the full pipeline: desugar → canonicalize → lower). */
131
+ build(): SelectQuery;
132
+ /** Execute the query and return results. */
133
+ exec(): Promise<Result>;
134
+ /** `await` triggers execution. */
135
+ then<TResult1 = Result, TResult2 = never>(onfulfilled?: ((value: Result) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
136
+ /** Catch errors from execution. Chain off then() to avoid re-executing. */
137
+ catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<Result | TResult>;
138
+ /** Finally handler after execution. Chain off then() to avoid re-executing. */
139
+ finally(onfinally?: (() => void) | null): Promise<Result>;
140
+ get [Symbol.toStringTag](): string;
141
+ }
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryBuilder = void 0;
4
+ const resolveShape_js_1 = require("./resolveShape.js");
5
+ const SelectQuery_js_1 = require("./SelectQuery.js");
6
+ const IRPipeline_js_1 = require("./IRPipeline.js");
7
+ const queryDispatch_js_1 = require("./queryDispatch.js");
8
+ const FieldSet_js_1 = require("./FieldSet.js");
9
+ /**
10
+ * An immutable, fluent query builder for select queries.
11
+ *
12
+ * Every mutation method (`.select()`, `.where()`, `.limit()`, etc.) returns
13
+ * a **new** QueryBuilder instance — the original is never modified.
14
+ *
15
+ * Implements `PromiseLike` so queries execute on `await`:
16
+ * ```ts
17
+ * const results = await QueryBuilder.from(Person).select(p => p.name);
18
+ * ```
19
+ *
20
+ * Generates IR directly via FieldSet, guaranteeing identical output to the existing DSL.
21
+ */
22
+ class QueryBuilder {
23
+ constructor(init) {
24
+ this._shape = init.shape;
25
+ this._selectFn = init.selectFn;
26
+ this._whereFn = init.whereFn;
27
+ this._sortByFn = init.sortByFn;
28
+ this._sortDirection = init.sortDirection;
29
+ this._limit = init.limit;
30
+ this._offset = init.offset;
31
+ this._subject = init.subject;
32
+ this._subjects = init.subjects;
33
+ this._singleResult = init.singleResult;
34
+ this._selectAllLabels = init.selectAllLabels;
35
+ this._fieldSet = init.fieldSet;
36
+ this._preloads = init.preloads;
37
+ }
38
+ /** Create a shallow clone with overrides. */
39
+ clone(overrides = {}) {
40
+ return new QueryBuilder(Object.assign({ shape: this._shape, selectFn: this._selectFn, whereFn: this._whereFn, sortByFn: this._sortByFn, sortDirection: this._sortDirection, limit: this._limit, offset: this._offset, subject: this._subject, subjects: this._subjects, singleResult: this._singleResult, selectAllLabels: this._selectAllLabels, fieldSet: this._fieldSet, preloads: this._preloads }, overrides));
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Static constructors
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Create a QueryBuilder for the given shape.
47
+ *
48
+ * Accepts a shape class (e.g. `Person`), a NodeShape instance,
49
+ * or a shape IRI string (resolved via the shape registry).
50
+ */
51
+ static from(shape) {
52
+ const resolved = (0, resolveShape_js_1.resolveShape)(shape);
53
+ return new QueryBuilder({ shape: resolved });
54
+ }
55
+ select(fnOrLabelsOrFieldSet) {
56
+ if (fnOrLabelsOrFieldSet instanceof FieldSet_js_1.FieldSet) {
57
+ const labels = fnOrLabelsOrFieldSet.labels();
58
+ const selectFn = ((p) => labels.map((label) => p[label]));
59
+ return this.clone({ selectFn, selectAllLabels: undefined, fieldSet: fnOrLabelsOrFieldSet });
60
+ }
61
+ if (Array.isArray(fnOrLabelsOrFieldSet)) {
62
+ const labels = fnOrLabelsOrFieldSet;
63
+ const selectFn = ((p) => labels.map((label) => p[label]));
64
+ return this.clone({ selectFn, selectAllLabels: undefined, fieldSet: undefined });
65
+ }
66
+ return this.clone({ selectFn: fnOrLabelsOrFieldSet, selectAllLabels: undefined, fieldSet: undefined });
67
+ }
68
+ /** Select all decorated properties of the shape. */
69
+ selectAll() {
70
+ const propertyLabels = this._shape.shape
71
+ .getUniquePropertyShapes()
72
+ .map((ps) => ps.label);
73
+ const selectFn = ((p) => propertyLabels.map((label) => p[label]));
74
+ return this.clone({ selectFn, selectAllLabels: propertyLabels });
75
+ }
76
+ /** Add a where clause. */
77
+ where(fn) {
78
+ return this.clone({ whereFn: fn });
79
+ }
80
+ /** Set sort order. */
81
+ orderBy(fn, direction = 'ASC') {
82
+ return this.clone({ sortByFn: fn, sortDirection: direction });
83
+ }
84
+ /**
85
+ * Alias for orderBy — matches the existing DSL's `sortBy` method name.
86
+ */
87
+ sortBy(fn, direction = 'ASC') {
88
+ return this.orderBy(fn, direction);
89
+ }
90
+ /** Set result limit. */
91
+ limit(n) {
92
+ return this.clone({ limit: n });
93
+ }
94
+ /** Set result offset. */
95
+ offset(n) {
96
+ return this.clone({ offset: n });
97
+ }
98
+ /** Target a single entity by ID. Implies singleResult; unwraps array Result type. */
99
+ for(id) {
100
+ const subject = typeof id === 'string' ? { id } : id;
101
+ return this.clone({ subject, subjects: undefined, singleResult: true });
102
+ }
103
+ /** Target multiple entities by ID, or all if no ids given. */
104
+ forAll(ids) {
105
+ if (!ids) {
106
+ return this.clone({ subject: undefined, subjects: undefined, singleResult: false });
107
+ }
108
+ const subjects = ids.map((id) => (typeof id === 'string' ? { id } : id));
109
+ return this.clone({ subject: undefined, subjects, singleResult: false });
110
+ }
111
+ /** Limit to one result. Unwraps array Result type to single element. */
112
+ one() {
113
+ return this.clone({ limit: 1, singleResult: true });
114
+ }
115
+ /**
116
+ * Preload a component's query fields at the given property path.
117
+ *
118
+ * This merges the component's query paths into this query's selection,
119
+ * wrapping them in an OPTIONAL block (handled by the IR pipeline).
120
+ *
121
+ * Equivalent to the DSL's `.preloadFor()`:
122
+ * ```ts
123
+ * // DSL style
124
+ * Person.select(p => p.bestFriend.preloadFor(PersonCard))
125
+ * // QueryBuilder style
126
+ * QueryBuilder.from(Person).select(p => [p.name]).preload('bestFriend', PersonCard)
127
+ * ```
128
+ *
129
+ * NOTE: Preloads hold live component references and are not serializable.
130
+ * They are injected into the selectFn at build time (see buildFactory()),
131
+ * so changes to preload handling must account for the selectFn wrapping logic.
132
+ */
133
+ preload(path, component) {
134
+ const newPreloads = [...(this._preloads || []), { path, component }];
135
+ return this.clone({ preloads: newPreloads });
136
+ }
137
+ /**
138
+ * Returns the current selection as a FieldSet.
139
+ * If the selection was set via a FieldSet, returns that directly.
140
+ * If set via selectAll labels, constructs a FieldSet from them.
141
+ * If set via a callback, eagerly evaluates it through the proxy to produce a FieldSet.
142
+ */
143
+ fields() {
144
+ if (this._fieldSet) {
145
+ return this._fieldSet;
146
+ }
147
+ if (this._selectAllLabels) {
148
+ return FieldSet_js_1.FieldSet.for(this._shape.shape, this._selectAllLabels);
149
+ }
150
+ if (this._selectFn) {
151
+ // Eagerly evaluate the callback through FieldSet.for(ShapeClass, callback)
152
+ // The callback is pure — same proxy always produces same paths.
153
+ return FieldSet_js_1.FieldSet.for(this._shape, this._selectFn);
154
+ }
155
+ return undefined;
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Serialization
159
+ // ---------------------------------------------------------------------------
160
+ /**
161
+ * Serialize this QueryBuilder to a plain JSON object.
162
+ *
163
+ * Selections are serializable regardless of how they were set (FieldSet,
164
+ * string[], selectAll, or callback). Callback-based selections are eagerly
165
+ * evaluated through the proxy to produce a FieldSet.
166
+ *
167
+ * The `where` and `orderBy` callbacks are not serialized (only the direction
168
+ * is preserved for orderBy).
169
+ */
170
+ toJSON() {
171
+ var _a;
172
+ const shapeId = ((_a = this._shape.shape) === null || _a === void 0 ? void 0 : _a.id) || '';
173
+ const json = {
174
+ shape: shapeId,
175
+ };
176
+ // Serialize fields — fields() already handles _selectAllLabels, so
177
+ // no separate branch is needed (T1: dead else-if removed).
178
+ const fs = this.fields();
179
+ if (fs) {
180
+ json.fields = fs.toJSON().fields;
181
+ }
182
+ if (this._limit !== undefined) {
183
+ json.limit = this._limit;
184
+ }
185
+ if (this._offset !== undefined) {
186
+ json.offset = this._offset;
187
+ }
188
+ if (this._subject && typeof this._subject === 'object' && 'id' in this._subject) {
189
+ json.subject = this._subject.id;
190
+ }
191
+ if (this._subjects && this._subjects.length > 0) {
192
+ json.subjects = this._subjects.map((s) => s.id);
193
+ }
194
+ if (this._singleResult) {
195
+ json.singleResult = true;
196
+ }
197
+ if (this._sortDirection) {
198
+ json.orderDirection = this._sortDirection;
199
+ }
200
+ return json;
201
+ }
202
+ /**
203
+ * Reconstruct a QueryBuilder from a JSON object.
204
+ * Resolves shape IRI via getShapeClass() and field paths as label selections.
205
+ */
206
+ static fromJSON(json) {
207
+ let builder = QueryBuilder.from(json.shape);
208
+ if (json.fields && json.fields.length > 0) {
209
+ const fieldSet = FieldSet_js_1.FieldSet.fromJSON({
210
+ shape: json.shape,
211
+ fields: json.fields,
212
+ });
213
+ builder = builder.select(fieldSet);
214
+ }
215
+ if (json.limit !== undefined) {
216
+ builder = builder.limit(json.limit);
217
+ }
218
+ if (json.offset !== undefined) {
219
+ builder = builder.offset(json.offset);
220
+ }
221
+ if (json.subject) {
222
+ builder = builder.for(json.subject);
223
+ }
224
+ if (json.subjects && json.subjects.length > 0) {
225
+ builder = builder.forAll(json.subjects);
226
+ }
227
+ if (json.singleResult && !json.subject) {
228
+ builder = builder.one();
229
+ }
230
+ // Restore orderDirection. The sort key callback isn't serializable,
231
+ // so we only store the direction. When a sort key is later re-applied
232
+ // via .orderBy(), the direction will be available.
233
+ if (json.orderDirection) {
234
+ // Access private clone() — safe because fromJSON is in the same class.
235
+ builder = builder.clone({ sortDirection: json.orderDirection });
236
+ }
237
+ return builder;
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Build & execute
241
+ // ---------------------------------------------------------------------------
242
+ /**
243
+ * Get the raw pipeline input.
244
+ *
245
+ * Constructs RawSelectInput directly from FieldSet entries.
246
+ */
247
+ toRawInput() {
248
+ return this._buildDirectRawInput();
249
+ }
250
+ /**
251
+ * Build RawSelectInput directly from FieldSet entries.
252
+ */
253
+ _buildDirectRawInput() {
254
+ let fs = this.fields();
255
+ // When preloads exist, trace them through the proxy and merge with the FieldSet.
256
+ if (this._preloads && this._preloads.length > 0) {
257
+ const preloadFn = (p) => {
258
+ const results = [];
259
+ for (const entry of this._preloads) {
260
+ results.push(p[entry.path].preloadFor(entry.component));
261
+ }
262
+ return results;
263
+ };
264
+ const preloadFs = FieldSet_js_1.FieldSet.for(this._shape, preloadFn);
265
+ if (fs) {
266
+ fs = FieldSet_js_1.FieldSet.createFromEntries(fs.shape, [
267
+ ...fs.entries,
268
+ ...preloadFs.entries,
269
+ ]);
270
+ }
271
+ else {
272
+ fs = preloadFs;
273
+ }
274
+ }
275
+ const entries = fs ? fs.entries : [];
276
+ // Evaluate where callback
277
+ let where;
278
+ if (this._whereFn) {
279
+ where = (0, SelectQuery_js_1.processWhereClause)(this._whereFn, this._shape);
280
+ }
281
+ // Evaluate sort callback
282
+ let sortBy;
283
+ if (this._sortByFn) {
284
+ sortBy = (0, SelectQuery_js_1.evaluateSortCallback)(this._shape, this._sortByFn, this._sortDirection || 'ASC');
285
+ }
286
+ const input = {
287
+ entries,
288
+ subject: this._subject,
289
+ limit: this._limit,
290
+ offset: this._offset,
291
+ shape: this._shape,
292
+ sortBy,
293
+ singleResult: this._singleResult ||
294
+ !!(this._subject &&
295
+ typeof this._subject === 'object' &&
296
+ 'id' in this._subject),
297
+ };
298
+ if (where) {
299
+ input.where = where;
300
+ }
301
+ if (this._subjects && this._subjects.length > 0) {
302
+ input.subjects = this._subjects;
303
+ }
304
+ return input;
305
+ }
306
+ /** Build the IR (run the full pipeline: desugar → canonicalize → lower). */
307
+ build() {
308
+ return (0, IRPipeline_js_1.buildSelectQuery)(this.toRawInput());
309
+ }
310
+ /** Execute the query and return results. */
311
+ exec() {
312
+ return (0, queryDispatch_js_1.getQueryDispatch)().selectQuery(this.build());
313
+ }
314
+ // ---------------------------------------------------------------------------
315
+ // Promise-compatible interface
316
+ // ---------------------------------------------------------------------------
317
+ /** `await` triggers execution. */
318
+ then(onfulfilled, onrejected) {
319
+ return this.exec().then(onfulfilled, onrejected);
320
+ }
321
+ /** Catch errors from execution. Chain off then() to avoid re-executing. */
322
+ catch(onrejected) {
323
+ return this.then().catch(onrejected);
324
+ }
325
+ /** Finally handler after execution. Chain off then() to avoid re-executing. */
326
+ finally(onfinally) {
327
+ return this.then().finally(onfinally);
328
+ }
329
+ get [Symbol.toStringTag]() {
330
+ return 'QueryBuilder';
331
+ }
332
+ }
333
+ exports.QueryBuilder = QueryBuilder;
334
+ //# sourceMappingURL=QueryBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../../src/queries/QueryBuilder.ts"],"names":[],"mappings":"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"}