@_linked/core 2.36.1 → 2.36.3
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 +24 -0
- package/README.md +19 -0
- package/lib/esm/collections/CoreSet.js +2 -0
- package/lib/esm/collections/CoreSet.js.map +1 -1
- package/lib/esm/collections/ShapeSet.js +2 -0
- package/lib/esm/collections/ShapeSet.js.map +1 -1
- package/lib/esm/expressions/Expr.js +3 -2
- package/lib/esm/expressions/Expr.js.map +1 -1
- package/lib/esm/expressions/ExpressionNode.js +10 -7
- package/lib/esm/expressions/ExpressionNode.js.map +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/queries/AskBuilder.js +5 -3
- package/lib/esm/queries/AskBuilder.js.map +1 -1
- package/lib/esm/queries/CountBuilder.js +4 -2
- package/lib/esm/queries/CountBuilder.js.map +1 -1
- package/lib/esm/queries/CreateBuilder.js +2 -0
- package/lib/esm/queries/CreateBuilder.js.map +1 -1
- package/lib/esm/queries/DeleteBuilder.js +3 -1
- package/lib/esm/queries/DeleteBuilder.js.map +1 -1
- package/lib/esm/queries/DslJsonExpression.js +7 -6
- package/lib/esm/queries/DslJsonExpression.js.map +1 -1
- package/lib/esm/queries/FieldSet.js +10 -8
- package/lib/esm/queries/FieldSet.js.map +1 -1
- package/lib/esm/queries/IRLower.js +2 -1
- package/lib/esm/queries/IRLower.js.map +1 -1
- package/lib/esm/queries/MutationSerialization.js +2 -1
- package/lib/esm/queries/MutationSerialization.js.map +1 -1
- package/lib/esm/queries/PropertyPath.js +2 -0
- package/lib/esm/queries/PropertyPath.js.map +1 -1
- package/lib/esm/queries/ProxiedPathBuilder.js +2 -1
- package/lib/esm/queries/ProxiedPathBuilder.js.map +1 -1
- package/lib/esm/queries/QueryBuilder.js +5 -4
- package/lib/esm/queries/QueryBuilder.js.map +1 -1
- package/lib/esm/queries/QueryContext.js +17 -6
- package/lib/esm/queries/QueryContext.js.map +1 -1
- package/lib/esm/queries/SelectQuery.js +18 -12
- package/lib/esm/queries/SelectQuery.js.map +1 -1
- package/lib/esm/queries/UpdateBuilder.js +3 -1
- package/lib/esm/queries/UpdateBuilder.js.map +1 -1
- package/lib/esm/queries/lower.js +5 -4
- package/lib/esm/queries/lower.js.map +1 -1
- package/lib/esm/shapes/SHACL.js +6 -3
- package/lib/esm/shapes/SHACL.js.map +1 -1
- package/lib/esm/shapes/Shape.d.ts +3 -1
- package/lib/esm/shapes/Shape.js +20 -2
- package/lib/esm/shapes/Shape.js.map +1 -1
- package/lib/esm/utils/LinkedErrorLogging.d.ts +2 -1
- package/lib/esm/utils/LinkedErrorLogging.js +11 -0
- package/lib/esm/utils/LinkedErrorLogging.js.map +1 -1
- package/lib/esm/utils/LinkedFileStorage.d.ts +6 -4
- package/lib/esm/utils/LinkedFileStorage.js +34 -4
- package/lib/esm/utils/LinkedFileStorage.js.map +1 -1
- package/lib/esm/utils/Package.d.ts +6 -0
- package/lib/esm/utils/Package.js +35 -7
- package/lib/esm/utils/Package.js.map +1 -1
- package/lib/esm/utils/Prefix.d.ts +4 -2
- package/lib/esm/utils/Prefix.js +18 -2
- package/lib/esm/utils/Prefix.js.map +1 -1
- package/lib/esm/utils/ShapeClass.js +11 -6
- package/lib/esm/utils/ShapeClass.js.map +1 -1
- package/lib/esm/utils/cached.js +2 -1
- package/lib/esm/utils/cached.js.map +1 -1
- package/lib/esm/utils/linkedError.d.ts +32 -0
- package/lib/esm/utils/linkedError.js +63 -0
- package/lib/esm/utils/linkedError.js.map +1 -1
- package/lib/esm/utils/unresolvedShape.d.ts +3 -1
- package/lib/esm/utils/unresolvedShape.js +5 -1
- package/lib/esm/utils/unresolvedShape.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.36.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#357](https://github.com/linked-fw/core/pull/357) [`5985c51`](https://github.com/linked-fw/core/commit/5985c51ded778653187f5934c3b1c9fec169f10b) Thanks [@flyon](https://github.com/flyon)! - `isLinkedInstance` memoises its prototype-chain lookup per prototype, so a repeated failed check is
|
|
8
|
+
one WeakMap and one Map lookup instead of a walk. This recovers most of the query-building time
|
|
9
|
+
2.36.2 added: select +50% → +17%, create +30% → +20% against 2.36.1 (medians). The rest is tracked
|
|
10
|
+
in backlog 058.
|
|
11
|
+
|
|
12
|
+
## 2.36.2
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- [#355](https://github.com/linked-fw/core/pull/355) [`9b811aa`](https://github.com/linked-fw/core/commit/9b811aa2d4ec0a8ab9d5ecc259ab58bb5014ff74) Thanks [@flyon](https://github.com/flyon)! - A second copy of core in one runtime now sees the same module state and accepts the other copy's
|
|
17
|
+
values. The query-context map and its listeners, `LinkedFileStorage`'s stores, `LinkedErrorLogging`'s
|
|
18
|
+
logger, `Prefix`'s maps, ontology registrations and `autoLoadOntologyData`, the default page limit
|
|
19
|
+
(`DEFAULT_LIMIT` follows `setDefaultPageLimit` from any copy; new `getDefaultPageLimit()`), package
|
|
20
|
+
publish roots, node-shape callbacks, catalog adapters and `Shape.typesToShapes` are kept with
|
|
21
|
+
`sharedState`. New `brandLinkedClass(Cls, pkg, name)` and `isLinkedInstance(value, Cls)` extend the
|
|
22
|
+
error brands to any class: core brands `Shape`, `ShapeSet`, `CoreSet`, the six query builders,
|
|
23
|
+
`PendingQueryContext`, `FieldSet`, `PropertyPath`, `ExpressionNode`, `ExistsCondition` and the five
|
|
24
|
+
query-proxy classes, and its own class checks use `isLinkedInstance`. `UnresolvedShapeError` is now
|
|
25
|
+
branded, so `isLinkedError(err, UnresolvedShapeError)` matches one thrown by another copy.
|
|
26
|
+
|
|
3
27
|
## 2.36.1
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1395,6 +1395,25 @@ module runner and once by Node) or twice in a browser. Two conventions make that
|
|
|
1395
1395
|
if (isLinkedError(err, StoreError)) { /* … */ }
|
|
1396
1396
|
```
|
|
1397
1397
|
|
|
1398
|
+
- **Class checks on another package's values use `isLinkedInstance`.** `value instanceof Shape` is
|
|
1399
|
+
false for a value another copy of core made. `isLinkedInstance(value, Cls)` also matches it, for
|
|
1400
|
+
any class branded with `brandLinkedClass(Cls, '<pkg>', '<ClassName>')`, and falls back to
|
|
1401
|
+
`instanceof` for one that is not. Core brands `Shape`, `ShapeSet`, `CoreSet`, the query builders
|
|
1402
|
+
(`QueryBuilder`/`SelectBuilder`, `CreateBuilder`, `UpdateBuilder`, `DeleteBuilder`, `AskBuilder`,
|
|
1403
|
+
`CountBuilder`), `PendingQueryContext`, `FieldSet`, `PropertyPath`, `ExpressionNode`,
|
|
1404
|
+
`ExistsCondition` and the query-proxy classes. Pass `Sub.prototype` to ask whether `Sub` extends
|
|
1405
|
+
`Cls`.
|
|
1406
|
+
|
|
1407
|
+
```ts
|
|
1408
|
+
import {isLinkedInstance, Shape} from '@_linked/core';
|
|
1409
|
+
if (isLinkedInstance(input, Shape)) return input.id;
|
|
1410
|
+
```
|
|
1411
|
+
|
|
1412
|
+
Core's own module state (query contexts and their listeners, `LinkedFileStorage`'s stores,
|
|
1413
|
+
`LinkedErrorLogging`'s logger, `Prefix`, the default page limit, ontology registrations, package
|
|
1414
|
+
publish roots, node-shape callbacks and catalog adapters) is kept with `sharedState`, so every copy
|
|
1415
|
+
sees the same values.
|
|
1416
|
+
|
|
1398
1417
|
The full convention, including what stays per copy and how React contexts are handled, is in
|
|
1399
1418
|
[shared state and error brands](https://github.com/linked-fw/cli/blob/main/docs/architecture/shared-state-and-error-brands.md).
|
|
1400
1419
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { brandLinkedClass } from '../utils/linkedError.js';
|
|
1
2
|
export class CoreSet extends Set {
|
|
2
3
|
createNew(...args) {
|
|
3
4
|
return new this.constructor(...args);
|
|
@@ -129,4 +130,5 @@ export class CoreSet extends Set {
|
|
|
129
130
|
return this;
|
|
130
131
|
}
|
|
131
132
|
}
|
|
133
|
+
brandLinkedClass(CoreSet, '@_linked/core', 'CoreSet');
|
|
132
134
|
//# sourceMappingURL=CoreSet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoreSet.js","sourceRoot":"","sources":["../../../src/collections/CoreSet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CoreSet.js","sourceRoot":"","sources":["../../../src/collections/CoreSet.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport type {ICoreIterable} from '../interfaces/ICoreIterable.js';\nimport {brandLinkedClass} from '../utils/linkedError.js';\n\nexport class CoreSet<R> extends Set<R> implements ICoreIterable<R> {\n createNew(...args): this {\n return new (<any>this.constructor)(...args) as this;\n }\n\n filter(fn: (value: R, index: any, thisInstance: any) => any): this {\n var res: this = this.createNew();\n for (var item of this) {\n if (fn(item, item, this)) {\n res.add(item);\n }\n }\n return res;\n }\n\n reduce<U>(\n fn: (\n previousValue: U,\n currentValue: R,\n currentIndex: number,\n thisInstance: any,\n ) => U,\n initialValue: U,\n ): U {\n let i = 0;\n let res = initialValue;\n for (let item of this) {\n res = fn(res, item, i++, this);\n }\n return res;\n }\n\n /**\n * Returns the value of the first element in the Set where predicate is true, and undefined\n * otherwise.\n */\n find(\n predicate: (value: R, index: R, obj: CoreSet<R>) => boolean,\n thisArg?: any,\n ): R | undefined {\n for (let item of this) {\n if (predicate.apply(thisArg, [item, item, this])) {\n return item;\n }\n }\n return undefined;\n }\n\n first(): R | undefined {\n return this.values().next().value;\n }\n\n /**\n * Returns the last element added to the set\n */\n last(): R {\n //unfortunately there is no efficient way to do this. Either we convert the set to an array or we loop over all values to discover the last\n let item;\n for (item of this);\n return item;\n }\n\n getFirst(n: number) {\n return this.createNew([...this].slice(0, n));\n }\n\n slice(start?: number, end?: number) {\n return this.createNew([...this].slice(start, end));\n }\n\n sort(compareFn?: (a: R, b: R) => number, thisArg?): this {\n //convert this set to an array, sort it with provided parameters, create a new set of the same type and provide the sorted array as content\n var sortedArray = thisArg\n ? [...this].sort.apply(thisArg, [compareFn])\n : [...this].sort(compareFn);\n return this.createNew(sortedArray);\n }\n\n /**\n * Determines whether all the members of an array satisfy the specified test.\n * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n every(\n callbackfn: (item: R, set: CoreSet<R>) => boolean,\n thisArg?: any,\n ): boolean {\n for (let item of this) {\n if (!callbackfn.apply(thisArg, [item, this])) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether the specified callback function returns true for any element of an array.\n * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n some(\n callbackfn: (item: R, set: CoreSet<R>) => boolean,\n thisArg?: any,\n ): boolean {\n for (let item of this) {\n if (callbackfn.apply(thisArg, [item, this])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Calls a defined callback function on each element of the set, and returns an ARRAY that contains the results.\n * Note that this method returns an array so that sets can be more easily used with for example JSX\n * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n map<U>(callbackfn: (item: R, set: CoreSet<R>) => U, thisArg?: any): U[] {\n //NOTE: we changed this method so that it returns an array because it\n // causes trouble in ES5 when we create a new CoreSet and try to add the mapped results which may not have a unique toString() implementation (like in React)\n\n //create the result map, whos values will be 'mapped' into new values from the current values of this map\n var mapped: U[] = [];\n for (let item of this) {\n //do the mapping\n mapped.push(callbackfn.apply(thisArg, [item, this]));\n }\n return mapped;\n }\n\n concat(...sets: ICoreIterable<R>[]): this {\n var res = this.createNew(this);\n for (var set of sets) {\n set.forEach(res.add.bind(res));\n }\n return res;\n }\n\n clone(): this {\n return this.createNew(this);\n }\n\n reverse(): this {\n return this.createNew([...this].reverse());\n }\n\n print() {\n console.log(this.toString());\n }\n\n /**\n * Similar to concat, but adds all items to THIS set instead of creating a new one\n * @param sets\n */\n addFrom(...sets: ICoreIterable<R>[]): this {\n for (var set of sets) {\n if (set) {\n set.forEach(this.add.bind(this));\n }\n }\n return this;\n }\n}\nbrandLinkedClass(CoreSet, '@_linked/core', 'CoreSet');\n\n"]}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { CoreSet } from './CoreSet.js';
|
|
7
7
|
import { getLeastSpecificShapeClasses } from '../utils/ShapeClass.js';
|
|
8
|
+
import { brandLinkedClass } from '../utils/linkedError.js';
|
|
8
9
|
export class ShapeSet extends CoreSet {
|
|
9
10
|
constructor(iterable) {
|
|
10
11
|
super(iterable);
|
|
@@ -13,4 +14,5 @@ export class ShapeSet extends CoreSet {
|
|
|
13
14
|
return getLeastSpecificShapeClasses(this).shift();
|
|
14
15
|
}
|
|
15
16
|
}
|
|
17
|
+
brandLinkedClass(ShapeSet, '@_linked/core', 'ShapeSet');
|
|
16
18
|
//# sourceMappingURL=ShapeSet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShapeSet.js","sourceRoot":"","sources":["../../../src/collections/ShapeSet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,4BAA4B,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ShapeSet.js","sourceRoot":"","sources":["../../../src/collections/ShapeSet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,4BAA4B,EAAC,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAEzD,MAAM,OAAO,QAAkC,SAAQ,OAAU;IAC/D,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;QACnB,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;CACF;AACD,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC","sourcesContent":["/*\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport {CoreSet} from './CoreSet.js';\nimport {Shape} from '../shapes/Shape.js';\nimport {getLeastSpecificShapeClasses} from '../utils/ShapeClass.js';\nimport {brandLinkedClass} from '../utils/linkedError.js';\n\nexport class ShapeSet<R extends Shape = Shape> extends CoreSet<R> {\n constructor(iterable?: Iterable<R>) {\n super(iterable);\n }\n\n getLeastSpecificShape() {\n return getLeastSpecificShapeClasses(this).shift();\n }\n}\nbrandLinkedClass(ShapeSet, '@_linked/core', 'ShapeSet');\n\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ExpressionNode, toIRExpression } from './ExpressionNode.js';
|
|
2
|
+
import { isLinkedInstance } from '../utils/linkedError.js';
|
|
2
3
|
function wrap(input) {
|
|
3
|
-
return input
|
|
4
|
+
return isLinkedInstance(input, ExpressionNode)
|
|
4
5
|
? input
|
|
5
6
|
: new ExpressionNode(toIRExpression(input));
|
|
6
7
|
}
|
|
@@ -12,7 +13,7 @@ function wrap(input) {
|
|
|
12
13
|
function mergedRefs(inputs) {
|
|
13
14
|
const merged = new Map();
|
|
14
15
|
for (const input of inputs) {
|
|
15
|
-
if (input
|
|
16
|
+
if (isLinkedInstance(input, ExpressionNode)) {
|
|
16
17
|
for (const [k, v] of input._refs)
|
|
17
18
|
merged.set(k, v);
|
|
18
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Expr.js","sourceRoot":"","sources":["../../../src/expressions/Expr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Expr.js","sourceRoot":"","sources":["../../../src/expressions/Expr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAEzD,SAAS,IAAI,CAAC,KAAsB;IAClC,OAAO,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC;QAC5C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,MAAkC;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,6CAA6C;IAC7C,GAAG;QACD,OAAO,IAAI,cAAc,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;IAC5E,CAAC;IAED,wEAAwE;IACxE,MAAM,CAAC,GAAG,KAAwB;QAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,cAAc,CACvB;YACE,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;SAChC,EACD,UAAU,CAAC,KAAK,CAAC,CAClB,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,YAAY,CAAC,GAAG,IAAuB;QACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,cAAc,CACvB;YACE,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;SAC/B,EACD,UAAU,CAAC,IAAI,CAAC,CACjB,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,CACJ,IAAqB,EACrB,OAAwB,EACxB,OAAwB;QAExB,OAAO,IAAI,cAAc,CACvB;YACE,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;SAC/E,EACD,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,GAAG,CAAC,CAAkB;QACpB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;CACO,CAAC","sourcesContent":["import {ExpressionNode, toIRExpression} from './ExpressionNode.js';\nimport type {ExpressionInput, PropertyRefMap} from './ExpressionNode.js';\nimport {isLinkedInstance} from '../utils/linkedError.js';\n\nfunction wrap(input: ExpressionInput): ExpressionNode {\n return isLinkedInstance(input, ExpressionNode)\n ? input\n : new ExpressionNode(toIRExpression(input));\n}\n\n/**\n * Merge the unresolved property-ref maps of all ExpressionNode inputs, so\n * proxy-traced references (e.g. `p.name`) inside a directly-constructed\n * function expression still resolve to real aliases during lowering.\n */\nfunction mergedRefs(inputs: readonly ExpressionInput[]): PropertyRefMap {\n const merged = new Map<string, readonly string[]>();\n for (const input of inputs) {\n if (isLinkedInstance(input, ExpressionNode)) {\n for (const [k, v] of input._refs) merged.set(k, v);\n }\n }\n return merged;\n}\n\n/**\n * `Expr` — static builders for expressions that have **no natural fluent host**.\n *\n * The fluent form (`p.age.plus(1)`, `p.name.matches(/^A/)`) is the one true way to\n * build a *property-first* expression; every arithmetic/comparison/string/date/hash\n * operation lives there. `Expr` deliberately does **not** mirror them — that\n * duplication is what drifted (two names for one op). `Expr` carries only the\n * operations that can't start from a property proxy:\n *\n * - `now()` — nullary; there is nothing to chain off.\n * - `ifThen(c,t,e)`— ternary conditional; the condition is not a natural receiver.\n * - `firstDefined(…)` — variadic COALESCE; no natural first operand.\n * - `concat(…)` — variadic; also reads best literal-first (`Expr.concat('Hi ', p.name)`).\n * - `not(x)` — prefix negation; `Expr.not(cond)` reads better than `cond.not()`.\n */\nexport const Expr = {\n /** SPARQL `NOW()` — the current dateTime. */\n now(): ExpressionNode {\n return new ExpressionNode({kind: 'function_expr', name: 'NOW', args: []});\n },\n\n /** SPARQL `CONCAT(...)` — string concatenation of two or more parts. */\n concat(...parts: ExpressionInput[]): ExpressionNode {\n if (parts.length < 2) {\n throw new Error('Expr.concat() requires at least 2 arguments');\n }\n return new ExpressionNode(\n {\n kind: 'function_expr',\n name: 'CONCAT',\n args: parts.map(toIRExpression),\n },\n mergedRefs(parts),\n );\n },\n\n /** SPARQL `COALESCE(...)` — the first bound/defined value among two or more. */\n firstDefined(...args: ExpressionInput[]): ExpressionNode {\n if (args.length < 2) {\n throw new Error('Expr.firstDefined() requires at least 2 arguments');\n }\n return new ExpressionNode(\n {\n kind: 'function_expr',\n name: 'COALESCE',\n args: args.map(toIRExpression),\n },\n mergedRefs(args),\n );\n },\n\n /** SPARQL `IF(cond, then, else)`. */\n ifThen(\n cond: ExpressionInput,\n thenVal: ExpressionInput,\n elseVal: ExpressionInput,\n ): ExpressionNode {\n return new ExpressionNode(\n {\n kind: 'function_expr',\n name: 'IF',\n args: [toIRExpression(cond), toIRExpression(thenVal), toIRExpression(elseVal)],\n },\n mergedRefs([cond, thenVal, elseVal]),\n );\n },\n\n /** Prefix logical negation — `Expr.not(p.name.equals('Alice'))`. */\n not(a: ExpressionInput): ExpressionNode {\n return wrap(a).not();\n },\n} as const;\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PendingQueryContext } from '../queries/QueryContext.js';
|
|
2
|
+
import { brandLinkedClass, isLinkedInstance } from '../utils/linkedError.js';
|
|
2
3
|
const VALID_REGEX_FLAGS = new Set(['i', 'm', 's']);
|
|
3
4
|
function validateRegexFlags(flags) {
|
|
4
5
|
if (!flags)
|
|
@@ -10,7 +11,7 @@ function validateRegexFlags(flags) {
|
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
export function toIRExpression(input) {
|
|
13
|
-
if (input
|
|
14
|
+
if (isLinkedInstance(input, ExpressionNode))
|
|
14
15
|
return input.ir;
|
|
15
16
|
if (typeof input === 'string')
|
|
16
17
|
return { kind: 'literal_expr', value: input };
|
|
@@ -26,7 +27,7 @@ export function toIRExpression(input) {
|
|
|
26
27
|
if (input instanceof Date)
|
|
27
28
|
return { kind: 'literal_expr', value: input };
|
|
28
29
|
// A live query-context reference → carry the name; `lower()` resolves it.
|
|
29
|
-
if (input
|
|
30
|
+
if (isLinkedInstance(input, PendingQueryContext))
|
|
30
31
|
return { kind: 'reference_expr', contextName: input.contextName };
|
|
31
32
|
if (typeof input === 'object' && input !== null && 'id' in input)
|
|
32
33
|
return { kind: 'reference_expr', value: input.id };
|
|
@@ -47,7 +48,7 @@ export class ExpressionNode {
|
|
|
47
48
|
_derive(ir, ...others) {
|
|
48
49
|
const merged = new Map(this._refs);
|
|
49
50
|
for (const other of others) {
|
|
50
|
-
if (other
|
|
51
|
+
if (isLinkedInstance(other, ExpressionNode)) {
|
|
51
52
|
for (const [k, v] of other._refs)
|
|
52
53
|
merged.set(k, v);
|
|
53
54
|
}
|
|
@@ -283,6 +284,7 @@ export class ExpressionNode {
|
|
|
283
284
|
sha256() { return this._wrap(fnExpr('SHA256', this.ir)); }
|
|
284
285
|
sha512() { return this._wrap(fnExpr('SHA512', this.ir)); }
|
|
285
286
|
}
|
|
287
|
+
brandLinkedClass(ExpressionNode, '@_linked/core', 'ExpressionNode');
|
|
286
288
|
// ---------------------------------------------------------------------------
|
|
287
289
|
// Proxy tracing helpers
|
|
288
290
|
// ---------------------------------------------------------------------------
|
|
@@ -403,24 +405,25 @@ export class ExistsCondition {
|
|
|
403
405
|
and(other) {
|
|
404
406
|
return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [
|
|
405
407
|
...this._chain,
|
|
406
|
-
{ op: 'and', condition: other
|
|
408
|
+
{ op: 'and', condition: isLinkedInstance(other, ExistsCondition) ? other : isLinkedInstance(other, ExpressionNode) ? other : new ExpressionNode(toIRExpression(other)) },
|
|
407
409
|
]);
|
|
408
410
|
}
|
|
409
411
|
or(other) {
|
|
410
412
|
return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [
|
|
411
413
|
...this._chain,
|
|
412
|
-
{ op: 'or', condition: other
|
|
414
|
+
{ op: 'or', condition: isLinkedInstance(other, ExistsCondition) ? other : isLinkedInstance(other, ExpressionNode) ? other : new ExpressionNode(toIRExpression(other)) },
|
|
413
415
|
]);
|
|
414
416
|
}
|
|
415
417
|
get chain() {
|
|
416
418
|
return this._chain;
|
|
417
419
|
}
|
|
418
420
|
}
|
|
421
|
+
brandLinkedClass(ExistsCondition, '@_linked/core', 'ExistsCondition');
|
|
419
422
|
export function isExistsCondition(value) {
|
|
420
|
-
return value
|
|
423
|
+
return isLinkedInstance(value, ExistsCondition);
|
|
421
424
|
}
|
|
422
425
|
/** Check if a value is an ExpressionNode. */
|
|
423
426
|
export function isExpressionNode(value) {
|
|
424
|
-
return value
|
|
427
|
+
return isLinkedInstance(value, ExpressionNode);
|
|
425
428
|
}
|
|
426
429
|
//# sourceMappingURL=ExpressionNode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpressionNode.js","sourceRoot":"","sources":["../../../src/expressions/ExpressionNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IRBinaryOperator,\n IRExpression,\n} from '../queries/IntermediateRepresentation.js';\nimport {PendingQueryContext} from '../queries/QueryContext.js';\n\nexport type ExpressionInput = ExpressionNode | string | number | boolean | Date | PendingQueryContext;\n\n/**\n * Map from placeholder sourceAlias → PropertyShapeData ID segments.\n * Used to track unresolved property references from proxy tracing\n * that need to be resolved during IR lowering.\n */\nexport type PropertyRefMap = ReadonlyMap<string, readonly string[]>;\n\nconst VALID_REGEX_FLAGS = new Set(['i', 'm', 's']);\n\nfunction validateRegexFlags(flags: string | undefined): void {\n if (!flags) return;\n for (const ch of flags) {\n if (!VALID_REGEX_FLAGS.has(ch)) {\n throw new Error(\n `Unsupported regex flag \"${ch}\". Only \"i\", \"m\", \"s\" are supported.`,\n );\n }\n }\n}\n\nexport function toIRExpression(input: ExpressionInput): IRExpression {\n if (input instanceof ExpressionNode) return input.ir;\n if (typeof input === 'string')\n return {kind: 'literal_expr', value: input};\n if (typeof input === 'number')\n return {kind: 'literal_expr', value: input};\n if (typeof input === 'boolean')\n return {kind: 'literal_expr', value: input};\n // The `Date` is carried through as a Date, NOT flattened to its ISO string.\n // `IRLiteralValue` admits one, and the SPARQL layer needs the JS type to know\n // it must emit a TYPED literal: a plain `\"2020-01-01T00:00:00.000Z\"` never\n // equals the `^^xsd:dateTime` term the mutation side writes, so flattening\n // here made every date comparison silently match nothing.\n if (input instanceof Date) return {kind: 'literal_expr', value: input};\n // A live query-context reference → carry the name; `lower()` resolves it.\n if (input instanceof PendingQueryContext)\n return {kind: 'reference_expr', contextName: input.contextName};\n if (typeof input === 'object' && input !== null && 'id' in input)\n return {kind: 'reference_expr', value: (input as {id: string}).id};\n throw new Error(`Invalid expression input: ${input}`);\n}\n\nfunction binary(\n op: IRBinaryOperator,\n left: IRExpression,\n right: ExpressionInput,\n): IRExpression {\n return {kind: 'binary_expr', operator: op, left, right: toIRExpression(right)};\n}\n\nfunction fnExpr(name: string, ...args: IRExpression[]): IRExpression {\n return {kind: 'function_expr', name, args};\n}\n\nexport class ExpressionNode {\n /** Property reference map for unresolved proxy-traced property references. */\n readonly _refs: PropertyRefMap;\n\n constructor(\n public readonly ir: IRExpression,\n refs?: PropertyRefMap,\n ) {\n this._refs = refs ?? new Map();\n }\n\n /** Create a derived node that merges refs from this and other inputs. */\n private _derive(ir: IRExpression, ...others: ExpressionInput[]): ExpressionNode {\n const merged = new Map(this._refs);\n for (const other of others) {\n if (other instanceof ExpressionNode) {\n for (const [k, v] of other._refs) merged.set(k, v);\n }\n }\n return new ExpressionNode(ir, merged);\n }\n\n /** Create a derived node with no additional inputs. */\n private _wrap(ir: IRExpression): ExpressionNode {\n return new ExpressionNode(ir, this._refs);\n }\n\n // ---------------------------------------------------------------------------\n // Arithmetic\n // ---------------------------------------------------------------------------\n\n plus(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('+', this.ir, n), n);\n }\n\n minus(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('-', this.ir, n), n);\n }\n\n times(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('*', this.ir, n), n);\n }\n\n divide(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('/', this.ir, n), n);\n }\n\n abs(): ExpressionNode {\n return this._wrap(fnExpr('ABS', this.ir));\n }\n\n round(): ExpressionNode {\n return this._wrap(fnExpr('ROUND', this.ir));\n }\n\n ceil(): ExpressionNode {\n return this._wrap(fnExpr('CEIL', this.ir));\n }\n\n floor(): ExpressionNode {\n return this._wrap(fnExpr('FLOOR', this.ir));\n }\n\n power(n: number): ExpressionNode {\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(\n `power() exponent must be a positive integer, got ${n}`,\n );\n }\n if (n > 20) {\n throw new Error(\n `power() exponent must be ≤ 20 to avoid query bloat, got ${n}`,\n );\n }\n if (n === 1) return new ExpressionNode(this.ir, this._refs);\n let result: IRExpression = this.ir;\n for (let i = 1; i < n; i++) {\n result = {kind: 'binary_expr', operator: '*', left: result, right: this.ir};\n }\n return new ExpressionNode(result, this._refs);\n }\n\n // ---------------------------------------------------------------------------\n // Comparison (short + long aliases)\n // ---------------------------------------------------------------------------\n\n eq(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('=', this.ir, v), v);\n }\n equals(v: ExpressionInput): ExpressionNode {\n return this.eq(v);\n }\n\n neq(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('!=', this.ir, v), v);\n }\n notEquals(v: ExpressionInput): ExpressionNode {\n return this.neq(v);\n }\n\n gt(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('>', this.ir, v), v);\n }\n greaterThan(v: ExpressionInput): ExpressionNode {\n return this.gt(v);\n }\n\n gte(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('>=', this.ir, v), v);\n }\n greaterThanOrEqual(v: ExpressionInput): ExpressionNode {\n return this.gte(v);\n }\n\n lt(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('<', this.ir, v), v);\n }\n lessThan(v: ExpressionInput): ExpressionNode {\n return this.lt(v);\n }\n\n lte(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('<=', this.ir, v), v);\n }\n lessThanOrEqual(v: ExpressionInput): ExpressionNode {\n return this.lte(v);\n }\n\n // ---------------------------------------------------------------------------\n // Membership — `value IN (…)` / `NOT IN (…)`\n // ---------------------------------------------------------------------------\n\n /** True when this value is one of `values` (SPARQL `IN`). Empty list → matches nothing. */\n oneOf(values: ExpressionInput[]): ExpressionNode {\n return this._derive(\n {kind: 'in_expr', negated: false, value: this.ir, source: {list: values.map(toIRExpression)}},\n ...values,\n );\n }\n /** True when this value is NOT one of `values` (SPARQL `NOT IN`). Empty list → matches everything. */\n notOneOf(values: ExpressionInput[]): ExpressionNode {\n return this._derive(\n {kind: 'in_expr', negated: true, value: this.ir, source: {list: values.map(toIRExpression)}},\n ...values,\n );\n }\n\n // ---------------------------------------------------------------------------\n // String\n // ---------------------------------------------------------------------------\n\n concat(...parts: ExpressionInput[]): ExpressionNode {\n return this._derive(\n fnExpr('CONCAT', this.ir, ...parts.map(toIRExpression)),\n ...parts,\n );\n }\n\n contains(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('CONTAINS', this.ir, toIRExpression(s)), s);\n }\n\n startsWith(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRSTARTS', this.ir, toIRExpression(s)), s);\n }\n\n endsWith(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRENDS', this.ir, toIRExpression(s)), s);\n }\n\n substr(start: number, len?: number): ExpressionNode {\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: start},\n ];\n if (len !== undefined) {\n args.push({kind: 'literal_expr', value: len});\n }\n return this._wrap(fnExpr('SUBSTR', ...args));\n }\n\n before(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRBEFORE', this.ir, toIRExpression(s)), s);\n }\n\n after(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRAFTER', this.ir, toIRExpression(s)), s);\n }\n\n replace(pat: string, rep: string, flags?: string): ExpressionNode {\n validateRegexFlags(flags);\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: pat},\n {kind: 'literal_expr', value: rep},\n ];\n if (flags) {\n args.push({kind: 'literal_expr', value: flags});\n }\n return this._wrap(fnExpr('REPLACE', ...args));\n }\n\n ucase(): ExpressionNode {\n return this._wrap(fnExpr('UCASE', this.ir));\n }\n\n lcase(): ExpressionNode {\n return this._wrap(fnExpr('LCASE', this.ir));\n }\n\n strlen(): ExpressionNode {\n return this._wrap(fnExpr('STRLEN', this.ir));\n }\n\n encodeForUri(): ExpressionNode {\n return this._wrap(fnExpr('ENCODE_FOR_URI', this.ir));\n }\n\n matches(pat: string, flags?: string): ExpressionNode {\n validateRegexFlags(flags);\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: pat},\n ];\n if (flags) {\n args.push({kind: 'literal_expr', value: flags});\n }\n return this._wrap(fnExpr('REGEX', ...args));\n }\n\n // ---------------------------------------------------------------------------\n // Date/Time\n // ---------------------------------------------------------------------------\n\n year(): ExpressionNode { return this._wrap(fnExpr('YEAR', this.ir)); }\n month(): ExpressionNode { return this._wrap(fnExpr('MONTH', this.ir)); }\n day(): ExpressionNode { return this._wrap(fnExpr('DAY', this.ir)); }\n hours(): ExpressionNode { return this._wrap(fnExpr('HOURS', this.ir)); }\n minutes(): ExpressionNode { return this._wrap(fnExpr('MINUTES', this.ir)); }\n seconds(): ExpressionNode { return this._wrap(fnExpr('SECONDS', this.ir)); }\n timezone(): ExpressionNode { return this._wrap(fnExpr('TIMEZONE', this.ir)); }\n tz(): ExpressionNode { return this._wrap(fnExpr('TZ', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Logical\n // ---------------------------------------------------------------------------\n\n and(expr: ExpressionInput): ExpressionNode {\n return this._derive({\n kind: 'logical_expr',\n operator: 'and',\n expressions: [this.ir, toIRExpression(expr)],\n }, expr);\n }\n\n or(expr: ExpressionInput): ExpressionNode {\n return this._derive({\n kind: 'logical_expr',\n operator: 'or',\n expressions: [this.ir, toIRExpression(expr)],\n }, expr);\n }\n\n not(): ExpressionNode {\n return this._wrap({kind: 'not_expr', expression: this.ir});\n }\n\n // ---------------------------------------------------------------------------\n // Null-handling\n // ---------------------------------------------------------------------------\n\n isDefined(): ExpressionNode {\n return this._wrap(fnExpr('BOUND', this.ir));\n }\n\n isNotDefined(): ExpressionNode {\n return this._wrap({\n kind: 'not_expr',\n expression: fnExpr('BOUND', this.ir),\n });\n }\n\n defaultTo(fallback: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('COALESCE', this.ir, toIRExpression(fallback)), fallback);\n }\n\n // ---------------------------------------------------------------------------\n // RDF introspection\n // ---------------------------------------------------------------------------\n\n lang(): ExpressionNode { return this._wrap(fnExpr('LANG', this.ir)); }\n datatype(): ExpressionNode { return this._wrap(fnExpr('DATATYPE', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Type casting / checking\n // ---------------------------------------------------------------------------\n\n str(): ExpressionNode { return this._wrap(fnExpr('STR', this.ir)); }\n iri(): ExpressionNode { return this._wrap(fnExpr('IRI', this.ir)); }\n isIri(): ExpressionNode { return this._wrap(fnExpr('isIRI', this.ir)); }\n isLiteral(): ExpressionNode { return this._wrap(fnExpr('isLiteral', this.ir)); }\n isBlank(): ExpressionNode { return this._wrap(fnExpr('isBlank', this.ir)); }\n isNumeric(): ExpressionNode { return this._wrap(fnExpr('isNumeric', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Hash\n // ---------------------------------------------------------------------------\n\n md5(): ExpressionNode { return this._wrap(fnExpr('MD5', this.ir)); }\n sha256(): ExpressionNode { return this._wrap(fnExpr('SHA256', this.ir)); }\n sha512(): ExpressionNode { return this._wrap(fnExpr('SHA512', this.ir)); }\n}\n\n// ---------------------------------------------------------------------------\n// Proxy tracing helpers\n// ---------------------------------------------------------------------------\n\nlet _refCounter = 0;\n\n/**\n * Create an ExpressionNode from a proxy-traced property access.\n * Uses a placeholder sourceAlias that gets resolved during IR lowering.\n *\n * The segments array maps to a property path (e.g. ['bestFriend', 'name']).\n * Only the last segment becomes the property_expr's .property; earlier segments\n * are stored in the refs map and resolved as traversals during lowering.\n */\nexport function tracedPropertyExpression(\n segmentIds: readonly string[],\n): ExpressionNode {\n const placeholder = `__ref_${_refCounter++}__`;\n const lastSegment = segmentIds[segmentIds.length - 1];\n const ir: IRExpression = {\n kind: 'property_expr',\n sourceAlias: placeholder,\n property: lastSegment,\n };\n const refs = new Map<string, readonly string[]>([[placeholder, segmentIds]]);\n return new ExpressionNode(ir, refs);\n}\n\n/**\n * Create a traced expression that resolves to an alias reference (the entity itself,\n * not a property on it). Used for root shape comparisons like `p.equals(entity)`.\n * The traversalSegmentIds are walked to resolve the alias, then the result is alias_expr.\n */\nexport function tracedAliasExpression(\n traversalSegmentIds: readonly string[],\n): ExpressionNode {\n const placeholder = `__alias_ref_${_refCounter++}__`;\n const ir: IRExpression = {\n kind: 'alias_expr',\n alias: placeholder,\n };\n const refs = new Map<string, readonly string[]>([[placeholder, traversalSegmentIds]]);\n return new ExpressionNode(ir, refs);\n}\n\n/**\n * Resolve unresolved property references in an IRExpression tree.\n * Walks the tree and replaces placeholder sourceAlias values with\n * real aliases resolved via pathOptions.\n */\nexport function resolveExpressionRefs(\n expr: IRExpression,\n refs: PropertyRefMap,\n rootAlias: string,\n resolveTraversal: (fromAlias: string, propertyShapeId: string) => string,\n): IRExpression {\n if (refs.size === 0) return expr;\n\n const resolve = (e: IRExpression): IRExpression => {\n switch (e.kind) {\n case 'property_expr': {\n const segments = refs.get(e.sourceAlias);\n if (!segments) return e;\n // Resolve: first N-1 segments are traversals, last is property\n let currentAlias = rootAlias;\n for (let i = 0; i < segments.length - 1; i++) {\n currentAlias = resolveTraversal(currentAlias, segments[i]);\n }\n return {\n kind: 'property_expr',\n sourceAlias: currentAlias,\n property: segments[segments.length - 1],\n };\n }\n case 'alias_expr': {\n const segments = refs.get(e.alias);\n if (!segments) return e;\n // Resolve all segments as traversals, return alias_expr for the final alias\n let currentAlias = rootAlias;\n for (const seg of segments) {\n currentAlias = resolveTraversal(currentAlias, seg);\n }\n return {kind: 'alias_expr', alias: currentAlias};\n }\n case 'binary_expr':\n return {\n ...e,\n left: resolve(e.left),\n right: resolve(e.right),\n };\n case 'in_expr':\n return {\n ...e,\n value: resolve(e.value),\n source: {list: e.source.list.map(resolve)},\n };\n case 'function_expr':\n return {...e, args: e.args.map(resolve)};\n case 'aggregate_expr':\n return {...e, args: e.args.map(resolve)};\n case 'logical_expr':\n return {...e, expressions: e.expressions.map(resolve)};\n case 'not_expr':\n return {...e, expression: resolve(e.expression)};\n default:\n return e;\n }\n };\n\n return resolve(expr);\n}\n\n/**\n * Represents an EXISTS quantifier condition over a collection path.\n * Used by .some(), .every(), .none() on QueryShapeSet.\n * Supports .and() / .or() / .not() chaining to compose with other conditions.\n *\n * The desugar/lower pipeline recognizes this via isExistsCondition() and builds\n * IRExistsExpression with proper traversal patterns and aliases.\n */\nexport class ExistsCondition {\n constructor(\n /** PropertyShapeData IDs forming the path from root to the collection. */\n public readonly pathSegmentIds: readonly string[],\n /** The inner predicate ExpressionNode. */\n public readonly predicate: ExpressionNode,\n /** Whether the EXISTS is negated (NOT EXISTS). */\n public readonly negated: boolean = false,\n /** Optional chained and/or conditions. */\n private readonly _chain: Array<{op: 'and' | 'or'; condition: ExpressionNode | ExistsCondition}> = [],\n ) {}\n\n not(): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, !this.negated, this._chain);\n }\n\n and(other: ExpressionInput | ExistsCondition): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [\n ...this._chain,\n {op: 'and', condition: other instanceof ExistsCondition ? other : other instanceof ExpressionNode ? other : new ExpressionNode(toIRExpression(other))},\n ]);\n }\n\n or(other: ExpressionInput | ExistsCondition): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [\n ...this._chain,\n {op: 'or', condition: other instanceof ExistsCondition ? other : other instanceof ExpressionNode ? other : new ExpressionNode(toIRExpression(other))},\n ]);\n }\n\n get chain(): ReadonlyArray<{op: 'and' | 'or'; condition: ExpressionNode | ExistsCondition}> {\n return this._chain;\n }\n}\n\nexport function isExistsCondition(value: unknown): value is ExistsCondition {\n return value instanceof ExistsCondition;\n}\n\n/** Check if a value is an ExpressionNode. */\nexport function isExpressionNode(value: unknown): value is ExpressionNode {\n return value instanceof ExpressionNode;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExpressionNode.js","sourceRoot":"","sources":["../../../src/expressions/ExpressionNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IRBinaryOperator,\n IRExpression,\n} from '../queries/IntermediateRepresentation.js';\nimport {PendingQueryContext} from '../queries/QueryContext.js';\nimport {brandLinkedClass, isLinkedInstance} from '../utils/linkedError.js';\n\nexport type ExpressionInput = ExpressionNode | string | number | boolean | Date | PendingQueryContext;\n\n/**\n * Map from placeholder sourceAlias → PropertyShapeData ID segments.\n * Used to track unresolved property references from proxy tracing\n * that need to be resolved during IR lowering.\n */\nexport type PropertyRefMap = ReadonlyMap<string, readonly string[]>;\n\nconst VALID_REGEX_FLAGS = new Set(['i', 'm', 's']);\n\nfunction validateRegexFlags(flags: string | undefined): void {\n if (!flags) return;\n for (const ch of flags) {\n if (!VALID_REGEX_FLAGS.has(ch)) {\n throw new Error(\n `Unsupported regex flag \"${ch}\". Only \"i\", \"m\", \"s\" are supported.`,\n );\n }\n }\n}\n\nexport function toIRExpression(input: ExpressionInput): IRExpression {\n if (isLinkedInstance(input, ExpressionNode)) return input.ir;\n if (typeof input === 'string')\n return {kind: 'literal_expr', value: input};\n if (typeof input === 'number')\n return {kind: 'literal_expr', value: input};\n if (typeof input === 'boolean')\n return {kind: 'literal_expr', value: input};\n // The `Date` is carried through as a Date, NOT flattened to its ISO string.\n // `IRLiteralValue` admits one, and the SPARQL layer needs the JS type to know\n // it must emit a TYPED literal: a plain `\"2020-01-01T00:00:00.000Z\"` never\n // equals the `^^xsd:dateTime` term the mutation side writes, so flattening\n // here made every date comparison silently match nothing.\n if (input instanceof Date) return {kind: 'literal_expr', value: input};\n // A live query-context reference → carry the name; `lower()` resolves it.\n if (isLinkedInstance(input, PendingQueryContext))\n return {kind: 'reference_expr', contextName: input.contextName};\n if (typeof input === 'object' && input !== null && 'id' in input)\n return {kind: 'reference_expr', value: (input as {id: string}).id};\n throw new Error(`Invalid expression input: ${input}`);\n}\n\nfunction binary(\n op: IRBinaryOperator,\n left: IRExpression,\n right: ExpressionInput,\n): IRExpression {\n return {kind: 'binary_expr', operator: op, left, right: toIRExpression(right)};\n}\n\nfunction fnExpr(name: string, ...args: IRExpression[]): IRExpression {\n return {kind: 'function_expr', name, args};\n}\n\nexport class ExpressionNode {\n /** Property reference map for unresolved proxy-traced property references. */\n readonly _refs: PropertyRefMap;\n\n constructor(\n public readonly ir: IRExpression,\n refs?: PropertyRefMap,\n ) {\n this._refs = refs ?? new Map();\n }\n\n /** Create a derived node that merges refs from this and other inputs. */\n private _derive(ir: IRExpression, ...others: ExpressionInput[]): ExpressionNode {\n const merged = new Map(this._refs);\n for (const other of others) {\n if (isLinkedInstance(other, ExpressionNode)) {\n for (const [k, v] of other._refs) merged.set(k, v);\n }\n }\n return new ExpressionNode(ir, merged);\n }\n\n /** Create a derived node with no additional inputs. */\n private _wrap(ir: IRExpression): ExpressionNode {\n return new ExpressionNode(ir, this._refs);\n }\n\n // ---------------------------------------------------------------------------\n // Arithmetic\n // ---------------------------------------------------------------------------\n\n plus(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('+', this.ir, n), n);\n }\n\n minus(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('-', this.ir, n), n);\n }\n\n times(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('*', this.ir, n), n);\n }\n\n divide(n: ExpressionInput): ExpressionNode {\n return this._derive(binary('/', this.ir, n), n);\n }\n\n abs(): ExpressionNode {\n return this._wrap(fnExpr('ABS', this.ir));\n }\n\n round(): ExpressionNode {\n return this._wrap(fnExpr('ROUND', this.ir));\n }\n\n ceil(): ExpressionNode {\n return this._wrap(fnExpr('CEIL', this.ir));\n }\n\n floor(): ExpressionNode {\n return this._wrap(fnExpr('FLOOR', this.ir));\n }\n\n power(n: number): ExpressionNode {\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(\n `power() exponent must be a positive integer, got ${n}`,\n );\n }\n if (n > 20) {\n throw new Error(\n `power() exponent must be ≤ 20 to avoid query bloat, got ${n}`,\n );\n }\n if (n === 1) return new ExpressionNode(this.ir, this._refs);\n let result: IRExpression = this.ir;\n for (let i = 1; i < n; i++) {\n result = {kind: 'binary_expr', operator: '*', left: result, right: this.ir};\n }\n return new ExpressionNode(result, this._refs);\n }\n\n // ---------------------------------------------------------------------------\n // Comparison (short + long aliases)\n // ---------------------------------------------------------------------------\n\n eq(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('=', this.ir, v), v);\n }\n equals(v: ExpressionInput): ExpressionNode {\n return this.eq(v);\n }\n\n neq(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('!=', this.ir, v), v);\n }\n notEquals(v: ExpressionInput): ExpressionNode {\n return this.neq(v);\n }\n\n gt(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('>', this.ir, v), v);\n }\n greaterThan(v: ExpressionInput): ExpressionNode {\n return this.gt(v);\n }\n\n gte(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('>=', this.ir, v), v);\n }\n greaterThanOrEqual(v: ExpressionInput): ExpressionNode {\n return this.gte(v);\n }\n\n lt(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('<', this.ir, v), v);\n }\n lessThan(v: ExpressionInput): ExpressionNode {\n return this.lt(v);\n }\n\n lte(v: ExpressionInput): ExpressionNode {\n return this._derive(binary('<=', this.ir, v), v);\n }\n lessThanOrEqual(v: ExpressionInput): ExpressionNode {\n return this.lte(v);\n }\n\n // ---------------------------------------------------------------------------\n // Membership — `value IN (…)` / `NOT IN (…)`\n // ---------------------------------------------------------------------------\n\n /** True when this value is one of `values` (SPARQL `IN`). Empty list → matches nothing. */\n oneOf(values: ExpressionInput[]): ExpressionNode {\n return this._derive(\n {kind: 'in_expr', negated: false, value: this.ir, source: {list: values.map(toIRExpression)}},\n ...values,\n );\n }\n /** True when this value is NOT one of `values` (SPARQL `NOT IN`). Empty list → matches everything. */\n notOneOf(values: ExpressionInput[]): ExpressionNode {\n return this._derive(\n {kind: 'in_expr', negated: true, value: this.ir, source: {list: values.map(toIRExpression)}},\n ...values,\n );\n }\n\n // ---------------------------------------------------------------------------\n // String\n // ---------------------------------------------------------------------------\n\n concat(...parts: ExpressionInput[]): ExpressionNode {\n return this._derive(\n fnExpr('CONCAT', this.ir, ...parts.map(toIRExpression)),\n ...parts,\n );\n }\n\n contains(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('CONTAINS', this.ir, toIRExpression(s)), s);\n }\n\n startsWith(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRSTARTS', this.ir, toIRExpression(s)), s);\n }\n\n endsWith(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRENDS', this.ir, toIRExpression(s)), s);\n }\n\n substr(start: number, len?: number): ExpressionNode {\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: start},\n ];\n if (len !== undefined) {\n args.push({kind: 'literal_expr', value: len});\n }\n return this._wrap(fnExpr('SUBSTR', ...args));\n }\n\n before(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRBEFORE', this.ir, toIRExpression(s)), s);\n }\n\n after(s: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('STRAFTER', this.ir, toIRExpression(s)), s);\n }\n\n replace(pat: string, rep: string, flags?: string): ExpressionNode {\n validateRegexFlags(flags);\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: pat},\n {kind: 'literal_expr', value: rep},\n ];\n if (flags) {\n args.push({kind: 'literal_expr', value: flags});\n }\n return this._wrap(fnExpr('REPLACE', ...args));\n }\n\n ucase(): ExpressionNode {\n return this._wrap(fnExpr('UCASE', this.ir));\n }\n\n lcase(): ExpressionNode {\n return this._wrap(fnExpr('LCASE', this.ir));\n }\n\n strlen(): ExpressionNode {\n return this._wrap(fnExpr('STRLEN', this.ir));\n }\n\n encodeForUri(): ExpressionNode {\n return this._wrap(fnExpr('ENCODE_FOR_URI', this.ir));\n }\n\n matches(pat: string, flags?: string): ExpressionNode {\n validateRegexFlags(flags);\n const args: IRExpression[] = [\n this.ir,\n {kind: 'literal_expr', value: pat},\n ];\n if (flags) {\n args.push({kind: 'literal_expr', value: flags});\n }\n return this._wrap(fnExpr('REGEX', ...args));\n }\n\n // ---------------------------------------------------------------------------\n // Date/Time\n // ---------------------------------------------------------------------------\n\n year(): ExpressionNode { return this._wrap(fnExpr('YEAR', this.ir)); }\n month(): ExpressionNode { return this._wrap(fnExpr('MONTH', this.ir)); }\n day(): ExpressionNode { return this._wrap(fnExpr('DAY', this.ir)); }\n hours(): ExpressionNode { return this._wrap(fnExpr('HOURS', this.ir)); }\n minutes(): ExpressionNode { return this._wrap(fnExpr('MINUTES', this.ir)); }\n seconds(): ExpressionNode { return this._wrap(fnExpr('SECONDS', this.ir)); }\n timezone(): ExpressionNode { return this._wrap(fnExpr('TIMEZONE', this.ir)); }\n tz(): ExpressionNode { return this._wrap(fnExpr('TZ', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Logical\n // ---------------------------------------------------------------------------\n\n and(expr: ExpressionInput): ExpressionNode {\n return this._derive({\n kind: 'logical_expr',\n operator: 'and',\n expressions: [this.ir, toIRExpression(expr)],\n }, expr);\n }\n\n or(expr: ExpressionInput): ExpressionNode {\n return this._derive({\n kind: 'logical_expr',\n operator: 'or',\n expressions: [this.ir, toIRExpression(expr)],\n }, expr);\n }\n\n not(): ExpressionNode {\n return this._wrap({kind: 'not_expr', expression: this.ir});\n }\n\n // ---------------------------------------------------------------------------\n // Null-handling\n // ---------------------------------------------------------------------------\n\n isDefined(): ExpressionNode {\n return this._wrap(fnExpr('BOUND', this.ir));\n }\n\n isNotDefined(): ExpressionNode {\n return this._wrap({\n kind: 'not_expr',\n expression: fnExpr('BOUND', this.ir),\n });\n }\n\n defaultTo(fallback: ExpressionInput): ExpressionNode {\n return this._derive(fnExpr('COALESCE', this.ir, toIRExpression(fallback)), fallback);\n }\n\n // ---------------------------------------------------------------------------\n // RDF introspection\n // ---------------------------------------------------------------------------\n\n lang(): ExpressionNode { return this._wrap(fnExpr('LANG', this.ir)); }\n datatype(): ExpressionNode { return this._wrap(fnExpr('DATATYPE', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Type casting / checking\n // ---------------------------------------------------------------------------\n\n str(): ExpressionNode { return this._wrap(fnExpr('STR', this.ir)); }\n iri(): ExpressionNode { return this._wrap(fnExpr('IRI', this.ir)); }\n isIri(): ExpressionNode { return this._wrap(fnExpr('isIRI', this.ir)); }\n isLiteral(): ExpressionNode { return this._wrap(fnExpr('isLiteral', this.ir)); }\n isBlank(): ExpressionNode { return this._wrap(fnExpr('isBlank', this.ir)); }\n isNumeric(): ExpressionNode { return this._wrap(fnExpr('isNumeric', this.ir)); }\n\n // ---------------------------------------------------------------------------\n // Hash\n // ---------------------------------------------------------------------------\n\n md5(): ExpressionNode { return this._wrap(fnExpr('MD5', this.ir)); }\n sha256(): ExpressionNode { return this._wrap(fnExpr('SHA256', this.ir)); }\n sha512(): ExpressionNode { return this._wrap(fnExpr('SHA512', this.ir)); }\n}\nbrandLinkedClass(ExpressionNode, '@_linked/core', 'ExpressionNode');\n\n\n// ---------------------------------------------------------------------------\n// Proxy tracing helpers\n// ---------------------------------------------------------------------------\n\nlet _refCounter = 0;\n\n/**\n * Create an ExpressionNode from a proxy-traced property access.\n * Uses a placeholder sourceAlias that gets resolved during IR lowering.\n *\n * The segments array maps to a property path (e.g. ['bestFriend', 'name']).\n * Only the last segment becomes the property_expr's .property; earlier segments\n * are stored in the refs map and resolved as traversals during lowering.\n */\nexport function tracedPropertyExpression(\n segmentIds: readonly string[],\n): ExpressionNode {\n const placeholder = `__ref_${_refCounter++}__`;\n const lastSegment = segmentIds[segmentIds.length - 1];\n const ir: IRExpression = {\n kind: 'property_expr',\n sourceAlias: placeholder,\n property: lastSegment,\n };\n const refs = new Map<string, readonly string[]>([[placeholder, segmentIds]]);\n return new ExpressionNode(ir, refs);\n}\n\n/**\n * Create a traced expression that resolves to an alias reference (the entity itself,\n * not a property on it). Used for root shape comparisons like `p.equals(entity)`.\n * The traversalSegmentIds are walked to resolve the alias, then the result is alias_expr.\n */\nexport function tracedAliasExpression(\n traversalSegmentIds: readonly string[],\n): ExpressionNode {\n const placeholder = `__alias_ref_${_refCounter++}__`;\n const ir: IRExpression = {\n kind: 'alias_expr',\n alias: placeholder,\n };\n const refs = new Map<string, readonly string[]>([[placeholder, traversalSegmentIds]]);\n return new ExpressionNode(ir, refs);\n}\n\n/**\n * Resolve unresolved property references in an IRExpression tree.\n * Walks the tree and replaces placeholder sourceAlias values with\n * real aliases resolved via pathOptions.\n */\nexport function resolveExpressionRefs(\n expr: IRExpression,\n refs: PropertyRefMap,\n rootAlias: string,\n resolveTraversal: (fromAlias: string, propertyShapeId: string) => string,\n): IRExpression {\n if (refs.size === 0) return expr;\n\n const resolve = (e: IRExpression): IRExpression => {\n switch (e.kind) {\n case 'property_expr': {\n const segments = refs.get(e.sourceAlias);\n if (!segments) return e;\n // Resolve: first N-1 segments are traversals, last is property\n let currentAlias = rootAlias;\n for (let i = 0; i < segments.length - 1; i++) {\n currentAlias = resolveTraversal(currentAlias, segments[i]);\n }\n return {\n kind: 'property_expr',\n sourceAlias: currentAlias,\n property: segments[segments.length - 1],\n };\n }\n case 'alias_expr': {\n const segments = refs.get(e.alias);\n if (!segments) return e;\n // Resolve all segments as traversals, return alias_expr for the final alias\n let currentAlias = rootAlias;\n for (const seg of segments) {\n currentAlias = resolveTraversal(currentAlias, seg);\n }\n return {kind: 'alias_expr', alias: currentAlias};\n }\n case 'binary_expr':\n return {\n ...e,\n left: resolve(e.left),\n right: resolve(e.right),\n };\n case 'in_expr':\n return {\n ...e,\n value: resolve(e.value),\n source: {list: e.source.list.map(resolve)},\n };\n case 'function_expr':\n return {...e, args: e.args.map(resolve)};\n case 'aggregate_expr':\n return {...e, args: e.args.map(resolve)};\n case 'logical_expr':\n return {...e, expressions: e.expressions.map(resolve)};\n case 'not_expr':\n return {...e, expression: resolve(e.expression)};\n default:\n return e;\n }\n };\n\n return resolve(expr);\n}\n\n/**\n * Represents an EXISTS quantifier condition over a collection path.\n * Used by .some(), .every(), .none() on QueryShapeSet.\n * Supports .and() / .or() / .not() chaining to compose with other conditions.\n *\n * The desugar/lower pipeline recognizes this via isExistsCondition() and builds\n * IRExistsExpression with proper traversal patterns and aliases.\n */\nexport class ExistsCondition {\n constructor(\n /** PropertyShapeData IDs forming the path from root to the collection. */\n public readonly pathSegmentIds: readonly string[],\n /** The inner predicate ExpressionNode. */\n public readonly predicate: ExpressionNode,\n /** Whether the EXISTS is negated (NOT EXISTS). */\n public readonly negated: boolean = false,\n /** Optional chained and/or conditions. */\n private readonly _chain: Array<{op: 'and' | 'or'; condition: ExpressionNode | ExistsCondition}> = [],\n ) {}\n\n not(): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, !this.negated, this._chain);\n }\n\n and(other: ExpressionInput | ExistsCondition): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [\n ...this._chain,\n {op: 'and', condition: isLinkedInstance(other, ExistsCondition) ? other : isLinkedInstance(other, ExpressionNode) ? other : new ExpressionNode(toIRExpression(other))},\n ]);\n }\n\n or(other: ExpressionInput | ExistsCondition): ExistsCondition {\n return new ExistsCondition(this.pathSegmentIds, this.predicate, this.negated, [\n ...this._chain,\n {op: 'or', condition: isLinkedInstance(other, ExistsCondition) ? other : isLinkedInstance(other, ExpressionNode) ? other : new ExpressionNode(toIRExpression(other))},\n ]);\n }\n\n get chain(): ReadonlyArray<{op: 'and' | 'or'; condition: ExpressionNode | ExistsCondition}> {\n return this._chain;\n }\n}\nbrandLinkedClass(ExistsCondition, '@_linked/core', 'ExistsCondition');\n\n\nexport function isExistsCondition(value: unknown): value is ExistsCondition {\n return isLinkedInstance(value, ExistsCondition);\n}\n\n/** Check if a value is an ExpressionNode. */\nexport function isExpressionNode(value: unknown): value is ExpressionNode {\n return isLinkedInstance(value, ExpressionNode);\n}\n"]}
|
package/lib/esm/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { UnresolvedShapeError, type UnresolvedShapeDetails } from './utils/unres
|
|
|
11
11
|
export type { ValidationReport, ValidationResult, ValidationMode, ValidateOptions, ValidatableShape, } from './shapes/validation.js';
|
|
12
12
|
export { LinkedStorage } from './utils/LinkedStorage.js';
|
|
13
13
|
export { sharedState, sharedStateKey } from './utils/sharedState.js';
|
|
14
|
-
export { brandLinkedError, isLinkedError, linkedErrorBrand } from './utils/linkedError.js';
|
|
14
|
+
export { brandLinkedError, brandLinkedClass, isLinkedError, isLinkedInstance, linkedErrorBrand } from './utils/linkedError.js';
|
|
15
15
|
export { SelectBuilder, QueryBuilder } from './queries/QueryBuilder.js';
|
|
16
16
|
export { lower } from './queries/lower.js';
|
|
17
17
|
export type { LowerableQuery } from './queries/lower.js';
|
package/lib/esm/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export { UnresolvedShapeError } from './utils/unresolvedShape.js';
|
|
|
19
19
|
export { LinkedStorage } from './utils/LinkedStorage.js';
|
|
20
20
|
// Conventions that make a second copy of a framework module harmless.
|
|
21
21
|
export { sharedState, sharedStateKey } from './utils/sharedState.js';
|
|
22
|
-
export { brandLinkedError, isLinkedError, linkedErrorBrand } from './utils/linkedError.js';
|
|
22
|
+
export { brandLinkedError, brandLinkedClass, isLinkedError, isLinkedInstance, linkedErrorBrand } from './utils/linkedError.js';
|
|
23
23
|
// New dynamic query building API (Phase 2)
|
|
24
24
|
export { SelectBuilder, QueryBuilder } from './queries/QueryBuilder.js';
|
|
25
25
|
export { lower } from './queries/lower.js';
|
package/lib/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,0DAA0D;AAC1D,OAAO,mBAAmB,CAAC;AAC3B,8EAA8E;AAC9E,OAAO,WAAW,CAAC;AACnB,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,qCAAqC,CAAC;AAC5E,sEAAsE;AACtE,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACxC,kEAAkE;AAClE,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAC,oBAAoB,EAA8B,MAAM,4BAA4B,CAAC;AAQ7F,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACvD,sEAAsE;AACtE,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAC,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,0DAA0D;AAC1D,OAAO,mBAAmB,CAAC;AAC3B,8EAA8E;AAC9E,OAAO,WAAW,CAAC;AACnB,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,qCAAqC,CAAC;AAC5E,sEAAsE;AACtE,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACxC,kEAAkE;AAClE,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAC,oBAAoB,EAA8B,MAAM,4BAA4B,CAAC;AAQ7F,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACvD,sEAAsE;AACtE,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC7H,2CAA2C;AAC3C,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,oFAAoF;AACpF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACT,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAElE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAEzE,sBAAsB;AACtB,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAM/C,+BAA+B;AAC/B,OAAO,EAAC,UAAU,EAAE,UAAU,EAAC,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAGrE,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AAGzD,8CAA8C;AAC9C,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAe3C,sEAAsE;AACtE,OAAO,EACL,cAAc,EACd,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,gCAAgC,CAAC;AAWxC,0FAA0F;AAC1F,OAAO,EAAC,iBAAiB,EAAE,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAEhE,mDAAmD;AACnD,OAAO,EAAC,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAC","sourcesContent":["/*\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n// Registers every shape core defines (side effects only).\nimport './shapes/index.js';\n// Registers the live-query store so `query.live()` works (side effects only).\nimport './live.js';\nexport {syncShapes, syncShape} from './shapes/syncShapes.js';\nexport type {SyncShapesOptions, SyncShapeOptions} from './shapes/syncShapes.js';\nexport {\n singleOwnerShapeIri,\n singleOwnerProperties,\n buildSingleOwnerConstraints,\n} from './shapes/singleOwnerConstraint.js';\nexport {rdfList} from './shapes/List.js';\nexport {serializePathToNodeData} from './shapes/serializePathToNodeData.js';\n// Core public API surface (documented as root imports in the README).\nexport {Shape} from './shapes/Shape.js';\n// SHACL-aligned validation of plain data objects against a shape.\nexport {validate, assertValid, ShapeValidationError} from './shapes/validation.js';\nexport {UnresolvedShapeError, type UnresolvedShapeDetails} from './utils/unresolvedShape.js';\nexport type {\n ValidationReport,\n ValidationResult,\n ValidationMode,\n ValidateOptions,\n ValidatableShape,\n} from './shapes/validation.js';\nexport {LinkedStorage} from './utils/LinkedStorage.js';\n// Conventions that make a second copy of a framework module harmless.\nexport {sharedState, sharedStateKey} from './utils/sharedState.js';\nexport {brandLinkedError, brandLinkedClass, isLinkedError, isLinkedInstance, linkedErrorBrand} from './utils/linkedError.js';\n// New dynamic query building API (Phase 2)\nexport {SelectBuilder, QueryBuilder} from './queries/QueryBuilder.js';\nexport {lower} from './queries/lower.js';\nexport type {LowerableQuery} from './queries/lower.js';\nexport {fromJSON} from './queries/fromJSON.js';\nexport type {QueryJSON, FromJSONOptions} from './queries/fromJSON.js';\n// Shape catalogs: resolve queries against a set of shapes without registering them.\nexport {\n ShapeCatalog,\n withShapeCatalog,\n getActiveShapeCatalog,\n catalogOf,\n shapeCatalogKey,\n} from './utils/ShapeCatalog.js';\nexport {\n getQueryContext,\n setQueryContext,\n subscribeQueryContext,\n PendingQueryContext,\n UnresolvedContextError,\n} from './queries/QueryContext.js';\nexport {subscribeQueryDispatch} from './queries/queryDispatch.js';\nexport type {QueryDispatchEvent, QueryDispatchListener} from './queries/queryDispatch.js';\nexport {\n CONTEXT_REF_KEY,\n encodeContextRef,\n isContextRefJSON,\n resolveContextId,\n} from './queries/ContextRef.js';\nexport type {ContextRefJSON} from './queries/ContextRef.js';\nexport {PropertyPath, walkPropertyPath} from './queries/PropertyPath.js';\n\n// Phase 3a — FieldSet\nexport {FieldSet} from './queries/FieldSet.js';\nexport type {FieldSetEntry, FieldSetInput, FieldSetJSON, FieldSetFieldJSON} from './queries/FieldSet.js';\n\n// Phase 4 — Serialization types\nexport type {QueryBuilderJSON} from './queries/QueryBuilder.js';\n\n// Phase 3b — Mutation builders\nexport {AskBuilder, isAskQuery} from './queries/AskBuilder.js';\nexport type {AskSpec} from './queries/AskBuilder.js';\nexport type {AskQuery, AskQueryJSON, RawAskInput} from './queries/AskQuery.js';\nexport {CountBuilder, isCountQuery} from './queries/CountBuilder.js';\nexport type {CountSpec} from './queries/CountBuilder.js';\nexport type {CountQuery, CountQueryJSON, RawCountInput} from './queries/CountQuery.js';\nexport {CreateBuilder} from './queries/CreateBuilder.js';\nexport {UpdateBuilder} from './queries/UpdateBuilder.js';\nexport {DeleteBuilder} from './queries/DeleteBuilder.js';\nexport type {DeleteId} from './queries/DeleteBuilder.js';\n\n// Expressions — computed fields and functions\nexport {ExpressionNode} from './expressions/ExpressionNode.js';\nexport type {ExpressionInput, PropertyRefMap} from './expressions/ExpressionNode.js';\nexport {Expr} from './expressions/Expr.js';\nexport type {\n ExpressionUpdateProxy,\n ExpressionUpdateResult,\n BaseExpressionMethods,\n NumericExpressionMethods,\n StringExpressionMethods,\n DateExpressionMethods,\n BooleanExpressionMethods,\n} from './expressions/ExpressionMethods.js';\n\n// Phase 5 — Component query integration\nexport type {LinkedComponentInterface, QueryComponentLike} from './queries/SelectQuery.js';\n\n\n// Mutation DSL-JSON serialization (create/update/delete to/from JSON)\nexport {\n encodeNodeData,\n encodeValue,\n} from './queries/MutationSerialization.js';\nexport {\n decodeNodeData,\n lowerMutationJSON,\n} from './queries/lowerMutationJSON.js';\nexport type {\n MutationJSON,\n CreateMutationJSON,\n UpdateMutationJSON,\n DeleteMutationJSON,\n MutationValueJSON,\n MutationNodeDataJSON,\n} from './queries/MutationSerialization.js';\n\n\n// Live-query dependency helpers — what a query reads and a mutation writes, as predicates\nexport {queryDependencies, mutationEffects} from './queries/queryDependencies.js';\nexport type {QueryDependencies, MutationEffects} from './queries/queryDependencies.js';\nexport {findPropertyShapeById} from './shapes/nodeShapeData.js';\n\n// Live queries — see documentation/live-queries.md\nexport {LiveQueryStore, getLiveQueryStore, resetLiveQueryStore, publishChange, invalidate} from './live/LiveQueryStore.js';\nexport type {ChangeEvent} from './live/changes.js';\nexport type {\n LiveQuery,\n LiveState,\n LiveStatus,\n LiveListener,\n LiveQueryOptions,\n LiveQueryStoreOptions,\n} from './live/LiveQueryStore.js';\n"]}
|
|
@@ -21,6 +21,7 @@ import { resolveUriOrThrow } from '../utils/NodeReference.js';
|
|
|
21
21
|
import { serializeWherePath, serializeRawMinusEntry, deserializeWherePath, deserializeRawMinusEntry, } from './QueryBuilderSerialization.js';
|
|
22
22
|
import { requireLiveQueryStore } from '../live/registry.js';
|
|
23
23
|
import { captureCatalog, getActiveShapeCatalog, withShapeCatalog } from '../utils/ShapeClass.js';
|
|
24
|
+
import { brandLinkedClass, isLinkedInstance } from '../utils/linkedError.js';
|
|
24
25
|
export class AskBuilder {
|
|
25
26
|
constructor(spec) {
|
|
26
27
|
/** Discriminator for the free `lower()` function and dataset routing. */
|
|
@@ -44,7 +45,7 @@ export class AskBuilder {
|
|
|
44
45
|
if (id === null || id === undefined) {
|
|
45
46
|
return new AskBuilder({ nullSubject: true });
|
|
46
47
|
}
|
|
47
|
-
if (id
|
|
48
|
+
if (isLinkedInstance(id, PendingQueryContext)) {
|
|
48
49
|
return new AskBuilder({ subject: id });
|
|
49
50
|
}
|
|
50
51
|
const ref = typeof id === 'string' ? { id: resolveUriOrThrow(id) } : id;
|
|
@@ -91,7 +92,7 @@ export class AskBuilder {
|
|
|
91
92
|
if (shapeClass) {
|
|
92
93
|
json.shape = ((_a = shapeClass.shape) === null || _a === void 0 ? void 0 : _a.id) || '';
|
|
93
94
|
}
|
|
94
|
-
if (subject
|
|
95
|
+
if (isLinkedInstance(subject, PendingQueryContext)) {
|
|
95
96
|
// Carry the reference, not its (possibly unresolved) id, so the receiver
|
|
96
97
|
// resolves it against its own context map at lowering time.
|
|
97
98
|
json.subject = encodeContextRef(subject.contextName);
|
|
@@ -164,7 +165,7 @@ export class AskBuilder {
|
|
|
164
165
|
const { nullSubject, subject } = this._spec;
|
|
165
166
|
if (nullSubject)
|
|
166
167
|
return false;
|
|
167
|
-
if (subject
|
|
168
|
+
if (isLinkedInstance(subject, PendingQueryContext) && !subject.id)
|
|
168
169
|
return false;
|
|
169
170
|
// `async` ensures a missing global dispatch rejects rather than throwing
|
|
170
171
|
// synchronously past the caller's `.catch()`.
|
|
@@ -199,6 +200,7 @@ export class AskBuilder {
|
|
|
199
200
|
return 'AskBuilder';
|
|
200
201
|
}
|
|
201
202
|
}
|
|
203
|
+
brandLinkedClass(AskBuilder, '@_linked/core', 'AskBuilder');
|
|
202
204
|
/** Narrow an unknown query object to an ask. */
|
|
203
205
|
export function isAskQuery(query) {
|
|
204
206
|
return (!!query && query.__queryKind === 'ask');
|