@_linked/core 2.2.0-next.20260313111743 → 2.2.0-next.20260320002642
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 +35 -0
- package/lib/cjs/ontologies/shacl.d.ts +5 -0
- package/lib/cjs/ontologies/shacl.js +10 -0
- package/lib/cjs/ontologies/shacl.js.map +1 -1
- package/lib/cjs/paths/PropertyPathExpr.d.ts +38 -0
- package/lib/cjs/paths/PropertyPathExpr.js +221 -0
- package/lib/cjs/paths/PropertyPathExpr.js.map +1 -0
- package/lib/cjs/paths/normalizePropertyPath.d.ts +23 -0
- package/lib/cjs/paths/normalizePropertyPath.js +75 -0
- package/lib/cjs/paths/normalizePropertyPath.js.map +1 -0
- package/lib/cjs/paths/pathExprToSparql.d.ts +14 -0
- package/lib/cjs/paths/pathExprToSparql.js +136 -0
- package/lib/cjs/paths/pathExprToSparql.js.map +1 -0
- package/lib/cjs/paths/serializePathToSHACL.d.ts +22 -0
- package/lib/cjs/paths/serializePathToSHACL.js +126 -0
- package/lib/cjs/paths/serializePathToSHACL.js.map +1 -0
- package/lib/cjs/queries/IRDesugar.d.ts +2 -0
- package/lib/cjs/queries/IRDesugar.js +24 -8
- package/lib/cjs/queries/IRDesugar.js.map +1 -1
- package/lib/cjs/queries/IRLower.js +9 -5
- package/lib/cjs/queries/IRLower.js.map +1 -1
- package/lib/cjs/queries/IRProjection.d.ts +2 -1
- package/lib/cjs/queries/IRProjection.js +7 -3
- package/lib/cjs/queries/IRProjection.js.map +1 -1
- package/lib/cjs/queries/IntermediateRepresentation.d.ts +3 -0
- package/lib/cjs/queries/QueryBuilder.js +3 -2
- package/lib/cjs/queries/QueryBuilder.js.map +1 -1
- package/lib/cjs/shapes/SHACL.d.ts +62 -24
- package/lib/cjs/shapes/SHACL.js +30 -26
- package/lib/cjs/shapes/SHACL.js.map +1 -1
- package/lib/cjs/sparql/SparqlAlgebra.d.ts +4 -0
- package/lib/cjs/sparql/algebraToString.js +6 -0
- package/lib/cjs/sparql/algebraToString.js.map +1 -1
- package/lib/cjs/sparql/irToAlgebra.js +13 -3
- package/lib/cjs/sparql/irToAlgebra.js.map +1 -1
- package/lib/cjs/utils/NodeReference.d.ts +24 -0
- package/lib/cjs/utils/NodeReference.js +41 -1
- package/lib/cjs/utils/NodeReference.js.map +1 -1
- package/lib/cjs/utils/ShapeClass.js +3 -1
- package/lib/cjs/utils/ShapeClass.js.map +1 -1
- package/lib/esm/ontologies/shacl.d.ts +5 -0
- package/lib/esm/ontologies/shacl.js +10 -0
- package/lib/esm/ontologies/shacl.js.map +1 -1
- package/lib/esm/paths/PropertyPathExpr.d.ts +38 -0
- package/lib/esm/paths/PropertyPathExpr.js +215 -0
- package/lib/esm/paths/PropertyPathExpr.js.map +1 -0
- package/lib/esm/paths/normalizePropertyPath.d.ts +23 -0
- package/lib/esm/paths/normalizePropertyPath.js +71 -0
- package/lib/esm/paths/normalizePropertyPath.js.map +1 -0
- package/lib/esm/paths/pathExprToSparql.d.ts +14 -0
- package/lib/esm/paths/pathExprToSparql.js +132 -0
- package/lib/esm/paths/pathExprToSparql.js.map +1 -0
- package/lib/esm/paths/serializePathToSHACL.d.ts +22 -0
- package/lib/esm/paths/serializePathToSHACL.js +122 -0
- package/lib/esm/paths/serializePathToSHACL.js.map +1 -0
- package/lib/esm/queries/IRDesugar.d.ts +2 -0
- package/lib/esm/queries/IRDesugar.js +24 -8
- package/lib/esm/queries/IRDesugar.js.map +1 -1
- package/lib/esm/queries/IRLower.js +9 -5
- package/lib/esm/queries/IRLower.js.map +1 -1
- package/lib/esm/queries/IRProjection.d.ts +2 -1
- package/lib/esm/queries/IRProjection.js +7 -3
- package/lib/esm/queries/IRProjection.js.map +1 -1
- package/lib/esm/queries/IntermediateRepresentation.d.ts +3 -0
- package/lib/esm/queries/QueryBuilder.js +3 -2
- package/lib/esm/queries/QueryBuilder.js.map +1 -1
- package/lib/esm/shapes/SHACL.d.ts +62 -24
- package/lib/esm/shapes/SHACL.js +30 -26
- package/lib/esm/shapes/SHACL.js.map +1 -1
- package/lib/esm/sparql/SparqlAlgebra.d.ts +4 -0
- package/lib/esm/sparql/algebraToString.js +6 -0
- package/lib/esm/sparql/algebraToString.js.map +1 -1
- package/lib/esm/sparql/irToAlgebra.js +13 -3
- package/lib/esm/sparql/irToAlgebra.js.map +1 -1
- package/lib/esm/utils/NodeReference.d.ts +24 -0
- package/lib/esm/utils/NodeReference.js +39 -1
- package/lib/esm/utils/NodeReference.js.map +1 -1
- package/lib/esm/utils/ShapeClass.js +3 -1
- package/lib/esm/utils/ShapeClass.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -51,6 +51,41 @@
|
|
|
51
51
|
|
|
52
52
|
See the [README](./README.md#computed-expressions) for the full method reference and more examples.
|
|
53
53
|
|
|
54
|
+
### Patch Changes
|
|
55
|
+
|
|
56
|
+
- [#34](https://github.com/Semantu/linked/pull/34) [`e2ae4a2`](https://github.com/Semantu/linked/commit/e2ae4a28e5be28716e1634ca81d9c379a291cbc6) Thanks [@flyon](https://github.com/flyon)! - ### SHACL property path support
|
|
57
|
+
|
|
58
|
+
Property decorators now accept full SPARQL property path syntax:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
@literalProperty({path: 'foaf:knows/foaf:name'}) // sequence
|
|
62
|
+
@literalProperty({path: '<http://ex.org/a>|<http://ex.org/b>'}) // alternative
|
|
63
|
+
@literalProperty({path: '^foaf:knows'}) // inverse
|
|
64
|
+
@literalProperty({path: 'foaf:knows*'}) // zeroOrMore
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
New exports from `src/paths/`:
|
|
68
|
+
|
|
69
|
+
- `PathExpr`, `PathRef` — AST types for property paths
|
|
70
|
+
- `parsePropertyPath(input): PathExpr` — parser for SPARQL property path strings
|
|
71
|
+
- `normalizePropertyPath(input): PathExpr` — normalizes any input form to canonical AST
|
|
72
|
+
- `pathExprToSparql(expr): string` — renders PathExpr to SPARQL syntax
|
|
73
|
+
- `serializePathToSHACL(expr): SHACLPathResult` — serializes to SHACL RDF triples
|
|
74
|
+
|
|
75
|
+
`PropertyShape.path` is now typed as `PathExpr` (was opaque). Complex paths flow through the full IR pipeline and emit correct SPARQL property path syntax in generated queries.
|
|
76
|
+
|
|
77
|
+
### Strict prefix resolution in query API
|
|
78
|
+
|
|
79
|
+
`QueryBuilder.for()` and `.forAll()` now throw on unregistered prefixes instead of silently passing through. New export:
|
|
80
|
+
|
|
81
|
+
- `resolveUriOrThrow(str): string` — strict prefix resolution (throws on unknown prefix)
|
|
82
|
+
|
|
83
|
+
### SHACL constraint field fixes
|
|
84
|
+
|
|
85
|
+
- `hasValue` and `in` config fields now correctly handle literal values (`string`, `number`, `boolean`) — previously all values were wrapped as IRI nodes
|
|
86
|
+
- `lessThan` and `lessThanOrEquals` config fields are now wired into `createPropertyShape` and exposed via `getResult()`
|
|
87
|
+
- New `PropertyShapeResult` interface provides typed access to `getResult()` output
|
|
88
|
+
|
|
54
89
|
## 1.1.0
|
|
55
90
|
|
|
56
91
|
### Minor Changes
|
|
@@ -88,4 +88,9 @@ export declare const shacl: {
|
|
|
88
88
|
MaxLengthConstraintComponent: NodeReferenceValue;
|
|
89
89
|
AbstractResult: NodeReferenceValue;
|
|
90
90
|
result: NodeReferenceValue;
|
|
91
|
+
alternativePath: NodeReferenceValue;
|
|
92
|
+
inversePath: NodeReferenceValue;
|
|
93
|
+
zeroOrMorePath: NodeReferenceValue;
|
|
94
|
+
oneOrMorePath: NodeReferenceValue;
|
|
95
|
+
zeroOrOnePath: NodeReferenceValue;
|
|
91
96
|
};
|
|
@@ -30,6 +30,11 @@ const targetNode = (0, exports.ns)('targetNode');
|
|
|
30
30
|
const node = (0, exports.ns)('node');
|
|
31
31
|
const nodeKind = (0, exports.ns)('nodeKind');
|
|
32
32
|
const Shape = (0, exports.ns)('Shape');
|
|
33
|
+
const alternativePath = (0, exports.ns)('alternativePath');
|
|
34
|
+
const inversePath = (0, exports.ns)('inversePath');
|
|
35
|
+
const zeroOrMorePath = (0, exports.ns)('zeroOrMorePath');
|
|
36
|
+
const oneOrMorePath = (0, exports.ns)('oneOrMorePath');
|
|
37
|
+
const zeroOrOnePath = (0, exports.ns)('zeroOrOnePath');
|
|
33
38
|
const BlankNode = (0, exports.ns)('BlankNode');
|
|
34
39
|
const IRI = (0, exports.ns)('IRI');
|
|
35
40
|
const Literal = (0, exports.ns)('Literal');
|
|
@@ -124,5 +129,10 @@ exports.shacl = {
|
|
|
124
129
|
MaxLengthConstraintComponent: exports.MaxLengthConstraintComponent,
|
|
125
130
|
AbstractResult: exports.AbstractResult,
|
|
126
131
|
result: exports.result,
|
|
132
|
+
alternativePath,
|
|
133
|
+
inversePath,
|
|
134
|
+
zeroOrMorePath,
|
|
135
|
+
oneOrMorePath,
|
|
136
|
+
zeroOrOnePath,
|
|
127
137
|
};
|
|
128
138
|
//# sourceMappingURL=shacl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shacl.js","sourceRoot":"","sources":["../../../src/ontologies/shacl.ts"],"names":[],"mappings":";;;AAMA,kDAA0C;AAC1C,wDAAsD;AAEtD,MAAM,IAAI,GAAG,6BAA6B,CAAC;AAC9B,QAAA,iBAAiB,GAAuB,EAAC,EAAE,EAAE,IAAI,EAAC,CAAC;AAChE,kBAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAEb,QAAA,EAAE,GAAG,IAAA,8BAAe,EAAC,IAAI,CAAC,CAAC;AAExC,8BAA8B;AAC9B,MAAM,MAAM,GAAG,IAAA,UAAE,EAAC,OAAO,CAAC,CAAC;AAC3B,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,OAAO,GAAG,IAAA,UAAE,EAAC,SAAS,CAAC,CAAC;AAC9B,MAAM,GAAG,GAAG,IAAA,UAAE,EAAC,IAAI,CAAC,CAAC;AACrB,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,MAAM,GAAG,IAAA,UAAE,EAAC,QAAQ,CAAC,CAAC;AAC5B,MAAM,IAAI,GAAG,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,IAAA,UAAE,EAAC,aAAa,CAAC,CAAC;AACtC,MAAM,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAClC,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAClC,MAAM,iBAAiB,GAAG,IAAA,UAAE,EAAC,mBAAmB,CAAC,CAAC;AAClD,MAAM,IAAI,GAAG,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;AACxB,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,MAAM,GAAG,IAAA,UAAE,EAAC,QAAQ,CAAC,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAA,UAAE,EAAC,eAAe,CAAC,CAAC;AAC1C,MAAM,WAAW,GAAG,IAAA,UAAE,EAAC,aAAa,CAAC,CAAC;AACtC,MAAM,UAAU,GAAG,IAAA,UAAE,EAAC,YAAY,CAAC,CAAC;AACpC,MAAM,IAAI,GAAG,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;AACxB,MAAM,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAChC,MAAM,KAAK,GAAG,IAAA,UAAE,EAAC,OAAO,CAAC,CAAC;AAE1B,MAAM,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAClC,MAAM,GAAG,GAAG,IAAA,UAAE,EAAC,KAAK,CAAC,CAAC;AACtB,MAAM,OAAO,GAAG,IAAA,UAAE,EAAC,SAAS,CAAC,CAAC;AAC9B,MAAM,cAAc,GAAG,IAAA,UAAE,EAAC,gBAAgB,CAAC,CAAC;AAC5C,MAAM,kBAAkB,GAAG,IAAA,UAAE,EAAC,oBAAoB,CAAC,CAAC;AACpD,MAAM,YAAY,GAAG,IAAA,UAAE,EAAC,cAAc,CAAC,CAAC;AAE3B,QAAA,UAAU,GAAG,IAAA,UAAE,EAAC,YAAY,CAAC,CAAC;AAC9B,QAAA,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAC1B,QAAA,gBAAgB,GAAG,IAAA,UAAE,EAAC,kBAAkB,CAAC,CAAC;AAC1C,QAAA,YAAY,GAAG,IAAA,UAAE,EAAC,cAAc,CAAC,CAAC;AAClC,QAAA,YAAY,GAAG,IAAA,UAAE,EAAC,cAAc,CAAC,CAAC;AAClC,QAAA,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAC5B,QAAA,YAAY,GAAG,IAAA,UAAE,EAAC,cAAc,CAAC,CAAC;AAClC,QAAA,YAAY,GAAG,IAAA,UAAE,EAAC,cAAc,CAAC,CAAC;AAClC,QAAA,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAC5B,QAAA,OAAO,GAAG,IAAA,UAAE,EAAC,SAAS,CAAC,CAAC;AACxB,QAAA,UAAU,GAAG,IAAA,UAAE,EAAC,YAAY,CAAC,CAAC;AAC9B,QAAA,gBAAgB,GAAG,IAAA,UAAE,EAAC,kBAAkB,CAAC,CAAC;AAC1C,QAAA,QAAQ,GAAG,IAAA,UAAE,EAAC,UAAU,CAAC,CAAC;AAC1B,QAAA,gBAAgB,GAAG,IAAA,UAAE,EAAC,kBAAkB,CAAC,CAAC;AAC1C,QAAA,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAC5B,QAAA,WAAW,GAAG,IAAA,UAAE,EAAC,aAAa,CAAC,CAAC;AAChC,QAAA,cAAc,GAAG,IAAA,UAAE,EAAC,gBAAgB,CAAC,CAAC;AACtC,QAAA,UAAU,GAAG,IAAA,UAAE,EAAC,YAAY,CAAC,CAAC;AAC9B,QAAA,KAAK,GAAG,IAAA,UAAE,EAAC,OAAO,CAAC,CAAC;AACpB,QAAA,OAAO,GAAG,IAAA,UAAE,EAAC,SAAS,CAAC,CAAC;AACxB,QAAA,SAAS,GAAG,IAAA,UAAE,EAAC,WAAW,CAAC,CAAC;AAC5B,QAAA,cAAc,GAAG,IAAA,UAAE,EAAC,gBAAgB,CAAC,CAAC;AACtC,QAAA,yBAAyB,GAAG,IAAA,UAAE,EAAC,2BAA2B,CAAC,CAAC;AAC5D,QAAA,wBAAwB,GAAG,IAAA,UAAE,EAAC,0BAA0B,CAAC,CAAC;AAC1D,QAAA,uBAAuB,GAAG,IAAA,UAAE,EAAC,yBAAyB,CAAC,CAAC;AACxD,QAAA,2BAA2B,GAAG,IAAA,UAAE,EAAC,6BAA6B,CAAC,CAAC;AAChE,QAAA,4BAA4B,GAAG,IAAA,UAAE,EAAC,8BAA8B,CAAC,CAAC;AAClE,QAAA,4BAA4B,GAAG,IAAA,UAAE,EAAC,8BAA8B,CAAC,CAAC;AAClE,QAAA,MAAM,GAAG,IAAA,UAAE,EAAC,QAAQ,CAAC,CAAC;AAEnC,4CAA4C;AAC/B,QAAA,KAAK,GAAG;IACnB,KAAK,EAAE,MAAM;IACb,QAAQ;IACR,OAAO;IACP,EAAE,EAAE,GAAG;IACP,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,IAAI;IACJ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,aAAa;IACb,KAAK;IACL,WAAW;IACX,UAAU;IACV,SAAS;IACT,GAAG;IACH,OAAO;IACP,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,UAAU,EAAV,kBAAU;IACV,QAAQ,EAAR,gBAAQ;IACR,gBAAgB,EAAhB,wBAAgB;IAChB,YAAY,EAAZ,oBAAY;IACZ,YAAY,EAAZ,oBAAY;IACZ,SAAS,EAAT,iBAAS;IACT,YAAY,EAAZ,oBAAY;IACZ,YAAY,EAAZ,oBAAY;IACZ,SAAS,EAAT,iBAAS;IACT,OAAO,EAAP,eAAO;IACP,UAAU,EAAV,kBAAU;IACV,gBAAgB,EAAhB,wBAAgB;IAChB,QAAQ,EAAR,gBAAQ;IACR,gBAAgB,EAAhB,wBAAgB;IAChB,SAAS,EAAT,iBAAS;IACT,WAAW,EAAX,mBAAW;IACX,cAAc,EAAd,sBAAc;IACd,UAAU,EAAV,kBAAU;IACV,KAAK,EAAL,aAAK;IACL,OAAO,EAAP,eAAO;IACP,SAAS,EAAT,iBAAS;IACT,yBAAyB,EAAzB,iCAAyB;IACzB,wBAAwB,EAAxB,gCAAwB;IACxB,uBAAuB,EAAvB,+BAAuB;IACvB,2BAA2B,EAA3B,mCAA2B;IAC3B,4BAA4B,EAA5B,oCAA4B;IAC5B,4BAA4B,EAA5B,oCAA4B;IAC5B,cAAc,EAAd,sBAAc;IACd,MAAM,EAAN,cAAM;
|
|
1
|
+
{"version":3,"file":"shacl.js","sourceRoot":"","sources":["../../../src/ontologies/shacl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** A simple path reference — either a raw string (prefixed/IRI) or a node ref. */
|
|
2
|
+
export type PathRef = string | {
|
|
3
|
+
id: string;
|
|
4
|
+
};
|
|
5
|
+
/** Discriminated-object union for all SPARQL property path forms. */
|
|
6
|
+
export type PathExpr = PathRef | {
|
|
7
|
+
seq: PathExpr[];
|
|
8
|
+
} | {
|
|
9
|
+
alt: PathExpr[];
|
|
10
|
+
} | {
|
|
11
|
+
inv: PathExpr;
|
|
12
|
+
} | {
|
|
13
|
+
zeroOrMore: PathExpr;
|
|
14
|
+
} | {
|
|
15
|
+
oneOrMore: PathExpr;
|
|
16
|
+
} | {
|
|
17
|
+
zeroOrOne: PathExpr;
|
|
18
|
+
} | {
|
|
19
|
+
negatedPropertySet: (PathRef | {
|
|
20
|
+
inv: PathRef;
|
|
21
|
+
})[];
|
|
22
|
+
};
|
|
23
|
+
export declare const isPathRef: (expr: PathExpr) => expr is PathRef;
|
|
24
|
+
export declare const isComplexPathExpr: (expr: PathExpr) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Characters that signal a string contains path operators and should be parsed.
|
|
27
|
+
* Used by the normalizer to decide whether to invoke the parser.
|
|
28
|
+
*/
|
|
29
|
+
export declare const PATH_OPERATOR_CHARS: RegExp;
|
|
30
|
+
/**
|
|
31
|
+
* Parse a SPARQL property path string into a PathExpr AST.
|
|
32
|
+
*
|
|
33
|
+
* Supports: sequence (/), alternative (|), inverse (^), zeroOrMore (*),
|
|
34
|
+
* oneOrMore (+), zeroOrOne (?), negatedPropertySet (!), and grouping (()).
|
|
35
|
+
*
|
|
36
|
+
* Does NOT resolve prefixes — raw strings are preserved in the AST.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parsePropertyPath(input: string): PathExpr;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PATH_OPERATOR_CHARS = exports.isComplexPathExpr = exports.isPathRef = void 0;
|
|
9
|
+
exports.parsePropertyPath = parsePropertyPath;
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Type guards
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const isPathRef = (expr) => typeof expr === 'string' || (typeof expr === 'object' && expr !== null && 'id' in expr && Object.keys(expr).length === 1);
|
|
14
|
+
exports.isPathRef = isPathRef;
|
|
15
|
+
const isComplexPathExpr = (expr) => !(0, exports.isPathRef)(expr);
|
|
16
|
+
exports.isComplexPathExpr = isComplexPathExpr;
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Parser — recursive-descent for SPARQL property path grammar
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Characters that signal a string contains path operators and should be parsed.
|
|
22
|
+
* Used by the normalizer to decide whether to invoke the parser.
|
|
23
|
+
*/
|
|
24
|
+
exports.PATH_OPERATOR_CHARS = /[/|^*+?()!<]/;
|
|
25
|
+
class PathParser {
|
|
26
|
+
constructor(input) {
|
|
27
|
+
this.pos = 0;
|
|
28
|
+
this.input = input;
|
|
29
|
+
}
|
|
30
|
+
parse() {
|
|
31
|
+
this.skipWhitespace();
|
|
32
|
+
const result = this.parseAlt();
|
|
33
|
+
this.skipWhitespace();
|
|
34
|
+
if (this.pos < this.input.length) {
|
|
35
|
+
this.error(`Unexpected character '${this.input[this.pos]}'`);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
// alt = seq ( '|' seq )*
|
|
40
|
+
parseAlt() {
|
|
41
|
+
const first = this.parseSeq();
|
|
42
|
+
const branches = [first];
|
|
43
|
+
while (this.peek() === '|') {
|
|
44
|
+
this.advance(); // consume '|'
|
|
45
|
+
this.skipWhitespace();
|
|
46
|
+
branches.push(this.parseSeq());
|
|
47
|
+
}
|
|
48
|
+
return branches.length === 1 ? branches[0] : { alt: branches };
|
|
49
|
+
}
|
|
50
|
+
// seq = unary ( '/' unary )*
|
|
51
|
+
parseSeq() {
|
|
52
|
+
const first = this.parseUnary();
|
|
53
|
+
const steps = [first];
|
|
54
|
+
while (this.peek() === '/') {
|
|
55
|
+
this.advance(); // consume '/'
|
|
56
|
+
this.skipWhitespace();
|
|
57
|
+
steps.push(this.parseUnary());
|
|
58
|
+
}
|
|
59
|
+
return steps.length === 1 ? steps[0] : { seq: steps };
|
|
60
|
+
}
|
|
61
|
+
// unary = '^' unary | primary ( '*' | '+' | '?' )?
|
|
62
|
+
parseUnary() {
|
|
63
|
+
this.skipWhitespace();
|
|
64
|
+
if (this.peek() === '^') {
|
|
65
|
+
this.advance(); // consume '^'
|
|
66
|
+
this.skipWhitespace();
|
|
67
|
+
const inner = this.parseUnary();
|
|
68
|
+
return { inv: inner };
|
|
69
|
+
}
|
|
70
|
+
let expr = this.parsePrimary();
|
|
71
|
+
this.skipWhitespace();
|
|
72
|
+
const postfix = this.peek();
|
|
73
|
+
if (postfix === '*') {
|
|
74
|
+
this.advance();
|
|
75
|
+
expr = { zeroOrMore: expr };
|
|
76
|
+
}
|
|
77
|
+
else if (postfix === '+') {
|
|
78
|
+
this.advance();
|
|
79
|
+
expr = { oneOrMore: expr };
|
|
80
|
+
}
|
|
81
|
+
else if (postfix === '?') {
|
|
82
|
+
this.advance();
|
|
83
|
+
expr = { zeroOrOne: expr };
|
|
84
|
+
}
|
|
85
|
+
this.skipWhitespace();
|
|
86
|
+
return expr;
|
|
87
|
+
}
|
|
88
|
+
// primary = '(' alt ')' | '!' negatedPropertySet | iri
|
|
89
|
+
parsePrimary() {
|
|
90
|
+
this.skipWhitespace();
|
|
91
|
+
const ch = this.peek();
|
|
92
|
+
// Grouped expression
|
|
93
|
+
if (ch === '(') {
|
|
94
|
+
this.advance(); // consume '('
|
|
95
|
+
this.skipWhitespace();
|
|
96
|
+
const inner = this.parseAlt();
|
|
97
|
+
this.skipWhitespace();
|
|
98
|
+
if (this.peek() !== ')') {
|
|
99
|
+
this.error("Expected ')'");
|
|
100
|
+
}
|
|
101
|
+
this.advance(); // consume ')'
|
|
102
|
+
return inner;
|
|
103
|
+
}
|
|
104
|
+
// Negated property set
|
|
105
|
+
if (ch === '!') {
|
|
106
|
+
this.advance(); // consume '!'
|
|
107
|
+
this.skipWhitespace();
|
|
108
|
+
return this.parseNegatedPropertySet();
|
|
109
|
+
}
|
|
110
|
+
// IRI or prefixed name
|
|
111
|
+
return this.parseIri();
|
|
112
|
+
}
|
|
113
|
+
// negatedPropertySet = '(' negatedItem ( '|' negatedItem )* ')' | negatedItem
|
|
114
|
+
parseNegatedPropertySet() {
|
|
115
|
+
this.skipWhitespace();
|
|
116
|
+
if (this.peek() === '(') {
|
|
117
|
+
this.advance(); // consume '('
|
|
118
|
+
this.skipWhitespace();
|
|
119
|
+
const items = this.parseNegatedItems();
|
|
120
|
+
this.skipWhitespace();
|
|
121
|
+
if (this.peek() !== ')') {
|
|
122
|
+
this.error("Expected ')' in negated property set");
|
|
123
|
+
}
|
|
124
|
+
this.advance(); // consume ')'
|
|
125
|
+
return { negatedPropertySet: items };
|
|
126
|
+
}
|
|
127
|
+
// Single negated item
|
|
128
|
+
const item = this.parseNegatedItem();
|
|
129
|
+
return { negatedPropertySet: [item] };
|
|
130
|
+
}
|
|
131
|
+
parseNegatedItems() {
|
|
132
|
+
const items = [this.parseNegatedItem()];
|
|
133
|
+
while (this.peek() === '|') {
|
|
134
|
+
this.advance(); // consume '|'
|
|
135
|
+
this.skipWhitespace();
|
|
136
|
+
items.push(this.parseNegatedItem());
|
|
137
|
+
}
|
|
138
|
+
return items;
|
|
139
|
+
}
|
|
140
|
+
parseNegatedItem() {
|
|
141
|
+
this.skipWhitespace();
|
|
142
|
+
if (this.peek() === '^') {
|
|
143
|
+
this.advance(); // consume '^'
|
|
144
|
+
this.skipWhitespace();
|
|
145
|
+
const ref = this.parseIri();
|
|
146
|
+
return { inv: ref };
|
|
147
|
+
}
|
|
148
|
+
return this.parseIri();
|
|
149
|
+
}
|
|
150
|
+
// iri = '<' chars '>' | prefixedName
|
|
151
|
+
parseIri() {
|
|
152
|
+
this.skipWhitespace();
|
|
153
|
+
if (this.peek() === '<') {
|
|
154
|
+
this.advance(); // consume '<'
|
|
155
|
+
const start = this.pos;
|
|
156
|
+
while (this.pos < this.input.length && this.input[this.pos] !== '>') {
|
|
157
|
+
this.pos++;
|
|
158
|
+
}
|
|
159
|
+
if (this.pos >= this.input.length) {
|
|
160
|
+
this.error("Expected '>' to close IRI");
|
|
161
|
+
}
|
|
162
|
+
const iri = this.input.slice(start, this.pos);
|
|
163
|
+
this.advance(); // consume '>'
|
|
164
|
+
return iri;
|
|
165
|
+
}
|
|
166
|
+
return this.parsePrefixedName();
|
|
167
|
+
}
|
|
168
|
+
// prefixedName = PNAME_NS PNAME_LOCAL | PNAME_NS
|
|
169
|
+
// We accept any characters until we hit a path operator or whitespace or end
|
|
170
|
+
parsePrefixedName() {
|
|
171
|
+
this.skipWhitespace();
|
|
172
|
+
const start = this.pos;
|
|
173
|
+
while (this.pos < this.input.length && !this.isTerminator(this.input[this.pos])) {
|
|
174
|
+
this.pos++;
|
|
175
|
+
}
|
|
176
|
+
if (this.pos === start) {
|
|
177
|
+
this.error('Expected IRI or prefixed name');
|
|
178
|
+
}
|
|
179
|
+
return this.input.slice(start, this.pos);
|
|
180
|
+
}
|
|
181
|
+
isTerminator(ch) {
|
|
182
|
+
return ch === '/' || ch === '|' || ch === '*' || ch === '+' || ch === '?' ||
|
|
183
|
+
ch === '(' || ch === ')' || ch === '^' || ch === '!' || ch === ' ' ||
|
|
184
|
+
ch === '\t' || ch === '\n' || ch === '\r';
|
|
185
|
+
}
|
|
186
|
+
peek() {
|
|
187
|
+
return this.pos < this.input.length ? this.input[this.pos] : undefined;
|
|
188
|
+
}
|
|
189
|
+
advance() {
|
|
190
|
+
this.pos++;
|
|
191
|
+
}
|
|
192
|
+
skipWhitespace() {
|
|
193
|
+
while (this.pos < this.input.length) {
|
|
194
|
+
const ch = this.input[this.pos];
|
|
195
|
+
if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
|
|
196
|
+
this.pos++;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
error(message) {
|
|
204
|
+
throw new Error(`Property path parse error at position ${this.pos}: ${message} (input: "${this.input}")`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Parse a SPARQL property path string into a PathExpr AST.
|
|
209
|
+
*
|
|
210
|
+
* Supports: sequence (/), alternative (|), inverse (^), zeroOrMore (*),
|
|
211
|
+
* oneOrMore (+), zeroOrOne (?), negatedPropertySet (!), and grouping (()).
|
|
212
|
+
*
|
|
213
|
+
* Does NOT resolve prefixes — raw strings are preserved in the AST.
|
|
214
|
+
*/
|
|
215
|
+
function parsePropertyPath(input) {
|
|
216
|
+
if (!input || input.trim().length === 0) {
|
|
217
|
+
throw new Error('Property path input must not be empty');
|
|
218
|
+
}
|
|
219
|
+
return new PathParser(input.trim()).parse();
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=PropertyPathExpr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPathExpr.js","sourceRoot":"","sources":["../../../src/paths/PropertyPathExpr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
/**
|
|
3
|
+
* Input type for property path decorators.
|
|
4
|
+
* Accepts all forms: string, {id}, array (sequence shorthand), or PathExpr.
|
|
5
|
+
*/
|
|
6
|
+
export type PropertyPathDecoratorInput = string | {
|
|
7
|
+
id: string;
|
|
8
|
+
} | PropertyPathDecoratorInput[] | PathExpr;
|
|
9
|
+
/**
|
|
10
|
+
* Normalize any property path decorator input into a canonical PathExpr.
|
|
11
|
+
*
|
|
12
|
+
* - `string` without path operators → preserved as-is (a PathRef)
|
|
13
|
+
* - `string` with operators → parsed via `parsePropertyPath`
|
|
14
|
+
* - `{id: string}` → preserved as PathRef
|
|
15
|
+
* - `PathExpr` structured object → passed through
|
|
16
|
+
* - `Array` → converted to `{seq: [...]}`
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizePropertyPath(input: PropertyPathDecoratorInput): PathExpr;
|
|
19
|
+
/**
|
|
20
|
+
* Check whether a PathExpr is a simple single-IRI path (backward-compatible form).
|
|
21
|
+
* Returns the IRI string if simple, or null if complex.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSimplePathId(expr: PathExpr): string | null;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.normalizePropertyPath = normalizePropertyPath;
|
|
9
|
+
exports.getSimplePathId = getSimplePathId;
|
|
10
|
+
const PropertyPathExpr_js_1 = require("./PropertyPathExpr.js");
|
|
11
|
+
/** Path expression operator keys used to detect structured PathExpr objects. */
|
|
12
|
+
const PATH_EXPR_KEYS = new Set(['seq', 'alt', 'inv', 'zeroOrMore', 'oneOrMore', 'zeroOrOne', 'negatedPropertySet']);
|
|
13
|
+
/** Check if an object is a structured PathExpr (not a plain {id} ref). */
|
|
14
|
+
const isStructuredPathExpr = (value) => {
|
|
15
|
+
if (typeof value !== 'object' || value === null)
|
|
16
|
+
return false;
|
|
17
|
+
return Object.keys(value).some((key) => PATH_EXPR_KEYS.has(key));
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Normalize any property path decorator input into a canonical PathExpr.
|
|
21
|
+
*
|
|
22
|
+
* - `string` without path operators → preserved as-is (a PathRef)
|
|
23
|
+
* - `string` with operators → parsed via `parsePropertyPath`
|
|
24
|
+
* - `{id: string}` → preserved as PathRef
|
|
25
|
+
* - `PathExpr` structured object → passed through
|
|
26
|
+
* - `Array` → converted to `{seq: [...]}`
|
|
27
|
+
*/
|
|
28
|
+
function normalizePropertyPath(input) {
|
|
29
|
+
let result;
|
|
30
|
+
// String input
|
|
31
|
+
if (typeof input === 'string') {
|
|
32
|
+
if (PropertyPathExpr_js_1.PATH_OPERATOR_CHARS.test(input)) {
|
|
33
|
+
result = (0, PropertyPathExpr_js_1.parsePropertyPath)(input);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
result = input;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Array → sequence shorthand
|
|
40
|
+
else if (Array.isArray(input)) {
|
|
41
|
+
const normalized = input.map((item) => normalizePropertyPath(item));
|
|
42
|
+
result = normalized.length === 1 ? normalized[0] : { seq: normalized };
|
|
43
|
+
}
|
|
44
|
+
// Object
|
|
45
|
+
else if (typeof input === 'object' && input !== null) {
|
|
46
|
+
// Structured PathExpr (has seq, alt, inv, etc.)
|
|
47
|
+
if (isStructuredPathExpr(input)) {
|
|
48
|
+
result = input;
|
|
49
|
+
}
|
|
50
|
+
// Plain {id} ref
|
|
51
|
+
else if ('id' in input) {
|
|
52
|
+
result = input;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
throw new Error(`Invalid property path input: ${JSON.stringify(input)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
throw new Error(`Invalid property path input: ${JSON.stringify(input)}`);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check whether a PathExpr is a simple single-IRI path (backward-compatible form).
|
|
65
|
+
* Returns the IRI string if simple, or null if complex.
|
|
66
|
+
*/
|
|
67
|
+
function getSimplePathId(expr) {
|
|
68
|
+
if (typeof expr === 'string')
|
|
69
|
+
return expr;
|
|
70
|
+
if (typeof expr === 'object' && expr !== null && 'id' in expr && !isStructuredPathExpr(expr)) {
|
|
71
|
+
return expr.id;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=normalizePropertyPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizePropertyPath.js","sourceRoot":"","sources":["../../../src/paths/normalizePropertyPath.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAgCH,sDAiCC;AAMD,0CAMC;AA3ED,+DAAuF;AAYvF,gFAAgF;AAChF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEpH,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,KAAiC;IACrE,IAAI,MAAgB,CAAC;IAErB,eAAe;IACf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,yCAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,IAAA,uCAAiB,EAAC,KAAK,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IACD,6BAA6B;SACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,GAAG,EAAE,UAAU,EAAC,CAAC;IACvE,CAAC;IACD,SAAS;SACJ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACrD,gDAAgD;QAChD,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,KAAiB,CAAC;QAC7B,CAAC;QACD,iBAAiB;aACZ,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,GAAG,KAAqB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAc;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7F,OAAQ,IAAqB,CAAC,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collect all full IRIs from a PathExpr AST.
|
|
4
|
+
* Returns IRIs that need PREFIX declarations (full URIs from string refs
|
|
5
|
+
* containing `://` and from `{id}` refs). Does not collect prefixed-name
|
|
6
|
+
* string refs since those are already in prefix:local form.
|
|
7
|
+
*/
|
|
8
|
+
export declare function collectPathUris(expr: PathExpr): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Render a PathExpr to SPARQL property path syntax.
|
|
11
|
+
* Handles all forms including negatedPropertySet.
|
|
12
|
+
* Adds parentheses only when needed for correct precedence.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pathExprToSparql(expr: PathExpr): string;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.collectPathUris = collectPathUris;
|
|
9
|
+
exports.pathExprToSparql = pathExprToSparql;
|
|
10
|
+
const PropertyPathExpr_js_1 = require("./PropertyPathExpr.js");
|
|
11
|
+
const sparqlUtils_js_1 = require("../sparql/sparqlUtils.js");
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Precedence levels (higher = tighter binding)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const PREC_ALT = 1;
|
|
16
|
+
const PREC_SEQ = 2;
|
|
17
|
+
const PREC_UNARY = 3;
|
|
18
|
+
const PREC_PRIMARY = 4;
|
|
19
|
+
function refToSparql(ref) {
|
|
20
|
+
if (typeof ref === 'string') {
|
|
21
|
+
// If it looks like a full IRI (contains ://), use formatUri for prefix shortening
|
|
22
|
+
if (ref.includes('://'))
|
|
23
|
+
return (0, sparqlUtils_js_1.formatUri)(ref);
|
|
24
|
+
// Otherwise treat as prefixed name (already in prefix:local form)
|
|
25
|
+
return ref;
|
|
26
|
+
}
|
|
27
|
+
// {id} refs always contain full IRIs — use formatUri for prefix shortening
|
|
28
|
+
return (0, sparqlUtils_js_1.formatUri)(ref.id);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Collect all full IRIs from a PathExpr AST.
|
|
32
|
+
* Returns IRIs that need PREFIX declarations (full URIs from string refs
|
|
33
|
+
* containing `://` and from `{id}` refs). Does not collect prefixed-name
|
|
34
|
+
* string refs since those are already in prefix:local form.
|
|
35
|
+
*/
|
|
36
|
+
function collectPathUris(expr) {
|
|
37
|
+
const uris = [];
|
|
38
|
+
walkPathExpr(expr, uris);
|
|
39
|
+
return uris;
|
|
40
|
+
}
|
|
41
|
+
function collectRef(ref, uris) {
|
|
42
|
+
if (typeof ref === 'string') {
|
|
43
|
+
if (ref.includes('://'))
|
|
44
|
+
uris.push(ref);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
uris.push(ref.id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function walkPathExpr(expr, uris) {
|
|
51
|
+
if ((0, PropertyPathExpr_js_1.isPathRef)(expr)) {
|
|
52
|
+
collectRef(expr, uris);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if ('seq' in expr) {
|
|
56
|
+
for (const e of expr.seq)
|
|
57
|
+
walkPathExpr(e, uris);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if ('alt' in expr) {
|
|
61
|
+
for (const e of expr.alt)
|
|
62
|
+
walkPathExpr(e, uris);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if ('inv' in expr) {
|
|
66
|
+
walkPathExpr(expr.inv, uris);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if ('zeroOrMore' in expr) {
|
|
70
|
+
walkPathExpr(expr.zeroOrMore, uris);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if ('oneOrMore' in expr) {
|
|
74
|
+
walkPathExpr(expr.oneOrMore, uris);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if ('zeroOrOne' in expr) {
|
|
78
|
+
walkPathExpr(expr.zeroOrOne, uris);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if ('negatedPropertySet' in expr) {
|
|
82
|
+
for (const item of expr.negatedPropertySet) {
|
|
83
|
+
if (typeof item === 'string' || (typeof item === 'object' && 'id' in item && !('inv' in item))) {
|
|
84
|
+
collectRef(item, uris);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
collectRef(item.inv, uris);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Render a PathExpr to SPARQL property path syntax.
|
|
94
|
+
* Handles all forms including negatedPropertySet.
|
|
95
|
+
* Adds parentheses only when needed for correct precedence.
|
|
96
|
+
*/
|
|
97
|
+
function pathExprToSparql(expr) {
|
|
98
|
+
return renderExpr(expr, 0);
|
|
99
|
+
}
|
|
100
|
+
function renderExpr(expr, parentPrec) {
|
|
101
|
+
if ((0, PropertyPathExpr_js_1.isPathRef)(expr)) {
|
|
102
|
+
return refToSparql(expr);
|
|
103
|
+
}
|
|
104
|
+
if ('seq' in expr) {
|
|
105
|
+
const inner = expr.seq.map((e) => renderExpr(e, PREC_SEQ)).join('/');
|
|
106
|
+
return parentPrec > PREC_SEQ ? `(${inner})` : inner;
|
|
107
|
+
}
|
|
108
|
+
if ('alt' in expr) {
|
|
109
|
+
const inner = expr.alt.map((e) => renderExpr(e, PREC_ALT)).join('|');
|
|
110
|
+
return parentPrec > PREC_ALT ? `(${inner})` : inner;
|
|
111
|
+
}
|
|
112
|
+
if ('inv' in expr) {
|
|
113
|
+
return `^${renderExpr(expr.inv, PREC_UNARY)}`;
|
|
114
|
+
}
|
|
115
|
+
if ('zeroOrMore' in expr) {
|
|
116
|
+
return `${renderExpr(expr.zeroOrMore, PREC_PRIMARY)}*`;
|
|
117
|
+
}
|
|
118
|
+
if ('oneOrMore' in expr) {
|
|
119
|
+
return `${renderExpr(expr.oneOrMore, PREC_PRIMARY)}+`;
|
|
120
|
+
}
|
|
121
|
+
if ('zeroOrOne' in expr) {
|
|
122
|
+
return `${renderExpr(expr.zeroOrOne, PREC_PRIMARY)}?`;
|
|
123
|
+
}
|
|
124
|
+
if ('negatedPropertySet' in expr) {
|
|
125
|
+
const items = expr.negatedPropertySet.map((item) => {
|
|
126
|
+
if (typeof item === 'string' || (typeof item === 'object' && 'id' in item && !('inv' in item))) {
|
|
127
|
+
return refToSparql(item);
|
|
128
|
+
}
|
|
129
|
+
const invItem = item;
|
|
130
|
+
return `^${refToSparql(invItem.inv)}`;
|
|
131
|
+
});
|
|
132
|
+
return items.length === 1 ? `!${items[0]}` : `!(${items.join('|')})`;
|
|
133
|
+
}
|
|
134
|
+
throw new Error(`Unknown PathExpr shape: ${JSON.stringify(expr)}`);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=pathExprToSparql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathExprToSparql.js","sourceRoot":"","sources":["../../../src/paths/pathExprToSparql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
export type SHACLTriple = {
|
|
3
|
+
subject: string;
|
|
4
|
+
predicate: string;
|
|
5
|
+
object: string;
|
|
6
|
+
};
|
|
7
|
+
export type SHACLPathResult = {
|
|
8
|
+
/** The root node of the serialized path (IRI or blank node id). */
|
|
9
|
+
root: string;
|
|
10
|
+
/** Additional triples needed to describe the path structure. */
|
|
11
|
+
triples: SHACLTriple[];
|
|
12
|
+
};
|
|
13
|
+
/** Reset blank node counter (for deterministic testing). */
|
|
14
|
+
export declare function resetBlankNodeCounter(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Serialize a PathExpr to SHACL RDF triples.
|
|
17
|
+
*
|
|
18
|
+
* - Simple PathRef → direct IRI (no extra triples)
|
|
19
|
+
* - Complex paths → blank nodes with SHACL path vocabulary
|
|
20
|
+
* - negatedPropertySet → throws (not supported by SHACL)
|
|
21
|
+
*/
|
|
22
|
+
export declare function serializePathToSHACL(expr: PathExpr): SHACLPathResult;
|