@_linked/core 2.28.4 → 2.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +131 -1
  3. package/lib/esm/index.d.ts +1 -0
  4. package/lib/esm/index.js +1 -0
  5. package/lib/esm/index.js.map +1 -1
  6. package/lib/esm/ontologies/linked-core.d.ts +2 -0
  7. package/lib/esm/ontologies/linked-core.js +10 -0
  8. package/lib/esm/ontologies/linked-core.js.map +1 -1
  9. package/lib/esm/ontologies/shacl.d.ts +1 -0
  10. package/lib/esm/ontologies/shacl.js +2 -0
  11. package/lib/esm/ontologies/shacl.js.map +1 -1
  12. package/lib/esm/queries/IRMutation.js +1 -1
  13. package/lib/esm/queries/IRMutation.js.map +1 -1
  14. package/lib/esm/queries/IntermediateRepresentation.d.ts +5 -0
  15. package/lib/esm/queries/IntermediateRepresentation.js.map +1 -1
  16. package/lib/esm/queries/MutationQuery.js +15 -0
  17. package/lib/esm/queries/MutationQuery.js.map +1 -1
  18. package/lib/esm/queries/MutationSerialization.d.ts +5 -4
  19. package/lib/esm/queries/MutationSerialization.js +9 -1
  20. package/lib/esm/queries/MutationSerialization.js.map +1 -1
  21. package/lib/esm/queries/QueryFactory.d.ts +6 -0
  22. package/lib/esm/queries/QueryFactory.js.map +1 -1
  23. package/lib/esm/queries/SelectQuery.js +3 -1
  24. package/lib/esm/queries/SelectQuery.js.map +1 -1
  25. package/lib/esm/queries/lowerMutationJSON.js +6 -1
  26. package/lib/esm/queries/lowerMutationJSON.js.map +1 -1
  27. package/lib/esm/shapes/List.d.ts +1 -0
  28. package/lib/esm/shapes/List.js.map +1 -1
  29. package/lib/esm/shapes/PathNode.d.ts +5 -2
  30. package/lib/esm/shapes/PathNode.js +5 -2
  31. package/lib/esm/shapes/PathNode.js.map +1 -1
  32. package/lib/esm/shapes/SHACL.d.ts +15 -2
  33. package/lib/esm/shapes/SHACL.js.map +1 -1
  34. package/lib/esm/shapes/serializePathToNodeData.d.ts +17 -5
  35. package/lib/esm/shapes/serializePathToNodeData.js +41 -27
  36. package/lib/esm/shapes/serializePathToNodeData.js.map +1 -1
  37. package/lib/esm/shapes/singleOwnerConstraint.d.ts +27 -0
  38. package/lib/esm/shapes/singleOwnerConstraint.js +89 -0
  39. package/lib/esm/shapes/singleOwnerConstraint.js.map +1 -0
  40. package/lib/esm/shapes/syncShapes.js +49 -10
  41. package/lib/esm/shapes/syncShapes.js.map +1 -1
  42. package/lib/esm/shapes/validation.js +2 -2
  43. package/lib/esm/shapes/validation.js.map +1 -1
  44. package/lib/esm/sparql/SparqlAlgebra.d.ts +5 -0
  45. package/lib/esm/sparql/SparqlAlgebra.js.map +1 -1
  46. package/lib/esm/sparql/SparqlDataset.d.ts +9 -1
  47. package/lib/esm/sparql/SparqlDataset.js +19 -0
  48. package/lib/esm/sparql/SparqlDataset.js.map +1 -1
  49. package/lib/esm/sparql/algebraToString.js +2 -0
  50. package/lib/esm/sparql/algebraToString.js.map +1 -1
  51. package/lib/esm/sparql/irToAlgebra.d.ts +34 -6
  52. package/lib/esm/sparql/irToAlgebra.js +384 -59
  53. package/lib/esm/sparql/irToAlgebra.js.map +1 -1
  54. package/lib/esm/sparql/ownedLinkCheck.d.ts +50 -0
  55. package/lib/esm/sparql/ownedLinkCheck.js +142 -0
  56. package/lib/esm/sparql/ownedLinkCheck.js.map +1 -0
  57. package/lib/esm/utils/Package.js +8 -0
  58. package/lib/esm/utils/Package.js.map +1 -1
  59. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"PathNode.js","sourceRoot":"","sources":["../../../src/shapes/PathNode.ts"],"names":[],"mappings":";;;;;;AAAA;;;;GAIG;AACH,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/B;;;;;;;;;GASG;AACH,4FAA4F;AAC5F,2FAA2F;AAC3F,mBAAmB;AAEZ,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,KAAK;IAIjC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC;IACd,CAAC;;AAzBM,oBAAW,GAAG,YAAY,CAAC,QAAQ,AAAxB,CAAyB;AAG3C;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;2CAGtE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;+CAGvF;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;8CAGzE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;6CAGxE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;6CAGxE;AA1BU,QAAQ;IADpB,WAAW,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC;GACpC,QAAQ,CA2BpB","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 {linkedShape} from '../package.js';\nimport {Shape} from './Shape.js';\nimport {objectProperty} from './SHACL.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {coreOntology} from '../ontologies/linked-core.js';\nimport {List} from './List.js';\n\n/**\n * Operator node for SHACL property paths that are NOT a simple predicate or a sequence:\n * inverse (`sh:inversePath`), alternative (`sh:alternativePath` → an `rdf:List`), and the\n * cardinality forms (`sh:zeroOrMorePath`/`sh:oneOrMorePath`/`sh:zeroOrOnePath`).\n *\n * Each operator edge is `contains` (the operand subtree is owned), and the node itself is\n * `dependent`, so a property-shape's complex `sh:path` cascade-cleans on delete/replace.\n * Operands are polymorphic (a predicate IRI, a nested `PathNode`, or a `List`), so no fixed\n * `valueShape` is declared except for `alternativePath`, which is always an `rdf:List`.\n */\n// Named explicitly: the class shares its name with the ontology term coreOntology.PathNode,\n// and a bundler resolving that collision renames the class (PathNode2), which would change\n// the shape's IRI.\n@linkedShape({name: 'PathNode', dependent: true})\nexport class PathNode extends Shape {\n static targetClass = coreOntology.PathNode;\n\n @objectProperty({path: shacl.inversePath, maxCount: 1, contains: true})\n get inversePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.alternativePath, maxCount: 1, shape: List, contains: true})\n get alternativePath(): List {\n return null;\n }\n\n @objectProperty({path: shacl.zeroOrMorePath, maxCount: 1, contains: true})\n get zeroOrMorePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.oneOrMorePath, maxCount: 1, contains: true})\n get oneOrMorePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.zeroOrOnePath, maxCount: 1, contains: true})\n get zeroOrOnePath(): unknown {\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"PathNode.js","sourceRoot":"","sources":["../../../src/shapes/PathNode.ts"],"names":[],"mappings":";;;;;;AAAA;;;;GAIG;AACH,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/B;;;;;;;;;;;;GAYG;AACH,4FAA4F;AAC5F,2FAA2F;AAC3F,mBAAmB;AAEZ,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,KAAK;IAIjC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC;IACd,CAAC;;AAzBM,oBAAW,GAAG,YAAY,CAAC,QAAQ,AAAxB,CAAyB;AAG3C;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;2CAGtE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;+CAGvF;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;8CAGzE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;6CAGxE;AAGD;IADC,cAAc,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;6CAGxE;AA1BU,QAAQ;IADpB,WAAW,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC;GACpC,QAAQ,CA2BpB","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 {linkedShape} from '../package.js';\nimport {Shape} from './Shape.js';\nimport {objectProperty} from './SHACL.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {coreOntology} from '../ontologies/linked-core.js';\nimport {List} from './List.js';\n\n/**\n * Operator node for SHACL property paths that are NOT a simple predicate or a sequence:\n * inverse (`sh:inversePath`), alternative (`sh:alternativePath` → an `rdf:List`), and the\n * cardinality forms (`sh:zeroOrMorePath`/`sh:oneOrMorePath`/`sh:zeroOrOnePath`).\n *\n * Shape sync writes these as untyped blank nodes (`__blank`, see `serializePathToNodeData`): the\n * only form SHACL §2.3.1 defines, a blank node that is the subject of exactly one triple. Each\n * operator edge is `contains`, so the blank-node block of the containment cascade removes the\n * structure on delete/replace. The class stays `dependent` with its `core:PathNode` type for the\n * IRI-named, typed nodes earlier versions wrote: the typed cascade removes those on the next sync.\n * Operands are polymorphic (a predicate IRI, a nested `PathNode`, or a `List`), so no fixed\n * `valueShape` is declared except for `alternativePath`, which is always an `rdf:List`.\n */\n// Named explicitly: the class shares its name with the ontology term coreOntology.PathNode,\n// and a bundler resolving that collision renames the class (PathNode2), which would change\n// the shape's IRI.\n@linkedShape({name: 'PathNode', dependent: true})\nexport class PathNode extends Shape {\n static targetClass = coreOntology.PathNode;\n\n @objectProperty({path: shacl.inversePath, maxCount: 1, contains: true})\n get inversePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.alternativePath, maxCount: 1, shape: List, contains: true})\n get alternativePath(): List {\n return null;\n }\n\n @objectProperty({path: shacl.zeroOrMorePath, maxCount: 1, contains: true})\n get zeroOrMorePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.oneOrMorePath, maxCount: 1, contains: true})\n get oneOrMorePath(): unknown {\n return null;\n }\n\n @objectProperty({path: shacl.zeroOrOnePath, maxCount: 1, contains: true})\n get zeroOrOnePath(): unknown {\n return null;\n }\n}\n"]}
@@ -113,8 +113,21 @@ export interface ObjectPropertyShapeConfig extends PropertyShapeConfig {
113
113
  */
114
114
  shape?: typeof Shape | [string, string];
115
115
  /**
116
- * Marks this property as *containment* (composition): the value(s) are owned by the subject
117
- * and the delete/update cascade removes the owned subtree.
116
+ * Marks this property as *containment* (composition): the value(s) are owned by the subject.
117
+ * For replace, set-remove and the class check, ownership is decided per predicate across the
118
+ * registry: another shape's property on this predicate owns its values too.
119
+ *
120
+ * - With a `shape`: replacing, unsetting or set-removing a value deletes the old node's own
121
+ * triples; deleting the subject (by id or in bulk) deletes its immediate values; re-sent
122
+ * `{id}`s are kept. Linking an existing node by `{id}` is class-checked: it is refused when
123
+ * the node is typed and none of its types is the shape's class, a registered sub-shape's,
124
+ * or `sh:class`.
125
+ * - Without a `shape` (a polymorphic slot): only `dependent`-typed values are deleted.
126
+ * - In both cases the cascade follows the edge to `dependent`-typed descendants.
127
+ *
128
+ * With a `shape`, shape sync also persists a generated SHACL shape for this property (at its
129
+ * property shape's IRI plus `.singleOwner`, written by the declaring class only) that limits
130
+ * each value of the predicate to one owner. It is not enforced on write.
118
131
  */
119
132
  contains?: boolean;
120
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SHACL.js","sourceRoot":"","sources":["../../../src/shapes/SHACL.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 NodeReferenceValue, toNodeReference} from '../utils/NodeReference.js';\nimport {Shape, type ShapeConstructor} from './Shape.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {warnOnReservedPropertyLabel} from '../queries/reservedQueryNames.js';\nimport {getShapeClass} from '../utils/ShapeClass.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\nimport {normalizePropertyPath, type PropertyPathDecoratorInput} from '../paths/normalizePropertyPath.js';\nimport {\n createPropertyShapeData,\n getPropertyShape as getPropertyShapeData,\n addPropertyShape as addPropertyShapeData,\n clonePropertyShape,\n type NodeShapeData,\n type PropertyShapeData,\n} from './nodeShapeData.js';\n\n// Metadata types now live in nodeShapeData.js (plain objects); re-exported here for\n// existing importers of `NodeShape`/`PropertyShape`-adjacent types.\nexport type {NodeShapeData, PropertyShapeData, PropertyShapeResult} from './nodeShapeData.js';\n// Metadata operations (formerly NodeShape/PropertyShape instance methods).\nexport {\n getPropertyShapes,\n getUniquePropertyShapes,\n getPropertyShape,\n addPropertyShape,\n clonePropertyShape,\n propertyShapeToResult,\n nodeShapeEquals,\n createNodeShapeData,\n createPropertyShapeData,\n} from './nodeShapeData.js';\n\n/**\n * Default identity root for shape & package IRIs. Public/first-party packages\n * publish under `linked.cm` (arch-02 §Domains). Packages may override per-package\n * via `linkedPackage(name, { baseUri })` — CN injects a workspace-scoped root\n * (`{workspaceSlug}.id.create.now`) for private packages; first-party packages\n * keep this default.\n */\nexport const LINKED_DATA_ROOT: string = 'https://linked.cm/';\n\n/**\n * Derive the public package slug — the npm package **basename** with the\n * `@scope/` dropped, kebab-cased (arch-02 §Slug rules: `^[a-z0-9]+(?:-[a-z0-9]+)*$`).\n * The package name is the single source of truth; there is no separate slug.\n * `@_linked/core` → `core`, `@linked.cm/blog` → `blog`, `mypkg` → `mypkg`.\n *\n * Both first-party (`@_linked`) and community (`@linked.cm`) packages publish into\n * the one `linked.cm/{shape,pkg}` space, so the basename must be globally unique —\n * enforced by the registry, which reserves the (handful of) first-party names.\n */\nexport function packageNameToSlug(packageName: string): string {\n return packageName\n .replace(/^@[^/]+\\//, '') // drop the npm scope (@scope/), keep the basename\n .replace(/[^a-zA-Z0-9]+/g, '-') // any run of non-alphanumerics → single hyphen\n .replace(/^-+|-+$/g, '') // trim stray hyphens\n .toLowerCase();\n}\n\n/**\n * Where each package publishes its IRIs (the identity root). The slug is always\n * derived from the package name; only the root is configurable — `linkedPackage`\n * defaults it to `LINKED_DATA_ROOT` (linked.cm), and CN injects a workspace-scoped\n * root (`{workspaceSlug}.id.create.now`) for private packages.\n */\nconst packageBaseUri = new Map<string, string>();\n\n/** Record a package's publish root. Called by `linkedPackage()`. */\nexport function setPackagePublishConfig(\n packageName: string,\n config?: {baseUri?: string},\n): void {\n packageBaseUri.set(packageName, config?.baseUri ?? LINKED_DATA_ROOT);\n}\n\n/** Resolve a package's publish root, defaulting to linked.cm if undeclared. */\nfunction resolveBaseUri(packageName: string): string {\n return packageBaseUri.get(packageName) ?? LINKED_DATA_ROOT;\n}\n\n/** Public/first-party package IRI — arch-02: `{baseUri}pkg/{slug}`. */\nexport function getPackageUri(packageName: string): string {\n return `${resolveBaseUri(packageName)}pkg/${packageNameToSlug(packageName)}`;\n}\n\ntype NodeKindConfig = NodeReferenceValue | NodeReferenceValue[];\n\nexport type PropertyPathInput = PropertyPathDecoratorInput;\nexport type PropertyPathInputList = PropertyPathDecoratorInput;\n\nconst normalizeNodeKind = (\n nodeKind?: NodeKindConfig,\n defaultNodeKind?: NodeReferenceValue,\n): NodeReferenceValue | undefined => {\n if (!nodeKind) {\n return defaultNodeKind;\n }\n if (Array.isArray(nodeKind)) {\n const ids = nodeKind.map((entry) => entry?.id);\n const includesBlank = ids.includes(shacl.BlankNode.id);\n const includesNamed = ids.includes(shacl.IRI.id);\n const includesLiteral = ids.includes(shacl.Literal.id);\n if (includesBlank && includesNamed) {\n return shacl.BlankNodeOrIRI;\n }\n if (includesLiteral && includesNamed) {\n return shacl.IRIOrLiteral;\n }\n if (includesLiteral && includesBlank) {\n return shacl.BlankNodeOrLiteral;\n }\n return nodeKind[0];\n }\n return nodeKind;\n};\n\nexport interface NodeShapeConfig {\n /**\n * Set to true to close the shape. This means any target node of this shape\n * that has properties outside the defined properties of this shape is invalid.\n */\n closed?: boolean;\n /**\n * Optional list of properties that are also permitted in addition to those explicitly listed by this shape.\n */\n ignoredProperties?: NodeReferenceValue[];\n}\n\nexport interface LiteralPropertyShapeConfig extends PropertyShapeConfig {\n nodeKind?: NodeReferenceValue;\n /**\n * Values of the configured property must be less than the values of this 'lessThan' property.\n * Value is always a property IRI (pair constraint).\n */\n lessThan?: NodeReferenceValue;\n /**\n * Values of the configured property must be less than or equal the values of this 'lessThanOrEquals' property.\n * Value is always a property IRI (pair constraint).\n */\n lessThanOrEquals?: NodeReferenceValue;\n /**\n * All values of this property must be higher than this number\n */\n minExclusive?: number | string;\n /**\n * All values of this property must be higher than or equal this number\n */\n minInclusive?: number;\n /**\n * All values of this property must be lower than this number\n */\n maxExclusive?: number;\n /**\n * All values of this property must be lower than or equal this number\n */\n maxInclusive?: number;\n /**\n * All literal values of this property must at least be this long\n */\n minLength?: number;\n /**\n * All literal values of this property must at most be this long\n */\n maxLength?: number;\n /**\n * All literal values of this property must match this regular expression\n */\n pattern?: RegExp;\n /**\n * All literal values of this property must have one of these languages as their language tag\n */\n languageIn?: string[];\n /**\n * No pair of values may use the same language tag.\n */\n uniqueLang?: boolean;\n /**\n * Each literal value of this property must use this datatype\n */\n datatype?: NodeReferenceValue;\n /**\n * Each value of the property must occur in this set.\n * Use {id: '...'} for IRI nodes, or plain strings/numbers/booleans for literal values.\n */\n in?: (NodeReferenceValue | string | number | boolean)[];\n}\n\nexport interface ObjectPropertyShapeConfig extends PropertyShapeConfig {\n nodeKind?: NodeReferenceValue;\n /**\n * Each value of this property must have this class as its rdf:type\n */\n class?: NodeReferenceValue;\n /**\n * The shape that values of this property path need to confirm to.\n * You need to provide a class that extends Shape.\n */\n shape?: typeof Shape | [string, string];\n /**\n * Marks this property as *containment* (composition): the value(s) are owned by the subject\n * and the delete/update cascade removes the owned subtree.\n */\n contains?: boolean;\n}\n\nexport interface PropertyShapeConfig {\n /**\n * The property path of this property shape.\n *\n * Four accepted forms, all equivalent where they overlap:\n *\n * - **An ontology term** — `documents.confidence`. The idiom for real shapes: it reuses the\n * ontology, so a namespace changes in one place. `createNameSpace` returns a `{id}` ref, so\n * the term IS the second form and is passed DIRECTLY — never `documents.confidence.id`,\n * which unwraps it back to a bare string.\n * - **A node reference** — `{id: 'https://example.org/vocab#startsAt'}`. What the first form\n * produces. Convenient in tests, or wherever an ontology module would be overkill.\n * - **A bare IRI or prefixed name** — `'https://example.org/vocab#startsAt'`, `'ex:startsAt'`.\n * - **A path expression** — `'ex:a/ex:b'`, `{seq: [...]}`, `{inv: ...}`, and the other\n * operators. An array is read as a sequence.\n *\n * A string is parsed as an expression only when it is not a bare absolute IRI: `ex:a/ex:b` is\n * a sequence, while the `/` inside `https://example.org/vocab#x` belongs to the IRI.\n */\n path: PropertyPathInputList;\n /**\n * Indicates that this property must exist.\n * Shorthand for minCount=1\n */\n required?: boolean;\n /**\n * Each value must be of this node type.\n */\n nodeKind?: NodeKindConfig;\n /**\n * Minimum number of values required\n */\n minCount?: number;\n /**\n * Maximum number of values allowed\n */\n maxCount?: number;\n /**\n * Values of the configured property must equal the values of this 'equals' property.\n * Value is always a property IRI (pair constraint).\n */\n equals?: NodeReferenceValue;\n /**\n * Values of the configured property must differ from the values of this 'disjoint' property.\n * Value is always a property IRI (pair constraint).\n */\n disjoint?: NodeReferenceValue;\n /**\n * At least one value of this property must equal the given value.\n * Use {id: '...'} for IRI nodes, or a plain string for literal values.\n */\n hasValue?: NodeReferenceValue | string | number | boolean;\n name?: string;\n description?: string;\n order?: number;\n group?: string;\n /**\n * Display importance, lower = more important (`core:displayRank`).\n * A renderer that can show only N properties shows the N lowest ranks.\n */\n displayRank?: number;\n /** Omit this property from generic rendering (`core:displayHidden`). */\n displayHidden?: boolean;\n /**\n * should correlate to the given datatype or class\n */\n defaultValue?: unknown;\n /**\n * Each value of the property must occur in this set.\n * Use {id: '...'} for IRI nodes, or plain strings for literal values.\n *\n * @example\n * in: ['ACTIVE', 'PENDING', 'CLOSED']\n * in: [{id: 'http://example.org/StatusA'}, {id: 'http://example.org/StatusB'}]\n */\n in?: (NodeReferenceValue | string | number | boolean)[];\n /**\n * Values of the configured property path are sorted by the values of this property path.\n */\n sortBy?: PropertyPathInputList;\n}\n\nconst EXPLICIT_NODE_KIND_SYMBOL = Symbol('explicitNodeKind');\nconst EXPLICIT_MIN_COUNT_SYMBOL = Symbol('explicitMinCount');\nconst EXPLICIT_MAX_COUNT_SYMBOL = Symbol('explicitMaxCount');\n\n/** Internal symbol-keyed flags on a PropertyShapeData object to track which fields were explicitly configured. */\ninterface ExplicitFlags {\n [EXPLICIT_NODE_KIND_SYMBOL]?: boolean;\n [EXPLICIT_MIN_COUNT_SYMBOL]?: boolean;\n [EXPLICIT_MAX_COUNT_SYMBOL]?: boolean;\n}\n\nexport interface ParameterConfig {\n optional?: number;\n}\n\n/**\n * Static-only DSL handle for the SHACL `sh:NodeShape` meta-shape.\n *\n * Never instantiated — a shape's metadata is a plain {@link NodeShapeData} object\n * (see nodeShapeData.js), and the instance methods that used to live here are now\n * free functions in that module. This class exists only to carry the meta-shape's\n * static `.shape` self-description and to serve as the DSL entry point for reading\n * and writing node-shape SHACL data (`NodeShape.create/select/delete`).\n */\nexport class NodeShape extends Shape {\n static targetClass = shacl.NodeShape;\n}\n\n/**\n * Static-only DSL handle for the SHACL `sh:PropertyShape` meta-shape.\n *\n * Never instantiated — property-shape metadata is a plain {@link PropertyShapeData}\n * object (see nodeShapeData.js). Exists only for its static `.shape` self-description\n * and as a DSL entry point (`PropertyShape.create/select`).\n */\nexport class PropertyShape extends Shape {\n static targetClass = shacl.PropertyShape;\n}\n\nconst connectValueShape = <\n Config extends LiteralPropertyShapeConfig | ObjectPropertyShapeConfig,\n>(\n config: Config,\n propertyKey: string,\n property: PropertyShapeData,\n) => {\n if ((config as ObjectPropertyShapeConfig).shape) {\n const shapeConfig = (config as ObjectPropertyShapeConfig).shape;\n\n if (Array.isArray(shapeConfig)) {\n const [packageName, shapeName] = shapeConfig;\n const nodeShapeUri = getNodeShapeUri(packageName, shapeName);\n property.valueShape = {id: nodeShapeUri};\n } else {\n const shapeClass = shapeConfig as typeof Shape;\n if (shapeClass.shape) {\n property.valueShape = {id: shapeClass.shape.id};\n } else {\n onShapeSetup(\n shapeConfig,\n (nodeShape: NodeShapeData) => {\n property.valueShape = {id: nodeShape.id};\n },\n propertyKey,\n );\n }\n }\n }\n};\n\n/**\n * The DSL-JSON where-clause combinators. A property may not be named after one,\n * because a condition key in those positions has no `{path}` escape (the key is a\n * bare string). See documentation/dsl-json.md (Reserved words).\n */\nconst RESERVED_PROPERTY_LABELS = new Set(['and', 'or', 'not']);\n\nexport function registerPropertyShape(\n shape: NodeShapeData,\n propertyShape: PropertyShapeData,\n) {\n if (RESERVED_PROPERTY_LABELS.has(propertyShape.label)) {\n throw new Error(\n `Property label '${propertyShape.label}' is reserved (a DSL-JSON boolean combinator) ` +\n `and cannot be used as a property name. See documentation/dsl-json.md (Reserved words).`,\n );\n }\n // Not fatal, but the author needs to hear it here rather than from the field tracer.\n warnOnReservedPropertyLabel(propertyShape.label, shape.label, shape.id);\n const inherited = getPropertyShapeData(shape, propertyShape.label, true);\n const existing = getPropertyShapeData(shape, propertyShape.label, false);\n if (!existing && inherited) {\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_MIN_COUNT_SYMBOL]) {\n propertyShape.minCount = inherited.minCount;\n }\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_MAX_COUNT_SYMBOL]) {\n propertyShape.maxCount = inherited.maxCount;\n }\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_NODE_KIND_SYMBOL]) {\n propertyShape.nodeKind = inherited.nodeKind;\n }\n validateOverrideTightening(shape, inherited, propertyShape);\n }\n if (existing) {\n Object.assign(existing, propertyShape);\n return existing;\n }\n propertyShape.id = `${shape.id}/${propertyShape.label}`;\n addPropertyShapeData(shape, propertyShape);\n return propertyShape;\n}\n\nconst ATOMIC_NODE_KINDS = [\n shacl.BlankNode.id,\n shacl.IRI.id,\n shacl.Literal.id,\n];\n\nconst nodeKindToAtomics = (nodeKind?: NodeReferenceValue): Set<string> => {\n if (!nodeKind?.id) {\n return new Set();\n }\n switch (nodeKind.id) {\n case shacl.BlankNode.id:\n case shacl.IRI.id:\n case shacl.Literal.id:\n return new Set([nodeKind.id]);\n case shacl.BlankNodeOrIRI.id:\n return new Set([shacl.BlankNode.id, shacl.IRI.id]);\n case shacl.IRIOrLiteral.id:\n return new Set([shacl.IRI.id, shacl.Literal.id]);\n case shacl.BlankNodeOrLiteral.id:\n return new Set([shacl.BlankNode.id, shacl.Literal.id]);\n default:\n return new Set(ATOMIC_NODE_KINDS);\n }\n};\n\nconst throwOverrideError = (\n shape: NodeShapeData,\n propertyShape: PropertyShapeData,\n message: string,\n) => {\n throw new Error(\n `Invalid override for ${shape.label}.${propertyShape.label}: ${message}`,\n );\n};\n\nconst validateOverrideTightening = (\n shape: NodeShapeData,\n base: PropertyShapeData,\n override: PropertyShapeData,\n) => {\n if (\n typeof base.minCount === 'number' &&\n typeof override.minCount === 'number' &&\n override.minCount < base.minCount\n ) {\n throwOverrideError(\n shape,\n override,\n `minCount cannot be lowered (${base.minCount} -> ${override.minCount}).`,\n );\n }\n\n if (\n typeof base.maxCount === 'number' &&\n typeof override.maxCount === 'number' &&\n override.maxCount > base.maxCount\n ) {\n throwOverrideError(\n shape,\n override,\n `maxCount cannot be increased (${base.maxCount} -> ${override.maxCount}).`,\n );\n }\n\n if (base.nodeKind && override.nodeKind) {\n const baseKinds = nodeKindToAtomics(base.nodeKind);\n const overrideKinds = nodeKindToAtomics(override.nodeKind);\n const widensNodeKind = [...overrideKinds].some((kind) => !baseKinds.has(kind));\n if (widensNodeKind) {\n throwOverrideError(\n shape,\n override,\n `nodeKind cannot be widened (${base.nodeKind.id} -> ${override.nodeKind.id}).`,\n );\n }\n }\n};\n\nexport function createPropertyShape<\n Config extends LiteralPropertyShapeConfig | ObjectPropertyShapeConfig,\n>(\n config: Config,\n propertyKey: string,\n defaultNodeKind: NodeReferenceValue = null,\n shapeClass: typeof Shape | [string, string] = null,\n) {\n const propertyShape = createPropertyShapeData();\n propertyShape.path = normalizePropertyPath(config.path);\n propertyShape.label = propertyKey;\n\n if (config.name) {\n propertyShape.name = config.name;\n }\n if (config.description) {\n propertyShape.description = config.description;\n }\n\n if (config.required) {\n propertyShape.minCount = 1;\n } else if (config.minCount !== undefined) {\n propertyShape.minCount = config.minCount;\n }\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_MIN_COUNT_SYMBOL] =\n config.required === true || config.minCount !== undefined;\n\n if (config.maxCount !== undefined) {\n propertyShape.maxCount = config.maxCount;\n }\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_MAX_COUNT_SYMBOL] =\n config.maxCount !== undefined;\n if ((config as LiteralPropertyShapeConfig).datatype) {\n propertyShape.datatype = toNodeReference(\n (config as LiteralPropertyShapeConfig).datatype,\n );\n }\n\n if ((config as ObjectPropertyShapeConfig).class) {\n propertyShape.class = toNodeReference(\n (config as ObjectPropertyShapeConfig).class,\n );\n }\n\n if ((config as ObjectPropertyShapeConfig).contains) {\n propertyShape.contains = true;\n }\n\n if (config.equals) {\n propertyShape.equalsConstraint = toNodeReference(config.equals);\n }\n if (config.disjoint) {\n propertyShape.disjoint = toNodeReference(config.disjoint);\n }\n if ((config as LiteralPropertyShapeConfig).lessThan) {\n propertyShape.lessThan = toNodeReference((config as LiteralPropertyShapeConfig).lessThan);\n }\n if ((config as LiteralPropertyShapeConfig).lessThanOrEquals) {\n propertyShape.lessThanOrEquals = toNodeReference((config as LiteralPropertyShapeConfig).lessThanOrEquals);\n }\n // Value-range / string-length / pattern constraints (report 021 §3, G5). These are\n // recorded on the shape and serialized to SHACL; there is no DSL-side runtime\n // enforcement — they describe the shape for validators / introspection.\n {\n const lit = config as LiteralPropertyShapeConfig;\n if (lit.minInclusive !== undefined) propertyShape.minInclusive = lit.minInclusive;\n if (lit.maxInclusive !== undefined) propertyShape.maxInclusive = lit.maxInclusive;\n if (lit.minExclusive !== undefined) propertyShape.minExclusive = lit.minExclusive;\n if (lit.maxExclusive !== undefined) propertyShape.maxExclusive = lit.maxExclusive;\n if (lit.minLength !== undefined) propertyShape.minLength = lit.minLength;\n if (lit.maxLength !== undefined) propertyShape.maxLength = lit.maxLength;\n if (lit.pattern !== undefined) propertyShape.pattern = lit.pattern;\n }\n if (config.hasValue !== undefined) {\n const v = config.hasValue;\n propertyShape.hasValueConstraint = typeof v === 'object' && v !== null ? toNodeReference(v) : v;\n }\n if (config.defaultValue !== undefined) {\n propertyShape.defaultValue = config.defaultValue;\n }\n if (config.in) {\n propertyShape.in = config.in.map((entry) =>\n typeof entry === 'object' && entry !== null ? toNodeReference(entry) : entry,\n );\n }\n if (config.sortBy) {\n propertyShape.sortBy = normalizePropertyPath(config.sortBy);\n }\n // Arrangement + display metadata. `order` and `group` were declared on the config\n // but never copied onto the property shape, so a declared `sh:order` was silently\n // dropped and every renderer fell back to array position. Carried now, alongside\n // the two display terms.\n if (config.order !== undefined) propertyShape.order = config.order;\n if (config.group !== undefined) propertyShape.group = config.group;\n if (config.displayRank !== undefined) propertyShape.displayRank = config.displayRank;\n if (config.displayHidden !== undefined)\n propertyShape.displayHidden = config.displayHidden;\n\n propertyShape.nodeKind = normalizeNodeKind(config.nodeKind, defaultNodeKind);\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_NODE_KIND_SYMBOL] =\n config.nodeKind !== undefined;\n\n if (shapeClass) {\n onShapeSetup(shapeClass, (shape: NodeShapeData) => {\n connectValueShape(config, propertyKey, propertyShape);\n registerPropertyShape(shape, propertyShape);\n });\n }\n\n return propertyShape;\n}\n\nexport function onShapeSetup(\n shapeClass: typeof Shape | [string, string],\n callback: (shape: NodeShapeData) => void,\n propertyName?: string,\n waitForSuperShapes?: boolean,\n) {\n const cb = waitForSuperShapes\n ? (shape: NodeShapeData) => {\n const superClass = Object.getPrototypeOf(shapeClass) as typeof Shape;\n if (superClass.name === 'Shape') {\n callback(shape);\n return;\n }\n if (superClass.name === '') {\n console.error(\n `Shape ${shape.label} does not extend base class lincd/shapes/Shape. Make sure it extends Shape.`,\n );\n return;\n }\n onShapeSetup(\n superClass,\n () => {\n callback(shape);\n },\n propertyName,\n waitForSuperShapes,\n );\n }\n : callback;\n\n const safeCallback = (\n targetShapeClass: typeof Shape,\n innerCallback: (shape: NodeShapeData) => void,\n ) => {\n if (targetShapeClass.hasOwnProperty('shape')) {\n innerCallback((targetShapeClass as typeof Shape).shape);\n } else {\n if (!targetShapeClass['shapeCallbacks']) {\n targetShapeClass['shapeCallbacks'] = [];\n }\n targetShapeClass['shapeCallbacks'].push(innerCallback);\n }\n };\n\n if (Array.isArray(shapeClass)) {\n const [packageName, shapeName] = shapeClass;\n const nodeShapeId = getNodeShapeUri(packageName, shapeName);\n if (typeof document !== 'undefined') {\n window.addEventListener('load', () => {\n const resolved = getShapeClass(nodeShapeId);\n if (!resolved) {\n console.warn(\n `Could not find value shape (${packageName}/${shapeName}) for accessor get ${propertyName}(). Likely because it is not bundled.`,\n );\n return;\n }\n safeCallback(resolved as unknown as typeof Shape, cb);\n });\n } else {\n addNodeShapeCallback(nodeShapeId, cb);\n }\n } else {\n safeCallback(shapeClass, cb);\n }\n}\n\nconst _linkedProperty = <\n Config extends ObjectPropertyShapeConfig | LiteralPropertyShapeConfig,\n>(\n config: Config,\n defaultNodeKind: NodeReferenceValue = null,\n) => {\n return function (\n target: any,\n propertyKey: string,\n _descriptor: PropertyDescriptor,\n ) {\n createPropertyShape(config, propertyKey, defaultNodeKind, target.constructor);\n };\n};\n\nexport const literalProperty = (config: LiteralPropertyShapeConfig) => {\n return _linkedProperty<LiteralPropertyShapeConfig>(config, shacl.Literal);\n};\n\nexport const objectProperty = (config: ObjectPropertyShapeConfig) => {\n return _linkedProperty<ObjectPropertyShapeConfig>(config, shacl.IRI);\n};\n\nexport const linkedProperty = (\n config: ObjectPropertyShapeConfig | LiteralPropertyShapeConfig,\n) => {\n return _linkedProperty(config);\n};\n\nexport function disallowProperty(\n target: any,\n propertyKey: string,\n _descriptor: PropertyDescriptor,\n) {\n onShapeSetup(\n target.constructor,\n (shape: NodeShapeData) => {\n const superClass = Object.getPrototypeOf(target.constructor) as typeof Shape;\n const superNodeShape = superClass.shape;\n const superPropertyShape = getPropertyShapeData(\n superNodeShape,\n propertyKey,\n true,\n );\n if (!superPropertyShape) {\n console.warn(\n `Property ${propertyKey} not found in super class ${superClass.name} or any of its super classes. Does it have a property decorator? Cannot disallow property ${target.constructor.name}.${propertyKey}`,\n );\n return;\n }\n const clonedPropertyShape = clonePropertyShape(superPropertyShape);\n clonedPropertyShape.maxCount = 0;\n registerPropertyShape(shape, clonedPropertyShape);\n },\n '',\n true,\n );\n}\n\nexport function getNodeShapeUri(packageName: string, shapeName: string): string {\n // arch-02: `{baseUri}shape/{packageSlug}/{ShapeName}` — ShapeName kept PascalCase\n // (it is a class name, already URI-safe), packageSlug derived from the name.\n return `${resolveBaseUri(packageName)}shape/${packageNameToSlug(packageName)}/${shapeName}`;\n}\n\nconst nodeShapeCallbacks = new Map<string, ((shape: NodeShapeData) => void)[]>();\nexport function getAndClearCallbacks(\n nodeShapeId: string,\n): ((shape: NodeShapeData) => void)[] {\n const callbacks = nodeShapeCallbacks.get(nodeShapeId);\n nodeShapeCallbacks.delete(nodeShapeId);\n return callbacks;\n}\nexport const addNodeShapeCallback = (\n nodeShapeId: string,\n callback: (shape: NodeShapeData) => void,\n) => {\n if (!nodeShapeCallbacks.has(nodeShapeId)) {\n nodeShapeCallbacks.set(nodeShapeId, []);\n }\n nodeShapeCallbacks.get(nodeShapeId).push(callback);\n};\n"]}
1
+ {"version":3,"file":"SHACL.js","sourceRoot":"","sources":["../../../src/shapes/SHACL.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 NodeReferenceValue, toNodeReference} from '../utils/NodeReference.js';\nimport {Shape, type ShapeConstructor} from './Shape.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {warnOnReservedPropertyLabel} from '../queries/reservedQueryNames.js';\nimport {getShapeClass} from '../utils/ShapeClass.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\nimport {normalizePropertyPath, type PropertyPathDecoratorInput} from '../paths/normalizePropertyPath.js';\nimport {\n createPropertyShapeData,\n getPropertyShape as getPropertyShapeData,\n addPropertyShape as addPropertyShapeData,\n clonePropertyShape,\n type NodeShapeData,\n type PropertyShapeData,\n} from './nodeShapeData.js';\n\n// Metadata types now live in nodeShapeData.js (plain objects); re-exported here for\n// existing importers of `NodeShape`/`PropertyShape`-adjacent types.\nexport type {NodeShapeData, PropertyShapeData, PropertyShapeResult} from './nodeShapeData.js';\n// Metadata operations (formerly NodeShape/PropertyShape instance methods).\nexport {\n getPropertyShapes,\n getUniquePropertyShapes,\n getPropertyShape,\n addPropertyShape,\n clonePropertyShape,\n propertyShapeToResult,\n nodeShapeEquals,\n createNodeShapeData,\n createPropertyShapeData,\n} from './nodeShapeData.js';\n\n/**\n * Default identity root for shape & package IRIs. Public/first-party packages\n * publish under `linked.cm` (arch-02 §Domains). Packages may override per-package\n * via `linkedPackage(name, { baseUri })` — CN injects a workspace-scoped root\n * (`{workspaceSlug}.id.create.now`) for private packages; first-party packages\n * keep this default.\n */\nexport const LINKED_DATA_ROOT: string = 'https://linked.cm/';\n\n/**\n * Derive the public package slug — the npm package **basename** with the\n * `@scope/` dropped, kebab-cased (arch-02 §Slug rules: `^[a-z0-9]+(?:-[a-z0-9]+)*$`).\n * The package name is the single source of truth; there is no separate slug.\n * `@_linked/core` → `core`, `@linked.cm/blog` → `blog`, `mypkg` → `mypkg`.\n *\n * Both first-party (`@_linked`) and community (`@linked.cm`) packages publish into\n * the one `linked.cm/{shape,pkg}` space, so the basename must be globally unique —\n * enforced by the registry, which reserves the (handful of) first-party names.\n */\nexport function packageNameToSlug(packageName: string): string {\n return packageName\n .replace(/^@[^/]+\\//, '') // drop the npm scope (@scope/), keep the basename\n .replace(/[^a-zA-Z0-9]+/g, '-') // any run of non-alphanumerics → single hyphen\n .replace(/^-+|-+$/g, '') // trim stray hyphens\n .toLowerCase();\n}\n\n/**\n * Where each package publishes its IRIs (the identity root). The slug is always\n * derived from the package name; only the root is configurable — `linkedPackage`\n * defaults it to `LINKED_DATA_ROOT` (linked.cm), and CN injects a workspace-scoped\n * root (`{workspaceSlug}.id.create.now`) for private packages.\n */\nconst packageBaseUri = new Map<string, string>();\n\n/** Record a package's publish root. Called by `linkedPackage()`. */\nexport function setPackagePublishConfig(\n packageName: string,\n config?: {baseUri?: string},\n): void {\n packageBaseUri.set(packageName, config?.baseUri ?? LINKED_DATA_ROOT);\n}\n\n/** Resolve a package's publish root, defaulting to linked.cm if undeclared. */\nfunction resolveBaseUri(packageName: string): string {\n return packageBaseUri.get(packageName) ?? LINKED_DATA_ROOT;\n}\n\n/** Public/first-party package IRI — arch-02: `{baseUri}pkg/{slug}`. */\nexport function getPackageUri(packageName: string): string {\n return `${resolveBaseUri(packageName)}pkg/${packageNameToSlug(packageName)}`;\n}\n\ntype NodeKindConfig = NodeReferenceValue | NodeReferenceValue[];\n\nexport type PropertyPathInput = PropertyPathDecoratorInput;\nexport type PropertyPathInputList = PropertyPathDecoratorInput;\n\nconst normalizeNodeKind = (\n nodeKind?: NodeKindConfig,\n defaultNodeKind?: NodeReferenceValue,\n): NodeReferenceValue | undefined => {\n if (!nodeKind) {\n return defaultNodeKind;\n }\n if (Array.isArray(nodeKind)) {\n const ids = nodeKind.map((entry) => entry?.id);\n const includesBlank = ids.includes(shacl.BlankNode.id);\n const includesNamed = ids.includes(shacl.IRI.id);\n const includesLiteral = ids.includes(shacl.Literal.id);\n if (includesBlank && includesNamed) {\n return shacl.BlankNodeOrIRI;\n }\n if (includesLiteral && includesNamed) {\n return shacl.IRIOrLiteral;\n }\n if (includesLiteral && includesBlank) {\n return shacl.BlankNodeOrLiteral;\n }\n return nodeKind[0];\n }\n return nodeKind;\n};\n\nexport interface NodeShapeConfig {\n /**\n * Set to true to close the shape. This means any target node of this shape\n * that has properties outside the defined properties of this shape is invalid.\n */\n closed?: boolean;\n /**\n * Optional list of properties that are also permitted in addition to those explicitly listed by this shape.\n */\n ignoredProperties?: NodeReferenceValue[];\n}\n\nexport interface LiteralPropertyShapeConfig extends PropertyShapeConfig {\n nodeKind?: NodeReferenceValue;\n /**\n * Values of the configured property must be less than the values of this 'lessThan' property.\n * Value is always a property IRI (pair constraint).\n */\n lessThan?: NodeReferenceValue;\n /**\n * Values of the configured property must be less than or equal the values of this 'lessThanOrEquals' property.\n * Value is always a property IRI (pair constraint).\n */\n lessThanOrEquals?: NodeReferenceValue;\n /**\n * All values of this property must be higher than this number\n */\n minExclusive?: number | string;\n /**\n * All values of this property must be higher than or equal this number\n */\n minInclusive?: number;\n /**\n * All values of this property must be lower than this number\n */\n maxExclusive?: number;\n /**\n * All values of this property must be lower than or equal this number\n */\n maxInclusive?: number;\n /**\n * All literal values of this property must at least be this long\n */\n minLength?: number;\n /**\n * All literal values of this property must at most be this long\n */\n maxLength?: number;\n /**\n * All literal values of this property must match this regular expression\n */\n pattern?: RegExp;\n /**\n * All literal values of this property must have one of these languages as their language tag\n */\n languageIn?: string[];\n /**\n * No pair of values may use the same language tag.\n */\n uniqueLang?: boolean;\n /**\n * Each literal value of this property must use this datatype\n */\n datatype?: NodeReferenceValue;\n /**\n * Each value of the property must occur in this set.\n * Use {id: '...'} for IRI nodes, or plain strings/numbers/booleans for literal values.\n */\n in?: (NodeReferenceValue | string | number | boolean)[];\n}\n\nexport interface ObjectPropertyShapeConfig extends PropertyShapeConfig {\n nodeKind?: NodeReferenceValue;\n /**\n * Each value of this property must have this class as its rdf:type\n */\n class?: NodeReferenceValue;\n /**\n * The shape that values of this property path need to confirm to.\n * You need to provide a class that extends Shape.\n */\n shape?: typeof Shape | [string, string];\n /**\n * Marks this property as *containment* (composition): the value(s) are owned by the subject.\n * For replace, set-remove and the class check, ownership is decided per predicate across the\n * registry: another shape's property on this predicate owns its values too.\n *\n * - With a `shape`: replacing, unsetting or set-removing a value deletes the old node's own\n * triples; deleting the subject (by id or in bulk) deletes its immediate values; re-sent\n * `{id}`s are kept. Linking an existing node by `{id}` is class-checked: it is refused when\n * the node is typed and none of its types is the shape's class, a registered sub-shape's,\n * or `sh:class`.\n * - Without a `shape` (a polymorphic slot): only `dependent`-typed values are deleted.\n * - In both cases the cascade follows the edge to `dependent`-typed descendants.\n *\n * With a `shape`, shape sync also persists a generated SHACL shape for this property (at its\n * property shape's IRI plus `.singleOwner`, written by the declaring class only) that limits\n * each value of the predicate to one owner. It is not enforced on write.\n */\n contains?: boolean;\n}\n\nexport interface PropertyShapeConfig {\n /**\n * The property path of this property shape.\n *\n * Four accepted forms, all equivalent where they overlap:\n *\n * - **An ontology term** — `documents.confidence`. The idiom for real shapes: it reuses the\n * ontology, so a namespace changes in one place. `createNameSpace` returns a `{id}` ref, so\n * the term IS the second form and is passed DIRECTLY — never `documents.confidence.id`,\n * which unwraps it back to a bare string.\n * - **A node reference** — `{id: 'https://example.org/vocab#startsAt'}`. What the first form\n * produces. Convenient in tests, or wherever an ontology module would be overkill.\n * - **A bare IRI or prefixed name** — `'https://example.org/vocab#startsAt'`, `'ex:startsAt'`.\n * - **A path expression** — `'ex:a/ex:b'`, `{seq: [...]}`, `{inv: ...}`, and the other\n * operators. An array is read as a sequence.\n *\n * A string is parsed as an expression only when it is not a bare absolute IRI: `ex:a/ex:b` is\n * a sequence, while the `/` inside `https://example.org/vocab#x` belongs to the IRI.\n */\n path: PropertyPathInputList;\n /**\n * Indicates that this property must exist.\n * Shorthand for minCount=1\n */\n required?: boolean;\n /**\n * Each value must be of this node type.\n */\n nodeKind?: NodeKindConfig;\n /**\n * Minimum number of values required\n */\n minCount?: number;\n /**\n * Maximum number of values allowed\n */\n maxCount?: number;\n /**\n * Values of the configured property must equal the values of this 'equals' property.\n * Value is always a property IRI (pair constraint).\n */\n equals?: NodeReferenceValue;\n /**\n * Values of the configured property must differ from the values of this 'disjoint' property.\n * Value is always a property IRI (pair constraint).\n */\n disjoint?: NodeReferenceValue;\n /**\n * At least one value of this property must equal the given value.\n * Use {id: '...'} for IRI nodes, or a plain string for literal values.\n */\n hasValue?: NodeReferenceValue | string | number | boolean;\n name?: string;\n description?: string;\n order?: number;\n group?: string;\n /**\n * Display importance, lower = more important (`core:displayRank`).\n * A renderer that can show only N properties shows the N lowest ranks.\n */\n displayRank?: number;\n /** Omit this property from generic rendering (`core:displayHidden`). */\n displayHidden?: boolean;\n /**\n * should correlate to the given datatype or class\n */\n defaultValue?: unknown;\n /**\n * Each value of the property must occur in this set.\n * Use {id: '...'} for IRI nodes, or plain strings for literal values.\n *\n * @example\n * in: ['ACTIVE', 'PENDING', 'CLOSED']\n * in: [{id: 'http://example.org/StatusA'}, {id: 'http://example.org/StatusB'}]\n */\n in?: (NodeReferenceValue | string | number | boolean)[];\n /**\n * Values of the configured property path are sorted by the values of this property path.\n */\n sortBy?: PropertyPathInputList;\n}\n\nconst EXPLICIT_NODE_KIND_SYMBOL = Symbol('explicitNodeKind');\nconst EXPLICIT_MIN_COUNT_SYMBOL = Symbol('explicitMinCount');\nconst EXPLICIT_MAX_COUNT_SYMBOL = Symbol('explicitMaxCount');\n\n/** Internal symbol-keyed flags on a PropertyShapeData object to track which fields were explicitly configured. */\ninterface ExplicitFlags {\n [EXPLICIT_NODE_KIND_SYMBOL]?: boolean;\n [EXPLICIT_MIN_COUNT_SYMBOL]?: boolean;\n [EXPLICIT_MAX_COUNT_SYMBOL]?: boolean;\n}\n\nexport interface ParameterConfig {\n optional?: number;\n}\n\n/**\n * Static-only DSL handle for the SHACL `sh:NodeShape` meta-shape.\n *\n * Never instantiated — a shape's metadata is a plain {@link NodeShapeData} object\n * (see nodeShapeData.js), and the instance methods that used to live here are now\n * free functions in that module. This class exists only to carry the meta-shape's\n * static `.shape` self-description and to serve as the DSL entry point for reading\n * and writing node-shape SHACL data (`NodeShape.create/select/delete`).\n */\nexport class NodeShape extends Shape {\n static targetClass = shacl.NodeShape;\n}\n\n/**\n * Static-only DSL handle for the SHACL `sh:PropertyShape` meta-shape.\n *\n * Never instantiated — property-shape metadata is a plain {@link PropertyShapeData}\n * object (see nodeShapeData.js). Exists only for its static `.shape` self-description\n * and as a DSL entry point (`PropertyShape.create/select`).\n */\nexport class PropertyShape extends Shape {\n static targetClass = shacl.PropertyShape;\n}\n\nconst connectValueShape = <\n Config extends LiteralPropertyShapeConfig | ObjectPropertyShapeConfig,\n>(\n config: Config,\n propertyKey: string,\n property: PropertyShapeData,\n) => {\n if ((config as ObjectPropertyShapeConfig).shape) {\n const shapeConfig = (config as ObjectPropertyShapeConfig).shape;\n\n if (Array.isArray(shapeConfig)) {\n const [packageName, shapeName] = shapeConfig;\n const nodeShapeUri = getNodeShapeUri(packageName, shapeName);\n property.valueShape = {id: nodeShapeUri};\n } else {\n const shapeClass = shapeConfig as typeof Shape;\n if (shapeClass.shape) {\n property.valueShape = {id: shapeClass.shape.id};\n } else {\n onShapeSetup(\n shapeConfig,\n (nodeShape: NodeShapeData) => {\n property.valueShape = {id: nodeShape.id};\n },\n propertyKey,\n );\n }\n }\n }\n};\n\n/**\n * The DSL-JSON where-clause combinators. A property may not be named after one,\n * because a condition key in those positions has no `{path}` escape (the key is a\n * bare string). See documentation/dsl-json.md (Reserved words).\n */\nconst RESERVED_PROPERTY_LABELS = new Set(['and', 'or', 'not']);\n\nexport function registerPropertyShape(\n shape: NodeShapeData,\n propertyShape: PropertyShapeData,\n) {\n if (RESERVED_PROPERTY_LABELS.has(propertyShape.label)) {\n throw new Error(\n `Property label '${propertyShape.label}' is reserved (a DSL-JSON boolean combinator) ` +\n `and cannot be used as a property name. See documentation/dsl-json.md (Reserved words).`,\n );\n }\n // Not fatal, but the author needs to hear it here rather than from the field tracer.\n warnOnReservedPropertyLabel(propertyShape.label, shape.label, shape.id);\n const inherited = getPropertyShapeData(shape, propertyShape.label, true);\n const existing = getPropertyShapeData(shape, propertyShape.label, false);\n if (!existing && inherited) {\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_MIN_COUNT_SYMBOL]) {\n propertyShape.minCount = inherited.minCount;\n }\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_MAX_COUNT_SYMBOL]) {\n propertyShape.maxCount = inherited.maxCount;\n }\n if (!(propertyShape as unknown as ExplicitFlags)[EXPLICIT_NODE_KIND_SYMBOL]) {\n propertyShape.nodeKind = inherited.nodeKind;\n }\n validateOverrideTightening(shape, inherited, propertyShape);\n }\n if (existing) {\n Object.assign(existing, propertyShape);\n return existing;\n }\n propertyShape.id = `${shape.id}/${propertyShape.label}`;\n addPropertyShapeData(shape, propertyShape);\n return propertyShape;\n}\n\nconst ATOMIC_NODE_KINDS = [\n shacl.BlankNode.id,\n shacl.IRI.id,\n shacl.Literal.id,\n];\n\nconst nodeKindToAtomics = (nodeKind?: NodeReferenceValue): Set<string> => {\n if (!nodeKind?.id) {\n return new Set();\n }\n switch (nodeKind.id) {\n case shacl.BlankNode.id:\n case shacl.IRI.id:\n case shacl.Literal.id:\n return new Set([nodeKind.id]);\n case shacl.BlankNodeOrIRI.id:\n return new Set([shacl.BlankNode.id, shacl.IRI.id]);\n case shacl.IRIOrLiteral.id:\n return new Set([shacl.IRI.id, shacl.Literal.id]);\n case shacl.BlankNodeOrLiteral.id:\n return new Set([shacl.BlankNode.id, shacl.Literal.id]);\n default:\n return new Set(ATOMIC_NODE_KINDS);\n }\n};\n\nconst throwOverrideError = (\n shape: NodeShapeData,\n propertyShape: PropertyShapeData,\n message: string,\n) => {\n throw new Error(\n `Invalid override for ${shape.label}.${propertyShape.label}: ${message}`,\n );\n};\n\nconst validateOverrideTightening = (\n shape: NodeShapeData,\n base: PropertyShapeData,\n override: PropertyShapeData,\n) => {\n if (\n typeof base.minCount === 'number' &&\n typeof override.minCount === 'number' &&\n override.minCount < base.minCount\n ) {\n throwOverrideError(\n shape,\n override,\n `minCount cannot be lowered (${base.minCount} -> ${override.minCount}).`,\n );\n }\n\n if (\n typeof base.maxCount === 'number' &&\n typeof override.maxCount === 'number' &&\n override.maxCount > base.maxCount\n ) {\n throwOverrideError(\n shape,\n override,\n `maxCount cannot be increased (${base.maxCount} -> ${override.maxCount}).`,\n );\n }\n\n if (base.nodeKind && override.nodeKind) {\n const baseKinds = nodeKindToAtomics(base.nodeKind);\n const overrideKinds = nodeKindToAtomics(override.nodeKind);\n const widensNodeKind = [...overrideKinds].some((kind) => !baseKinds.has(kind));\n if (widensNodeKind) {\n throwOverrideError(\n shape,\n override,\n `nodeKind cannot be widened (${base.nodeKind.id} -> ${override.nodeKind.id}).`,\n );\n }\n }\n};\n\nexport function createPropertyShape<\n Config extends LiteralPropertyShapeConfig | ObjectPropertyShapeConfig,\n>(\n config: Config,\n propertyKey: string,\n defaultNodeKind: NodeReferenceValue = null,\n shapeClass: typeof Shape | [string, string] = null,\n) {\n const propertyShape = createPropertyShapeData();\n propertyShape.path = normalizePropertyPath(config.path);\n propertyShape.label = propertyKey;\n\n if (config.name) {\n propertyShape.name = config.name;\n }\n if (config.description) {\n propertyShape.description = config.description;\n }\n\n if (config.required) {\n propertyShape.minCount = 1;\n } else if (config.minCount !== undefined) {\n propertyShape.minCount = config.minCount;\n }\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_MIN_COUNT_SYMBOL] =\n config.required === true || config.minCount !== undefined;\n\n if (config.maxCount !== undefined) {\n propertyShape.maxCount = config.maxCount;\n }\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_MAX_COUNT_SYMBOL] =\n config.maxCount !== undefined;\n if ((config as LiteralPropertyShapeConfig).datatype) {\n propertyShape.datatype = toNodeReference(\n (config as LiteralPropertyShapeConfig).datatype,\n );\n }\n\n if ((config as ObjectPropertyShapeConfig).class) {\n propertyShape.class = toNodeReference(\n (config as ObjectPropertyShapeConfig).class,\n );\n }\n\n if ((config as ObjectPropertyShapeConfig).contains) {\n propertyShape.contains = true;\n }\n\n if (config.equals) {\n propertyShape.equalsConstraint = toNodeReference(config.equals);\n }\n if (config.disjoint) {\n propertyShape.disjoint = toNodeReference(config.disjoint);\n }\n if ((config as LiteralPropertyShapeConfig).lessThan) {\n propertyShape.lessThan = toNodeReference((config as LiteralPropertyShapeConfig).lessThan);\n }\n if ((config as LiteralPropertyShapeConfig).lessThanOrEquals) {\n propertyShape.lessThanOrEquals = toNodeReference((config as LiteralPropertyShapeConfig).lessThanOrEquals);\n }\n // Value-range / string-length / pattern constraints (report 021 §3, G5). These are\n // recorded on the shape and serialized to SHACL; there is no DSL-side runtime\n // enforcement — they describe the shape for validators / introspection.\n {\n const lit = config as LiteralPropertyShapeConfig;\n if (lit.minInclusive !== undefined) propertyShape.minInclusive = lit.minInclusive;\n if (lit.maxInclusive !== undefined) propertyShape.maxInclusive = lit.maxInclusive;\n if (lit.minExclusive !== undefined) propertyShape.minExclusive = lit.minExclusive;\n if (lit.maxExclusive !== undefined) propertyShape.maxExclusive = lit.maxExclusive;\n if (lit.minLength !== undefined) propertyShape.minLength = lit.minLength;\n if (lit.maxLength !== undefined) propertyShape.maxLength = lit.maxLength;\n if (lit.pattern !== undefined) propertyShape.pattern = lit.pattern;\n }\n if (config.hasValue !== undefined) {\n const v = config.hasValue;\n propertyShape.hasValueConstraint = typeof v === 'object' && v !== null ? toNodeReference(v) : v;\n }\n if (config.defaultValue !== undefined) {\n propertyShape.defaultValue = config.defaultValue;\n }\n if (config.in) {\n propertyShape.in = config.in.map((entry) =>\n typeof entry === 'object' && entry !== null ? toNodeReference(entry) : entry,\n );\n }\n if (config.sortBy) {\n propertyShape.sortBy = normalizePropertyPath(config.sortBy);\n }\n // Arrangement + display metadata. `order` and `group` were declared on the config\n // but never copied onto the property shape, so a declared `sh:order` was silently\n // dropped and every renderer fell back to array position. Carried now, alongside\n // the two display terms.\n if (config.order !== undefined) propertyShape.order = config.order;\n if (config.group !== undefined) propertyShape.group = config.group;\n if (config.displayRank !== undefined) propertyShape.displayRank = config.displayRank;\n if (config.displayHidden !== undefined)\n propertyShape.displayHidden = config.displayHidden;\n\n propertyShape.nodeKind = normalizeNodeKind(config.nodeKind, defaultNodeKind);\n (propertyShape as unknown as ExplicitFlags)[EXPLICIT_NODE_KIND_SYMBOL] =\n config.nodeKind !== undefined;\n\n if (shapeClass) {\n onShapeSetup(shapeClass, (shape: NodeShapeData) => {\n connectValueShape(config, propertyKey, propertyShape);\n registerPropertyShape(shape, propertyShape);\n });\n }\n\n return propertyShape;\n}\n\nexport function onShapeSetup(\n shapeClass: typeof Shape | [string, string],\n callback: (shape: NodeShapeData) => void,\n propertyName?: string,\n waitForSuperShapes?: boolean,\n) {\n const cb = waitForSuperShapes\n ? (shape: NodeShapeData) => {\n const superClass = Object.getPrototypeOf(shapeClass) as typeof Shape;\n if (superClass.name === 'Shape') {\n callback(shape);\n return;\n }\n if (superClass.name === '') {\n console.error(\n `Shape ${shape.label} does not extend base class lincd/shapes/Shape. Make sure it extends Shape.`,\n );\n return;\n }\n onShapeSetup(\n superClass,\n () => {\n callback(shape);\n },\n propertyName,\n waitForSuperShapes,\n );\n }\n : callback;\n\n const safeCallback = (\n targetShapeClass: typeof Shape,\n innerCallback: (shape: NodeShapeData) => void,\n ) => {\n if (targetShapeClass.hasOwnProperty('shape')) {\n innerCallback((targetShapeClass as typeof Shape).shape);\n } else {\n if (!targetShapeClass['shapeCallbacks']) {\n targetShapeClass['shapeCallbacks'] = [];\n }\n targetShapeClass['shapeCallbacks'].push(innerCallback);\n }\n };\n\n if (Array.isArray(shapeClass)) {\n const [packageName, shapeName] = shapeClass;\n const nodeShapeId = getNodeShapeUri(packageName, shapeName);\n if (typeof document !== 'undefined') {\n window.addEventListener('load', () => {\n const resolved = getShapeClass(nodeShapeId);\n if (!resolved) {\n console.warn(\n `Could not find value shape (${packageName}/${shapeName}) for accessor get ${propertyName}(). Likely because it is not bundled.`,\n );\n return;\n }\n safeCallback(resolved as unknown as typeof Shape, cb);\n });\n } else {\n addNodeShapeCallback(nodeShapeId, cb);\n }\n } else {\n safeCallback(shapeClass, cb);\n }\n}\n\nconst _linkedProperty = <\n Config extends ObjectPropertyShapeConfig | LiteralPropertyShapeConfig,\n>(\n config: Config,\n defaultNodeKind: NodeReferenceValue = null,\n) => {\n return function (\n target: any,\n propertyKey: string,\n _descriptor: PropertyDescriptor,\n ) {\n createPropertyShape(config, propertyKey, defaultNodeKind, target.constructor);\n };\n};\n\nexport const literalProperty = (config: LiteralPropertyShapeConfig) => {\n return _linkedProperty<LiteralPropertyShapeConfig>(config, shacl.Literal);\n};\n\nexport const objectProperty = (config: ObjectPropertyShapeConfig) => {\n return _linkedProperty<ObjectPropertyShapeConfig>(config, shacl.IRI);\n};\n\nexport const linkedProperty = (\n config: ObjectPropertyShapeConfig | LiteralPropertyShapeConfig,\n) => {\n return _linkedProperty(config);\n};\n\nexport function disallowProperty(\n target: any,\n propertyKey: string,\n _descriptor: PropertyDescriptor,\n) {\n onShapeSetup(\n target.constructor,\n (shape: NodeShapeData) => {\n const superClass = Object.getPrototypeOf(target.constructor) as typeof Shape;\n const superNodeShape = superClass.shape;\n const superPropertyShape = getPropertyShapeData(\n superNodeShape,\n propertyKey,\n true,\n );\n if (!superPropertyShape) {\n console.warn(\n `Property ${propertyKey} not found in super class ${superClass.name} or any of its super classes. Does it have a property decorator? Cannot disallow property ${target.constructor.name}.${propertyKey}`,\n );\n return;\n }\n const clonedPropertyShape = clonePropertyShape(superPropertyShape);\n clonedPropertyShape.maxCount = 0;\n registerPropertyShape(shape, clonedPropertyShape);\n },\n '',\n true,\n );\n}\n\nexport function getNodeShapeUri(packageName: string, shapeName: string): string {\n // arch-02: `{baseUri}shape/{packageSlug}/{ShapeName}` — ShapeName kept PascalCase\n // (it is a class name, already URI-safe), packageSlug derived from the name.\n return `${resolveBaseUri(packageName)}shape/${packageNameToSlug(packageName)}/${shapeName}`;\n}\n\nconst nodeShapeCallbacks = new Map<string, ((shape: NodeShapeData) => void)[]>();\nexport function getAndClearCallbacks(\n nodeShapeId: string,\n): ((shape: NodeShapeData) => void)[] {\n const callbacks = nodeShapeCallbacks.get(nodeShapeId);\n nodeShapeCallbacks.delete(nodeShapeId);\n return callbacks;\n}\nexport const addNodeShapeCallback = (\n nodeShapeId: string,\n callback: (shape: NodeShapeData) => void,\n) => {\n if (!nodeShapeCallbacks.has(nodeShapeId)) {\n nodeShapeCallbacks.set(nodeShapeId, []);\n }\n nodeShapeCallbacks.get(nodeShapeId).push(callback);\n};\n"]}
@@ -8,17 +8,29 @@ import { PathNode } from './PathNode.js';
8
8
  */
9
9
  export type PathNodeData = NodeReferenceValue | {
10
10
  shape: typeof List | typeof PathNode;
11
- __id?: string;
11
+ __blank: true;
12
12
  [k: string]: unknown;
13
13
  };
14
14
  /**
15
15
  * Translate a `PathExpr` into create-pipeline node-data for `sh:path`.
16
16
  *
17
17
  * - simple `PathRef` → `{id}` (a shared predicate IRI; NOT owned)
18
- * - sequence → an `rdf:List` of segments (via {@link rdfList})
18
+ * - sequence → an `rdf:List` of segments
19
19
  * - inverse / alternative / cardinality → a `PathNode` operator node (alt's operand is an `rdf:List`)
20
20
  *
21
- * `base` seeds deterministic ids for the minted owned nodes (`{base}/inv`, `{base}/seq/0`, …) so a
22
- * re-sync overwrites them in place; the owned subtree is cleaned by the containment cascade.
21
+ * Every operator node and list cell is written as an untyped blank node (`__blank`), the only
22
+ * form SHACL §2.3.1 defines: an IRI in `sh:path` is a predicate path, and an inverse,
23
+ * alternative or cardinality path is a blank node that is the subject of exactly one triple.
24
+ *
25
+ * ```turtle
26
+ * <ps> sh:path [ sh:inversePath schema:image ] .
27
+ * <ps> sh:path ( schema:knows [ sh:zeroOrMorePath schema:parent ] ) .
28
+ * ```
29
+ *
30
+ * The structure is owned through `contains` edges, so a re-sync's delete removes it (the
31
+ * blank-node block of the containment cascade) before the create writes it again.
32
+ *
33
+ * @param _base ignored. It seeded the IRIs of the nodes this used to mint (`{base}/inv`, …);
34
+ * blank nodes have none. Kept so existing two-argument calls still compile.
23
35
  */
24
- export declare function serializePathToNodeData(path: PathExpr, base: string): PathNodeData;
36
+ export declare function serializePathToNodeData(path: PathExpr, _base?: string): PathNodeData;
@@ -1,18 +1,36 @@
1
1
  import { isPathRef } from '../paths/PropertyPathExpr.js';
2
- import { rdfList } from './List.js';
2
+ import { List } from './List.js';
3
+ import { rdf } from '../ontologies/rdf.js';
3
4
  import { PathNode } from './PathNode.js';
4
5
  /**
5
6
  * Translate a `PathExpr` into create-pipeline node-data for `sh:path`.
6
7
  *
7
8
  * - simple `PathRef` → `{id}` (a shared predicate IRI; NOT owned)
8
- * - sequence → an `rdf:List` of segments (via {@link rdfList})
9
+ * - sequence → an `rdf:List` of segments
9
10
  * - inverse / alternative / cardinality → a `PathNode` operator node (alt's operand is an `rdf:List`)
10
11
  *
11
- * `base` seeds deterministic ids for the minted owned nodes (`{base}/inv`, `{base}/seq/0`, …) so a
12
- * re-sync overwrites them in place; the owned subtree is cleaned by the containment cascade.
12
+ * Every operator node and list cell is written as an untyped blank node (`__blank`), the only
13
+ * form SHACL §2.3.1 defines: an IRI in `sh:path` is a predicate path, and an inverse,
14
+ * alternative or cardinality path is a blank node that is the subject of exactly one triple.
15
+ *
16
+ * ```turtle
17
+ * <ps> sh:path [ sh:inversePath schema:image ] .
18
+ * <ps> sh:path ( schema:knows [ sh:zeroOrMorePath schema:parent ] ) .
19
+ * ```
20
+ *
21
+ * The structure is owned through `contains` edges, so a re-sync's delete removes it (the
22
+ * blank-node block of the containment cascade) before the create writes it again.
23
+ *
24
+ * @param _base ignored. It seeded the IRIs of the nodes this used to mint (`{base}/inv`, …);
25
+ * blank nodes have none. Kept so existing two-argument calls still compile.
13
26
  */
14
- export function serializePathToNodeData(path, base) {
15
- const serialize = (e, b) => {
27
+ export function serializePathToNodeData(path, _base) {
28
+ const operator = (key, operand) => ({
29
+ shape: PathNode,
30
+ __blank: true,
31
+ [key]: operand,
32
+ });
33
+ const serialize = (e) => {
16
34
  if (isPathRef(e)) {
17
35
  return { id: typeof e === 'string' ? e : e.id };
18
36
  }
@@ -25,12 +43,11 @@ export function serializePathToNodeData(path, base) {
25
43
  throw new Error('Cannot serialize an empty sequence path to SHACL sh:path.');
26
44
  }
27
45
  if (e.seq.length === 1)
28
- return serialize(e.seq[0], `${b}/seq/0`);
29
- return rdfList(e.seq.map((s, i) => serialize(s, `${b}/seq/${i}`)), { base: `${b}/seq` });
30
- }
31
- if ('inv' in e) {
32
- return { shape: PathNode, __id: `${b}/inv`, inversePath: serialize(e.inv, `${b}/inv`) };
46
+ return serialize(e.seq[0]);
47
+ return blankList(e.seq.map(serialize));
33
48
  }
49
+ if ('inv' in e)
50
+ return operator('inversePath', serialize(e.inv));
34
51
  if ('alt' in e) {
35
52
  // SHACL §2.3.2: sh:alternativePath is a list with **at least two** members.
36
53
  // Collapse a singleton alternative to its bare member, reject an empty one.
@@ -38,27 +55,24 @@ export function serializePathToNodeData(path, base) {
38
55
  throw new Error('Cannot serialize an empty alternative path to SHACL sh:path.');
39
56
  }
40
57
  if (e.alt.length === 1)
41
- return serialize(e.alt[0], `${b}/alt/0`);
42
- return {
43
- shape: PathNode,
44
- __id: `${b}/alt`,
45
- alternativePath: rdfList(e.alt.map((a, i) => serialize(a, `${b}/alt/${i}`)), { base: `${b}/alt` }),
46
- };
47
- }
48
- if ('zeroOrMore' in e) {
49
- return { shape: PathNode, __id: `${b}/zom`, zeroOrMorePath: serialize(e.zeroOrMore, `${b}/zom`) };
50
- }
51
- if ('oneOrMore' in e) {
52
- return { shape: PathNode, __id: `${b}/oom`, oneOrMorePath: serialize(e.oneOrMore, `${b}/oom`) };
53
- }
54
- if ('zeroOrOne' in e) {
55
- return { shape: PathNode, __id: `${b}/zoo`, zeroOrOnePath: serialize(e.zeroOrOne, `${b}/zoo`) };
58
+ return serialize(e.alt[0]);
59
+ return operator('alternativePath', blankList(e.alt.map(serialize)));
56
60
  }
61
+ if ('zeroOrMore' in e)
62
+ return operator('zeroOrMorePath', serialize(e.zeroOrMore));
63
+ if ('oneOrMore' in e)
64
+ return operator('oneOrMorePath', serialize(e.oneOrMore));
65
+ if ('zeroOrOne' in e)
66
+ return operator('zeroOrOnePath', serialize(e.zeroOrOne));
57
67
  if ('negatedPropertySet' in e) {
58
68
  throw new Error('negatedPropertySet cannot be serialized to SHACL sh:path — no SHACL representation.');
59
69
  }
60
70
  throw new Error(`Unknown PathExpr shape: ${JSON.stringify(e)}`);
61
71
  };
62
- return serialize(path, base);
72
+ return serialize(path);
73
+ }
74
+ /** An `rdf:List` of blank cells (`rdf:first`/`rdf:rest` only), terminated by `rdf:nil`. */
75
+ function blankList(items) {
76
+ return items.reduceRight((rest, first) => ({ shape: List, __blank: true, first, rest }), { id: rdf.nil.id });
63
77
  }
64
78
  //# sourceMappingURL=serializePathToNodeData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializePathToNodeData.js","sourceRoot":"","sources":["../../../src/shapes/serializePathToNodeData.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 {PathExpr} from '../paths/PropertyPathExpr.js';\nimport {isPathRef} from '../paths/PropertyPathExpr.js';\nimport type {NodeReferenceValue} from '../utils/NodeReference.js';\nimport {List, rdfList} from './List.js';\nimport {PathNode} from './PathNode.js';\n\n/**\n * Node-data the create pipeline accepts for a `sh:path` value: an IRI reference (simple path),\n * an `rdf:List` (sequence / alternative members), or a `PathNode` operator node.\n */\nexport type PathNodeData =\n | NodeReferenceValue\n | {shape: typeof List | typeof PathNode; __id?: string; [k: string]: unknown};\n\n/**\n * Translate a `PathExpr` into create-pipeline node-data for `sh:path`.\n *\n * - simple `PathRef` → `{id}` (a shared predicate IRI; NOT owned)\n * - sequence → an `rdf:List` of segments (via {@link rdfList})\n * - inverse / alternative / cardinality → a `PathNode` operator node (alt's operand is an `rdf:List`)\n *\n * `base` seeds deterministic ids for the minted owned nodes (`{base}/inv`, `{base}/seq/0`, …) so a\n * re-sync overwrites them in place; the owned subtree is cleaned by the containment cascade.\n */\nexport function serializePathToNodeData(path: PathExpr, base: string): PathNodeData {\n const serialize = (e: PathExpr, b: string): PathNodeData => {\n if (isPathRef(e)) {\n return {id: typeof e === 'string' ? e : e.id};\n }\n if ('seq' in e) {\n // SHACL §2.3.1: a sequence path is a list with **at least two** members.\n // A 0/1-member sequence is not a list — collapse a singleton to its bare\n // member, reject an empty one. (normalizePropertyPath already collapses\n // these upstream; this keeps the serializer independently spec-correct.)\n if (e.seq.length === 0) {\n throw new Error('Cannot serialize an empty sequence path to SHACL sh:path.');\n }\n if (e.seq.length === 1) return serialize(e.seq[0], `${b}/seq/0`);\n return rdfList(\n e.seq.map((s, i) => serialize(s, `${b}/seq/${i}`)),\n {base: `${b}/seq`},\n ) as PathNodeData;\n }\n if ('inv' in e) {\n return {shape: PathNode, __id: `${b}/inv`, inversePath: serialize(e.inv, `${b}/inv`)};\n }\n if ('alt' in e) {\n // SHACL §2.3.2: sh:alternativePath is a list with **at least two** members.\n // Collapse a singleton alternative to its bare member, reject an empty one.\n if (e.alt.length === 0) {\n throw new Error('Cannot serialize an empty alternative path to SHACL sh:path.');\n }\n if (e.alt.length === 1) return serialize(e.alt[0], `${b}/alt/0`);\n return {\n shape: PathNode,\n __id: `${b}/alt`,\n alternativePath: rdfList(\n e.alt.map((a, i) => serialize(a, `${b}/alt/${i}`)),\n {base: `${b}/alt`},\n ),\n };\n }\n if ('zeroOrMore' in e) {\n return {shape: PathNode, __id: `${b}/zom`, zeroOrMorePath: serialize(e.zeroOrMore, `${b}/zom`)};\n }\n if ('oneOrMore' in e) {\n return {shape: PathNode, __id: `${b}/oom`, oneOrMorePath: serialize(e.oneOrMore, `${b}/oom`)};\n }\n if ('zeroOrOne' in e) {\n return {shape: PathNode, __id: `${b}/zoo`, zeroOrOnePath: serialize(e.zeroOrOne, `${b}/zoo`)};\n }\n if ('negatedPropertySet' in e) {\n throw new Error(\n 'negatedPropertySet cannot be serialized to SHACL sh:path — no SHACL representation.',\n );\n }\n throw new Error(`Unknown PathExpr shape: ${JSON.stringify(e)}`);\n };\n return serialize(path, base);\n}\n"]}
1
+ {"version":3,"file":"serializePathToNodeData.js","sourceRoot":"","sources":["../../../src/shapes/serializePathToNodeData.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 {PathExpr} from '../paths/PropertyPathExpr.js';\nimport {isPathRef} from '../paths/PropertyPathExpr.js';\nimport type {NodeReferenceValue} from '../utils/NodeReference.js';\nimport {List, type RdfListNodeData} from './List.js';\nimport {rdf} from '../ontologies/rdf.js';\nimport {PathNode} from './PathNode.js';\n\n/**\n * Node-data the create pipeline accepts for a `sh:path` value: an IRI reference (simple path),\n * an `rdf:List` (sequence / alternative members), or a `PathNode` operator node.\n */\nexport type PathNodeData =\n | NodeReferenceValue\n | {shape: typeof List | typeof PathNode; __blank: true; [k: string]: unknown};\n\n/**\n * Translate a `PathExpr` into create-pipeline node-data for `sh:path`.\n *\n * - simple `PathRef` → `{id}` (a shared predicate IRI; NOT owned)\n * - sequence → an `rdf:List` of segments\n * - inverse / alternative / cardinality → a `PathNode` operator node (alt's operand is an `rdf:List`)\n *\n * Every operator node and list cell is written as an untyped blank node (`__blank`), the only\n * form SHACL §2.3.1 defines: an IRI in `sh:path` is a predicate path, and an inverse,\n * alternative or cardinality path is a blank node that is the subject of exactly one triple.\n *\n * ```turtle\n * <ps> sh:path [ sh:inversePath schema:image ] .\n * <ps> sh:path ( schema:knows [ sh:zeroOrMorePath schema:parent ] ) .\n * ```\n *\n * The structure is owned through `contains` edges, so a re-sync's delete removes it (the\n * blank-node block of the containment cascade) before the create writes it again.\n *\n * @param _base ignored. It seeded the IRIs of the nodes this used to mint (`{base}/inv`, …);\n * blank nodes have none. Kept so existing two-argument calls still compile.\n */\nexport function serializePathToNodeData(path: PathExpr, _base?: string): PathNodeData {\n const operator = (key: string, operand: unknown): PathNodeData => ({\n shape: PathNode,\n __blank: true,\n [key]: operand,\n });\n const serialize = (e: PathExpr): PathNodeData => {\n if (isPathRef(e)) {\n return {id: typeof e === 'string' ? e : e.id};\n }\n if ('seq' in e) {\n // SHACL §2.3.1: a sequence path is a list with **at least two** members.\n // A 0/1-member sequence is not a list — collapse a singleton to its bare\n // member, reject an empty one. (normalizePropertyPath already collapses\n // these upstream; this keeps the serializer independently spec-correct.)\n if (e.seq.length === 0) {\n throw new Error('Cannot serialize an empty sequence path to SHACL sh:path.');\n }\n if (e.seq.length === 1) return serialize(e.seq[0]);\n return blankList(e.seq.map(serialize)) as PathNodeData;\n }\n if ('inv' in e) return operator('inversePath', serialize(e.inv));\n if ('alt' in e) {\n // SHACL §2.3.2: sh:alternativePath is a list with **at least two** members.\n // Collapse a singleton alternative to its bare member, reject an empty one.\n if (e.alt.length === 0) {\n throw new Error('Cannot serialize an empty alternative path to SHACL sh:path.');\n }\n if (e.alt.length === 1) return serialize(e.alt[0]);\n return operator('alternativePath', blankList(e.alt.map(serialize)));\n }\n if ('zeroOrMore' in e) return operator('zeroOrMorePath', serialize(e.zeroOrMore));\n if ('oneOrMore' in e) return operator('oneOrMorePath', serialize(e.oneOrMore));\n if ('zeroOrOne' in e) return operator('zeroOrOnePath', serialize(e.zeroOrOne));\n if ('negatedPropertySet' in e) {\n throw new Error(\n 'negatedPropertySet cannot be serialized to SHACL sh:path — no SHACL representation.',\n );\n }\n throw new Error(`Unknown PathExpr shape: ${JSON.stringify(e)}`);\n };\n return serialize(path);\n}\n\n/** An `rdf:List` of blank cells (`rdf:first`/`rdf:rest` only), terminated by `rdf:nil`. */\nfunction blankList(items: PathNodeData[]): RdfListNodeData {\n return items.reduceRight<RdfListNodeData>(\n (rest, first) => ({shape: List, __blank: true, first, rest}),\n {id: rdf.nil.id},\n );\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { type NodeShapeData, type PropertyShapeData } from './nodeShapeData.js';
2
+ /**
3
+ * The deterministic IRI of the generated single-owner NodeShape of one property shape:
4
+ * `${propertyShapeIri}.singleOwner`, e.g. `…/shape/my-pkg/Thing/image.singleOwner`.
5
+ */
6
+ export declare function singleOwnerShapeIri(propertyShapeIri: string): string;
7
+ /**
8
+ * The shape's OWN `contains` properties that get a single-owner constraint: those that declare
9
+ * a value shape and have a simple path, in declaration order.
10
+ *
11
+ * Inherited properties are not included; their declaring shape writes their constraint.
12
+ * Complex paths are skipped, as the containment cascade skips them. A `contains` property
13
+ * without a value shape is a polymorphic slot (like `sh:path`) whose value may be a shared IRI,
14
+ * so the replace, the subject delete and the class check do not treat it as owning that value,
15
+ * and neither does the single-owner rule.
16
+ */
17
+ export declare function singleOwnerProperties(nodeShape: NodeShapeData): PropertyShapeData[];
18
+ /**
19
+ * Create-pipeline data for the generated single-owner NodeShapes of `nodeShape`, one per
20
+ * {@link singleOwnerProperties} entry. Each is stored at
21
+ * {@link singleOwnerShapeIri}`(${shapeIri}/${label})`: the property shape's IRI exactly as shape
22
+ * sync writes it (`buildPropertyShapeData`).
23
+ */
24
+ export declare function buildSingleOwnerConstraints(nodeShape: NodeShapeData, shapeIri: string): Array<{
25
+ iri: string;
26
+ data: Record<string, unknown>;
27
+ }>;
@@ -0,0 +1,89 @@
1
+ /*
2
+ * This Source Code Form is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+ */
6
+ import { getPropertyShapes } from './nodeShapeData.js';
7
+ import { getSimplePathId } from '../paths/normalizePropertyPath.js';
8
+ import { serializePathToNodeData } from './serializePathToNodeData.js';
9
+ /**
10
+ * The single-owner SHACL constraints generated from `contains` properties.
11
+ *
12
+ * A `contains` property says the subject owns the value node. For every such property, shape
13
+ * sync writes one generated NodeShape stating the matching store-side rule: every object of the
14
+ * property's predicate has at most one subject pointing at it through that predicate.
15
+ *
16
+ * ```turtle
17
+ * <…/Thing/image.singleOwner> a sh:NodeShape ;
18
+ * core:generated true ;
19
+ * sh:targetObjectsOf schema:image ;
20
+ * sh:property <…/Thing/image.singleOwner/owners> .
21
+ * <…/Thing/image.singleOwner/owners> a sh:PropertyShape ;
22
+ * sh:maxCount 1 ;
23
+ * sh:path [ sh:inversePath schema:image ] .
24
+ * ```
25
+ *
26
+ * One constraint per accessor, written only by the class that declares it: subclasses inherit
27
+ * the property but add no constraint, since the rule targets the predicate's objects whoever the
28
+ * subject is. The declaring shape owns its constraints through `core:generatedShape`
29
+ * (`NodeShape.generatedShapes`, `contains`): shape sync writes them nested in the shape's
30
+ * create and deletes them with the shape.
31
+ *
32
+ * Non-owning references through other predicates are not counted, and neither is ownership
33
+ * through two different `contains` predicates (a documented limitation). The shapes are built
34
+ * only at sync time and are never registered in the in-memory shape registry.
35
+ */
36
+ /** Suffix that turns a property shape's IRI into its generated single-owner shape's IRI. */
37
+ const SINGLE_OWNER_SUFFIX = '.singleOwner';
38
+ /**
39
+ * The deterministic IRI of the generated single-owner NodeShape of one property shape:
40
+ * `${propertyShapeIri}.singleOwner`, e.g. `…/shape/my-pkg/Thing/image.singleOwner`.
41
+ */
42
+ export function singleOwnerShapeIri(propertyShapeIri) {
43
+ return `${propertyShapeIri}${SINGLE_OWNER_SUFFIX}`;
44
+ }
45
+ /**
46
+ * The shape's OWN `contains` properties that get a single-owner constraint: those that declare
47
+ * a value shape and have a simple path, in declaration order.
48
+ *
49
+ * Inherited properties are not included; their declaring shape writes their constraint.
50
+ * Complex paths are skipped, as the containment cascade skips them. A `contains` property
51
+ * without a value shape is a polymorphic slot (like `sh:path`) whose value may be a shared IRI,
52
+ * so the replace, the subject delete and the class check do not treat it as owning that value,
53
+ * and neither does the single-owner rule.
54
+ */
55
+ export function singleOwnerProperties(nodeShape) {
56
+ return getPropertyShapes(nodeShape, false).filter((ps) => ps.contains && !!ps.valueShape && !!getSimplePathId(ps.path));
57
+ }
58
+ /**
59
+ * Create-pipeline data for the generated single-owner NodeShapes of `nodeShape`, one per
60
+ * {@link singleOwnerProperties} entry. Each is stored at
61
+ * {@link singleOwnerShapeIri}`(${shapeIri}/${label})`: the property shape's IRI exactly as shape
62
+ * sync writes it (`buildPropertyShapeData`).
63
+ */
64
+ export function buildSingleOwnerConstraints(nodeShape, shapeIri) {
65
+ return singleOwnerProperties(nodeShape).flatMap((ps) => {
66
+ // Always set: `singleOwnerProperties` keeps simple paths only. The guard narrows the type.
67
+ const predicate = getSimplePathId(ps.path);
68
+ if (!predicate)
69
+ return [];
70
+ const iri = singleOwnerShapeIri(`${shapeIri}/${ps.label}`);
71
+ const psIri = `${iri}/owners`;
72
+ return [{
73
+ iri,
74
+ data: {
75
+ generated: true,
76
+ targetObjectsOf: [{ id: predicate }],
77
+ properties: [
78
+ {
79
+ __id: psIri,
80
+ label: 'owners',
81
+ maxCount: 1,
82
+ path: serializePathToNodeData({ inv: { id: predicate } }),
83
+ },
84
+ ],
85
+ },
86
+ }];
87
+ });
88
+ }
89
+ //# sourceMappingURL=singleOwnerConstraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleOwnerConstraint.js","sourceRoot":"","sources":["../../../src/shapes/singleOwnerConstraint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,iBAAiB,EAA6C,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAC,eAAe,EAAC,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,4FAA4F;AAC5F,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAAwB;IAC1D,OAAO,GAAG,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAwB;IAC5D,OAAO,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,CAC/C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CACrE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,SAAwB,EACxB,QAAgB;IAEhB,OAAO,qBAAqB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACrD,2FAA2F;QAC3F,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC;QAC9B,OAAO,CAAC;gBACN,GAAG;gBACH,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI;oBACf,eAAe,EAAE,CAAC,EAAC,EAAE,EAAE,SAAS,EAAC,CAAC;oBAClC,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,KAAK;4BACX,KAAK,EAAE,QAAQ;4BACf,QAAQ,EAAE,CAAC;4BACX,IAAI,EAAE,uBAAuB,CAAC,EAAC,GAAG,EAAE,EAAC,EAAE,EAAE,SAAS,EAAC,EAAC,CAAC;yBACtD;qBACF;iBACF;aACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,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 {getPropertyShapes, type NodeShapeData, type PropertyShapeData} from './nodeShapeData.js';\nimport {getSimplePathId} from '../paths/normalizePropertyPath.js';\nimport {serializePathToNodeData} from './serializePathToNodeData.js';\n\n/**\n * The single-owner SHACL constraints generated from `contains` properties.\n *\n * A `contains` property says the subject owns the value node. For every such property, shape\n * sync writes one generated NodeShape stating the matching store-side rule: every object of the\n * property's predicate has at most one subject pointing at it through that predicate.\n *\n * ```turtle\n * <…/Thing/image.singleOwner> a sh:NodeShape ;\n * core:generated true ;\n * sh:targetObjectsOf schema:image ;\n * sh:property <…/Thing/image.singleOwner/owners> .\n * <…/Thing/image.singleOwner/owners> a sh:PropertyShape ;\n * sh:maxCount 1 ;\n * sh:path [ sh:inversePath schema:image ] .\n * ```\n *\n * One constraint per accessor, written only by the class that declares it: subclasses inherit\n * the property but add no constraint, since the rule targets the predicate's objects whoever the\n * subject is. The declaring shape owns its constraints through `core:generatedShape`\n * (`NodeShape.generatedShapes`, `contains`): shape sync writes them nested in the shape's\n * create and deletes them with the shape.\n *\n * Non-owning references through other predicates are not counted, and neither is ownership\n * through two different `contains` predicates (a documented limitation). The shapes are built\n * only at sync time and are never registered in the in-memory shape registry.\n */\n\n/** Suffix that turns a property shape's IRI into its generated single-owner shape's IRI. */\nconst SINGLE_OWNER_SUFFIX = '.singleOwner';\n\n/**\n * The deterministic IRI of the generated single-owner NodeShape of one property shape:\n * `${propertyShapeIri}.singleOwner`, e.g. `…/shape/my-pkg/Thing/image.singleOwner`.\n */\nexport function singleOwnerShapeIri(propertyShapeIri: string): string {\n return `${propertyShapeIri}${SINGLE_OWNER_SUFFIX}`;\n}\n\n/**\n * The shape's OWN `contains` properties that get a single-owner constraint: those that declare\n * a value shape and have a simple path, in declaration order.\n *\n * Inherited properties are not included; their declaring shape writes their constraint.\n * Complex paths are skipped, as the containment cascade skips them. A `contains` property\n * without a value shape is a polymorphic slot (like `sh:path`) whose value may be a shared IRI,\n * so the replace, the subject delete and the class check do not treat it as owning that value,\n * and neither does the single-owner rule.\n */\nexport function singleOwnerProperties(nodeShape: NodeShapeData): PropertyShapeData[] {\n return getPropertyShapes(nodeShape, false).filter(\n (ps) => ps.contains && !!ps.valueShape && !!getSimplePathId(ps.path),\n );\n}\n\n/**\n * Create-pipeline data for the generated single-owner NodeShapes of `nodeShape`, one per\n * {@link singleOwnerProperties} entry. Each is stored at\n * {@link singleOwnerShapeIri}`(${shapeIri}/${label})`: the property shape's IRI exactly as shape\n * sync writes it (`buildPropertyShapeData`).\n */\nexport function buildSingleOwnerConstraints(\n nodeShape: NodeShapeData,\n shapeIri: string,\n): Array<{iri: string; data: Record<string, unknown>}> {\n return singleOwnerProperties(nodeShape).flatMap((ps) => {\n // Always set: `singleOwnerProperties` keeps simple paths only. The guard narrows the type.\n const predicate = getSimplePathId(ps.path);\n if (!predicate) return [];\n const iri = singleOwnerShapeIri(`${shapeIri}/${ps.label}`);\n const psIri = `${iri}/owners`;\n return [{\n iri,\n data: {\n generated: true,\n targetObjectsOf: [{id: predicate}],\n properties: [\n {\n __id: psIri,\n label: 'owners',\n maxCount: 1,\n path: serializePathToNodeData({inv: {id: predicate}}),\n },\n ],\n },\n }];\n });\n}\n"]}