@_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":"DslJsonExpression.js","sourceRoot":"","sources":["../../../src/queries/DslJsonExpression.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DSL-JSON expression codec — the bidirectional bridge between the runtime\n * expression IR (`ExpressionNode` = `{ir, refs}`, `ExistsCondition`) and the\n * DSL-JSON wire grammar (documentation/dsl-json.md).\n *\n * Two tiers:\n * - VALUE (`encodeValueExpr`/`decodeValueExpr`): a computed value or an\n * operand — bare scalar, `{@path}`, `{@id}`, `{@ctx}`, `{@date}`,\n * `{@list}`, or an S-expr array `[\"op\", …]`.\n * - CONDITION (`encodeCondition`/`decodeCondition`): a boolean where-clause —\n * path-keyed object (implicit equals / operator map / quantifier),\n * `{and|or|not}`, or an S-expr array fallback.\n *\n * The codec is pure and shape-aware: it resolves property labels against the\n * supplied `NodeShapeData`, and never touches builder internals. Function and\n * aggregate names are kept verbatim from the IR (e.g. `STRLEN`, `count`) — no\n * name map, lossless round-trip. Round-trip-through-`lower` is the contract.\n */\nimport type {\n IRExpression,\n IRBinaryOperator,\n} from './IntermediateRepresentation.js';\nimport {\n ExpressionNode,\n ExistsCondition,\n type PropertyRefMap,\n tracedPropertyExpression,\n tracedAliasExpression,\n} from '../expressions/ExpressionNode.js';\nimport type {NodeShapeData} from '../shapes/SHACL.js';\nimport type {WherePath} from './SelectQuery.js';\nimport {walkPropertyPath} from './PropertyPath.js';\n\n// ---------------------------------------------------------------------------\n// Wire types\n// ---------------------------------------------------------------------------\n\nexport type DslJsonScalar = string | number | boolean | null;\nexport type DslJsonRef = {'@id': string};\nexport type DslJsonCtx = {'@ctx': string; '@path'?: string};\nexport type DslJsonDate = {'@date': string};\nexport type DslJsonList = {'@list': DslJsonValue[]};\nexport type DslJsonPath = {'@path': string};\nexport type DslJsonSExpr = [string, ...DslJsonValue[]];\nexport type DslJsonValue =\n | DslJsonScalar\n | DslJsonRef\n | DslJsonCtx\n | DslJsonDate\n | DslJsonList\n | DslJsonPath\n | DslJsonSExpr;\n\nexport type DslJsonOpMap = {[op: string]: DslJsonValue};\n/**\n * A DSL-JSON condition: an S-expr array, or a keyed object whose keys are property\n * paths (→ value / operator-map), quantifier keys like `rel.some` (→ a nested\n * condition), or combinators `and`/`or` (→ a condition array) / `not` (→ a\n * condition). The permissive index reflects the structural wire shape.\n */\nexport type DslJsonCondition =\n | DslJsonSExpr\n | {[key: string]: DslJsonValue | DslJsonOpMap | DslJsonCondition | DslJsonCondition[]};\n\nconst COMPARISON_OPS = new Set<IRBinaryOperator>([\n '=',\n '!=',\n '>',\n '>=',\n '<',\n '<=',\n]);\n\n// Word-operator aliases accepted on input (LLM/human-friendly). Symbols remain\n// the canonical/emitted form — these normalize to a symbol on decode.\nconst OP_ALIASES: Record<string, IRBinaryOperator> = {\n equals: '=',\n notEquals: '!=',\n gt: '>',\n gte: '>=',\n lt: '<',\n lte: '<=',\n};\n\nconst COMBINATORS = new Set(['and', 'or', 'not']);\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/** PropertyShapeData id = `{shapeId}/{label}` (SHACL.ts), so the label is the last segment. */\nfunction labelOf(segmentIri: string): string {\n const i = segmentIri.lastIndexOf('/');\n return i >= 0 ? segmentIri.slice(i + 1) : segmentIri;\n}\n\n/** Property-shape IRIs → a dotted label path. */\nexport function segmentsToPath(segmentIds: readonly string[]): string {\n return segmentIds.map(labelOf).join('.');\n}\n\n/** A dotted label path → its property-shape IRIs, resolved against `shape`. */\nexport function pathToSegmentIds(shape: NodeShapeData, path: string): string[] {\n return walkPropertyPath(shape, path).segments.map((s) => s.id);\n}\n\n// ---------------------------------------------------------------------------\n// refs merging\n// ---------------------------------------------------------------------------\n\nfunction mergeRefs(into: Map<string, readonly string[]>, from: PropertyRefMap): void {\n for (const [k, v] of from) into.set(k, v);\n}\n\n// ---------------------------------------------------------------------------\n// VALUE tier\n// ---------------------------------------------------------------------------\n\n/** Encode an IR expression used as a value/operand into a DSL-JSON value. */\nexport function encodeValueExpr(\n ir: IRExpression,\n refs: PropertyRefMap,\n): DslJsonValue {\n switch (ir.kind) {\n case 'literal_expr': {\n const v = ir.value as unknown;\n if (v instanceof Date) return {'@date': v.toISOString()};\n return v as DslJsonScalar;\n }\n case 'reference_expr':\n if (ir.contextName !== undefined) return {'@ctx': ir.contextName};\n return {'@id': ir.value as string};\n case 'context_property_expr':\n return {'@ctx': ir.contextName as string, '@path': labelOf(ir.property)};\n case 'property_expr': {\n const segs = refs.get(ir.sourceAlias);\n return {'@path': segs ? segmentsToPath(segs) : labelOf(ir.property)};\n }\n case 'alias_expr': {\n const segs = refs.get(ir.alias);\n // A bare alias_expr as a value is the node at the end of the traversal.\n return {'@path': segs ? segmentsToPath(segs) : ir.alias};\n }\n case 'in_expr':\n return [\n ir.negated ? 'not-in' : 'in',\n encodeValueExpr(ir.value, refs),\n ...ir.source.list.map((e) => encodeValueExpr(e, refs)),\n ];\n case 'binary_expr':\n return [\n ir.operator,\n encodeValueExpr(ir.left, refs),\n encodeValueExpr(ir.right, refs),\n ];\n case 'logical_expr':\n return [ir.operator, ...ir.expressions.map((e) => encodeValueExpr(e, refs))];\n case 'not_expr':\n return ['not', encodeValueExpr(ir.expression, refs)];\n case 'function_expr':\n return [ir.name, ...ir.args.map((a) => encodeValueExpr(a, refs))];\n case 'aggregate_expr':\n return [ir.name, ...ir.args.map((a) => encodeValueExpr(a, refs))];\n default:\n throw new Error(`Cannot encode expression of kind '${(ir as {kind: string}).kind}'`);\n }\n}\n\n// Bound S-expr decode recursion so a deeply-nested expression from `fromJSON()`\n// cannot exhaust the stack (RangeError DoS). Real expressions nest a handful of\n// levels; 128 is far beyond any legitimate query.\nconst MAX_EXPR_DEPTH = 128;\nlet _exprDepth = 0;\n\n/** Decode a DSL-JSON value back into an IR expression + its placeholder refs. */\nexport function decodeValueExpr(\n json: DslJsonValue,\n shape: NodeShapeData,\n): {ir: IRExpression; refs: PropertyRefMap} {\n if (++_exprDepth > MAX_EXPR_DEPTH) {\n _exprDepth = 0;\n throw new Error('DSL-JSON expression nested too deeply');\n }\n try {\n return decodeValueExprInner(json, shape);\n } finally {\n _exprDepth--;\n }\n}\n\nfunction decodeValueExprInner(\n json: DslJsonValue,\n shape: NodeShapeData,\n): {ir: IRExpression; refs: PropertyRefMap} {\n // S-expr array\n if (Array.isArray(json)) {\n const [head, ...operands] = json;\n const refs = new Map<string, readonly string[]>();\n const args = operands.map((o) => {\n const {ir, refs: r} = decodeValueExpr(o, shape);\n mergeRefs(refs, r);\n return ir;\n });\n return {ir: headToIR(head, args), refs};\n }\n // Objects: recognized value-objects\n if (json !== null && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n if ('@id' in o) {\n return {ir: {kind: 'reference_expr', value: o['@id'] as string}, refs: new Map()};\n }\n if ('@ctx' in o) {\n if (typeof o['@path'] === 'string') {\n const property = pathToSegmentIds(shape, o['@path']).pop() as string;\n return {\n ir: {kind: 'context_property_expr', contextName: o['@ctx'] as string, property},\n refs: new Map(),\n };\n }\n return {ir: {kind: 'reference_expr', contextName: o['@ctx'] as string}, refs: new Map()};\n }\n if ('@date' in o) {\n return {ir: {kind: 'literal_expr', value: new Date(o['@date'] as string)}, refs: new Map()};\n }\n if ('@path' in o) {\n return propertyOrAlias(shape, o['@path'] as string);\n }\n if ('@list' in o) {\n throw new Error('A {@list} value is only valid as an in/nin operand');\n }\n }\n // bare scalar literal\n return {ir: {kind: 'literal_expr', value: json as never}, refs: new Map()};\n}\n\n/**\n * Resolve a dotted path to its expression node:\n * - empty path `\"\"` → `alias_expr` (the bare subject, e.g. `p.equals(x)`);\n * - any non-empty path → `property_expr` (a property access, relation or not —\n * `p.bestFriend.equals(x)` compares the property value, no traversal).\n */\nfunction propertyOrAlias(\n shape: NodeShapeData,\n path: string,\n): {ir: IRExpression; refs: PropertyRefMap} {\n const node =\n path === ''\n ? tracedAliasExpression([])\n : tracedPropertyExpression(pathToSegmentIds(shape, path));\n return {ir: node.ir, refs: node._refs};\n}\n\n/** Build an IR node from an S-expr head symbol/name + decoded args. */\nfunction headToIR(head: string, args: IRExpression[]): IRExpression {\n if (head === 'and' || head === 'or') {\n return {kind: 'logical_expr', operator: head, expressions: args};\n }\n if (head === 'not') {\n return {kind: 'not_expr', expression: args[0]};\n }\n if (head === 'in' || head === 'not-in') {\n return {kind: 'in_expr', negated: head === 'not-in', value: args[0], source: {list: args.slice(1)}};\n }\n if (COMPARISON_OPS.has(head as IRBinaryOperator) || '+-*/'.includes(head)) {\n return {kind: 'binary_expr', operator: head as IRBinaryOperator, left: args[0], right: args[1]};\n }\n if (AGGREGATES.has(head)) {\n return {kind: 'aggregate_expr', name: head as never, args};\n }\n // default: a named function (verbatim IR function name, e.g. STRLEN)\n return {kind: 'function_expr', name: head, args};\n}\n\nconst AGGREGATES = new Set(['count', 'sum', 'avg', 'min', 'max']);\n\n// ---------------------------------------------------------------------------\n// CONDITION tier\n// ---------------------------------------------------------------------------\n\n/** Encode a where-clause node (boolean) into a DSL-JSON condition. */\nexport function encodeCondition(\n node: ExpressionNode | ExistsCondition,\n shape: NodeShapeData,\n): DslJsonCondition {\n if (node instanceof ExistsCondition) {\n return encodeExists(node, shape);\n }\n return encodeBoolExpr(node.ir, node._refs, shape);\n}\n\nfunction encodeExists(ec: ExistsCondition, shape: NodeShapeData): DslJsonCondition {\n const rel = segmentsToPath(ec.pathSegmentIds);\n let quantifier: 'some' | 'none' | 'every';\n let predIr = ec.predicate.ir;\n const predRefs = ec.predicate._refs;\n if (!ec.negated) {\n quantifier = 'some';\n } else if (predIr.kind === 'not_expr') {\n // every(fn) was built as NOT EXISTS(NOT fn) — unwrap the inner predicate.\n quantifier = 'every';\n predIr = predIr.expression;\n } else {\n quantifier = 'none';\n }\n let base: DslJsonCondition = {\n [`${rel}.${quantifier}`]: encodeBoolExpr(predIr, predRefs, shape),\n };\n // Fold any chained and/or conditions into nested logical combinators.\n for (const {op, condition} of ec.chain) {\n const c = encodeCondition(\n condition instanceof ExistsCondition ? condition : (condition as ExpressionNode),\n shape,\n );\n base = {[op]: [base, c]} as DslJsonCondition;\n }\n return base;\n}\n\n/** Encode a boolean IR expression into a DSL-JSON condition (path-keyed where possible). */\nfunction encodeBoolExpr(\n ir: IRExpression,\n refs: PropertyRefMap,\n shape: NodeShapeData,\n): DslJsonCondition {\n if (ir.kind === 'logical_expr') {\n const parts = ir.expressions.map((e) => encodeBoolExpr(e, refs, shape));\n if (ir.operator === 'and') {\n const merged = tryMergeAnd(parts);\n if (merged) return merged;\n }\n return {[ir.operator]: parts} as DslJsonCondition;\n }\n if (ir.kind === 'not_expr') {\n return {not: encodeBoolExpr(ir.expression, refs, shape)};\n }\n if (ir.kind === 'in_expr') {\n const key = pathKeyOf(ir.value, refs);\n if (key !== null) {\n const list = ir.source.list.map((e) => encodeValueExpr(e, refs));\n return {[key]: {[ir.negated ? 'notOneOf' : 'oneOf']: list}} as DslJsonCondition;\n }\n }\n if (ir.kind === 'binary_expr' && COMPARISON_OPS.has(ir.operator)) {\n const key = pathKeyOf(ir.left, refs);\n if (key !== null) {\n const value = encodeValueExpr(ir.right, refs);\n if (ir.operator === '=') return {[key]: value};\n return {[key]: {[ir.operator]: value}};\n }\n }\n // Fallback: S-expr (boolean expression that isn't a simple path-keyed shape).\n return encodeValueExpr(ir, refs) as DslJsonCondition;\n}\n\n/** A path key for a left operand that is a single property/alias/context property. */\nfunction pathKeyOf(ir: IRExpression, refs: PropertyRefMap): string | null {\n if (ir.kind === 'property_expr') {\n const segs = refs.get(ir.sourceAlias);\n return segs ? segmentsToPath(segs) : labelOf(ir.property);\n }\n if (ir.kind === 'alias_expr') {\n const segs = refs.get(ir.alias);\n return segs ? segmentsToPath(segs) : null;\n }\n if (ir.kind === 'context_property_expr') {\n return null; // a context property on the LHS is uncommon; use S-expr\n }\n return null;\n}\n\n/** Merge AND conjuncts into one path-keyed object iff all are distinct single-key path conditions. */\nfunction tryMergeAnd(parts: DslJsonCondition[]): DslJsonCondition | null {\n const out: Record<string, unknown> = {};\n for (const p of parts) {\n if (Array.isArray(p) || typeof p !== 'object' || p === null) return null;\n const keys = Object.keys(p);\n if (keys.length !== 1) return null;\n const k = keys[0];\n if (COMBINATORS.has(k) || k in out) return null;\n out[k] = (p as Record<string, unknown>)[k];\n }\n return out as DslJsonCondition;\n}\n\n/** Decode a DSL-JSON condition into a runtime WherePath (`{expressionNode}` | `{existsCondition}`). */\nexport function decodeCondition(json: DslJsonCondition, shape: NodeShapeData): WherePath {\n const node = decodeConditionNode(json, shape);\n return node instanceof ExistsCondition\n ? ({existsCondition: node} as WherePath)\n : ({expressionNode: node} as WherePath);\n}\n\nfunction decodeConditionNode(\n json: DslJsonCondition,\n shape: NodeShapeData,\n): ExpressionNode | ExistsCondition {\n // S-expr fallback\n if (Array.isArray(json)) {\n const {ir, refs} = decodeValueExpr(json, shape);\n return new ExpressionNode(ir, refs);\n }\n const o = json as Record<string, unknown>;\n const keys = Object.keys(o);\n\n // Combinators\n if (keys.length === 1 && COMBINATORS.has(keys[0])) {\n const k = keys[0];\n if (k === 'not') {\n const inner = decodeConditionNode(o.not as DslJsonCondition, shape);\n if (inner instanceof ExistsCondition) return inner.not();\n return new ExpressionNode({kind: 'not_expr', expression: inner.ir}, inner._refs);\n }\n // and / or\n const elems = (o[k] as DslJsonCondition[]).map((c) => decodeConditionNode(c, shape));\n // An exists-chain: first operand is an ExistsCondition → fold the rest as its chain.\n if (elems[0] instanceof ExistsCondition) {\n let ec = elems[0] as ExistsCondition;\n for (let i = 1; i < elems.length; i++) {\n ec = (k === 'and' ? ec.and(elems[i] as never) : ec.or(elems[i] as never)) as ExistsCondition;\n }\n return ec;\n }\n const refs = new Map<string, readonly string[]>();\n const expressions = elems.map((e) => {\n mergeRefs(refs, (e as ExpressionNode)._refs);\n return (e as ExpressionNode).ir;\n });\n return new ExpressionNode({kind: 'logical_expr', operator: k as 'and' | 'or', expressions}, refs);\n }\n\n // Single quantifier key: \"rel.some\" | \"rel.every\" | \"rel.none\"\n if (keys.length === 1) {\n const q = matchQuantifier(keys[0]);\n if (q) {\n const predicate = expressionNodeFromCondition(o[keys[0]] as DslJsonCondition, shape);\n const segmentIds = pathToSegmentIds(shape, q.rel);\n if (q.kind === 'some') return new ExistsCondition(segmentIds, predicate, false);\n if (q.kind === 'none') return new ExistsCondition(segmentIds, predicate, true);\n // every(fn) = NOT EXISTS(NOT fn)\n return new ExistsCondition(\n segmentIds,\n new ExpressionNode({kind: 'not_expr', expression: predicate.ir}, predicate._refs),\n true,\n );\n }\n }\n\n // Path-keyed condition(s): one or more `path: value|opMap` → AND of comparisons.\n const refs = new Map<string, readonly string[]>();\n const comparisons: IRExpression[] = [];\n for (const key of keys) {\n const left = propertyOrAlias(shape, key);\n mergeRefs(refs, left.refs);\n const v = o[key];\n for (const cmp of comparisonsFor(left.ir, v, shape, refs)) comparisons.push(cmp);\n }\n const ir =\n comparisons.length === 1\n ? comparisons[0]\n : {kind: 'logical_expr' as const, operator: 'and' as const, expressions: comparisons};\n return new ExpressionNode(ir, refs);\n}\n\nfunction comparisonsFor(\n left: IRExpression,\n value: unknown,\n shape: NodeShapeData,\n refs: Map<string, readonly string[]>,\n): IRExpression[] {\n // Membership: { \"oneOf\": [...] } / { \"notOneOf\": [...] } → IN / NOT IN.\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const o = value as Record<string, unknown>;\n if (Array.isArray(o.oneOf) || Array.isArray(o.notOneOf)) {\n const negated = Array.isArray(o.notOneOf);\n const listRaw = (negated ? o.notOneOf : o.oneOf) as DslJsonValue[];\n const list = listRaw.map((el) => {\n const r = decodeValueExpr(el, shape);\n mergeRefs(refs, r.refs);\n return r.ir;\n });\n return [{kind: 'in_expr', negated, value: left, source: {list}}];\n }\n }\n // operator map: { \">\": 18, \"<\": 65 } (symbols) or { \"gt\": 18 } (word aliases)\n if (isOpMap(value)) {\n return Object.entries(value as DslJsonOpMap).map(([op, v]) => {\n const r = decodeValueExpr(v as DslJsonValue, shape);\n mergeRefs(refs, r.refs);\n const operator = (OP_ALIASES[op] ?? op) as IRBinaryOperator;\n return {kind: 'binary_expr', operator, left, right: r.ir};\n });\n }\n // implicit equals\n const r = decodeValueExpr(value as DslJsonValue, shape);\n mergeRefs(refs, r.refs);\n return [{kind: 'binary_expr', operator: '=', left, right: r.ir}];\n}\n\n/** An object whose keys are all operator symbols (not a recognized value-object). */\nfunction isOpMap(value: unknown): boolean {\n if (Array.isArray(value) || value === null || typeof value !== 'object') return false;\n const keys = Object.keys(value as object);\n if (keys.length === 0) return false;\n if (keys.some((k) => k === '@id' || k === '@ctx' || k === '@path' || k === '@date' || k === '@list')) {\n return false;\n }\n // Comparison operators (symbols) or their word aliases (`equals`/`gt`/…) form\n // an op-map. `in`/`nin` are handled separately (oneOf/notOneOf, see decode).\n return keys.every(\n (k) => COMPARISON_OPS.has(k as IRBinaryOperator) || k in OP_ALIASES,\n );\n}\n\nfunction matchQuantifier(\n key: string,\n): {rel: string; kind: 'some' | 'every' | 'none'} | null {\n for (const kind of ['some', 'every', 'none'] as const) {\n if (key.endsWith(`.${kind}`)) {\n return {rel: key.slice(0, -(kind.length + 1)), kind};\n }\n }\n return null;\n}\n\n/** A quantifier predicate decodes to an ExpressionNode (its inner boolean). */\nfunction expressionNodeFromCondition(json: DslJsonCondition, shape: NodeShapeData): ExpressionNode {\n const node = decodeConditionNode(json, shape);\n if (node instanceof ExistsCondition) {\n // Nested exists as a predicate is uncommon; wrap is not representable here.\n throw new Error('Nested exists inside a quantifier predicate is not supported');\n }\n return node;\n}\n"]}
1
+ {"version":3,"file":"DslJsonExpression.js","sourceRoot":"","sources":["../../../src/queries/DslJsonExpression.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DSL-JSON expression codec — the bidirectional bridge between the runtime\n * expression IR (`ExpressionNode` = `{ir, refs}`, `ExistsCondition`) and the\n * DSL-JSON wire grammar (documentation/dsl-json.md).\n *\n * Two tiers:\n * - VALUE (`encodeValueExpr`/`decodeValueExpr`): a computed value or an\n * operand — bare scalar, `{@path}`, `{@id}`, `{@ctx}`, `{@date}`,\n * `{@list}`, or an S-expr array `[\"op\", …]`.\n * - CONDITION (`encodeCondition`/`decodeCondition`): a boolean where-clause —\n * path-keyed object (implicit equals / operator map / quantifier),\n * `{and|or|not}`, or an S-expr array fallback.\n *\n * The codec is pure and shape-aware: it resolves property labels against the\n * supplied `NodeShapeData`, and never touches builder internals. Function and\n * aggregate names are kept verbatim from the IR (e.g. `STRLEN`, `count`) — no\n * name map, lossless round-trip. Round-trip-through-`lower` is the contract.\n */\nimport type {\n IRExpression,\n IRBinaryOperator,\n} from './IntermediateRepresentation.js';\nimport {\n ExpressionNode,\n ExistsCondition,\n type PropertyRefMap,\n tracedPropertyExpression,\n tracedAliasExpression,\n} from '../expressions/ExpressionNode.js';\nimport type {NodeShapeData} from '../shapes/SHACL.js';\nimport type {WherePath} from './SelectQuery.js';\nimport {walkPropertyPath} from './PropertyPath.js';\nimport {isLinkedInstance} from '../utils/linkedError.js';\n\n// ---------------------------------------------------------------------------\n// Wire types\n// ---------------------------------------------------------------------------\n\nexport type DslJsonScalar = string | number | boolean | null;\nexport type DslJsonRef = {'@id': string};\nexport type DslJsonCtx = {'@ctx': string; '@path'?: string};\nexport type DslJsonDate = {'@date': string};\nexport type DslJsonList = {'@list': DslJsonValue[]};\nexport type DslJsonPath = {'@path': string};\nexport type DslJsonSExpr = [string, ...DslJsonValue[]];\nexport type DslJsonValue =\n | DslJsonScalar\n | DslJsonRef\n | DslJsonCtx\n | DslJsonDate\n | DslJsonList\n | DslJsonPath\n | DslJsonSExpr;\n\nexport type DslJsonOpMap = {[op: string]: DslJsonValue};\n/**\n * A DSL-JSON condition: an S-expr array, or a keyed object whose keys are property\n * paths (→ value / operator-map), quantifier keys like `rel.some` (→ a nested\n * condition), or combinators `and`/`or` (→ a condition array) / `not` (→ a\n * condition). The permissive index reflects the structural wire shape.\n */\nexport type DslJsonCondition =\n | DslJsonSExpr\n | {[key: string]: DslJsonValue | DslJsonOpMap | DslJsonCondition | DslJsonCondition[]};\n\nconst COMPARISON_OPS = new Set<IRBinaryOperator>([\n '=',\n '!=',\n '>',\n '>=',\n '<',\n '<=',\n]);\n\n// Word-operator aliases accepted on input (LLM/human-friendly). Symbols remain\n// the canonical/emitted form — these normalize to a symbol on decode.\nconst OP_ALIASES: Record<string, IRBinaryOperator> = {\n equals: '=',\n notEquals: '!=',\n gt: '>',\n gte: '>=',\n lt: '<',\n lte: '<=',\n};\n\nconst COMBINATORS = new Set(['and', 'or', 'not']);\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/** PropertyShapeData id = `{shapeId}/{label}` (SHACL.ts), so the label is the last segment. */\nfunction labelOf(segmentIri: string): string {\n const i = segmentIri.lastIndexOf('/');\n return i >= 0 ? segmentIri.slice(i + 1) : segmentIri;\n}\n\n/** Property-shape IRIs → a dotted label path. */\nexport function segmentsToPath(segmentIds: readonly string[]): string {\n return segmentIds.map(labelOf).join('.');\n}\n\n/** A dotted label path → its property-shape IRIs, resolved against `shape`. */\nexport function pathToSegmentIds(shape: NodeShapeData, path: string): string[] {\n return walkPropertyPath(shape, path).segments.map((s) => s.id);\n}\n\n// ---------------------------------------------------------------------------\n// refs merging\n// ---------------------------------------------------------------------------\n\nfunction mergeRefs(into: Map<string, readonly string[]>, from: PropertyRefMap): void {\n for (const [k, v] of from) into.set(k, v);\n}\n\n// ---------------------------------------------------------------------------\n// VALUE tier\n// ---------------------------------------------------------------------------\n\n/** Encode an IR expression used as a value/operand into a DSL-JSON value. */\nexport function encodeValueExpr(\n ir: IRExpression,\n refs: PropertyRefMap,\n): DslJsonValue {\n switch (ir.kind) {\n case 'literal_expr': {\n const v = ir.value as unknown;\n if (v instanceof Date) return {'@date': v.toISOString()};\n return v as DslJsonScalar;\n }\n case 'reference_expr':\n if (ir.contextName !== undefined) return {'@ctx': ir.contextName};\n return {'@id': ir.value as string};\n case 'context_property_expr':\n return {'@ctx': ir.contextName as string, '@path': labelOf(ir.property)};\n case 'property_expr': {\n const segs = refs.get(ir.sourceAlias);\n return {'@path': segs ? segmentsToPath(segs) : labelOf(ir.property)};\n }\n case 'alias_expr': {\n const segs = refs.get(ir.alias);\n // A bare alias_expr as a value is the node at the end of the traversal.\n return {'@path': segs ? segmentsToPath(segs) : ir.alias};\n }\n case 'in_expr':\n return [\n ir.negated ? 'not-in' : 'in',\n encodeValueExpr(ir.value, refs),\n ...ir.source.list.map((e) => encodeValueExpr(e, refs)),\n ];\n case 'binary_expr':\n return [\n ir.operator,\n encodeValueExpr(ir.left, refs),\n encodeValueExpr(ir.right, refs),\n ];\n case 'logical_expr':\n return [ir.operator, ...ir.expressions.map((e) => encodeValueExpr(e, refs))];\n case 'not_expr':\n return ['not', encodeValueExpr(ir.expression, refs)];\n case 'function_expr':\n return [ir.name, ...ir.args.map((a) => encodeValueExpr(a, refs))];\n case 'aggregate_expr':\n return [ir.name, ...ir.args.map((a) => encodeValueExpr(a, refs))];\n default:\n throw new Error(`Cannot encode expression of kind '${(ir as {kind: string}).kind}'`);\n }\n}\n\n// Bound S-expr decode recursion so a deeply-nested expression from `fromJSON()`\n// cannot exhaust the stack (RangeError DoS). Real expressions nest a handful of\n// levels; 128 is far beyond any legitimate query.\nconst MAX_EXPR_DEPTH = 128;\nlet _exprDepth = 0;\n\n/** Decode a DSL-JSON value back into an IR expression + its placeholder refs. */\nexport function decodeValueExpr(\n json: DslJsonValue,\n shape: NodeShapeData,\n): {ir: IRExpression; refs: PropertyRefMap} {\n if (++_exprDepth > MAX_EXPR_DEPTH) {\n _exprDepth = 0;\n throw new Error('DSL-JSON expression nested too deeply');\n }\n try {\n return decodeValueExprInner(json, shape);\n } finally {\n _exprDepth--;\n }\n}\n\nfunction decodeValueExprInner(\n json: DslJsonValue,\n shape: NodeShapeData,\n): {ir: IRExpression; refs: PropertyRefMap} {\n // S-expr array\n if (Array.isArray(json)) {\n const [head, ...operands] = json;\n const refs = new Map<string, readonly string[]>();\n const args = operands.map((o) => {\n const {ir, refs: r} = decodeValueExpr(o, shape);\n mergeRefs(refs, r);\n return ir;\n });\n return {ir: headToIR(head, args), refs};\n }\n // Objects: recognized value-objects\n if (json !== null && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n if ('@id' in o) {\n return {ir: {kind: 'reference_expr', value: o['@id'] as string}, refs: new Map()};\n }\n if ('@ctx' in o) {\n if (typeof o['@path'] === 'string') {\n const property = pathToSegmentIds(shape, o['@path']).pop() as string;\n return {\n ir: {kind: 'context_property_expr', contextName: o['@ctx'] as string, property},\n refs: new Map(),\n };\n }\n return {ir: {kind: 'reference_expr', contextName: o['@ctx'] as string}, refs: new Map()};\n }\n if ('@date' in o) {\n return {ir: {kind: 'literal_expr', value: new Date(o['@date'] as string)}, refs: new Map()};\n }\n if ('@path' in o) {\n return propertyOrAlias(shape, o['@path'] as string);\n }\n if ('@list' in o) {\n throw new Error('A {@list} value is only valid as an in/nin operand');\n }\n }\n // bare scalar literal\n return {ir: {kind: 'literal_expr', value: json as never}, refs: new Map()};\n}\n\n/**\n * Resolve a dotted path to its expression node:\n * - empty path `\"\"` → `alias_expr` (the bare subject, e.g. `p.equals(x)`);\n * - any non-empty path → `property_expr` (a property access, relation or not —\n * `p.bestFriend.equals(x)` compares the property value, no traversal).\n */\nfunction propertyOrAlias(\n shape: NodeShapeData,\n path: string,\n): {ir: IRExpression; refs: PropertyRefMap} {\n const node =\n path === ''\n ? tracedAliasExpression([])\n : tracedPropertyExpression(pathToSegmentIds(shape, path));\n return {ir: node.ir, refs: node._refs};\n}\n\n/** Build an IR node from an S-expr head symbol/name + decoded args. */\nfunction headToIR(head: string, args: IRExpression[]): IRExpression {\n if (head === 'and' || head === 'or') {\n return {kind: 'logical_expr', operator: head, expressions: args};\n }\n if (head === 'not') {\n return {kind: 'not_expr', expression: args[0]};\n }\n if (head === 'in' || head === 'not-in') {\n return {kind: 'in_expr', negated: head === 'not-in', value: args[0], source: {list: args.slice(1)}};\n }\n if (COMPARISON_OPS.has(head as IRBinaryOperator) || '+-*/'.includes(head)) {\n return {kind: 'binary_expr', operator: head as IRBinaryOperator, left: args[0], right: args[1]};\n }\n if (AGGREGATES.has(head)) {\n return {kind: 'aggregate_expr', name: head as never, args};\n }\n // default: a named function (verbatim IR function name, e.g. STRLEN)\n return {kind: 'function_expr', name: head, args};\n}\n\nconst AGGREGATES = new Set(['count', 'sum', 'avg', 'min', 'max']);\n\n// ---------------------------------------------------------------------------\n// CONDITION tier\n// ---------------------------------------------------------------------------\n\n/** Encode a where-clause node (boolean) into a DSL-JSON condition. */\nexport function encodeCondition(\n node: ExpressionNode | ExistsCondition,\n shape: NodeShapeData,\n): DslJsonCondition {\n if (isLinkedInstance(node, ExistsCondition)) {\n return encodeExists(node, shape);\n }\n return encodeBoolExpr(node.ir, node._refs, shape);\n}\n\nfunction encodeExists(ec: ExistsCondition, shape: NodeShapeData): DslJsonCondition {\n const rel = segmentsToPath(ec.pathSegmentIds);\n let quantifier: 'some' | 'none' | 'every';\n let predIr = ec.predicate.ir;\n const predRefs = ec.predicate._refs;\n if (!ec.negated) {\n quantifier = 'some';\n } else if (predIr.kind === 'not_expr') {\n // every(fn) was built as NOT EXISTS(NOT fn) — unwrap the inner predicate.\n quantifier = 'every';\n predIr = predIr.expression;\n } else {\n quantifier = 'none';\n }\n let base: DslJsonCondition = {\n [`${rel}.${quantifier}`]: encodeBoolExpr(predIr, predRefs, shape),\n };\n // Fold any chained and/or conditions into nested logical combinators.\n for (const {op, condition} of ec.chain) {\n const c = encodeCondition(\n isLinkedInstance(condition, ExistsCondition) ? condition : (condition as ExpressionNode),\n shape,\n );\n base = {[op]: [base, c]} as DslJsonCondition;\n }\n return base;\n}\n\n/** Encode a boolean IR expression into a DSL-JSON condition (path-keyed where possible). */\nfunction encodeBoolExpr(\n ir: IRExpression,\n refs: PropertyRefMap,\n shape: NodeShapeData,\n): DslJsonCondition {\n if (ir.kind === 'logical_expr') {\n const parts = ir.expressions.map((e) => encodeBoolExpr(e, refs, shape));\n if (ir.operator === 'and') {\n const merged = tryMergeAnd(parts);\n if (merged) return merged;\n }\n return {[ir.operator]: parts} as DslJsonCondition;\n }\n if (ir.kind === 'not_expr') {\n return {not: encodeBoolExpr(ir.expression, refs, shape)};\n }\n if (ir.kind === 'in_expr') {\n const key = pathKeyOf(ir.value, refs);\n if (key !== null) {\n const list = ir.source.list.map((e) => encodeValueExpr(e, refs));\n return {[key]: {[ir.negated ? 'notOneOf' : 'oneOf']: list}} as DslJsonCondition;\n }\n }\n if (ir.kind === 'binary_expr' && COMPARISON_OPS.has(ir.operator)) {\n const key = pathKeyOf(ir.left, refs);\n if (key !== null) {\n const value = encodeValueExpr(ir.right, refs);\n if (ir.operator === '=') return {[key]: value};\n return {[key]: {[ir.operator]: value}};\n }\n }\n // Fallback: S-expr (boolean expression that isn't a simple path-keyed shape).\n return encodeValueExpr(ir, refs) as DslJsonCondition;\n}\n\n/** A path key for a left operand that is a single property/alias/context property. */\nfunction pathKeyOf(ir: IRExpression, refs: PropertyRefMap): string | null {\n if (ir.kind === 'property_expr') {\n const segs = refs.get(ir.sourceAlias);\n return segs ? segmentsToPath(segs) : labelOf(ir.property);\n }\n if (ir.kind === 'alias_expr') {\n const segs = refs.get(ir.alias);\n return segs ? segmentsToPath(segs) : null;\n }\n if (ir.kind === 'context_property_expr') {\n return null; // a context property on the LHS is uncommon; use S-expr\n }\n return null;\n}\n\n/** Merge AND conjuncts into one path-keyed object iff all are distinct single-key path conditions. */\nfunction tryMergeAnd(parts: DslJsonCondition[]): DslJsonCondition | null {\n const out: Record<string, unknown> = {};\n for (const p of parts) {\n if (Array.isArray(p) || typeof p !== 'object' || p === null) return null;\n const keys = Object.keys(p);\n if (keys.length !== 1) return null;\n const k = keys[0];\n if (COMBINATORS.has(k) || k in out) return null;\n out[k] = (p as Record<string, unknown>)[k];\n }\n return out as DslJsonCondition;\n}\n\n/** Decode a DSL-JSON condition into a runtime WherePath (`{expressionNode}` | `{existsCondition}`). */\nexport function decodeCondition(json: DslJsonCondition, shape: NodeShapeData): WherePath {\n const node = decodeConditionNode(json, shape);\n return isLinkedInstance(node, ExistsCondition)\n ? ({existsCondition: node} as WherePath)\n : ({expressionNode: node} as WherePath);\n}\n\nfunction decodeConditionNode(\n json: DslJsonCondition,\n shape: NodeShapeData,\n): ExpressionNode | ExistsCondition {\n // S-expr fallback\n if (Array.isArray(json)) {\n const {ir, refs} = decodeValueExpr(json, shape);\n return new ExpressionNode(ir, refs);\n }\n const o = json as Record<string, unknown>;\n const keys = Object.keys(o);\n\n // Combinators\n if (keys.length === 1 && COMBINATORS.has(keys[0])) {\n const k = keys[0];\n if (k === 'not') {\n const inner = decodeConditionNode(o.not as DslJsonCondition, shape);\n if (isLinkedInstance(inner, ExistsCondition)) return inner.not();\n return new ExpressionNode({kind: 'not_expr', expression: inner.ir}, inner._refs);\n }\n // and / or\n const elems = (o[k] as DslJsonCondition[]).map((c) => decodeConditionNode(c, shape));\n // An exists-chain: first operand is an ExistsCondition → fold the rest as its chain.\n if (isLinkedInstance(elems[0], ExistsCondition)) {\n let ec = elems[0] as ExistsCondition;\n for (let i = 1; i < elems.length; i++) {\n ec = (k === 'and' ? ec.and(elems[i] as never) : ec.or(elems[i] as never)) as ExistsCondition;\n }\n return ec;\n }\n const refs = new Map<string, readonly string[]>();\n const expressions = elems.map((e) => {\n mergeRefs(refs, (e as ExpressionNode)._refs);\n return (e as ExpressionNode).ir;\n });\n return new ExpressionNode({kind: 'logical_expr', operator: k as 'and' | 'or', expressions}, refs);\n }\n\n // Single quantifier key: \"rel.some\" | \"rel.every\" | \"rel.none\"\n if (keys.length === 1) {\n const q = matchQuantifier(keys[0]);\n if (q) {\n const predicate = expressionNodeFromCondition(o[keys[0]] as DslJsonCondition, shape);\n const segmentIds = pathToSegmentIds(shape, q.rel);\n if (q.kind === 'some') return new ExistsCondition(segmentIds, predicate, false);\n if (q.kind === 'none') return new ExistsCondition(segmentIds, predicate, true);\n // every(fn) = NOT EXISTS(NOT fn)\n return new ExistsCondition(\n segmentIds,\n new ExpressionNode({kind: 'not_expr', expression: predicate.ir}, predicate._refs),\n true,\n );\n }\n }\n\n // Path-keyed condition(s): one or more `path: value|opMap` → AND of comparisons.\n const refs = new Map<string, readonly string[]>();\n const comparisons: IRExpression[] = [];\n for (const key of keys) {\n const left = propertyOrAlias(shape, key);\n mergeRefs(refs, left.refs);\n const v = o[key];\n for (const cmp of comparisonsFor(left.ir, v, shape, refs)) comparisons.push(cmp);\n }\n const ir =\n comparisons.length === 1\n ? comparisons[0]\n : {kind: 'logical_expr' as const, operator: 'and' as const, expressions: comparisons};\n return new ExpressionNode(ir, refs);\n}\n\nfunction comparisonsFor(\n left: IRExpression,\n value: unknown,\n shape: NodeShapeData,\n refs: Map<string, readonly string[]>,\n): IRExpression[] {\n // Membership: { \"oneOf\": [...] } / { \"notOneOf\": [...] } → IN / NOT IN.\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const o = value as Record<string, unknown>;\n if (Array.isArray(o.oneOf) || Array.isArray(o.notOneOf)) {\n const negated = Array.isArray(o.notOneOf);\n const listRaw = (negated ? o.notOneOf : o.oneOf) as DslJsonValue[];\n const list = listRaw.map((el) => {\n const r = decodeValueExpr(el, shape);\n mergeRefs(refs, r.refs);\n return r.ir;\n });\n return [{kind: 'in_expr', negated, value: left, source: {list}}];\n }\n }\n // operator map: { \">\": 18, \"<\": 65 } (symbols) or { \"gt\": 18 } (word aliases)\n if (isOpMap(value)) {\n return Object.entries(value as DslJsonOpMap).map(([op, v]) => {\n const r = decodeValueExpr(v as DslJsonValue, shape);\n mergeRefs(refs, r.refs);\n const operator = (OP_ALIASES[op] ?? op) as IRBinaryOperator;\n return {kind: 'binary_expr', operator, left, right: r.ir};\n });\n }\n // implicit equals\n const r = decodeValueExpr(value as DslJsonValue, shape);\n mergeRefs(refs, r.refs);\n return [{kind: 'binary_expr', operator: '=', left, right: r.ir}];\n}\n\n/** An object whose keys are all operator symbols (not a recognized value-object). */\nfunction isOpMap(value: unknown): boolean {\n if (Array.isArray(value) || value === null || typeof value !== 'object') return false;\n const keys = Object.keys(value as object);\n if (keys.length === 0) return false;\n if (keys.some((k) => k === '@id' || k === '@ctx' || k === '@path' || k === '@date' || k === '@list')) {\n return false;\n }\n // Comparison operators (symbols) or their word aliases (`equals`/`gt`/…) form\n // an op-map. `in`/`nin` are handled separately (oneOf/notOneOf, see decode).\n return keys.every(\n (k) => COMPARISON_OPS.has(k as IRBinaryOperator) || k in OP_ALIASES,\n );\n}\n\nfunction matchQuantifier(\n key: string,\n): {rel: string; kind: 'some' | 'every' | 'none'} | null {\n for (const kind of ['some', 'every', 'none'] as const) {\n if (key.endsWith(`.${kind}`)) {\n return {rel: key.slice(0, -(kind.length + 1)), kind};\n }\n }\n return null;\n}\n\n/** A quantifier predicate decodes to an ExpressionNode (its inner boolean). */\nfunction expressionNodeFromCondition(json: DslJsonCondition, shape: NodeShapeData): ExpressionNode {\n const node = decodeConditionNode(json, shape);\n if (isLinkedInstance(node, ExistsCondition)) {\n // Nested exists as a predicate is uncommon; wrap is not representable here.\n throw new Error('Nested exists inside a quantifier predicate is not supported');\n }\n return node;\n}\n"]}
@@ -6,6 +6,7 @@ import { isExpressionNode, ExpressionNode } from '../expressions/ExpressionNode.
6
6
  import { encodeValueExpr, decodeValueExpr } from './DslJsonExpression.js';
7
7
  import { serializeWherePath, deserializeWherePath, } from './QueryBuilderSerialization.js';
8
8
  import { topLevelDetails, unresolvedShapeError, unresolvedValueShapeError } from '../utils/unresolvedShape.js';
9
+ import { brandLinkedClass, isLinkedInstance } from '../utils/linkedError.js';
9
10
  const isQueryBuilderObject = (obj) => obj !== null &&
10
11
  typeof obj === 'object' &&
11
12
  'property' in obj &&
@@ -547,17 +548,17 @@ export class FieldSet {
547
548
  if (typeof input === 'string') {
548
549
  entries.push({ path: walkPropertyPath(shape, input) });
549
550
  }
550
- else if (input instanceof PropertyPath) {
551
+ else if (isLinkedInstance(input, PropertyPath)) {
551
552
  entries.push({ path: input });
552
553
  }
553
- else if (input instanceof FieldSet) {
554
+ else if (isLinkedInstance(input, FieldSet)) {
554
555
  entries.push(...input.entries);
555
556
  }
556
557
  else if (typeof input === 'object') {
557
558
  // Nested object form: { friends: ['name', 'hobby'] }
558
559
  for (const [key, value] of Object.entries(input)) {
559
560
  const basePath = walkPropertyPath(shape, key);
560
- if (value instanceof FieldSet) {
561
+ if (isLinkedInstance(value, FieldSet)) {
561
562
  // Merge nested FieldSet entries under this path
562
563
  for (const entry of value.entries) {
563
564
  const combined = new PropertyPath(shape, [
@@ -606,7 +607,7 @@ export class FieldSet {
606
607
  return [FieldSet.convertTraceResult(nodeShape, result)];
607
608
  }
608
609
  // Single FieldSet sub-select (e.g. p.friends.select(f => [f.name]))
609
- if (result instanceof FieldSet && result.parentSegments !== undefined) {
610
+ if (isLinkedInstance(result, FieldSet) && result.parentSegments !== undefined) {
610
611
  return [FieldSet.convertTraceResult(nodeShape, result)];
611
612
  }
612
613
  // Single SetSize (e.g. p.friends.size())
@@ -647,7 +648,7 @@ export class FieldSet {
647
648
  };
648
649
  }
649
650
  // FieldSet sub-select — use its entries directly (created by forSubSelect)
650
- if (obj instanceof FieldSet && obj.parentSegments !== undefined) {
651
+ if (isLinkedInstance(obj, FieldSet) && obj.parentSegments !== undefined) {
651
652
  const subSelect = obj.entries.length > 0 ? obj : undefined;
652
653
  const entry = {
653
654
  path: new PropertyPath(rootShape, obj.parentSegments),
@@ -814,11 +815,11 @@ export class FieldSet {
814
815
  */
815
816
  static extractComponentFieldSet(component) {
816
817
  // Prefer .fields if it's a FieldSet
817
- if (component.fields instanceof FieldSet) {
818
+ if (isLinkedInstance(component.fields, FieldSet)) {
818
819
  return component.fields;
819
820
  }
820
821
  const query = component.query;
821
- if (query instanceof FieldSet) {
822
+ if (isLinkedInstance(query, FieldSet)) {
822
823
  return query;
823
824
  }
824
825
  // QueryBuilder duck-type — has .fields() method
@@ -870,7 +871,7 @@ export class FieldSet {
870
871
  return [FieldSet.convertTraceResult(rootShape, traceResponse)];
871
872
  }
872
873
  // Single FieldSet sub-select — convert directly
873
- if (traceResponse instanceof FieldSet && traceResponse.parentSegments !== undefined) {
874
+ if (isLinkedInstance(traceResponse, FieldSet) && traceResponse.parentSegments !== undefined) {
874
875
  return [FieldSet.convertTraceResult(rootShape, traceResponse)];
875
876
  }
876
877
  // Single SetSize
@@ -896,4 +897,5 @@ export class FieldSet {
896
897
  return [];
897
898
  }
898
899
  }
900
+ brandLinkedClass(FieldSet, '@_linked/core', 'FieldSet');
899
901
  //# sourceMappingURL=FieldSet.js.map