@_linked/core 2.36.1 → 2.36.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +19 -0
  3. package/lib/esm/collections/CoreSet.js +2 -0
  4. package/lib/esm/collections/CoreSet.js.map +1 -1
  5. package/lib/esm/collections/ShapeSet.js +2 -0
  6. package/lib/esm/collections/ShapeSet.js.map +1 -1
  7. package/lib/esm/expressions/Expr.js +3 -2
  8. package/lib/esm/expressions/Expr.js.map +1 -1
  9. package/lib/esm/expressions/ExpressionNode.js +10 -7
  10. package/lib/esm/expressions/ExpressionNode.js.map +1 -1
  11. package/lib/esm/index.d.ts +1 -1
  12. package/lib/esm/index.js +1 -1
  13. package/lib/esm/index.js.map +1 -1
  14. package/lib/esm/queries/AskBuilder.js +5 -3
  15. package/lib/esm/queries/AskBuilder.js.map +1 -1
  16. package/lib/esm/queries/CountBuilder.js +4 -2
  17. package/lib/esm/queries/CountBuilder.js.map +1 -1
  18. package/lib/esm/queries/CreateBuilder.js +2 -0
  19. package/lib/esm/queries/CreateBuilder.js.map +1 -1
  20. package/lib/esm/queries/DeleteBuilder.js +3 -1
  21. package/lib/esm/queries/DeleteBuilder.js.map +1 -1
  22. package/lib/esm/queries/DslJsonExpression.js +7 -6
  23. package/lib/esm/queries/DslJsonExpression.js.map +1 -1
  24. package/lib/esm/queries/FieldSet.js +10 -8
  25. package/lib/esm/queries/FieldSet.js.map +1 -1
  26. package/lib/esm/queries/IRLower.js +2 -1
  27. package/lib/esm/queries/IRLower.js.map +1 -1
  28. package/lib/esm/queries/MutationSerialization.js +2 -1
  29. package/lib/esm/queries/MutationSerialization.js.map +1 -1
  30. package/lib/esm/queries/PropertyPath.js +2 -0
  31. package/lib/esm/queries/PropertyPath.js.map +1 -1
  32. package/lib/esm/queries/ProxiedPathBuilder.js +2 -1
  33. package/lib/esm/queries/ProxiedPathBuilder.js.map +1 -1
  34. package/lib/esm/queries/QueryBuilder.js +5 -4
  35. package/lib/esm/queries/QueryBuilder.js.map +1 -1
  36. package/lib/esm/queries/QueryContext.js +17 -6
  37. package/lib/esm/queries/QueryContext.js.map +1 -1
  38. package/lib/esm/queries/SelectQuery.js +18 -12
  39. package/lib/esm/queries/SelectQuery.js.map +1 -1
  40. package/lib/esm/queries/UpdateBuilder.js +3 -1
  41. package/lib/esm/queries/UpdateBuilder.js.map +1 -1
  42. package/lib/esm/queries/lower.js +5 -4
  43. package/lib/esm/queries/lower.js.map +1 -1
  44. package/lib/esm/shapes/SHACL.js +6 -3
  45. package/lib/esm/shapes/SHACL.js.map +1 -1
  46. package/lib/esm/shapes/Shape.d.ts +3 -1
  47. package/lib/esm/shapes/Shape.js +20 -2
  48. package/lib/esm/shapes/Shape.js.map +1 -1
  49. package/lib/esm/utils/LinkedErrorLogging.d.ts +2 -1
  50. package/lib/esm/utils/LinkedErrorLogging.js +11 -0
  51. package/lib/esm/utils/LinkedErrorLogging.js.map +1 -1
  52. package/lib/esm/utils/LinkedFileStorage.d.ts +6 -4
  53. package/lib/esm/utils/LinkedFileStorage.js +34 -4
  54. package/lib/esm/utils/LinkedFileStorage.js.map +1 -1
  55. package/lib/esm/utils/Package.d.ts +6 -0
  56. package/lib/esm/utils/Package.js +35 -7
  57. package/lib/esm/utils/Package.js.map +1 -1
  58. package/lib/esm/utils/Prefix.d.ts +4 -2
  59. package/lib/esm/utils/Prefix.js +18 -2
  60. package/lib/esm/utils/Prefix.js.map +1 -1
  61. package/lib/esm/utils/ShapeClass.js +11 -6
  62. package/lib/esm/utils/ShapeClass.js.map +1 -1
  63. package/lib/esm/utils/cached.js +2 -1
  64. package/lib/esm/utils/cached.js.map +1 -1
  65. package/lib/esm/utils/linkedError.d.ts +32 -0
  66. package/lib/esm/utils/linkedError.js +63 -0
  67. package/lib/esm/utils/linkedError.js.map +1 -1
  68. package/lib/esm/utils/unresolvedShape.d.ts +3 -1
  69. package/lib/esm/utils/unresolvedShape.js +5 -1
  70. package/lib/esm/utils/unresolvedShape.js.map +1 -1
  71. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FieldSet.js","sourceRoot":"","sources":["../../../src/queries/FieldSet.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeShapeData, PropertyShapeData} from '../shapes/SHACL.js';\nimport {getUniquePropertyShapes, getPropertyShape} from '../shapes/nodeShapeData.js';\nimport type {Shape, ShapeConstructor} from '../shapes/Shape.js';\nimport {PropertyPath, walkPropertyPath} from './PropertyPath.js';\nimport {\n captureCatalog,\n getActiveShapeCatalog,\n getAllNodeShapes,\n getAllShapeClasses,\n getNodeShape,\n getShapeClass,\n withShapeCatalog,\n getQueryShapeClass,\n} from '../utils/ShapeClass.js';\nimport type {ShapeCatalog} from '../utils/ShapeCatalog.js';\nimport type {WherePath} from './SelectQuery.js';\nimport {createProxiedPathBuilder} from './ProxiedPathBuilder.js';\nimport {isExpressionNode, ExpressionNode} from '../expressions/ExpressionNode.js';\nimport {encodeValueExpr, decodeValueExpr, type DslJsonValue} from './DslJsonExpression.js';\nimport {\n serializeWherePath,\n deserializeWherePath,\n type WherePathJSON,\n} from './QueryBuilderSerialization.js';\nimport {topLevelDetails, unresolvedShapeError, unresolvedValueShapeError} from '../utils/unresolvedShape.js';\n\n// Duck-type helpers for runtime detection.\n// These check structural shape since the classes live in SelectQuery.ts (runtime circular dep).\n// QueryBuilderObject has .property (PropertyShapeData) and .subject (QueryBuilderObject).\n// SetSize has .subject and extends QueryPrimitive<number>.\ntype QueryBuilderObjectLike = {\n property?: PropertyShapeData;\n subject?: QueryBuilderObjectLike;\n wherePath?: unknown;\n};\nconst isQueryBuilderObject = (obj: any): obj is QueryBuilderObjectLike =>\n obj !== null &&\n typeof obj === 'object' &&\n 'property' in obj &&\n 'subject' in obj &&\n typeof obj.getPropertyPath === 'function';\n\nconst isSetSize = (obj: any): boolean =>\n obj !== null &&\n typeof obj === 'object' &&\n 'subject' in obj &&\n typeof obj.as === 'function' &&\n typeof obj.getPropertyPath === 'function' &&\n // SetSize has a 'countable' field (may be undefined) and 'label' field\n 'label' in obj;\n\n// BoundComponent: has .source (QueryBuilderObject) and .originalValue (component-like)\nconst isBoundComponent = (obj: any): boolean =>\n obj !== null &&\n typeof obj === 'object' &&\n 'source' in obj &&\n 'originalValue' in obj;\n\n/**\n * A single entry in a FieldSet: a property path with optional alias, scoped filter,\n * sub-selection, aggregation, and custom key.\n */\nexport type FieldSetEntry = {\n path: PropertyPath;\n alias?: string;\n scopedFilter?: WherePath;\n /** Index into path.segments indicating which segment the scopedFilter applies to.\n * Defaults to the last segment if not specified. */\n scopedFilterIndex?: number;\n /** Nested object selection — the user explicitly selected sub-fields (e.g. `p.friends.select(...)`) */\n subSelect?: FieldSet;\n aggregation?: 'count';\n customKey?: string;\n /** Component preload composition — the FieldSet comes from a linked component's own query,\n * merged in via `preloadFor()`. Distinct from subSelect which is a user-authored nested query. */\n preloadSubSelect?: FieldSet;\n /** Computed expression from proxy tracing (e.g. `p.age.times(12)`) */\n expressionNode?: ExpressionNode;\n /** Inner LIMIT for a nested select (e.g. `p.friends.select(...).limit(2)`).\n * Only supported when the outer query targets a single subject. */\n innerLimit?: number;\n /** Inner OFFSET for a nested select. */\n innerOffset?: number;\n /** Inner ORDER BY for a nested select — paths relative to the sub-select shape. */\n innerOrderBy?: FieldSetInnerOrderBy[];\n};\n\n/** A single inner ORDER BY clause for a nested select. */\nexport type FieldSetInnerOrderBy = {\n propertyShapeId: string;\n direction: 'ASC' | 'DESC';\n};\n\n/**\n * Input types accepted by FieldSet construction methods.\n *\n * - `string` — resolved via walkPropertyPath (dot-separated)\n * - `PropertyPath` — used directly\n * - `FieldSet` — merged in\n * - `Record<string, string[] | FieldSet>` — nested fields\n */\nexport type FieldSetInput =\n | string\n | PropertyPath\n | FieldSet\n | Record<string, string[] | FieldSet>;\n\n/** A computed projection field: `{ as?, value }` — a DSL-JSON expression, no path. */\nexport type FieldSetComputedJSON = {\n as?: string;\n value: DslJsonValue;\n customKey?: string;\n};\n\n/** Options for a relation projection (the object value under a relation key). */\nexport type FieldSetRelationOptionsJSON = {\n as?: string;\n /** Shape IRI for nested fields when it differs from the relation's declared value shape. */\n shape?: string;\n /** A scoped filter on the relation (`p.friends.where(...)`). */\n where?: WherePathJSON;\n /** Which path segment the scoped `where` applies to (defaults to the last). */\n whereIndex?: number;\n aggregation?: string;\n customKey?: string;\n /** Nested-select pagination (`p.friends.select(...).limit(5).offset(2).orderBy(...)`). */\n limit?: number;\n offset?: number;\n orderBy?: Array<{[path: string]: 'ASC' | 'DESC'}>;\n /** Sub-projection of the related shape. */\n fields?: FieldSetFieldJSON[];\n};\n\n/**\n * A relation-keyed field: a single-key object whose key is the relation path\n * (labels dotted, with inline `as(Shape)` casts) and whose value is either the\n * sub-fields array (`{ \"friends\": [\"name\"] }`) or an options object\n * (`{ \"friends\": { as, where, fields } }`). Also covers a leaf with options\n * (`{ \"name\": { \"as\": \"personName\" } }`). The related shape is inferred.\n */\nexport type FieldSetRelationJSON = {\n [path: string]: FieldSetFieldJSON[] | FieldSetRelationOptionsJSON;\n};\n\n/**\n * JSON representation of a FieldSet field entry — exactly three shapes:\n * - a **string** leaf path (`\"name\"`, `\"friends.friends.name\"`, `\"pets.as(Dog).level\"`)\n * - a **relation-keyed** object (`{ \"friends\": [...] | {options} }`)\n * - a **computed** object (`{ as?, value }`)\n */\nexport type FieldSetFieldJSON = string | FieldSetComputedJSON | FieldSetRelationJSON;\n\n/** JSON representation of a FieldSet (a shape + its top-level fields). */\nexport type FieldSetJSON = {\n shape: string;\n fields: FieldSetFieldJSON[];\n};\n\n/** Option keys reserved inside a relation options object (never a relation path). */\nconst RELATION_OPTION_KEYS = new Set([\n 'as',\n 'shape',\n 'where',\n 'whereIndex',\n 'aggregation',\n 'customKey',\n 'limit',\n 'offset',\n 'orderBy',\n 'fields',\n]);\n\n/**\n * An immutable, composable collection of property paths for a shape.\n *\n * FieldSet describes which properties to select, independent of\n * how the query is built. It integrates with QueryBuilder via\n * `.select(fieldSet)`.\n *\n * Every mutation method returns a new FieldSet — the original is never modified.\n */\nexport class FieldSet<R = any, Source = any> {\n readonly shape: NodeShapeData;\n readonly entries: readonly FieldSetEntry[];\n /** Phantom field — carries the callback response type for conditional type inference. */\n declare readonly __response: R;\n /** Phantom field — carries the source context (QueryShapeSet/QueryShape) for conditional type inference. */\n declare readonly __source: Source;\n\n /**\n * For sub-select FieldSets: the raw callback return value (proxy trace objects).\n * Stored so conditional types can extract the response type.\n */\n readonly traceResponse?: R;\n\n /**\n * For sub-select FieldSets: the parent property segments leading to this sub-select.\n */\n readonly parentSegments?: PropertyShapeData[];\n\n /**\n * For sub-select FieldSets: the shape class (ShapeType) of the sub-select's target.\n */\n readonly shapeType?: any;\n\n /**\n * For sub-select FieldSets: inline `.where()` filter found on the parent\n * traversal chain (e.g. `p.friends.where(...).select(...)`), plus the index\n * into `parentSegments` of the segment it scopes.\n */\n readonly parentWherePath?: WherePath;\n readonly parentWherePathIndex?: number;\n\n /**\n * For sub-select FieldSets: inner LIMIT/OFFSET/ORDER BY carried from\n * `.limit()`/`.offset()`/`.orderBy()` chained on the nested select.\n * These bound the related collection per parent (single-subject only).\n */\n readonly innerLimit?: number;\n readonly innerOffset?: number;\n readonly innerOrderBy?: FieldSetInnerOrderBy[];\n\n private readonly _catalog: ShapeCatalog | undefined;\n\n private constructor(\n shape: NodeShapeData,\n entries: FieldSetEntry[],\n catalog: ShapeCatalog | undefined = FieldSet.captureFor(shape),\n ) {\n this.shape = shape;\n this.entries = entries;\n this._catalog = catalog;\n }\n\n /** The catalog this FieldSet resolves shapes in (undefined = the global registry). */\n get catalog(): ShapeCatalog | undefined {\n return this._catalog;\n }\n\n /**\n * The catalog a FieldSet rooted at `shape` captures: the active one for an IRI or a\n * shape it holds, none for a shape it does not (an authored class built by code that\n * runs inside a project scope), else the catalog an adapter class came from.\n */\n private static captureFor(\n shape: ShapeConstructor<any> | NodeShapeData | string,\n ): ShapeCatalog | undefined {\n if (typeof shape === 'function') return captureCatalog(shape);\n const active = getActiveShapeCatalog();\n if (active === undefined || typeof shape === 'string') return active;\n return active.has(shape.id) ? active : undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Static constructors\n // ---------------------------------------------------------------------------\n\n /**\n * Create a FieldSet for the given shape with the specified fields.\n *\n * Accepts a ShapeClass (e.g. Person), NodeShapeData, or shape IRI string.\n * Fields can be string paths, PropertyPath instances, nested objects,\n * or a callback receiving a proxy for dot-access.\n */\n static for<S extends Shape>(shape: ShapeConstructor<S>, fields: FieldSetInput[]): FieldSet<any>;\n static for<S extends Shape, R>(shape: ShapeConstructor<S>, fn: (p: any) => R): FieldSet<R>;\n static for(shape: NodeShapeData | string, fields: FieldSetInput[]): FieldSet<any>;\n static for(shape: NodeShapeData | string, fn: (p: any) => any): FieldSet<any>;\n static for(\n shape: ShapeConstructor<any> | NodeShapeData | string,\n fieldsOrFn: FieldSetInput[] | ((p: any) => any),\n ): FieldSet<any> {\n const catalog = FieldSet.captureFor(shape);\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => FieldSet.for(shape as string, fieldsOrFn as FieldSetInput[]));\n }\n const resolved = FieldSet.resolveShapeInput(shape);\n const resolvedShape = resolved.nodeShape;\n\n if (typeof fieldsOrFn === 'function') {\n if (!resolved.shapeClass) {\n throw new Error(\n `Cannot use callback form for shape '${resolved.nodeShape.id}': no ShapeConstructor registered. ` +\n `Use string field names instead, or pass the Shape class directly.`,\n );\n }\n const fields = FieldSet.traceFieldsWithProxy(resolved.nodeShape, resolved.shapeClass, fieldsOrFn);\n return new FieldSet(resolved.nodeShape, fields);\n }\n\n const entries = FieldSet.resolveInputs(resolvedShape, fieldsOrFn);\n return new FieldSet(resolvedShape, entries);\n }\n\n /**\n * Create a typed FieldSet for a sub-select. Traces the callback through the proxy,\n * stores parentSegments and traceResponse for runtime compatibility, and preserves\n * R and Source generics for conditional type inference.\n */\n static forSubSelect<R, Source>(\n shapeClass: any,\n fn: (p: any) => R,\n parentSegments: PropertyShapeData[],\n source?: QueryBuilderObjectLike,\n ): FieldSet<R, Source> {\n const nodeShape = shapeClass.shape || shapeClass;\n // Trace once: get both the raw response (for type carriers) and the entries\n const proxy = createProxiedPathBuilder(shapeClass);\n const traceResponse = fn(proxy as any);\n const entries = FieldSet.extractSubSelectEntries(nodeShape, traceResponse);\n const fs = new FieldSet(nodeShape, entries) as FieldSet<R, Source>;\n // Writable cast — these readonly fields are initialised once here at construction time\n const w = fs as {-readonly [K in 'traceResponse' | 'parentSegments' | 'shapeType' | 'parentWherePath' | 'parentWherePathIndex']: FieldSet<R, Source>[K]};\n w.traceResponse = traceResponse;\n w.parentSegments = parentSegments;\n w.shapeType = shapeClass;\n // Carry an inline `.where()` from the parent traversal chain (walked\n // leaf→root, same convention as convertTraceResult for plain paths).\n let current = source;\n let leafDistance = 0;\n while (current) {\n if (current.wherePath) {\n w.parentWherePath = current.wherePath as WherePath;\n w.parentWherePathIndex = parentSegments.length - 1 - leafDistance;\n break;\n }\n current = current.subject;\n leafDistance++;\n }\n return fs;\n }\n\n\n /**\n * Create a FieldSet containing all decorated properties of the shape.\n *\n * @param opts.depth Controls how deep to include nested shape properties:\n * - `depth=1` (default): this level only — properties of the root shape.\n * - `depth=0`: throws — use a node reference instead.\n * - `depth>1`: recursively includes nested shape properties up to the given depth.\n */\n static all<S extends Shape>(shape: ShapeConstructor<S>, opts?: {depth?: number}): FieldSet;\n static all(shape: NodeShapeData | string, opts?: {depth?: number}): FieldSet;\n static all(shape: ShapeConstructor<any> | NodeShapeData | string, opts?: {depth?: number}): FieldSet {\n const catalog = FieldSet.captureFor(shape);\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => FieldSet.all(shape as string, opts));\n }\n const depth = opts?.depth ?? 1;\n if (depth < 1) {\n throw new Error(\n 'FieldSet.all() requires depth >= 1. Use a node reference ({id}) for depth 0.',\n );\n }\n const resolved = FieldSet.resolveShapeInput(shape);\n // Seed visited with the root shape to prevent self-referencing cycles\n const visited = new Set<string>([resolved.nodeShape.id]);\n return FieldSet.allForShape(resolved.nodeShape, depth, visited);\n }\n\n /**\n * Recursive helper for all(). Tracks visited shape IDs to prevent infinite loops\n * from circular shape references.\n */\n private static allForShape(\n nodeShape: NodeShapeData,\n depth: number,\n visited: Set<string>,\n ): FieldSet {\n const propertyShapes = getUniquePropertyShapes(nodeShape);\n const entries: FieldSetEntry[] = [];\n\n for (const ps of propertyShapes) {\n const entry: FieldSetEntry = {path: new PropertyPath(nodeShape, [ps])};\n\n // If depth > 1, recurse into nested shapes\n if (depth > 1 && ps.valueShape) {\n const nestedShapeClass = getQueryShapeClass(ps.valueShape);\n if (nestedShapeClass?.shape && !visited.has(nestedShapeClass.shape.id)) {\n visited.add(nestedShapeClass.shape.id);\n const nestedFs = FieldSet.allForShape(nestedShapeClass.shape, depth - 1, visited);\n if (nestedFs.entries.length > 0) {\n entry.subSelect = nestedFs;\n }\n }\n }\n\n entries.push(entry);\n }\n\n return new FieldSet(nodeShape, entries);\n }\n\n /**\n * Merge multiple FieldSets into one, deduplicating by path equality.\n * All FieldSets must share the same root shape.\n */\n static merge(sets: FieldSet[]): FieldSet {\n if (sets.length === 0) {\n throw new Error('Cannot merge empty array of FieldSets');\n }\n const shape = sets[0].shape;\n for (const set of sets) {\n if (set.shape.id !== shape.id) {\n throw new Error(\n `Cannot merge FieldSets with different shapes: '${shape.label || shape.id}' and '${set.shape.label || set.shape.id}'`,\n );\n }\n }\n const merged: FieldSetEntry[] = [];\n const seen = new Set<string>();\n\n for (const set of sets) {\n for (const entry of set.entries) {\n // Include aggregation in the dedup key so that 'friends' and 'friends(count)' are distinct\n const key = entry.aggregation\n ? `${entry.path.toString()}:${entry.aggregation}`\n : entry.path.toString();\n if (!seen.has(key)) {\n seen.add(key);\n merged.push(entry);\n }\n }\n }\n\n return new FieldSet(shape, merged, sets[0]._catalog);\n }\n\n // ---------------------------------------------------------------------------\n // Composition methods — each returns a new FieldSet\n // ---------------------------------------------------------------------------\n\n /** Returns a new FieldSet with only the given fields. */\n select(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.select(fields));\n }\n const entries = FieldSet.resolveInputs(this.shape, fields);\n return new FieldSet(this.shape, entries, this._catalog);\n }\n\n /**\n * Clone this FieldSet, preserving the sub-select carrier fields\n * (traceResponse / parentSegments / shapeType / inner pagination) and\n * applying the supplied overrides. Used by `.limit()`/`.offset()`/`.orderBy()`.\n */\n private cloneWith(\n overrides: Partial<Pick<FieldSet, 'innerLimit' | 'innerOffset' | 'innerOrderBy'>>,\n ): this {\n const clone = new FieldSet(this.shape, this.entries as FieldSetEntry[], this._catalog) as this;\n // The sub-select carrier fields are declared `readonly` (normally set once at\n // construction via `forSubSelect`). Copy this FieldSet's identity onto the\n // clone through a mutable view, then layer the pagination overrides on top.\n Object.assign(clone as Record<string, unknown>, {\n traceResponse: this.traceResponse,\n parentSegments: this.parentSegments,\n shapeType: this.shapeType,\n parentWherePath: this.parentWherePath,\n parentWherePathIndex: this.parentWherePathIndex,\n innerLimit: this.innerLimit,\n innerOffset: this.innerOffset,\n innerOrderBy: this.innerOrderBy,\n ...overrides,\n });\n return clone;\n }\n\n /**\n * Bound a nested select's related collection to at most `lim` items per parent.\n * Only honoured when the outer query targets a single subject; otherwise the\n * pipeline throws (per-group pagination across multiple parents is unsupported).\n */\n limit(lim: number): this {\n return this.cloneWith({innerLimit: lim});\n }\n\n /** Skip the first `off` items of a nested select's related collection (single-subject only). */\n offset(off: number): this {\n return this.cloneWith({innerOffset: off});\n }\n\n /**\n * Order a nested select's related collection, producing a deterministic window\n * for inner LIMIT/OFFSET. Defaults to ascending.\n *\n * Accepts either a proxy callback — `.orderBy(f => f.name)` — consistent with\n * the rest of the DSL, or a property-name string (`.orderBy('name')`).\n */\n orderBy(\n paths: string | string[] | ((p: any) => unknown),\n direction: 'ASC' | 'DESC' = 'ASC',\n ): this {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.orderBy(paths, direction));\n }\n const orderBy: FieldSetInnerOrderBy[] =\n typeof paths === 'function'\n ? this.orderByFromProxy(paths, direction)\n : (Array.isArray(paths) ? paths : [paths]).map((label) => {\n const ps = walkPropertyPath(this.shape, label).terminal;\n if (!ps) {\n throw new Error(`orderBy: cannot resolve property '${label}' on shape '${this.shape.id}'`);\n }\n return {propertyShapeId: ps.id, direction};\n });\n return this.cloneWith({innerOrderBy: orderBy});\n }\n\n /** Resolve a proxy `orderBy` callback (e.g. `f => f.name` or `f => [f.a, f.b]`)\n * to inner order-by clauses by tracing the sub-select shape's property proxy. */\n private orderByFromProxy(\n fn: (p: any) => unknown,\n direction: 'ASC' | 'DESC',\n ): FieldSetInnerOrderBy[] {\n if (!this.shapeType) {\n throw new Error(\n 'orderBy(callback) is only available on a nested select(); pass a property-name string otherwise',\n );\n }\n const response = fn(createProxiedPathBuilder(this.shapeType));\n const results = Array.isArray(response) ? response : [response];\n return results.map((result) => {\n const segments = FieldSet.collectPropertySegments(result as QueryBuilderObjectLike);\n const terminal = segments[segments.length - 1];\n if (!terminal) {\n throw new Error('orderBy: callback did not resolve to a property of the sub-select shape');\n }\n return {propertyShapeId: terminal.id, direction};\n });\n }\n\n /** Returns a new FieldSet with additional entries. */\n add(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.add(fields));\n }\n const newEntries = FieldSet.resolveInputs(this.shape, fields);\n // Deduplicate\n const existing = new Set(this.entries.map((e) => e.path.toString()));\n const combined = [...this.entries];\n for (const entry of newEntries) {\n if (!existing.has(entry.path.toString())) {\n combined.push(entry);\n }\n }\n return new FieldSet(this.shape, combined, this._catalog);\n }\n\n /** Returns a new FieldSet without entries matching the given labels. */\n remove(labels: string[]): FieldSet {\n const labelSet = new Set(labels);\n const filtered = (this.entries as FieldSetEntry[]).filter(\n (e) => !labelSet.has(e.path.terminal?.label),\n );\n return new FieldSet(this.shape, filtered, this._catalog);\n }\n\n /** Synonym for replacing all entries — returns a new FieldSet with only the given fields. */\n set(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.set(fields));\n }\n const entries = FieldSet.resolveInputs(this.shape, fields);\n return new FieldSet(this.shape, entries, this._catalog);\n }\n\n /** Returns a new FieldSet keeping only entries matching the given labels. */\n pick(labels: string[]): FieldSet {\n const labelSet = new Set(labels);\n const filtered = (this.entries as FieldSetEntry[]).filter(\n (e) => labelSet.has(e.path.terminal?.label),\n );\n return new FieldSet(this.shape, filtered, this._catalog);\n }\n\n /** Returns all PropertyPaths in this FieldSet. */\n paths(): PropertyPath[] {\n return (this.entries as FieldSetEntry[]).map((e) => e.path);\n }\n\n /** Returns terminal property labels of all entries. */\n labels(): string[] {\n return (this.entries as FieldSetEntry[]).map((e) => e.path.terminal?.label).filter(Boolean) as string[];\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n /**\n * Serialize this FieldSet to a plain JSON object.\n * Shape is identified by its IRI, paths by dot-separated labels.\n */\n toJSON(): FieldSetJSON {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.toJSON());\n }\n return {shape: this.shape.id, fields: this.toFieldsJSON()};\n }\n\n /** Serialize just the field entries (used for nested relation sub-fields). */\n private toFieldsJSON(): FieldSetFieldJSON[] {\n return (this.entries as FieldSetEntry[]).map((entry) =>\n this.serializeEntry(entry),\n );\n }\n\n private serializeEntry(entry: FieldSetEntry): FieldSetFieldJSON {\n // Computed projection — no path; carry the DSL-JSON value.\n if (entry.expressionNode) {\n const out: FieldSetComputedJSON = {\n value: encodeValueExpr(entry.expressionNode.ir, entry.expressionNode._refs),\n };\n if (entry.alias) out.as = entry.alias;\n if (entry.customKey) out.customKey = entry.customKey;\n return out;\n }\n const pathStr = FieldSet.pathToStringWithCasts(this.shape, entry.path.segments);\n const sub = entry.subSelect ?? entry.preloadSubSelect;\n const subFields = sub ? sub.toFieldsJSON() : undefined;\n const opts: FieldSetRelationOptionsJSON = {};\n const naturalSubShape = FieldSet.nestedShapeOf(entry.path);\n if (sub && sub.shape.id !== naturalSubShape?.id) opts.shape = sub.shape.id;\n if (entry.alias) opts.as = entry.alias;\n if (entry.aggregation) opts.aggregation = entry.aggregation;\n if (entry.customKey) opts.customKey = entry.customKey;\n if (entry.scopedFilter) {\n const idx = entry.scopedFilterIndex ?? entry.path.segments.length - 1;\n opts.where = serializeWherePath(entry.scopedFilter, this.scopedShapeAt(entry, idx));\n opts.whereIndex = idx;\n }\n // Nested-select pagination (G10) — was previously dropped on the wire.\n if (typeof entry.innerLimit === 'number') opts.limit = entry.innerLimit;\n if (typeof entry.innerOffset === 'number') opts.offset = entry.innerOffset;\n if (entry.innerOrderBy && entry.innerOrderBy.length > 0) {\n opts.orderBy = entry.innerOrderBy.map((o) => ({\n [FieldSet.labelOfId(o.propertyShapeId)]: o.direction,\n }));\n }\n const hasOpts = Object.keys(opts).length > 0;\n // Bare-string shorthand: a plain leaf/relation with no options or sub-fields.\n if (!subFields && !hasOpts) return pathStr;\n // Array shorthand: sub-fields only, no other options.\n if (subFields && !hasOpts) return {[pathStr]: subFields};\n // Full options object (optionally carrying `fields`).\n return {[pathStr]: {...opts, ...(subFields ? {fields: subFields} : {})}};\n }\n\n /** The shape a scoped filter at segment `idx` is evaluated against (the segment's value shape). */\n private scopedShapeAt(entry: FieldSetEntry, idx: number): NodeShapeData {\n const seg = entry.path.segments[idx] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})\n ?.valueShape?.id;\n return (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || this.shape;\n }\n\n /**\n * Reconstruct a FieldSet from a JSON object.\n * Resolves shape IRI via getShapeClass() and paths via walkPropertyPath().\n */\n static fromJSON(json: FieldSetJSON): FieldSet {\n return FieldSet.fromFields(FieldSet.resolveShape(json.shape), json.fields);\n }\n\n /** Build a FieldSet from a shape + relation-keyed field list (recursion entry). */\n private static fromFields(shape: NodeShapeData, fields: FieldSetFieldJSON[]): FieldSet {\n return new FieldSet(\n shape,\n fields.map((raw) => FieldSet.parseField(shape, raw)),\n );\n }\n\n /** Parse one field entry (string leaf / computed / relation-keyed) against `shape`. */\n private static parseField(shape: NodeShapeData, raw: FieldSetFieldJSON): FieldSetEntry {\n // Leaf path (may carry inline `as(Shape)` casts).\n if (typeof raw === 'string') {\n return {path: FieldSet.walkPathWithCasts(shape, raw)};\n }\n // Computed projection — carries `value`.\n if ('value' in raw && (raw as FieldSetComputedJSON).value !== undefined) {\n const computed = raw as FieldSetComputedJSON;\n const {ir, refs} = decodeValueExpr(computed.value, shape);\n const entry: FieldSetEntry = {\n path: new PropertyPath(shape, []),\n expressionNode: new ExpressionNode(ir, refs),\n };\n if (computed.as) entry.alias = computed.as;\n if (computed.customKey) entry.customKey = computed.customKey;\n return entry;\n }\n // Relation-keyed: the single non-option key is the relation path.\n const rel = raw as FieldSetRelationJSON;\n const pathKey = Object.keys(rel).find((k) => !RELATION_OPTION_KEYS.has(k));\n if (!pathKey) {\n throw new Error(`FieldSet field has no relation path: ${JSON.stringify(raw)}`);\n }\n const spec = rel[pathKey];\n const path = FieldSet.walkPathWithCasts(shape, pathKey);\n const entry: FieldSetEntry = {path};\n const subFields = Array.isArray(spec) ? spec : spec.fields;\n const opts = Array.isArray(spec) ? ({} as FieldSetRelationOptionsJSON) : spec;\n if (opts.as) entry.alias = opts.as;\n if (opts.customKey) entry.customKey = opts.customKey;\n if (opts.aggregation) entry.aggregation = opts.aggregation as 'count';\n if (opts.where) {\n const idx = opts.whereIndex ?? path.segments.length - 1;\n const seg = path.segments[idx] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})?.valueShape?.id;\n const scopedShape = (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || shape;\n entry.scopedFilter = deserializeWherePath(scopedShape, opts.where);\n entry.scopedFilterIndex = idx;\n }\n // Nested-select pagination (G10).\n if (typeof opts.limit === 'number') entry.innerLimit = opts.limit;\n if (typeof opts.offset === 'number') entry.innerOffset = opts.offset;\n if (opts.orderBy && opts.orderBy.length > 0) {\n const nested = FieldSet.nestedShapeOf(path) ?? shape;\n entry.innerOrderBy = opts.orderBy.map((e) => {\n const label = Object.keys(e)[0];\n const ps = getPropertyShape(nested, label);\n return {propertyShapeId: ps?.id ?? label, direction: Object.values(e)[0]};\n });\n }\n if (subFields) {\n const nested = opts.shape\n ? FieldSet.resolveShape(opts.shape)\n : FieldSet.requireNestedShapeOf(path, shape);\n entry.subSelect = FieldSet.fromFields(nested, subFields);\n }\n return entry;\n }\n\n /**\n * The shape sub-fields of `path` are read against: its terminal segment's value shape, or\n * `shape` when that segment declares none. A declared value shape that does not resolve is\n * an error: reading the sub-fields against `shape` instead would resolve them on the wrong\n * shape (or fail with a message about the wrong property).\n */\n private static requireNestedShapeOf(path: PropertyPath, shape: NodeShapeData): NodeShapeData {\n const nested = FieldSet.nestedShapeOf(path);\n if (nested) return nested;\n const seg = path.segments[path.segments.length - 1] as PropertyShapeData | undefined;\n if (seg?.valueShape?.id) {\n const owner = path.segments.length > 1\n ? FieldSet.nestedShapeOf(new PropertyPath(path.rootShape, path.segments.slice(0, -1)))\n : path.rootShape;\n throw unresolvedValueShapeError(\n `Cannot resolve valueShape '${seg.valueShape.id}' for property '${seg.label}' in path '${path.toString()}'`,\n seg,\n owner,\n );\n }\n return shape;\n }\n\n /** The shape reached at the end of a relation path (its terminal segment's value shape). */\n private static nestedShapeOf(path: PropertyPath): NodeShapeData | undefined {\n const seg = path.segments[path.segments.length - 1] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})?.valueShape?.id;\n return (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Resolves any of the accepted shape input types to a NodeShapeData and optional ShapeClass.\n * Accepts: ShapeConstructor (class with .shape), NodeShapeData, or IRI string.\n */\n private static resolveShapeInput(shape: ShapeConstructor<any> | NodeShapeData | string): {nodeShape: NodeShapeData; shapeClass?: ShapeConstructor<any>} {\n // Inside a catalog the catalog's data is the authority for every IRI it holds, so an\n // authored class (or metadata) for one of them resolves to the catalog's shape — as\n // `resolveShape` does for the builders.\n const catalog = getActiveShapeCatalog();\n if (catalog !== undefined && typeof shape !== 'string') {\n const id = typeof shape === 'function' ? shape.shape?.id : shape?.id;\n const own = id ? catalog.get(id) : undefined;\n if (own) {\n const shapeClass = getQueryShapeClass(id!);\n return shapeClass ? {nodeShape: own, shapeClass} : {nodeShape: own};\n }\n }\n if (typeof shape === 'string') {\n const shapeClass = getQueryShapeClass(shape);\n if (shapeClass?.shape) {\n return {nodeShape: shapeClass.shape, shapeClass};\n }\n // No authored class: the metadata alone is enough here — the classless branch\n // below is already supported, it just was not reachable from an IRI.\n const nodeShape = getNodeShape(shape);\n if (!nodeShape) {\n throw unresolvedShapeError(`Cannot resolve shape for '${shape}'`, topLevelDetails(shape));\n }\n return {nodeShape};\n }\n // ShapeConstructor: has a static .shape property that is a NodeShapeData\n if ('shape' in shape && typeof shape.shape === 'object' && shape.shape !== null && 'id' in shape.shape) {\n return {nodeShape: (shape as ShapeConstructor<any>).shape, shapeClass: shape as ShapeConstructor<any>};\n }\n // NodeShapeData: has .id directly — try to look up its ShapeConstructor for full proxy support\n const nodeShape = shape as NodeShapeData;\n const shapeClass = nodeShape.id ? getQueryShapeClass(nodeShape.id) : undefined;\n return shapeClass\n ? {nodeShape, shapeClass}\n : {nodeShape};\n }\n\n /** @deprecated Use resolveShapeInput instead. Kept for fromJSON which only passes NodeShapeData|string. */\n private static resolveShape(shape: NodeShapeData | string): NodeShapeData {\n return FieldSet.resolveShapeInput(shape).nodeShape;\n }\n\n private static resolveInputs(\n shape: NodeShapeData,\n inputs: FieldSetInput[],\n ): FieldSetEntry[] {\n const entries: FieldSetEntry[] = [];\n for (const input of inputs) {\n if (typeof input === 'string') {\n entries.push({path: walkPropertyPath(shape, input)});\n } else if (input instanceof PropertyPath) {\n entries.push({path: input});\n } else if (input instanceof FieldSet) {\n entries.push(...(input.entries as FieldSetEntry[]));\n } else if (typeof input === 'object') {\n // Nested object form: { friends: ['name', 'hobby'] }\n for (const [key, value] of Object.entries(input)) {\n const basePath = walkPropertyPath(shape, key);\n if (value instanceof FieldSet) {\n // Merge nested FieldSet entries under this path\n for (const entry of value.entries as FieldSetEntry[]) {\n const combined = new PropertyPath(shape, [\n ...basePath.segments,\n ...entry.path.segments,\n ]);\n entries.push({path: combined, alias: entry.alias, scopedFilter: entry.scopedFilter});\n }\n } else if (Array.isArray(value)) {\n // Resolve nested string fields\n const basePropertyShape = basePath.terminal;\n if (!basePropertyShape?.valueShape) {\n throw new Error(\n `Property '${key}' has no valueShape; cannot resolve nested fields`,\n );\n }\n const nestedShapeClass = getQueryShapeClass(basePropertyShape.valueShape);\n if (!nestedShapeClass || !nestedShapeClass.shape) {\n throw unresolvedValueShapeError(\n `Cannot resolve valueShape '${basePropertyShape.valueShape.id}' for property '${key}'`,\n basePropertyShape,\n );\n }\n for (const nestedField of value) {\n const nestedPath = walkPropertyPath(nestedShapeClass.shape, nestedField);\n const combined = new PropertyPath(shape, [\n ...basePath.segments,\n ...nestedPath.segments,\n ]);\n entries.push({path: combined});\n }\n }\n }\n }\n }\n return entries;\n }\n\n /**\n * Trace fields using the full ProxiedPathBuilder proxy (createProxiedPathBuilder).\n * Handles nested paths, where conditions, aggregations, and sub-selects.\n */\n private static traceFieldsWithProxy(\n nodeShape: NodeShapeData,\n shapeClass: ShapeConstructor<any>,\n fn: (p: any) => any,\n ): FieldSetEntry[] {\n const proxy = createProxiedPathBuilder(shapeClass);\n const result = fn(proxy);\n\n // Normalize result: could be a single value, array, or custom object\n if (Array.isArray(result)) {\n return result.map((item) => FieldSet.convertTraceResult(nodeShape, item));\n }\n if (isQueryBuilderObject(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single FieldSet sub-select (e.g. p.friends.select(f => [f.name]))\n if (result instanceof FieldSet && result.parentSegments !== undefined) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single SetSize (e.g. p.friends.size())\n if (isSetSize(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single BoundComponent (e.g. p.bestFriend.preloadFor(comp))\n if (isBoundComponent(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single ExpressionNode (e.g. p.age.times(12))\n if (isExpressionNode(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n if (typeof result === 'object' && result !== null) {\n // Custom object form: {name: p.name, hobby: p.hobby}\n const entries: FieldSetEntry[] = [];\n for (const [key, value] of Object.entries(result)) {\n const entry = FieldSet.convertTraceResult(nodeShape, value);\n entry.customKey = key;\n entries.push(entry);\n }\n return entries;\n }\n return [];\n }\n\n /**\n * Convert a single proxy trace result (QueryBuilderObject, SetSize, or FieldSet sub-select)\n * into a FieldSetEntry.\n */\n private static convertTraceResult(rootShape: NodeShapeData, obj: any): FieldSetEntry {\n // SetSize → aggregation: 'count'\n if (isSetSize(obj)) {\n const segments = FieldSet.collectPropertySegments(obj.subject);\n return {\n path: new PropertyPath(rootShape, segments),\n aggregation: 'count',\n };\n }\n\n // FieldSet sub-select — use its entries directly (created by forSubSelect)\n if (obj instanceof FieldSet && obj.parentSegments !== undefined) {\n const subSelect = obj.entries.length > 0 ? obj : undefined;\n const entry: FieldSetEntry = {\n path: new PropertyPath(rootShape, obj.parentSegments),\n subSelect: subSelect as FieldSet | undefined,\n };\n // Carry an inline `.where()` from the parent traversal chain\n // (e.g. `p.friends.where(...).select(...)`).\n if (obj.parentWherePath) {\n entry.scopedFilter = obj.parentWherePath;\n entry.scopedFilterIndex = obj.parentWherePathIndex;\n }\n // Carry inner LIMIT/OFFSET/ORDER BY from `.limit()`/`.offset()`/`.orderBy()`.\n if (typeof obj.innerLimit === 'number') entry.innerLimit = obj.innerLimit;\n if (typeof obj.innerOffset === 'number') entry.innerOffset = obj.innerOffset;\n if (obj.innerOrderBy) entry.innerOrderBy = obj.innerOrderBy;\n return entry;\n }\n\n // BoundComponent → preload composition (e.g. p.bestFriend.preloadFor(component))\n // Extract the component's FieldSet and store it as preloadSubSelect.\n if (isBoundComponent(obj)) {\n const segments = FieldSet.collectPropertySegments(obj.source);\n const componentFieldSet = FieldSet.extractComponentFieldSet(obj.originalValue);\n return {\n path: new PropertyPath(rootShape, segments),\n preloadSubSelect: componentFieldSet,\n };\n }\n\n // ExpressionNode → computed expression (e.g. p.age.times(12))\n if (isExpressionNode(obj)) {\n return {\n path: new PropertyPath(rootShape, []),\n expressionNode: obj,\n };\n }\n\n // QueryBuilderObject → walk the chain to collect PropertyPath segments\n if (isQueryBuilderObject(obj)) {\n const segments = FieldSet.collectPropertySegments(obj);\n const entry: FieldSetEntry = {\n path: new PropertyPath(rootShape, segments),\n };\n // Walk from leaf to root to find wherePath on any object in the chain.\n // Track which segment it belongs to so desugarEntry attaches the filter correctly.\n let current: QueryBuilderObjectLike | undefined = obj;\n let leafDistance = 0;\n while (current) {\n if (current.wherePath) {\n entry.scopedFilter = current.wherePath as WherePath;\n entry.scopedFilterIndex = segments.length - 1 - leafDistance;\n break;\n }\n current = current.subject;\n leafDistance++;\n }\n return entry;\n }\n\n // Fallback: string label\n if (typeof obj === 'string') {\n return {path: walkPropertyPath(rootShape, obj)};\n }\n\n throw new Error(`Unknown trace result type: ${obj}`);\n }\n\n /**\n * Walk a QueryBuilderObject-like chain (via .subject) collecting PropertyShapeData segments\n * from leaf to root, then reverse to get root-to-leaf order.\n */\n static collectPropertySegments(obj: QueryBuilderObjectLike): PropertyShapeData[] {\n const segments: PropertyShapeData[] = [];\n let current: QueryBuilderObjectLike | undefined = obj;\n while (current) {\n if (current.property) {\n segments.unshift(current.property);\n }\n current = current.subject;\n }\n return segments;\n }\n\n // ---------------------------------------------------------------------------\n // Cast-aware path (de)serialization — carries `.as(Shape)` narrowing inline as\n // an `as(<ShapeLabel>)` path segment (documentation/dsl-json.md, backlog 002 G5).\n // ---------------------------------------------------------------------------\n\n private static shapeById(id: string): NodeShapeData | undefined {\n return getShapeClass(id)?.shape ?? getNodeShape(id);\n }\n\n private static shapeByLabel(label: string): NodeShapeData | undefined {\n // Inside a catalog every shape is data (core's built-ins aside), so scan its shapes;\n // the global registry keeps scanning authored classes.\n const matches = (shape?: NodeShapeData): shape is NodeShapeData =>\n !!shape && (shape.label === label || FieldSet.labelOfId(shape.id) === label);\n if (getActiveShapeCatalog() !== undefined) {\n for (const shape of getAllNodeShapes().values()) if (matches(shape)) return shape;\n return undefined;\n }\n for (const cls of getAllShapeClasses().values()) {\n const shape = (cls as unknown as {shape?: NodeShapeData}).shape;\n if (matches(shape)) return shape;\n }\n return undefined;\n }\n\n private static labelOfId(id: string): string {\n const i = id.lastIndexOf('/');\n return i >= 0 ? id.slice(i + 1) : id;\n }\n\n /**\n * Render a segment chain as a dotted label path, inserting `as(<ShapeLabel>)`\n * wherever a segment is not resolvable by label from the natural (walked) shape\n * — i.e. a `.as(Shape)` narrowing happened before it.\n */\n static pathToStringWithCasts(rootShape: NodeShapeData, segments: readonly PropertyShapeData[]): string {\n const parts: string[] = [];\n let current: NodeShapeData | undefined = rootShape;\n for (const seg of segments) {\n const label = FieldSet.labelOfId(seg.id);\n const natural = current ? getPropertyShape(current, label) : undefined;\n if (!natural || natural.id !== seg.id) {\n // A cast narrowed the context to the segment's owner shape.\n const ownerId = seg.id.slice(0, seg.id.lastIndexOf('/'));\n const owner = FieldSet.shapeById(ownerId);\n parts.push(`as(${owner?.label ?? FieldSet.labelOfId(ownerId)})`);\n current = owner ?? current;\n }\n parts.push(label);\n const vs = (seg as unknown as {valueShape?: {id: string}}).valueShape;\n current = vs ? FieldSet.shapeById(vs.id) ?? current : current;\n }\n return parts.join('.');\n }\n\n /** Inverse of {@link pathToStringWithCasts}: resolve a dotted path with `as(X)` casts. */\n static walkPathWithCasts(rootShape: NodeShapeData, path: string): PropertyPath {\n if (!path.includes('as(')) return walkPropertyPath(rootShape, path);\n const segments: PropertyShapeData[] = [];\n let current: NodeShapeData | undefined = rootShape;\n for (const token of path.split('.')) {\n const cast = /^as\\((.+)\\)$/.exec(token);\n if (cast) {\n current = FieldSet.shapeByLabel(cast[1]) ?? current;\n continue;\n }\n const ps = current ? getPropertyShape(current, token) : undefined;\n if (!ps) {\n throw new Error(\n `Property '${token}' not found on shape '${current?.label || current?.id}' while resolving path '${path}'`,\n );\n }\n segments.push(ps);\n const vs = (ps as unknown as {valueShape?: {id: string}}).valueShape;\n current = vs ? FieldSet.shapeById(vs.id) ?? current : current;\n }\n return new PropertyPath(rootShape, segments);\n }\n\n /**\n * Extract a FieldSet from a component-like object for preload composition.\n *\n * Supports multiple component interfaces:\n * - `.fields` as a FieldSet directly\n * - `.query` as a FieldSet, QueryBuilder (duck-typed via .fields()), or\n * Record<string, QueryBuilder> (e.g. `{person: PersonQuery}`)\n */\n static extractComponentFieldSet(component: any): FieldSet | undefined {\n // Prefer .fields if it's a FieldSet\n if (component.fields instanceof FieldSet) {\n return component.fields;\n }\n const query = component.query;\n if (query instanceof FieldSet) {\n return query;\n }\n // QueryBuilder duck-type — has .fields() method\n if (query && typeof query.fields === 'function') {\n return query.fields();\n }\n // Record form: { propName: QueryBuilder }\n if (typeof query === 'object') {\n for (const key in query) {\n const value = (query as Record<string, any>)[key];\n if (value && typeof value.fields === 'function') {\n return value.fields();\n }\n }\n }\n return undefined;\n }\n\n /**\n * Internal factory that bypasses the private constructor for use by static methods.\n */\n private static createInternal(shape: NodeShapeData, entries: FieldSetEntry[]): FieldSet {\n return new FieldSet(shape, entries);\n }\n\n /**\n * Create a FieldSet from raw entries. Used by QueryBuilder to merge preload entries.\n */\n static createFromEntries(shape: NodeShapeData, entries: FieldSetEntry[]): FieldSet {\n return new FieldSet(shape, entries);\n }\n\n /**\n * Extract FieldSetEntry[] from a sub-query's traceResponse.\n * Public alias for use by lightweight sub-select wrappers.\n */\n static extractSubSelectEntriesPublic(rootShape: NodeShapeData, traceResponse: any): FieldSetEntry[] {\n return FieldSet.extractSubSelectEntries(rootShape, traceResponse);\n }\n\n /**\n * Extract FieldSetEntry[] from a sub-select's traceResponse.\n * The traceResponse is the result of calling the sub-query callback with a proxy,\n * containing QueryBuilderObjects, arrays, custom objects, etc.\n */\n private static extractSubSelectEntries(rootShape: NodeShapeData, traceResponse: any): FieldSetEntry[] {\n if (Array.isArray(traceResponse)) {\n return traceResponse\n .filter((item) => item !== null && item !== undefined)\n .map((item) => FieldSet.convertTraceResult(rootShape, item));\n }\n if (isQueryBuilderObject(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single FieldSet sub-select — convert directly\n if (traceResponse instanceof FieldSet && traceResponse.parentSegments !== undefined) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single SetSize\n if (isSetSize(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single ExpressionNode\n if (isExpressionNode(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n if (typeof traceResponse === 'object' && traceResponse !== null) {\n // Custom object form: {name: p.name, hobby: p.hobby}\n const entries: FieldSetEntry[] = [];\n for (const [key, value] of Object.entries(traceResponse)) {\n if (value !== null && value !== undefined) {\n const entry = FieldSet.convertTraceResult(rootShape, value);\n entry.customKey = key;\n entries.push(entry);\n }\n }\n return entries;\n }\n return [];\n }\n\n}\n"]}
1
+ {"version":3,"file":"FieldSet.js","sourceRoot":"","sources":["../../../src/queries/FieldSet.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeShapeData, PropertyShapeData} from '../shapes/SHACL.js';\nimport {getUniquePropertyShapes, getPropertyShape} from '../shapes/nodeShapeData.js';\nimport type {Shape, ShapeConstructor} from '../shapes/Shape.js';\nimport {PropertyPath, walkPropertyPath} from './PropertyPath.js';\nimport {\n captureCatalog,\n getActiveShapeCatalog,\n getAllNodeShapes,\n getAllShapeClasses,\n getNodeShape,\n getShapeClass,\n withShapeCatalog,\n getQueryShapeClass,\n} from '../utils/ShapeClass.js';\nimport type {ShapeCatalog} from '../utils/ShapeCatalog.js';\nimport type {WherePath} from './SelectQuery.js';\nimport {createProxiedPathBuilder} from './ProxiedPathBuilder.js';\nimport {isExpressionNode, ExpressionNode} from '../expressions/ExpressionNode.js';\nimport {encodeValueExpr, decodeValueExpr, type DslJsonValue} from './DslJsonExpression.js';\nimport {\n serializeWherePath,\n deserializeWherePath,\n type WherePathJSON,\n} from './QueryBuilderSerialization.js';\nimport {topLevelDetails, unresolvedShapeError, unresolvedValueShapeError} from '../utils/unresolvedShape.js';\nimport {brandLinkedClass, isLinkedInstance} from '../utils/linkedError.js';\n\n// Duck-type helpers for runtime detection.\n// These check structural shape since the classes live in SelectQuery.ts (runtime circular dep).\n// QueryBuilderObject has .property (PropertyShapeData) and .subject (QueryBuilderObject).\n// SetSize has .subject and extends QueryPrimitive<number>.\ntype QueryBuilderObjectLike = {\n property?: PropertyShapeData;\n subject?: QueryBuilderObjectLike;\n wherePath?: unknown;\n};\nconst isQueryBuilderObject = (obj: any): obj is QueryBuilderObjectLike =>\n obj !== null &&\n typeof obj === 'object' &&\n 'property' in obj &&\n 'subject' in obj &&\n typeof obj.getPropertyPath === 'function';\n\nconst isSetSize = (obj: any): boolean =>\n obj !== null &&\n typeof obj === 'object' &&\n 'subject' in obj &&\n typeof obj.as === 'function' &&\n typeof obj.getPropertyPath === 'function' &&\n // SetSize has a 'countable' field (may be undefined) and 'label' field\n 'label' in obj;\n\n// BoundComponent: has .source (QueryBuilderObject) and .originalValue (component-like)\nconst isBoundComponent = (obj: any): boolean =>\n obj !== null &&\n typeof obj === 'object' &&\n 'source' in obj &&\n 'originalValue' in obj;\n\n/**\n * A single entry in a FieldSet: a property path with optional alias, scoped filter,\n * sub-selection, aggregation, and custom key.\n */\nexport type FieldSetEntry = {\n path: PropertyPath;\n alias?: string;\n scopedFilter?: WherePath;\n /** Index into path.segments indicating which segment the scopedFilter applies to.\n * Defaults to the last segment if not specified. */\n scopedFilterIndex?: number;\n /** Nested object selection — the user explicitly selected sub-fields (e.g. `p.friends.select(...)`) */\n subSelect?: FieldSet;\n aggregation?: 'count';\n customKey?: string;\n /** Component preload composition — the FieldSet comes from a linked component's own query,\n * merged in via `preloadFor()`. Distinct from subSelect which is a user-authored nested query. */\n preloadSubSelect?: FieldSet;\n /** Computed expression from proxy tracing (e.g. `p.age.times(12)`) */\n expressionNode?: ExpressionNode;\n /** Inner LIMIT for a nested select (e.g. `p.friends.select(...).limit(2)`).\n * Only supported when the outer query targets a single subject. */\n innerLimit?: number;\n /** Inner OFFSET for a nested select. */\n innerOffset?: number;\n /** Inner ORDER BY for a nested select — paths relative to the sub-select shape. */\n innerOrderBy?: FieldSetInnerOrderBy[];\n};\n\n/** A single inner ORDER BY clause for a nested select. */\nexport type FieldSetInnerOrderBy = {\n propertyShapeId: string;\n direction: 'ASC' | 'DESC';\n};\n\n/**\n * Input types accepted by FieldSet construction methods.\n *\n * - `string` — resolved via walkPropertyPath (dot-separated)\n * - `PropertyPath` — used directly\n * - `FieldSet` — merged in\n * - `Record<string, string[] | FieldSet>` — nested fields\n */\nexport type FieldSetInput =\n | string\n | PropertyPath\n | FieldSet\n | Record<string, string[] | FieldSet>;\n\n/** A computed projection field: `{ as?, value }` — a DSL-JSON expression, no path. */\nexport type FieldSetComputedJSON = {\n as?: string;\n value: DslJsonValue;\n customKey?: string;\n};\n\n/** Options for a relation projection (the object value under a relation key). */\nexport type FieldSetRelationOptionsJSON = {\n as?: string;\n /** Shape IRI for nested fields when it differs from the relation's declared value shape. */\n shape?: string;\n /** A scoped filter on the relation (`p.friends.where(...)`). */\n where?: WherePathJSON;\n /** Which path segment the scoped `where` applies to (defaults to the last). */\n whereIndex?: number;\n aggregation?: string;\n customKey?: string;\n /** Nested-select pagination (`p.friends.select(...).limit(5).offset(2).orderBy(...)`). */\n limit?: number;\n offset?: number;\n orderBy?: Array<{[path: string]: 'ASC' | 'DESC'}>;\n /** Sub-projection of the related shape. */\n fields?: FieldSetFieldJSON[];\n};\n\n/**\n * A relation-keyed field: a single-key object whose key is the relation path\n * (labels dotted, with inline `as(Shape)` casts) and whose value is either the\n * sub-fields array (`{ \"friends\": [\"name\"] }`) or an options object\n * (`{ \"friends\": { as, where, fields } }`). Also covers a leaf with options\n * (`{ \"name\": { \"as\": \"personName\" } }`). The related shape is inferred.\n */\nexport type FieldSetRelationJSON = {\n [path: string]: FieldSetFieldJSON[] | FieldSetRelationOptionsJSON;\n};\n\n/**\n * JSON representation of a FieldSet field entry — exactly three shapes:\n * - a **string** leaf path (`\"name\"`, `\"friends.friends.name\"`, `\"pets.as(Dog).level\"`)\n * - a **relation-keyed** object (`{ \"friends\": [...] | {options} }`)\n * - a **computed** object (`{ as?, value }`)\n */\nexport type FieldSetFieldJSON = string | FieldSetComputedJSON | FieldSetRelationJSON;\n\n/** JSON representation of a FieldSet (a shape + its top-level fields). */\nexport type FieldSetJSON = {\n shape: string;\n fields: FieldSetFieldJSON[];\n};\n\n/** Option keys reserved inside a relation options object (never a relation path). */\nconst RELATION_OPTION_KEYS = new Set([\n 'as',\n 'shape',\n 'where',\n 'whereIndex',\n 'aggregation',\n 'customKey',\n 'limit',\n 'offset',\n 'orderBy',\n 'fields',\n]);\n\n/**\n * An immutable, composable collection of property paths for a shape.\n *\n * FieldSet describes which properties to select, independent of\n * how the query is built. It integrates with QueryBuilder via\n * `.select(fieldSet)`.\n *\n * Every mutation method returns a new FieldSet — the original is never modified.\n */\nexport class FieldSet<R = any, Source = any> {\n readonly shape: NodeShapeData;\n readonly entries: readonly FieldSetEntry[];\n /** Phantom field — carries the callback response type for conditional type inference. */\n declare readonly __response: R;\n /** Phantom field — carries the source context (QueryShapeSet/QueryShape) for conditional type inference. */\n declare readonly __source: Source;\n\n /**\n * For sub-select FieldSets: the raw callback return value (proxy trace objects).\n * Stored so conditional types can extract the response type.\n */\n readonly traceResponse?: R;\n\n /**\n * For sub-select FieldSets: the parent property segments leading to this sub-select.\n */\n readonly parentSegments?: PropertyShapeData[];\n\n /**\n * For sub-select FieldSets: the shape class (ShapeType) of the sub-select's target.\n */\n readonly shapeType?: any;\n\n /**\n * For sub-select FieldSets: inline `.where()` filter found on the parent\n * traversal chain (e.g. `p.friends.where(...).select(...)`), plus the index\n * into `parentSegments` of the segment it scopes.\n */\n readonly parentWherePath?: WherePath;\n readonly parentWherePathIndex?: number;\n\n /**\n * For sub-select FieldSets: inner LIMIT/OFFSET/ORDER BY carried from\n * `.limit()`/`.offset()`/`.orderBy()` chained on the nested select.\n * These bound the related collection per parent (single-subject only).\n */\n readonly innerLimit?: number;\n readonly innerOffset?: number;\n readonly innerOrderBy?: FieldSetInnerOrderBy[];\n\n private readonly _catalog: ShapeCatalog | undefined;\n\n private constructor(\n shape: NodeShapeData,\n entries: FieldSetEntry[],\n catalog: ShapeCatalog | undefined = FieldSet.captureFor(shape),\n ) {\n this.shape = shape;\n this.entries = entries;\n this._catalog = catalog;\n }\n\n /** The catalog this FieldSet resolves shapes in (undefined = the global registry). */\n get catalog(): ShapeCatalog | undefined {\n return this._catalog;\n }\n\n /**\n * The catalog a FieldSet rooted at `shape` captures: the active one for an IRI or a\n * shape it holds, none for a shape it does not (an authored class built by code that\n * runs inside a project scope), else the catalog an adapter class came from.\n */\n private static captureFor(\n shape: ShapeConstructor<any> | NodeShapeData | string,\n ): ShapeCatalog | undefined {\n if (typeof shape === 'function') return captureCatalog(shape);\n const active = getActiveShapeCatalog();\n if (active === undefined || typeof shape === 'string') return active;\n return active.has(shape.id) ? active : undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Static constructors\n // ---------------------------------------------------------------------------\n\n /**\n * Create a FieldSet for the given shape with the specified fields.\n *\n * Accepts a ShapeClass (e.g. Person), NodeShapeData, or shape IRI string.\n * Fields can be string paths, PropertyPath instances, nested objects,\n * or a callback receiving a proxy for dot-access.\n */\n static for<S extends Shape>(shape: ShapeConstructor<S>, fields: FieldSetInput[]): FieldSet<any>;\n static for<S extends Shape, R>(shape: ShapeConstructor<S>, fn: (p: any) => R): FieldSet<R>;\n static for(shape: NodeShapeData | string, fields: FieldSetInput[]): FieldSet<any>;\n static for(shape: NodeShapeData | string, fn: (p: any) => any): FieldSet<any>;\n static for(\n shape: ShapeConstructor<any> | NodeShapeData | string,\n fieldsOrFn: FieldSetInput[] | ((p: any) => any),\n ): FieldSet<any> {\n const catalog = FieldSet.captureFor(shape);\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => FieldSet.for(shape as string, fieldsOrFn as FieldSetInput[]));\n }\n const resolved = FieldSet.resolveShapeInput(shape);\n const resolvedShape = resolved.nodeShape;\n\n if (typeof fieldsOrFn === 'function') {\n if (!resolved.shapeClass) {\n throw new Error(\n `Cannot use callback form for shape '${resolved.nodeShape.id}': no ShapeConstructor registered. ` +\n `Use string field names instead, or pass the Shape class directly.`,\n );\n }\n const fields = FieldSet.traceFieldsWithProxy(resolved.nodeShape, resolved.shapeClass, fieldsOrFn);\n return new FieldSet(resolved.nodeShape, fields);\n }\n\n const entries = FieldSet.resolveInputs(resolvedShape, fieldsOrFn);\n return new FieldSet(resolvedShape, entries);\n }\n\n /**\n * Create a typed FieldSet for a sub-select. Traces the callback through the proxy,\n * stores parentSegments and traceResponse for runtime compatibility, and preserves\n * R and Source generics for conditional type inference.\n */\n static forSubSelect<R, Source>(\n shapeClass: any,\n fn: (p: any) => R,\n parentSegments: PropertyShapeData[],\n source?: QueryBuilderObjectLike,\n ): FieldSet<R, Source> {\n const nodeShape = shapeClass.shape || shapeClass;\n // Trace once: get both the raw response (for type carriers) and the entries\n const proxy = createProxiedPathBuilder(shapeClass);\n const traceResponse = fn(proxy as any);\n const entries = FieldSet.extractSubSelectEntries(nodeShape, traceResponse);\n const fs = new FieldSet(nodeShape, entries) as FieldSet<R, Source>;\n // Writable cast — these readonly fields are initialised once here at construction time\n const w = fs as {-readonly [K in 'traceResponse' | 'parentSegments' | 'shapeType' | 'parentWherePath' | 'parentWherePathIndex']: FieldSet<R, Source>[K]};\n w.traceResponse = traceResponse;\n w.parentSegments = parentSegments;\n w.shapeType = shapeClass;\n // Carry an inline `.where()` from the parent traversal chain (walked\n // leaf→root, same convention as convertTraceResult for plain paths).\n let current = source;\n let leafDistance = 0;\n while (current) {\n if (current.wherePath) {\n w.parentWherePath = current.wherePath as WherePath;\n w.parentWherePathIndex = parentSegments.length - 1 - leafDistance;\n break;\n }\n current = current.subject;\n leafDistance++;\n }\n return fs;\n }\n\n\n /**\n * Create a FieldSet containing all decorated properties of the shape.\n *\n * @param opts.depth Controls how deep to include nested shape properties:\n * - `depth=1` (default): this level only — properties of the root shape.\n * - `depth=0`: throws — use a node reference instead.\n * - `depth>1`: recursively includes nested shape properties up to the given depth.\n */\n static all<S extends Shape>(shape: ShapeConstructor<S>, opts?: {depth?: number}): FieldSet;\n static all(shape: NodeShapeData | string, opts?: {depth?: number}): FieldSet;\n static all(shape: ShapeConstructor<any> | NodeShapeData | string, opts?: {depth?: number}): FieldSet {\n const catalog = FieldSet.captureFor(shape);\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => FieldSet.all(shape as string, opts));\n }\n const depth = opts?.depth ?? 1;\n if (depth < 1) {\n throw new Error(\n 'FieldSet.all() requires depth >= 1. Use a node reference ({id}) for depth 0.',\n );\n }\n const resolved = FieldSet.resolveShapeInput(shape);\n // Seed visited with the root shape to prevent self-referencing cycles\n const visited = new Set<string>([resolved.nodeShape.id]);\n return FieldSet.allForShape(resolved.nodeShape, depth, visited);\n }\n\n /**\n * Recursive helper for all(). Tracks visited shape IDs to prevent infinite loops\n * from circular shape references.\n */\n private static allForShape(\n nodeShape: NodeShapeData,\n depth: number,\n visited: Set<string>,\n ): FieldSet {\n const propertyShapes = getUniquePropertyShapes(nodeShape);\n const entries: FieldSetEntry[] = [];\n\n for (const ps of propertyShapes) {\n const entry: FieldSetEntry = {path: new PropertyPath(nodeShape, [ps])};\n\n // If depth > 1, recurse into nested shapes\n if (depth > 1 && ps.valueShape) {\n const nestedShapeClass = getQueryShapeClass(ps.valueShape);\n if (nestedShapeClass?.shape && !visited.has(nestedShapeClass.shape.id)) {\n visited.add(nestedShapeClass.shape.id);\n const nestedFs = FieldSet.allForShape(nestedShapeClass.shape, depth - 1, visited);\n if (nestedFs.entries.length > 0) {\n entry.subSelect = nestedFs;\n }\n }\n }\n\n entries.push(entry);\n }\n\n return new FieldSet(nodeShape, entries);\n }\n\n /**\n * Merge multiple FieldSets into one, deduplicating by path equality.\n * All FieldSets must share the same root shape.\n */\n static merge(sets: FieldSet[]): FieldSet {\n if (sets.length === 0) {\n throw new Error('Cannot merge empty array of FieldSets');\n }\n const shape = sets[0].shape;\n for (const set of sets) {\n if (set.shape.id !== shape.id) {\n throw new Error(\n `Cannot merge FieldSets with different shapes: '${shape.label || shape.id}' and '${set.shape.label || set.shape.id}'`,\n );\n }\n }\n const merged: FieldSetEntry[] = [];\n const seen = new Set<string>();\n\n for (const set of sets) {\n for (const entry of set.entries) {\n // Include aggregation in the dedup key so that 'friends' and 'friends(count)' are distinct\n const key = entry.aggregation\n ? `${entry.path.toString()}:${entry.aggregation}`\n : entry.path.toString();\n if (!seen.has(key)) {\n seen.add(key);\n merged.push(entry);\n }\n }\n }\n\n return new FieldSet(shape, merged, sets[0]._catalog);\n }\n\n // ---------------------------------------------------------------------------\n // Composition methods — each returns a new FieldSet\n // ---------------------------------------------------------------------------\n\n /** Returns a new FieldSet with only the given fields. */\n select(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.select(fields));\n }\n const entries = FieldSet.resolveInputs(this.shape, fields);\n return new FieldSet(this.shape, entries, this._catalog);\n }\n\n /**\n * Clone this FieldSet, preserving the sub-select carrier fields\n * (traceResponse / parentSegments / shapeType / inner pagination) and\n * applying the supplied overrides. Used by `.limit()`/`.offset()`/`.orderBy()`.\n */\n private cloneWith(\n overrides: Partial<Pick<FieldSet, 'innerLimit' | 'innerOffset' | 'innerOrderBy'>>,\n ): this {\n const clone = new FieldSet(this.shape, this.entries as FieldSetEntry[], this._catalog) as this;\n // The sub-select carrier fields are declared `readonly` (normally set once at\n // construction via `forSubSelect`). Copy this FieldSet's identity onto the\n // clone through a mutable view, then layer the pagination overrides on top.\n Object.assign(clone as Record<string, unknown>, {\n traceResponse: this.traceResponse,\n parentSegments: this.parentSegments,\n shapeType: this.shapeType,\n parentWherePath: this.parentWherePath,\n parentWherePathIndex: this.parentWherePathIndex,\n innerLimit: this.innerLimit,\n innerOffset: this.innerOffset,\n innerOrderBy: this.innerOrderBy,\n ...overrides,\n });\n return clone;\n }\n\n /**\n * Bound a nested select's related collection to at most `lim` items per parent.\n * Only honoured when the outer query targets a single subject; otherwise the\n * pipeline throws (per-group pagination across multiple parents is unsupported).\n */\n limit(lim: number): this {\n return this.cloneWith({innerLimit: lim});\n }\n\n /** Skip the first `off` items of a nested select's related collection (single-subject only). */\n offset(off: number): this {\n return this.cloneWith({innerOffset: off});\n }\n\n /**\n * Order a nested select's related collection, producing a deterministic window\n * for inner LIMIT/OFFSET. Defaults to ascending.\n *\n * Accepts either a proxy callback — `.orderBy(f => f.name)` — consistent with\n * the rest of the DSL, or a property-name string (`.orderBy('name')`).\n */\n orderBy(\n paths: string | string[] | ((p: any) => unknown),\n direction: 'ASC' | 'DESC' = 'ASC',\n ): this {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.orderBy(paths, direction));\n }\n const orderBy: FieldSetInnerOrderBy[] =\n typeof paths === 'function'\n ? this.orderByFromProxy(paths, direction)\n : (Array.isArray(paths) ? paths : [paths]).map((label) => {\n const ps = walkPropertyPath(this.shape, label).terminal;\n if (!ps) {\n throw new Error(`orderBy: cannot resolve property '${label}' on shape '${this.shape.id}'`);\n }\n return {propertyShapeId: ps.id, direction};\n });\n return this.cloneWith({innerOrderBy: orderBy});\n }\n\n /** Resolve a proxy `orderBy` callback (e.g. `f => f.name` or `f => [f.a, f.b]`)\n * to inner order-by clauses by tracing the sub-select shape's property proxy. */\n private orderByFromProxy(\n fn: (p: any) => unknown,\n direction: 'ASC' | 'DESC',\n ): FieldSetInnerOrderBy[] {\n if (!this.shapeType) {\n throw new Error(\n 'orderBy(callback) is only available on a nested select(); pass a property-name string otherwise',\n );\n }\n const response = fn(createProxiedPathBuilder(this.shapeType));\n const results = Array.isArray(response) ? response : [response];\n return results.map((result) => {\n const segments = FieldSet.collectPropertySegments(result as QueryBuilderObjectLike);\n const terminal = segments[segments.length - 1];\n if (!terminal) {\n throw new Error('orderBy: callback did not resolve to a property of the sub-select shape');\n }\n return {propertyShapeId: terminal.id, direction};\n });\n }\n\n /** Returns a new FieldSet with additional entries. */\n add(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.add(fields));\n }\n const newEntries = FieldSet.resolveInputs(this.shape, fields);\n // Deduplicate\n const existing = new Set(this.entries.map((e) => e.path.toString()));\n const combined = [...this.entries];\n for (const entry of newEntries) {\n if (!existing.has(entry.path.toString())) {\n combined.push(entry);\n }\n }\n return new FieldSet(this.shape, combined, this._catalog);\n }\n\n /** Returns a new FieldSet without entries matching the given labels. */\n remove(labels: string[]): FieldSet {\n const labelSet = new Set(labels);\n const filtered = (this.entries as FieldSetEntry[]).filter(\n (e) => !labelSet.has(e.path.terminal?.label),\n );\n return new FieldSet(this.shape, filtered, this._catalog);\n }\n\n /** Synonym for replacing all entries — returns a new FieldSet with only the given fields. */\n set(fields: FieldSetInput[]): FieldSet {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.set(fields));\n }\n const entries = FieldSet.resolveInputs(this.shape, fields);\n return new FieldSet(this.shape, entries, this._catalog);\n }\n\n /** Returns a new FieldSet keeping only entries matching the given labels. */\n pick(labels: string[]): FieldSet {\n const labelSet = new Set(labels);\n const filtered = (this.entries as FieldSetEntry[]).filter(\n (e) => labelSet.has(e.path.terminal?.label),\n );\n return new FieldSet(this.shape, filtered, this._catalog);\n }\n\n /** Returns all PropertyPaths in this FieldSet. */\n paths(): PropertyPath[] {\n return (this.entries as FieldSetEntry[]).map((e) => e.path);\n }\n\n /** Returns terminal property labels of all entries. */\n labels(): string[] {\n return (this.entries as FieldSetEntry[]).map((e) => e.path.terminal?.label).filter(Boolean) as string[];\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n /**\n * Serialize this FieldSet to a plain JSON object.\n * Shape is identified by its IRI, paths by dot-separated labels.\n */\n toJSON(): FieldSetJSON {\n const catalog = this._catalog;\n if (catalog !== getActiveShapeCatalog()) {\n return withShapeCatalog(catalog, () => this.toJSON());\n }\n return {shape: this.shape.id, fields: this.toFieldsJSON()};\n }\n\n /** Serialize just the field entries (used for nested relation sub-fields). */\n private toFieldsJSON(): FieldSetFieldJSON[] {\n return (this.entries as FieldSetEntry[]).map((entry) =>\n this.serializeEntry(entry),\n );\n }\n\n private serializeEntry(entry: FieldSetEntry): FieldSetFieldJSON {\n // Computed projection — no path; carry the DSL-JSON value.\n if (entry.expressionNode) {\n const out: FieldSetComputedJSON = {\n value: encodeValueExpr(entry.expressionNode.ir, entry.expressionNode._refs),\n };\n if (entry.alias) out.as = entry.alias;\n if (entry.customKey) out.customKey = entry.customKey;\n return out;\n }\n const pathStr = FieldSet.pathToStringWithCasts(this.shape, entry.path.segments);\n const sub = entry.subSelect ?? entry.preloadSubSelect;\n const subFields = sub ? sub.toFieldsJSON() : undefined;\n const opts: FieldSetRelationOptionsJSON = {};\n const naturalSubShape = FieldSet.nestedShapeOf(entry.path);\n if (sub && sub.shape.id !== naturalSubShape?.id) opts.shape = sub.shape.id;\n if (entry.alias) opts.as = entry.alias;\n if (entry.aggregation) opts.aggregation = entry.aggregation;\n if (entry.customKey) opts.customKey = entry.customKey;\n if (entry.scopedFilter) {\n const idx = entry.scopedFilterIndex ?? entry.path.segments.length - 1;\n opts.where = serializeWherePath(entry.scopedFilter, this.scopedShapeAt(entry, idx));\n opts.whereIndex = idx;\n }\n // Nested-select pagination (G10) — was previously dropped on the wire.\n if (typeof entry.innerLimit === 'number') opts.limit = entry.innerLimit;\n if (typeof entry.innerOffset === 'number') opts.offset = entry.innerOffset;\n if (entry.innerOrderBy && entry.innerOrderBy.length > 0) {\n opts.orderBy = entry.innerOrderBy.map((o) => ({\n [FieldSet.labelOfId(o.propertyShapeId)]: o.direction,\n }));\n }\n const hasOpts = Object.keys(opts).length > 0;\n // Bare-string shorthand: a plain leaf/relation with no options or sub-fields.\n if (!subFields && !hasOpts) return pathStr;\n // Array shorthand: sub-fields only, no other options.\n if (subFields && !hasOpts) return {[pathStr]: subFields};\n // Full options object (optionally carrying `fields`).\n return {[pathStr]: {...opts, ...(subFields ? {fields: subFields} : {})}};\n }\n\n /** The shape a scoped filter at segment `idx` is evaluated against (the segment's value shape). */\n private scopedShapeAt(entry: FieldSetEntry, idx: number): NodeShapeData {\n const seg = entry.path.segments[idx] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})\n ?.valueShape?.id;\n return (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || this.shape;\n }\n\n /**\n * Reconstruct a FieldSet from a JSON object.\n * Resolves shape IRI via getShapeClass() and paths via walkPropertyPath().\n */\n static fromJSON(json: FieldSetJSON): FieldSet {\n return FieldSet.fromFields(FieldSet.resolveShape(json.shape), json.fields);\n }\n\n /** Build a FieldSet from a shape + relation-keyed field list (recursion entry). */\n private static fromFields(shape: NodeShapeData, fields: FieldSetFieldJSON[]): FieldSet {\n return new FieldSet(\n shape,\n fields.map((raw) => FieldSet.parseField(shape, raw)),\n );\n }\n\n /** Parse one field entry (string leaf / computed / relation-keyed) against `shape`. */\n private static parseField(shape: NodeShapeData, raw: FieldSetFieldJSON): FieldSetEntry {\n // Leaf path (may carry inline `as(Shape)` casts).\n if (typeof raw === 'string') {\n return {path: FieldSet.walkPathWithCasts(shape, raw)};\n }\n // Computed projection — carries `value`.\n if ('value' in raw && (raw as FieldSetComputedJSON).value !== undefined) {\n const computed = raw as FieldSetComputedJSON;\n const {ir, refs} = decodeValueExpr(computed.value, shape);\n const entry: FieldSetEntry = {\n path: new PropertyPath(shape, []),\n expressionNode: new ExpressionNode(ir, refs),\n };\n if (computed.as) entry.alias = computed.as;\n if (computed.customKey) entry.customKey = computed.customKey;\n return entry;\n }\n // Relation-keyed: the single non-option key is the relation path.\n const rel = raw as FieldSetRelationJSON;\n const pathKey = Object.keys(rel).find((k) => !RELATION_OPTION_KEYS.has(k));\n if (!pathKey) {\n throw new Error(`FieldSet field has no relation path: ${JSON.stringify(raw)}`);\n }\n const spec = rel[pathKey];\n const path = FieldSet.walkPathWithCasts(shape, pathKey);\n const entry: FieldSetEntry = {path};\n const subFields = Array.isArray(spec) ? spec : spec.fields;\n const opts = Array.isArray(spec) ? ({} as FieldSetRelationOptionsJSON) : spec;\n if (opts.as) entry.alias = opts.as;\n if (opts.customKey) entry.customKey = opts.customKey;\n if (opts.aggregation) entry.aggregation = opts.aggregation as 'count';\n if (opts.where) {\n const idx = opts.whereIndex ?? path.segments.length - 1;\n const seg = path.segments[idx] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})?.valueShape?.id;\n const scopedShape = (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || shape;\n entry.scopedFilter = deserializeWherePath(scopedShape, opts.where);\n entry.scopedFilterIndex = idx;\n }\n // Nested-select pagination (G10).\n if (typeof opts.limit === 'number') entry.innerLimit = opts.limit;\n if (typeof opts.offset === 'number') entry.innerOffset = opts.offset;\n if (opts.orderBy && opts.orderBy.length > 0) {\n const nested = FieldSet.nestedShapeOf(path) ?? shape;\n entry.innerOrderBy = opts.orderBy.map((e) => {\n const label = Object.keys(e)[0];\n const ps = getPropertyShape(nested, label);\n return {propertyShapeId: ps?.id ?? label, direction: Object.values(e)[0]};\n });\n }\n if (subFields) {\n const nested = opts.shape\n ? FieldSet.resolveShape(opts.shape)\n : FieldSet.requireNestedShapeOf(path, shape);\n entry.subSelect = FieldSet.fromFields(nested, subFields);\n }\n return entry;\n }\n\n /**\n * The shape sub-fields of `path` are read against: its terminal segment's value shape, or\n * `shape` when that segment declares none. A declared value shape that does not resolve is\n * an error: reading the sub-fields against `shape` instead would resolve them on the wrong\n * shape (or fail with a message about the wrong property).\n */\n private static requireNestedShapeOf(path: PropertyPath, shape: NodeShapeData): NodeShapeData {\n const nested = FieldSet.nestedShapeOf(path);\n if (nested) return nested;\n const seg = path.segments[path.segments.length - 1] as PropertyShapeData | undefined;\n if (seg?.valueShape?.id) {\n const owner = path.segments.length > 1\n ? FieldSet.nestedShapeOf(new PropertyPath(path.rootShape, path.segments.slice(0, -1)))\n : path.rootShape;\n throw unresolvedValueShapeError(\n `Cannot resolve valueShape '${seg.valueShape.id}' for property '${seg.label}' in path '${path.toString()}'`,\n seg,\n owner,\n );\n }\n return shape;\n }\n\n /** The shape reached at the end of a relation path (its terminal segment's value shape). */\n private static nestedShapeOf(path: PropertyPath): NodeShapeData | undefined {\n const seg = path.segments[path.segments.length - 1] as PropertyShapeData | undefined;\n const valueShapeId = (seg as unknown as {valueShape?: {id: string}})?.valueShape?.id;\n return (valueShapeId && getQueryShapeClass(valueShapeId)?.shape) || undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Resolves any of the accepted shape input types to a NodeShapeData and optional ShapeClass.\n * Accepts: ShapeConstructor (class with .shape), NodeShapeData, or IRI string.\n */\n private static resolveShapeInput(shape: ShapeConstructor<any> | NodeShapeData | string): {nodeShape: NodeShapeData; shapeClass?: ShapeConstructor<any>} {\n // Inside a catalog the catalog's data is the authority for every IRI it holds, so an\n // authored class (or metadata) for one of them resolves to the catalog's shape — as\n // `resolveShape` does for the builders.\n const catalog = getActiveShapeCatalog();\n if (catalog !== undefined && typeof shape !== 'string') {\n const id = typeof shape === 'function' ? shape.shape?.id : shape?.id;\n const own = id ? catalog.get(id) : undefined;\n if (own) {\n const shapeClass = getQueryShapeClass(id!);\n return shapeClass ? {nodeShape: own, shapeClass} : {nodeShape: own};\n }\n }\n if (typeof shape === 'string') {\n const shapeClass = getQueryShapeClass(shape);\n if (shapeClass?.shape) {\n return {nodeShape: shapeClass.shape, shapeClass};\n }\n // No authored class: the metadata alone is enough here — the classless branch\n // below is already supported, it just was not reachable from an IRI.\n const nodeShape = getNodeShape(shape);\n if (!nodeShape) {\n throw unresolvedShapeError(`Cannot resolve shape for '${shape}'`, topLevelDetails(shape));\n }\n return {nodeShape};\n }\n // ShapeConstructor: has a static .shape property that is a NodeShapeData\n if ('shape' in shape && typeof shape.shape === 'object' && shape.shape !== null && 'id' in shape.shape) {\n return {nodeShape: (shape as ShapeConstructor<any>).shape, shapeClass: shape as ShapeConstructor<any>};\n }\n // NodeShapeData: has .id directly — try to look up its ShapeConstructor for full proxy support\n const nodeShape = shape as NodeShapeData;\n const shapeClass = nodeShape.id ? getQueryShapeClass(nodeShape.id) : undefined;\n return shapeClass\n ? {nodeShape, shapeClass}\n : {nodeShape};\n }\n\n /** @deprecated Use resolveShapeInput instead. Kept for fromJSON which only passes NodeShapeData|string. */\n private static resolveShape(shape: NodeShapeData | string): NodeShapeData {\n return FieldSet.resolveShapeInput(shape).nodeShape;\n }\n\n private static resolveInputs(\n shape: NodeShapeData,\n inputs: FieldSetInput[],\n ): FieldSetEntry[] {\n const entries: FieldSetEntry[] = [];\n for (const input of inputs) {\n if (typeof input === 'string') {\n entries.push({path: walkPropertyPath(shape, input)});\n } else if (isLinkedInstance(input, PropertyPath)) {\n entries.push({path: input});\n } else if (isLinkedInstance(input, FieldSet)) {\n entries.push(...(input.entries as FieldSetEntry[]));\n } else if (typeof input === 'object') {\n // Nested object form: { friends: ['name', 'hobby'] }\n for (const [key, value] of Object.entries(input)) {\n const basePath = walkPropertyPath(shape, key);\n if (isLinkedInstance(value, FieldSet)) {\n // Merge nested FieldSet entries under this path\n for (const entry of value.entries as FieldSetEntry[]) {\n const combined = new PropertyPath(shape, [\n ...basePath.segments,\n ...entry.path.segments,\n ]);\n entries.push({path: combined, alias: entry.alias, scopedFilter: entry.scopedFilter});\n }\n } else if (Array.isArray(value)) {\n // Resolve nested string fields\n const basePropertyShape = basePath.terminal;\n if (!basePropertyShape?.valueShape) {\n throw new Error(\n `Property '${key}' has no valueShape; cannot resolve nested fields`,\n );\n }\n const nestedShapeClass = getQueryShapeClass(basePropertyShape.valueShape);\n if (!nestedShapeClass || !nestedShapeClass.shape) {\n throw unresolvedValueShapeError(\n `Cannot resolve valueShape '${basePropertyShape.valueShape.id}' for property '${key}'`,\n basePropertyShape,\n );\n }\n for (const nestedField of value) {\n const nestedPath = walkPropertyPath(nestedShapeClass.shape, nestedField);\n const combined = new PropertyPath(shape, [\n ...basePath.segments,\n ...nestedPath.segments,\n ]);\n entries.push({path: combined});\n }\n }\n }\n }\n }\n return entries;\n }\n\n /**\n * Trace fields using the full ProxiedPathBuilder proxy (createProxiedPathBuilder).\n * Handles nested paths, where conditions, aggregations, and sub-selects.\n */\n private static traceFieldsWithProxy(\n nodeShape: NodeShapeData,\n shapeClass: ShapeConstructor<any>,\n fn: (p: any) => any,\n ): FieldSetEntry[] {\n const proxy = createProxiedPathBuilder(shapeClass);\n const result = fn(proxy);\n\n // Normalize result: could be a single value, array, or custom object\n if (Array.isArray(result)) {\n return result.map((item) => FieldSet.convertTraceResult(nodeShape, item));\n }\n if (isQueryBuilderObject(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single FieldSet sub-select (e.g. p.friends.select(f => [f.name]))\n if (isLinkedInstance(result, FieldSet) && result.parentSegments !== undefined) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single SetSize (e.g. p.friends.size())\n if (isSetSize(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single BoundComponent (e.g. p.bestFriend.preloadFor(comp))\n if (isBoundComponent(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n // Single ExpressionNode (e.g. p.age.times(12))\n if (isExpressionNode(result)) {\n return [FieldSet.convertTraceResult(nodeShape, result)];\n }\n if (typeof result === 'object' && result !== null) {\n // Custom object form: {name: p.name, hobby: p.hobby}\n const entries: FieldSetEntry[] = [];\n for (const [key, value] of Object.entries(result)) {\n const entry = FieldSet.convertTraceResult(nodeShape, value);\n entry.customKey = key;\n entries.push(entry);\n }\n return entries;\n }\n return [];\n }\n\n /**\n * Convert a single proxy trace result (QueryBuilderObject, SetSize, or FieldSet sub-select)\n * into a FieldSetEntry.\n */\n private static convertTraceResult(rootShape: NodeShapeData, obj: any): FieldSetEntry {\n // SetSize → aggregation: 'count'\n if (isSetSize(obj)) {\n const segments = FieldSet.collectPropertySegments(obj.subject);\n return {\n path: new PropertyPath(rootShape, segments),\n aggregation: 'count',\n };\n }\n\n // FieldSet sub-select — use its entries directly (created by forSubSelect)\n if (isLinkedInstance(obj, FieldSet) && obj.parentSegments !== undefined) {\n const subSelect = obj.entries.length > 0 ? obj : undefined;\n const entry: FieldSetEntry = {\n path: new PropertyPath(rootShape, obj.parentSegments),\n subSelect: subSelect as FieldSet | undefined,\n };\n // Carry an inline `.where()` from the parent traversal chain\n // (e.g. `p.friends.where(...).select(...)`).\n if (obj.parentWherePath) {\n entry.scopedFilter = obj.parentWherePath;\n entry.scopedFilterIndex = obj.parentWherePathIndex;\n }\n // Carry inner LIMIT/OFFSET/ORDER BY from `.limit()`/`.offset()`/`.orderBy()`.\n if (typeof obj.innerLimit === 'number') entry.innerLimit = obj.innerLimit;\n if (typeof obj.innerOffset === 'number') entry.innerOffset = obj.innerOffset;\n if (obj.innerOrderBy) entry.innerOrderBy = obj.innerOrderBy;\n return entry;\n }\n\n // BoundComponent → preload composition (e.g. p.bestFriend.preloadFor(component))\n // Extract the component's FieldSet and store it as preloadSubSelect.\n if (isBoundComponent(obj)) {\n const segments = FieldSet.collectPropertySegments(obj.source);\n const componentFieldSet = FieldSet.extractComponentFieldSet(obj.originalValue);\n return {\n path: new PropertyPath(rootShape, segments),\n preloadSubSelect: componentFieldSet,\n };\n }\n\n // ExpressionNode → computed expression (e.g. p.age.times(12))\n if (isExpressionNode(obj)) {\n return {\n path: new PropertyPath(rootShape, []),\n expressionNode: obj,\n };\n }\n\n // QueryBuilderObject → walk the chain to collect PropertyPath segments\n if (isQueryBuilderObject(obj)) {\n const segments = FieldSet.collectPropertySegments(obj);\n const entry: FieldSetEntry = {\n path: new PropertyPath(rootShape, segments),\n };\n // Walk from leaf to root to find wherePath on any object in the chain.\n // Track which segment it belongs to so desugarEntry attaches the filter correctly.\n let current: QueryBuilderObjectLike | undefined = obj;\n let leafDistance = 0;\n while (current) {\n if (current.wherePath) {\n entry.scopedFilter = current.wherePath as WherePath;\n entry.scopedFilterIndex = segments.length - 1 - leafDistance;\n break;\n }\n current = current.subject;\n leafDistance++;\n }\n return entry;\n }\n\n // Fallback: string label\n if (typeof obj === 'string') {\n return {path: walkPropertyPath(rootShape, obj)};\n }\n\n throw new Error(`Unknown trace result type: ${obj}`);\n }\n\n /**\n * Walk a QueryBuilderObject-like chain (via .subject) collecting PropertyShapeData segments\n * from leaf to root, then reverse to get root-to-leaf order.\n */\n static collectPropertySegments(obj: QueryBuilderObjectLike): PropertyShapeData[] {\n const segments: PropertyShapeData[] = [];\n let current: QueryBuilderObjectLike | undefined = obj;\n while (current) {\n if (current.property) {\n segments.unshift(current.property);\n }\n current = current.subject;\n }\n return segments;\n }\n\n // ---------------------------------------------------------------------------\n // Cast-aware path (de)serialization — carries `.as(Shape)` narrowing inline as\n // an `as(<ShapeLabel>)` path segment (documentation/dsl-json.md, backlog 002 G5).\n // ---------------------------------------------------------------------------\n\n private static shapeById(id: string): NodeShapeData | undefined {\n return getShapeClass(id)?.shape ?? getNodeShape(id);\n }\n\n private static shapeByLabel(label: string): NodeShapeData | undefined {\n // Inside a catalog every shape is data (core's built-ins aside), so scan its shapes;\n // the global registry keeps scanning authored classes.\n const matches = (shape?: NodeShapeData): shape is NodeShapeData =>\n !!shape && (shape.label === label || FieldSet.labelOfId(shape.id) === label);\n if (getActiveShapeCatalog() !== undefined) {\n for (const shape of getAllNodeShapes().values()) if (matches(shape)) return shape;\n return undefined;\n }\n for (const cls of getAllShapeClasses().values()) {\n const shape = (cls as unknown as {shape?: NodeShapeData}).shape;\n if (matches(shape)) return shape;\n }\n return undefined;\n }\n\n private static labelOfId(id: string): string {\n const i = id.lastIndexOf('/');\n return i >= 0 ? id.slice(i + 1) : id;\n }\n\n /**\n * Render a segment chain as a dotted label path, inserting `as(<ShapeLabel>)`\n * wherever a segment is not resolvable by label from the natural (walked) shape\n * — i.e. a `.as(Shape)` narrowing happened before it.\n */\n static pathToStringWithCasts(rootShape: NodeShapeData, segments: readonly PropertyShapeData[]): string {\n const parts: string[] = [];\n let current: NodeShapeData | undefined = rootShape;\n for (const seg of segments) {\n const label = FieldSet.labelOfId(seg.id);\n const natural = current ? getPropertyShape(current, label) : undefined;\n if (!natural || natural.id !== seg.id) {\n // A cast narrowed the context to the segment's owner shape.\n const ownerId = seg.id.slice(0, seg.id.lastIndexOf('/'));\n const owner = FieldSet.shapeById(ownerId);\n parts.push(`as(${owner?.label ?? FieldSet.labelOfId(ownerId)})`);\n current = owner ?? current;\n }\n parts.push(label);\n const vs = (seg as unknown as {valueShape?: {id: string}}).valueShape;\n current = vs ? FieldSet.shapeById(vs.id) ?? current : current;\n }\n return parts.join('.');\n }\n\n /** Inverse of {@link pathToStringWithCasts}: resolve a dotted path with `as(X)` casts. */\n static walkPathWithCasts(rootShape: NodeShapeData, path: string): PropertyPath {\n if (!path.includes('as(')) return walkPropertyPath(rootShape, path);\n const segments: PropertyShapeData[] = [];\n let current: NodeShapeData | undefined = rootShape;\n for (const token of path.split('.')) {\n const cast = /^as\\((.+)\\)$/.exec(token);\n if (cast) {\n current = FieldSet.shapeByLabel(cast[1]) ?? current;\n continue;\n }\n const ps = current ? getPropertyShape(current, token) : undefined;\n if (!ps) {\n throw new Error(\n `Property '${token}' not found on shape '${current?.label || current?.id}' while resolving path '${path}'`,\n );\n }\n segments.push(ps);\n const vs = (ps as unknown as {valueShape?: {id: string}}).valueShape;\n current = vs ? FieldSet.shapeById(vs.id) ?? current : current;\n }\n return new PropertyPath(rootShape, segments);\n }\n\n /**\n * Extract a FieldSet from a component-like object for preload composition.\n *\n * Supports multiple component interfaces:\n * - `.fields` as a FieldSet directly\n * - `.query` as a FieldSet, QueryBuilder (duck-typed via .fields()), or\n * Record<string, QueryBuilder> (e.g. `{person: PersonQuery}`)\n */\n static extractComponentFieldSet(component: any): FieldSet | undefined {\n // Prefer .fields if it's a FieldSet\n if (isLinkedInstance(component.fields, FieldSet)) {\n return component.fields;\n }\n const query = component.query;\n if (isLinkedInstance(query, FieldSet)) {\n return query;\n }\n // QueryBuilder duck-type — has .fields() method\n if (query && typeof query.fields === 'function') {\n return query.fields();\n }\n // Record form: { propName: QueryBuilder }\n if (typeof query === 'object') {\n for (const key in query) {\n const value = (query as Record<string, any>)[key];\n if (value && typeof value.fields === 'function') {\n return value.fields();\n }\n }\n }\n return undefined;\n }\n\n /**\n * Internal factory that bypasses the private constructor for use by static methods.\n */\n private static createInternal(shape: NodeShapeData, entries: FieldSetEntry[]): FieldSet {\n return new FieldSet(shape, entries);\n }\n\n /**\n * Create a FieldSet from raw entries. Used by QueryBuilder to merge preload entries.\n */\n static createFromEntries(shape: NodeShapeData, entries: FieldSetEntry[]): FieldSet {\n return new FieldSet(shape, entries);\n }\n\n /**\n * Extract FieldSetEntry[] from a sub-query's traceResponse.\n * Public alias for use by lightweight sub-select wrappers.\n */\n static extractSubSelectEntriesPublic(rootShape: NodeShapeData, traceResponse: any): FieldSetEntry[] {\n return FieldSet.extractSubSelectEntries(rootShape, traceResponse);\n }\n\n /**\n * Extract FieldSetEntry[] from a sub-select's traceResponse.\n * The traceResponse is the result of calling the sub-query callback with a proxy,\n * containing QueryBuilderObjects, arrays, custom objects, etc.\n */\n private static extractSubSelectEntries(rootShape: NodeShapeData, traceResponse: any): FieldSetEntry[] {\n if (Array.isArray(traceResponse)) {\n return traceResponse\n .filter((item) => item !== null && item !== undefined)\n .map((item) => FieldSet.convertTraceResult(rootShape, item));\n }\n if (isQueryBuilderObject(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single FieldSet sub-select — convert directly\n if (isLinkedInstance(traceResponse, FieldSet) && traceResponse.parentSegments !== undefined) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single SetSize\n if (isSetSize(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n // Single ExpressionNode\n if (isExpressionNode(traceResponse)) {\n return [FieldSet.convertTraceResult(rootShape, traceResponse)];\n }\n if (typeof traceResponse === 'object' && traceResponse !== null) {\n // Custom object form: {name: p.name, hobby: p.hobby}\n const entries: FieldSetEntry[] = [];\n for (const [key, value] of Object.entries(traceResponse)) {\n if (value !== null && value !== undefined) {\n const entry = FieldSet.convertTraceResult(rootShape, value);\n entry.customKey = key;\n entries.push(entry);\n }\n }\n return entries;\n }\n return [];\n }\n\n}\nbrandLinkedClass(FieldSet, '@_linked/core', 'FieldSet');\n\n"]}
@@ -3,6 +3,7 @@ import { resolveContextId } from './ContextRef.js';
3
3
  import { lowerSelectionPathExpression, projectionKeyFromPath } from './IRProjection.js';
4
4
  import { IRAliasScope } from './IRAliasScope.js';
5
5
  import { attachCatalog } from '../utils/ShapeClass.js';
6
+ import { isLinkedInstance } from '../utils/linkedError.js';
6
7
  /**
7
8
  * Creates a memoized traversal resolver that deduplicates (fromAlias, propertyShapeId)
8
9
  * pairs, generates unique aliases, and accumulates the resulting patterns.
@@ -178,7 +179,7 @@ const lowerExistsCondition = (condition, ctx, options) => {
178
179
  let result = existsExpr;
179
180
  for (const link of condition.chain) {
180
181
  let rightExpr;
181
- if (link.condition instanceof ExistsCondition) {
182
+ if (isLinkedInstance(link.condition, ExistsCondition)) {
182
183
  rightExpr = lowerExistsCondition(link.condition, ctx, options);
183
184
  }
184
185
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"IRLower.js","sourceRoot":"","sources":["../../../src/queries/IRLower.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CanonicalDesugaredSelectQuery,\n CanonicalWhereExpression,\n} from './IRCanonicalize.js';\nimport type {\n DesugaredExpressionSelect,\n DesugaredExpressionWhere,\n DesugaredExistsWhere,\n DesugaredSelection,\n DesugaredSelectionPath,\n DesugaredStep,\n DesugaredWhere,\n} from './IRDesugar.js';\nimport {resolveExpressionRefs, ExistsCondition} from '../expressions/ExpressionNode.js';\nimport {resolveContextId} from './ContextRef.js';\nimport type {\n IRExpression,\n IRGraphPattern,\n IROrderByItem,\n IRProjectionItem,\n IRResultMapEntry,\n IRSelectQuery,\n IRShapeScanPattern,\n IRTraversePattern,\n} from './IntermediateRepresentation.js';\nimport {lowerSelectionPathExpression, projectionKeyFromPath} from './IRProjection.js';\nimport {IRAliasScope} from './IRAliasScope.js';\nimport {attachCatalog} from '../utils/ShapeClass.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\n\n/**\n * Creates a memoized traversal resolver that deduplicates (fromAlias, propertyShapeId)\n * pairs, generates unique aliases, and accumulates the resulting patterns.\n * Used by both select-query lowering and mutation expression resolution.\n */\nexport function createTraversalResolver<P>(\n generateAlias: () => string,\n createPattern: (from: string, to: string, property: string) => P,\n): {resolve: (fromAlias: string, propertyShapeId: string) => string; patterns: P[]} {\n const patterns: P[] = [];\n const seen = new Map<string, string>();\n\n const resolve = (fromAlias: string, propertyShapeId: string): string => {\n const key = `${fromAlias}:${propertyShapeId}`;\n if (seen.has(key)) return seen.get(key)!;\n const toAlias = generateAlias();\n seen.set(key, toAlias);\n patterns.push(createPattern(fromAlias, toAlias, propertyShapeId));\n return toAlias;\n };\n\n return {resolve, patterns};\n}\n\nclass LoweringContext {\n private counter = 0;\n private patterns: IRGraphPattern[] = [];\n private traverseMap = new Map<string, string>();\n private filterMap = new Map<string, IRExpression>();\n private innerPaginationMap = new Map<\n string,\n {limit?: number; offset?: number; orderBy?: import('./IntermediateRepresentation.js').IRInnerOrderBy[]}\n >();\n readonly rootAlias: string;\n\n constructor() {\n this.rootAlias = this.nextAlias();\n }\n\n private nextAlias(): string {\n return `a${this.counter++}`;\n }\n\n getOrCreateTraversal(fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number): string {\n const key = `${fromAlias}:${propertyShapeId}`;\n const existing = this.traverseMap.get(key);\n if (existing) return existing;\n\n const toAlias = this.nextAlias();\n const pattern: IRTraversePattern = {\n kind: 'traverse',\n from: fromAlias,\n to: toAlias,\n property: propertyShapeId,\n };\n if (pathExpr) {\n pattern.pathExpr = pathExpr;\n }\n if (typeof maxCount === 'number') {\n pattern.maxCount = maxCount;\n }\n this.patterns.push(pattern);\n this.traverseMap.set(key, toAlias);\n return toAlias;\n }\n\n generateAlias(): string {\n return this.nextAlias();\n }\n\n /**\n * Attaches an inline where filter to the traverse pattern targeting `toAlias`.\n * The filter will be merged into the pattern when `getPatterns()` is called.\n */\n attachFilter(toAlias: string, filter: IRExpression): void {\n this.filterMap.set(toAlias, filter);\n }\n\n /**\n * Attaches inner LIMIT/OFFSET/ORDER BY (from a nested select) to the traverse\n * pattern targeting `toAlias`. Merged into the pattern in `getPatterns()`.\n */\n attachInnerPagination(\n toAlias: string,\n pagination: {limit?: number; offset?: number; orderBy?: import('./IntermediateRepresentation.js').IRInnerOrderBy[]},\n ): void {\n this.innerPaginationMap.set(toAlias, pagination);\n }\n\n getPatterns(): IRGraphPattern[] {\n return this.patterns.map((p) => {\n if (p.kind !== 'traverse') return p;\n let pattern = p;\n if (this.filterMap.has(p.to)) {\n pattern = {...pattern, filter: this.filterMap.get(p.to)!};\n }\n const pagination = this.innerPaginationMap.get(p.to);\n if (pagination) {\n pattern = {\n ...pattern,\n ...(typeof pagination.limit === 'number' ? {innerLimit: pagination.limit} : {}),\n ...(typeof pagination.offset === 'number' ? {innerOffset: pagination.offset} : {}),\n ...(pagination.orderBy ? {innerOrderBy: pagination.orderBy} : {}),\n };\n }\n return pattern;\n });\n }\n}\n\n/** Minimal interface for alias generation used by lowerWhere and traversal resolvers. */\ntype AliasGenerator = {\n generateAlias(): string;\n};\n\ntype PathLoweringOptions = {\n rootAlias: string;\n resolveTraversal: (fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number) => string;\n};\n\nconst lowerPath = (\n path: DesugaredSelectionPath,\n options: PathLoweringOptions,\n): IRExpression => lowerSelectionPathExpression(path, options);\n\n/**\n * Resolve any `{@ctx}` context references carried in a lowered expression tree —\n * whether it came from a where-clause filter OR a projected (expression-select)\n * value.\n *\n * A context reference (`.equals(getQueryContext('user'))`) is carried through build +\n * the wire as a *name* (`reference_expr.contextName` / `context_property_expr.contextName`),\n * never a baked id. Here — at lowering — it is resolved against the live context map into\n * the concrete IRI; an unresolved one throws `UnresolvedContextError` (SELECT callers\n * short-circuit to null before lowering, so a query is never lowered with an unresolved\n * context in practice). This must be applied to every expression that can reach the SPARQL\n * algebra, not just where-filters.\n */\nconst resolveContextRefs = (expr: IRExpression): IRExpression => {\n switch (expr.kind) {\n case 'reference_expr':\n if (expr.contextName) {\n return {kind: 'reference_expr', value: resolveContextId(expr.contextName, true)!};\n }\n return expr;\n case 'context_property_expr':\n if (expr.contextName) {\n return {kind: 'context_property_expr', contextIri: resolveContextId(expr.contextName, true)!, property: expr.property};\n }\n return expr;\n case 'binary_expr':\n return {...expr, left: resolveContextRefs(expr.left), right: resolveContextRefs(expr.right)};\n case 'in_expr':\n return {\n ...expr,\n value: resolveContextRefs(expr.value),\n source: {list: expr.source.list.map(resolveContextRefs)},\n };\n case 'logical_expr':\n return {...expr, expressions: expr.expressions.map(resolveContextRefs)};\n case 'not_expr':\n return {...expr, expression: resolveContextRefs(expr.expression)};\n case 'function_expr':\n case 'aggregate_expr':\n return {...expr, args: expr.args.map(resolveContextRefs)};\n case 'exists_expr':\n return expr.filter ? {...expr, filter: resolveContextRefs(expr.filter)} : expr;\n default:\n return expr;\n }\n};\n\nconst lowerWhere = (\n where: CanonicalWhereExpression,\n ctx: AliasGenerator,\n options: PathLoweringOptions,\n): IRExpression => {\n switch (where.kind) {\n case 'where_expression': {\n // ExpressionNode-based WHERE — resolve refs and return IRExpression directly\n const exprWhere = where as DesugaredExpressionWhere;\n return resolveContextRefs(resolveExpressionRefs(\n exprWhere.expressionNode.ir,\n exprWhere.expressionNode._refs,\n options.rootAlias,\n options.resolveTraversal,\n ));\n }\n case 'where_exists_condition': {\n // ExistsCondition-based WHERE (from .some()/.every()/.none())\n const existsWhere = where as DesugaredExistsWhere;\n return resolveContextRefs(lowerExistsCondition(existsWhere.existsCondition, ctx, options));\n }\n default:\n const _exhaustive: never = where;\n throw new Error(`Unknown canonical where kind: ${(_exhaustive as {kind: string}).kind}`);\n }\n};\n\n/**\n * Lower an ExistsCondition to IRExistsExpression with proper traversal patterns.\n */\nconst lowerExistsCondition = (\n condition: ExistsCondition,\n ctx: AliasGenerator,\n options: PathLoweringOptions,\n): IRExpression => {\n // Build traversal patterns for the collection path\n const {resolve: existsResolve, patterns: traversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n\n // Walk the path segments to create traversal patterns\n let currentAlias = options.rootAlias;\n for (const segmentId of condition.pathSegmentIds) {\n currentAlias = existsResolve(currentAlias, segmentId);\n }\n\n // Resolve the inner predicate's property refs against the EXISTS scope\n const filter = resolveExpressionRefs(\n condition.predicate.ir,\n condition.predicate._refs,\n currentAlias,\n existsResolve,\n );\n\n let existsExpr: IRExpression = {\n kind: 'exists_expr',\n pattern: traversals.length === 1\n ? traversals[0]\n : {kind: 'join', patterns: traversals},\n filter,\n };\n\n // Wrap in NOT if negated (.none() or outer NOT of .every())\n if (condition.negated) {\n existsExpr = {kind: 'not_expr', expression: existsExpr};\n }\n\n // Handle .and()/.or() chaining\n if (condition.chain.length > 0) {\n let result: IRExpression = existsExpr;\n for (const link of condition.chain) {\n let rightExpr: IRExpression;\n if (link.condition instanceof ExistsCondition) {\n rightExpr = lowerExistsCondition(link.condition, ctx, options);\n } else {\n rightExpr = resolveExpressionRefs(\n link.condition.ir,\n link.condition._refs,\n options.rootAlias,\n options.resolveTraversal,\n );\n }\n result = {\n kind: 'logical_expr',\n operator: link.op,\n expressions: [result, rightExpr],\n };\n }\n return result;\n }\n\n return existsExpr;\n};\n\ntype ProjectionSeed =\n | {\n kind: 'path';\n path: DesugaredSelectionPath;\n key?: string;\n }\n | {\n kind: 'expression';\n expression: IRExpression;\n key: string;\n };\n\nconst combineWithParentPath = (\n parentPath: DesugaredStep[],\n path: DesugaredSelectionPath,\n): DesugaredSelectionPath => ({\n kind: 'selection_path',\n steps: [...parentPath, ...path.steps],\n});\n\n/**\n * Lowers a canonical desugared select query into the final IRSelectQuery.\n * Introduces aliases, graph patterns (shape scans, traversals), and\n * converts selection paths and where-clauses into IR expressions.\n */\nexport const lowerSelectQuery = (\n canonical: CanonicalDesugaredSelectQuery,\n): IRSelectQuery => {\n const ctx = new LoweringContext();\n const pathOptions: PathLoweringOptions = {\n rootAlias: ctx.rootAlias,\n resolveTraversal: (fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number) =>\n ctx.getOrCreateTraversal(fromAlias, propertyShapeId, pathExpr, maxCount),\n };\n\n const root: IRShapeScanPattern = {\n kind: 'shape_scan',\n shape: canonical.shapeId || '',\n alias: ctx.rootAlias,\n };\n\n const aliasAfterPath = (steps: DesugaredStep[]): string => {\n let currentAlias = pathOptions.rootAlias;\n for (const step of steps) {\n if (step.kind === 'property_step') {\n currentAlias = pathOptions.resolveTraversal(currentAlias, step.propertyShapeId, step.pathExpr, step.maxCount);\n }\n }\n return currentAlias;\n };\n\n const collectProjectionSeeds = (\n selection: DesugaredSelection,\n key?: string,\n parentPath: DesugaredStep[] = [],\n ): ProjectionSeed[] => {\n if (selection.kind === 'selection_path') {\n return [{\n kind: 'path',\n path: combineWithParentPath(parentPath, selection),\n key,\n }];\n }\n\n if (selection.kind === 'sub_select') {\n const combinedParentPath = [...parentPath, ...selection.parentPath];\n // Nested-select inner LIMIT/OFFSET/ORDER BY → attach to the root→child\n // traverse (the alias reached by walking combinedParentPath). The serializer\n // wraps that traverse in a SPARQL sub-SELECT. Single-subject is enforced in\n // irToAlgebra; here we only record the intent.\n const hasInnerPagination =\n typeof selection.innerLimit === 'number' ||\n typeof selection.innerOffset === 'number' ||\n (selection.innerOrderBy && selection.innerOrderBy.length > 0);\n if (hasInnerPagination) {\n const childAlias = aliasAfterPath(combinedParentPath);\n ctx.attachInnerPagination(childAlias, {\n limit: selection.innerLimit,\n offset: selection.innerOffset,\n orderBy: selection.innerOrderBy?.map((o) => ({\n property: o.propertyShapeId,\n direction: o.direction,\n })),\n });\n }\n return collectProjectionSeeds(\n selection.selections,\n // The enclosing key identifies the sub-select container. Result-map\n // entries produced inside that container must retain their own property\n // keys. This also covers one-element array selections, which desugaring\n // intentionally collapses to a single selection.\n undefined,\n combinedParentPath,\n );\n }\n\n if (selection.kind === 'custom_object_select') {\n return selection.entries.flatMap((entry) =>\n collectProjectionSeeds(entry.value, entry.key, parentPath),\n );\n }\n\n if (selection.kind === 'multi_selection') {\n return selection.selections.flatMap((nestedSelection) =>\n // A key on the enclosing selection names that selection; it must not\n // replace the individual keys of an array/multi-selection. Each child\n // derives its own key from its terminal property (or carries its own\n // explicit custom key).\n collectProjectionSeeds(nestedSelection, undefined, parentPath),\n );\n }\n\n\n\n if (selection.kind === 'expression_select') {\n const exprSelect = selection as DesugaredExpressionSelect;\n // Resolve property refs AND any {@ctx} context references — a projected\n // expression (e.g. `select(p => ({flag: p.x.equals(getQueryContext('user'))}))`)\n // reaches the SPARQL algebra just like a where-filter, so its context refs\n // must be resolved here too, not only in lowerWhere.\n const resolved = resolveContextRefs(resolveExpressionRefs(\n exprSelect.expressionNode.ir,\n exprSelect.expressionNode._refs,\n aliasAfterPath(parentPath),\n pathOptions.resolveTraversal,\n ));\n return [{\n kind: 'expression',\n key: key || 'expr',\n expression: resolved,\n }];\n }\n\n return [];\n };\n\n const projectionSeeds = canonical.selections.flatMap((selection) =>\n collectProjectionSeeds(selection),\n );\n\n const projectionScope = new IRAliasScope('projection');\n projectionScope.registerAlias(ctx.rootAlias, 'root');\n const projection: IRProjectionItem[] = [];\n const resultMapEntries: IRResultMapEntry[] = [];\n\n // Inline filter handler: when a property step has `.where()`, canonicalize\n // and lower the where predicate, then attach it to the traverse pattern.\n const inlineFilterHandler = (traverseAlias: string, where: DesugaredWhere) => {\n const filterExpr = lowerWhere(where, ctx, {\n rootAlias: traverseAlias,\n resolveTraversal: pathOptions.resolveTraversal,\n });\n ctx.attachFilter(traverseAlias, filterExpr);\n };\n\n for (const seed of projectionSeeds) {\n const key = seed.kind === 'path'\n ? (seed.key || projectionKeyFromPath(seed.path))\n : seed.key;\n const alias = projectionScope.generateAlias(key).alias;\n projection.push({\n alias,\n expression: seed.kind === 'path'\n ? lowerSelectionPathExpression(seed.path, pathOptions, inlineFilterHandler)\n : seed.expression,\n });\n resultMapEntries.push({\n key,\n alias,\n });\n }\n\n const where = canonical.where ? lowerWhere(canonical.where, ctx, pathOptions) : undefined;\n\n const orderBy: IROrderByItem[] | undefined = canonical.sortBy\n ? canonical.sortBy.paths.map((path, i) => ({\n expression: lowerPath(path, pathOptions),\n direction: canonical.sortBy!.directions[i],\n }))\n : undefined;\n\n // Lower MINUS entries → IRMinusPattern objects\n const minusPatterns: IRGraphPattern[] = [];\n if (canonical.minusEntries) {\n for (const entry of canonical.minusEntries) {\n if (entry.shapeId) {\n // Shape exclusion: MINUS { ?a0 a <Shape> }\n minusPatterns.push({\n kind: 'minus',\n pattern: {kind: 'shape_scan', shape: entry.shapeId, alias: ctx.rootAlias},\n });\n } else if (entry.propertyPaths && entry.propertyPaths.length > 0) {\n // Property existence exclusion: MINUS { ?a0 <prop1> ?m0 . ?a0 <prop2> ?m1 . }\n // Supports nested paths: ?a0 <bestFriend> ?m0 . ?m0 <name> ?m1 .\n const traversals: IRTraversePattern[] = [];\n for (const path of entry.propertyPaths) {\n let currentAlias = ctx.rootAlias;\n for (const segment of path) {\n const toAlias = ctx.generateAlias();\n traversals.push({\n kind: 'traverse',\n from: currentAlias,\n to: toAlias,\n property: segment.propertyShapeId,\n });\n currentAlias = toAlias;\n }\n }\n const innerPattern: IRGraphPattern = traversals.length === 1\n ? traversals[0]\n : {kind: 'join', patterns: traversals};\n minusPatterns.push({kind: 'minus', pattern: innerPattern});\n } else if (entry.where) {\n // Condition-based exclusion: MINUS { ?a0 <prop> ?val . FILTER(...) }\n const {resolve: minusResolveTraversal, patterns: minusTraversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n const minusOptions: PathLoweringOptions = {\n rootAlias: ctx.rootAlias,\n resolveTraversal: minusResolveTraversal,\n };\n const filter = lowerWhere(entry.where, ctx, minusOptions);\n const innerPattern: IRGraphPattern = minusTraversals.length === 1\n ? minusTraversals[0]\n : minusTraversals.length > 1\n ? {kind: 'join', patterns: minusTraversals}\n : {kind: 'shape_scan', shape: canonical.shapeId || '', alias: ctx.rootAlias};\n minusPatterns.push({kind: 'minus', pattern: innerPattern, filter});\n }\n }\n }\n\n return attachCatalog<IRSelectQuery>({\n kind: 'select',\n root,\n patterns: [...ctx.getPatterns(), ...minusPatterns],\n projection,\n where,\n orderBy,\n limit: canonical.limit,\n offset: canonical.offset,\n subjectId: canonical.subjectId,\n subjectIds: canonical.subjectIds,\n singleResult: canonical.singleResult,\n resultMap: resultMapEntries,\n });\n};\n\n/**\n * Standalone WHERE lowering — converts a CanonicalWhereExpression to IR expression + patterns.\n * Used by mutation builders (DeleteBuilder, UpdateBuilder) that don't go through the select pipeline.\n */\nexport const lowerWhereToIR = (\n where: CanonicalWhereExpression,\n rootAlias: string = 'a0',\n): {where: IRExpression; wherePatterns: IRGraphPattern[]} => {\n let counter = 1; // start at 1 since a0 is the root\n const ctx: AliasGenerator = {\n generateAlias: () => `a${counter++}`,\n };\n\n const {resolve, patterns: traversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n\n const expr = lowerWhere(where, ctx, {rootAlias, resolveTraversal: resolve});\n return {where: expr, wherePatterns: traversals};\n};\n"]}
1
+ {"version":3,"file":"IRLower.js","sourceRoot":"","sources":["../../../src/queries/IRLower.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CanonicalDesugaredSelectQuery,\n CanonicalWhereExpression,\n} from './IRCanonicalize.js';\nimport type {\n DesugaredExpressionSelect,\n DesugaredExpressionWhere,\n DesugaredExistsWhere,\n DesugaredSelection,\n DesugaredSelectionPath,\n DesugaredStep,\n DesugaredWhere,\n} from './IRDesugar.js';\nimport {resolveExpressionRefs, ExistsCondition} from '../expressions/ExpressionNode.js';\nimport {resolveContextId} from './ContextRef.js';\nimport type {\n IRExpression,\n IRGraphPattern,\n IROrderByItem,\n IRProjectionItem,\n IRResultMapEntry,\n IRSelectQuery,\n IRShapeScanPattern,\n IRTraversePattern,\n} from './IntermediateRepresentation.js';\nimport {lowerSelectionPathExpression, projectionKeyFromPath} from './IRProjection.js';\nimport {IRAliasScope} from './IRAliasScope.js';\nimport {attachCatalog} from '../utils/ShapeClass.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\nimport {isLinkedInstance} from '../utils/linkedError.js';\n\n/**\n * Creates a memoized traversal resolver that deduplicates (fromAlias, propertyShapeId)\n * pairs, generates unique aliases, and accumulates the resulting patterns.\n * Used by both select-query lowering and mutation expression resolution.\n */\nexport function createTraversalResolver<P>(\n generateAlias: () => string,\n createPattern: (from: string, to: string, property: string) => P,\n): {resolve: (fromAlias: string, propertyShapeId: string) => string; patterns: P[]} {\n const patterns: P[] = [];\n const seen = new Map<string, string>();\n\n const resolve = (fromAlias: string, propertyShapeId: string): string => {\n const key = `${fromAlias}:${propertyShapeId}`;\n if (seen.has(key)) return seen.get(key)!;\n const toAlias = generateAlias();\n seen.set(key, toAlias);\n patterns.push(createPattern(fromAlias, toAlias, propertyShapeId));\n return toAlias;\n };\n\n return {resolve, patterns};\n}\n\nclass LoweringContext {\n private counter = 0;\n private patterns: IRGraphPattern[] = [];\n private traverseMap = new Map<string, string>();\n private filterMap = new Map<string, IRExpression>();\n private innerPaginationMap = new Map<\n string,\n {limit?: number; offset?: number; orderBy?: import('./IntermediateRepresentation.js').IRInnerOrderBy[]}\n >();\n readonly rootAlias: string;\n\n constructor() {\n this.rootAlias = this.nextAlias();\n }\n\n private nextAlias(): string {\n return `a${this.counter++}`;\n }\n\n getOrCreateTraversal(fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number): string {\n const key = `${fromAlias}:${propertyShapeId}`;\n const existing = this.traverseMap.get(key);\n if (existing) return existing;\n\n const toAlias = this.nextAlias();\n const pattern: IRTraversePattern = {\n kind: 'traverse',\n from: fromAlias,\n to: toAlias,\n property: propertyShapeId,\n };\n if (pathExpr) {\n pattern.pathExpr = pathExpr;\n }\n if (typeof maxCount === 'number') {\n pattern.maxCount = maxCount;\n }\n this.patterns.push(pattern);\n this.traverseMap.set(key, toAlias);\n return toAlias;\n }\n\n generateAlias(): string {\n return this.nextAlias();\n }\n\n /**\n * Attaches an inline where filter to the traverse pattern targeting `toAlias`.\n * The filter will be merged into the pattern when `getPatterns()` is called.\n */\n attachFilter(toAlias: string, filter: IRExpression): void {\n this.filterMap.set(toAlias, filter);\n }\n\n /**\n * Attaches inner LIMIT/OFFSET/ORDER BY (from a nested select) to the traverse\n * pattern targeting `toAlias`. Merged into the pattern in `getPatterns()`.\n */\n attachInnerPagination(\n toAlias: string,\n pagination: {limit?: number; offset?: number; orderBy?: import('./IntermediateRepresentation.js').IRInnerOrderBy[]},\n ): void {\n this.innerPaginationMap.set(toAlias, pagination);\n }\n\n getPatterns(): IRGraphPattern[] {\n return this.patterns.map((p) => {\n if (p.kind !== 'traverse') return p;\n let pattern = p;\n if (this.filterMap.has(p.to)) {\n pattern = {...pattern, filter: this.filterMap.get(p.to)!};\n }\n const pagination = this.innerPaginationMap.get(p.to);\n if (pagination) {\n pattern = {\n ...pattern,\n ...(typeof pagination.limit === 'number' ? {innerLimit: pagination.limit} : {}),\n ...(typeof pagination.offset === 'number' ? {innerOffset: pagination.offset} : {}),\n ...(pagination.orderBy ? {innerOrderBy: pagination.orderBy} : {}),\n };\n }\n return pattern;\n });\n }\n}\n\n/** Minimal interface for alias generation used by lowerWhere and traversal resolvers. */\ntype AliasGenerator = {\n generateAlias(): string;\n};\n\ntype PathLoweringOptions = {\n rootAlias: string;\n resolveTraversal: (fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number) => string;\n};\n\nconst lowerPath = (\n path: DesugaredSelectionPath,\n options: PathLoweringOptions,\n): IRExpression => lowerSelectionPathExpression(path, options);\n\n/**\n * Resolve any `{@ctx}` context references carried in a lowered expression tree —\n * whether it came from a where-clause filter OR a projected (expression-select)\n * value.\n *\n * A context reference (`.equals(getQueryContext('user'))`) is carried through build +\n * the wire as a *name* (`reference_expr.contextName` / `context_property_expr.contextName`),\n * never a baked id. Here — at lowering — it is resolved against the live context map into\n * the concrete IRI; an unresolved one throws `UnresolvedContextError` (SELECT callers\n * short-circuit to null before lowering, so a query is never lowered with an unresolved\n * context in practice). This must be applied to every expression that can reach the SPARQL\n * algebra, not just where-filters.\n */\nconst resolveContextRefs = (expr: IRExpression): IRExpression => {\n switch (expr.kind) {\n case 'reference_expr':\n if (expr.contextName) {\n return {kind: 'reference_expr', value: resolveContextId(expr.contextName, true)!};\n }\n return expr;\n case 'context_property_expr':\n if (expr.contextName) {\n return {kind: 'context_property_expr', contextIri: resolveContextId(expr.contextName, true)!, property: expr.property};\n }\n return expr;\n case 'binary_expr':\n return {...expr, left: resolveContextRefs(expr.left), right: resolveContextRefs(expr.right)};\n case 'in_expr':\n return {\n ...expr,\n value: resolveContextRefs(expr.value),\n source: {list: expr.source.list.map(resolveContextRefs)},\n };\n case 'logical_expr':\n return {...expr, expressions: expr.expressions.map(resolveContextRefs)};\n case 'not_expr':\n return {...expr, expression: resolveContextRefs(expr.expression)};\n case 'function_expr':\n case 'aggregate_expr':\n return {...expr, args: expr.args.map(resolveContextRefs)};\n case 'exists_expr':\n return expr.filter ? {...expr, filter: resolveContextRefs(expr.filter)} : expr;\n default:\n return expr;\n }\n};\n\nconst lowerWhere = (\n where: CanonicalWhereExpression,\n ctx: AliasGenerator,\n options: PathLoweringOptions,\n): IRExpression => {\n switch (where.kind) {\n case 'where_expression': {\n // ExpressionNode-based WHERE — resolve refs and return IRExpression directly\n const exprWhere = where as DesugaredExpressionWhere;\n return resolveContextRefs(resolveExpressionRefs(\n exprWhere.expressionNode.ir,\n exprWhere.expressionNode._refs,\n options.rootAlias,\n options.resolveTraversal,\n ));\n }\n case 'where_exists_condition': {\n // ExistsCondition-based WHERE (from .some()/.every()/.none())\n const existsWhere = where as DesugaredExistsWhere;\n return resolveContextRefs(lowerExistsCondition(existsWhere.existsCondition, ctx, options));\n }\n default:\n const _exhaustive: never = where;\n throw new Error(`Unknown canonical where kind: ${(_exhaustive as {kind: string}).kind}`);\n }\n};\n\n/**\n * Lower an ExistsCondition to IRExistsExpression with proper traversal patterns.\n */\nconst lowerExistsCondition = (\n condition: ExistsCondition,\n ctx: AliasGenerator,\n options: PathLoweringOptions,\n): IRExpression => {\n // Build traversal patterns for the collection path\n const {resolve: existsResolve, patterns: traversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n\n // Walk the path segments to create traversal patterns\n let currentAlias = options.rootAlias;\n for (const segmentId of condition.pathSegmentIds) {\n currentAlias = existsResolve(currentAlias, segmentId);\n }\n\n // Resolve the inner predicate's property refs against the EXISTS scope\n const filter = resolveExpressionRefs(\n condition.predicate.ir,\n condition.predicate._refs,\n currentAlias,\n existsResolve,\n );\n\n let existsExpr: IRExpression = {\n kind: 'exists_expr',\n pattern: traversals.length === 1\n ? traversals[0]\n : {kind: 'join', patterns: traversals},\n filter,\n };\n\n // Wrap in NOT if negated (.none() or outer NOT of .every())\n if (condition.negated) {\n existsExpr = {kind: 'not_expr', expression: existsExpr};\n }\n\n // Handle .and()/.or() chaining\n if (condition.chain.length > 0) {\n let result: IRExpression = existsExpr;\n for (const link of condition.chain) {\n let rightExpr: IRExpression;\n if (isLinkedInstance(link.condition, ExistsCondition)) {\n rightExpr = lowerExistsCondition(link.condition, ctx, options);\n } else {\n rightExpr = resolveExpressionRefs(\n link.condition.ir,\n link.condition._refs,\n options.rootAlias,\n options.resolveTraversal,\n );\n }\n result = {\n kind: 'logical_expr',\n operator: link.op,\n expressions: [result, rightExpr],\n };\n }\n return result;\n }\n\n return existsExpr;\n};\n\ntype ProjectionSeed =\n | {\n kind: 'path';\n path: DesugaredSelectionPath;\n key?: string;\n }\n | {\n kind: 'expression';\n expression: IRExpression;\n key: string;\n };\n\nconst combineWithParentPath = (\n parentPath: DesugaredStep[],\n path: DesugaredSelectionPath,\n): DesugaredSelectionPath => ({\n kind: 'selection_path',\n steps: [...parentPath, ...path.steps],\n});\n\n/**\n * Lowers a canonical desugared select query into the final IRSelectQuery.\n * Introduces aliases, graph patterns (shape scans, traversals), and\n * converts selection paths and where-clauses into IR expressions.\n */\nexport const lowerSelectQuery = (\n canonical: CanonicalDesugaredSelectQuery,\n): IRSelectQuery => {\n const ctx = new LoweringContext();\n const pathOptions: PathLoweringOptions = {\n rootAlias: ctx.rootAlias,\n resolveTraversal: (fromAlias: string, propertyShapeId: string, pathExpr?: PathExpr, maxCount?: number) =>\n ctx.getOrCreateTraversal(fromAlias, propertyShapeId, pathExpr, maxCount),\n };\n\n const root: IRShapeScanPattern = {\n kind: 'shape_scan',\n shape: canonical.shapeId || '',\n alias: ctx.rootAlias,\n };\n\n const aliasAfterPath = (steps: DesugaredStep[]): string => {\n let currentAlias = pathOptions.rootAlias;\n for (const step of steps) {\n if (step.kind === 'property_step') {\n currentAlias = pathOptions.resolveTraversal(currentAlias, step.propertyShapeId, step.pathExpr, step.maxCount);\n }\n }\n return currentAlias;\n };\n\n const collectProjectionSeeds = (\n selection: DesugaredSelection,\n key?: string,\n parentPath: DesugaredStep[] = [],\n ): ProjectionSeed[] => {\n if (selection.kind === 'selection_path') {\n return [{\n kind: 'path',\n path: combineWithParentPath(parentPath, selection),\n key,\n }];\n }\n\n if (selection.kind === 'sub_select') {\n const combinedParentPath = [...parentPath, ...selection.parentPath];\n // Nested-select inner LIMIT/OFFSET/ORDER BY → attach to the root→child\n // traverse (the alias reached by walking combinedParentPath). The serializer\n // wraps that traverse in a SPARQL sub-SELECT. Single-subject is enforced in\n // irToAlgebra; here we only record the intent.\n const hasInnerPagination =\n typeof selection.innerLimit === 'number' ||\n typeof selection.innerOffset === 'number' ||\n (selection.innerOrderBy && selection.innerOrderBy.length > 0);\n if (hasInnerPagination) {\n const childAlias = aliasAfterPath(combinedParentPath);\n ctx.attachInnerPagination(childAlias, {\n limit: selection.innerLimit,\n offset: selection.innerOffset,\n orderBy: selection.innerOrderBy?.map((o) => ({\n property: o.propertyShapeId,\n direction: o.direction,\n })),\n });\n }\n return collectProjectionSeeds(\n selection.selections,\n // The enclosing key identifies the sub-select container. Result-map\n // entries produced inside that container must retain their own property\n // keys. This also covers one-element array selections, which desugaring\n // intentionally collapses to a single selection.\n undefined,\n combinedParentPath,\n );\n }\n\n if (selection.kind === 'custom_object_select') {\n return selection.entries.flatMap((entry) =>\n collectProjectionSeeds(entry.value, entry.key, parentPath),\n );\n }\n\n if (selection.kind === 'multi_selection') {\n return selection.selections.flatMap((nestedSelection) =>\n // A key on the enclosing selection names that selection; it must not\n // replace the individual keys of an array/multi-selection. Each child\n // derives its own key from its terminal property (or carries its own\n // explicit custom key).\n collectProjectionSeeds(nestedSelection, undefined, parentPath),\n );\n }\n\n\n\n if (selection.kind === 'expression_select') {\n const exprSelect = selection as DesugaredExpressionSelect;\n // Resolve property refs AND any {@ctx} context references — a projected\n // expression (e.g. `select(p => ({flag: p.x.equals(getQueryContext('user'))}))`)\n // reaches the SPARQL algebra just like a where-filter, so its context refs\n // must be resolved here too, not only in lowerWhere.\n const resolved = resolveContextRefs(resolveExpressionRefs(\n exprSelect.expressionNode.ir,\n exprSelect.expressionNode._refs,\n aliasAfterPath(parentPath),\n pathOptions.resolveTraversal,\n ));\n return [{\n kind: 'expression',\n key: key || 'expr',\n expression: resolved,\n }];\n }\n\n return [];\n };\n\n const projectionSeeds = canonical.selections.flatMap((selection) =>\n collectProjectionSeeds(selection),\n );\n\n const projectionScope = new IRAliasScope('projection');\n projectionScope.registerAlias(ctx.rootAlias, 'root');\n const projection: IRProjectionItem[] = [];\n const resultMapEntries: IRResultMapEntry[] = [];\n\n // Inline filter handler: when a property step has `.where()`, canonicalize\n // and lower the where predicate, then attach it to the traverse pattern.\n const inlineFilterHandler = (traverseAlias: string, where: DesugaredWhere) => {\n const filterExpr = lowerWhere(where, ctx, {\n rootAlias: traverseAlias,\n resolveTraversal: pathOptions.resolveTraversal,\n });\n ctx.attachFilter(traverseAlias, filterExpr);\n };\n\n for (const seed of projectionSeeds) {\n const key = seed.kind === 'path'\n ? (seed.key || projectionKeyFromPath(seed.path))\n : seed.key;\n const alias = projectionScope.generateAlias(key).alias;\n projection.push({\n alias,\n expression: seed.kind === 'path'\n ? lowerSelectionPathExpression(seed.path, pathOptions, inlineFilterHandler)\n : seed.expression,\n });\n resultMapEntries.push({\n key,\n alias,\n });\n }\n\n const where = canonical.where ? lowerWhere(canonical.where, ctx, pathOptions) : undefined;\n\n const orderBy: IROrderByItem[] | undefined = canonical.sortBy\n ? canonical.sortBy.paths.map((path, i) => ({\n expression: lowerPath(path, pathOptions),\n direction: canonical.sortBy!.directions[i],\n }))\n : undefined;\n\n // Lower MINUS entries → IRMinusPattern objects\n const minusPatterns: IRGraphPattern[] = [];\n if (canonical.minusEntries) {\n for (const entry of canonical.minusEntries) {\n if (entry.shapeId) {\n // Shape exclusion: MINUS { ?a0 a <Shape> }\n minusPatterns.push({\n kind: 'minus',\n pattern: {kind: 'shape_scan', shape: entry.shapeId, alias: ctx.rootAlias},\n });\n } else if (entry.propertyPaths && entry.propertyPaths.length > 0) {\n // Property existence exclusion: MINUS { ?a0 <prop1> ?m0 . ?a0 <prop2> ?m1 . }\n // Supports nested paths: ?a0 <bestFriend> ?m0 . ?m0 <name> ?m1 .\n const traversals: IRTraversePattern[] = [];\n for (const path of entry.propertyPaths) {\n let currentAlias = ctx.rootAlias;\n for (const segment of path) {\n const toAlias = ctx.generateAlias();\n traversals.push({\n kind: 'traverse',\n from: currentAlias,\n to: toAlias,\n property: segment.propertyShapeId,\n });\n currentAlias = toAlias;\n }\n }\n const innerPattern: IRGraphPattern = traversals.length === 1\n ? traversals[0]\n : {kind: 'join', patterns: traversals};\n minusPatterns.push({kind: 'minus', pattern: innerPattern});\n } else if (entry.where) {\n // Condition-based exclusion: MINUS { ?a0 <prop> ?val . FILTER(...) }\n const {resolve: minusResolveTraversal, patterns: minusTraversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n const minusOptions: PathLoweringOptions = {\n rootAlias: ctx.rootAlias,\n resolveTraversal: minusResolveTraversal,\n };\n const filter = lowerWhere(entry.where, ctx, minusOptions);\n const innerPattern: IRGraphPattern = minusTraversals.length === 1\n ? minusTraversals[0]\n : minusTraversals.length > 1\n ? {kind: 'join', patterns: minusTraversals}\n : {kind: 'shape_scan', shape: canonical.shapeId || '', alias: ctx.rootAlias};\n minusPatterns.push({kind: 'minus', pattern: innerPattern, filter});\n }\n }\n }\n\n return attachCatalog<IRSelectQuery>({\n kind: 'select',\n root,\n patterns: [...ctx.getPatterns(), ...minusPatterns],\n projection,\n where,\n orderBy,\n limit: canonical.limit,\n offset: canonical.offset,\n subjectId: canonical.subjectId,\n subjectIds: canonical.subjectIds,\n singleResult: canonical.singleResult,\n resultMap: resultMapEntries,\n });\n};\n\n/**\n * Standalone WHERE lowering — converts a CanonicalWhereExpression to IR expression + patterns.\n * Used by mutation builders (DeleteBuilder, UpdateBuilder) that don't go through the select pipeline.\n */\nexport const lowerWhereToIR = (\n where: CanonicalWhereExpression,\n rootAlias: string = 'a0',\n): {where: IRExpression; wherePatterns: IRGraphPattern[]} => {\n let counter = 1; // start at 1 since a0 is the root\n const ctx: AliasGenerator = {\n generateAlias: () => `a${counter++}`,\n };\n\n const {resolve, patterns: traversals} = createTraversalResolver(\n () => ctx.generateAlias(),\n (from, to, property): IRTraversePattern => ({kind: 'traverse', from, to, property}),\n );\n\n const expr = lowerWhere(where, ctx, {rootAlias, resolveTraversal: resolve});\n return {where: expr, wherePatterns: traversals};\n};\n"]}
@@ -26,6 +26,7 @@ import { ExpressionNode, isExpressionNode } from '../expressions/ExpressionNode.
26
26
  import { PendingQueryContext } from './QueryContext.js';
27
27
  import { resolveShapeConstructor, getQueryShapeClass } from '../utils/ShapeClass.js';
28
28
  import { encodeValueExpr, decodeValueExpr, } from './DslJsonExpression.js';
29
+ import { isLinkedInstance } from '../utils/linkedError.js';
29
30
  /** Reserved node-data keys (not property labels). */
30
31
  const NODE_ID_KEY = '__id';
31
32
  const NODE_SHAPE_KEY = '__shape';
@@ -56,7 +57,7 @@ function encodeSingleValue(value, prop) {
56
57
  if (value && typeof value === 'object') {
57
58
  // Query-context reference — carry the name, resolve at lowering (checked
58
59
  // before the generic `.id` branch since a PendingQueryContext has an `.id` getter).
59
- if (value instanceof PendingQueryContext) {
60
+ if (isLinkedInstance(value, PendingQueryContext)) {
60
61
  return { '@ctx': value.contextName };
61
62
  }
62
63
  if ('fields' in value) {