@invinite-org/chartlang-compiler 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +310 -0
  2. package/dist/analysis/extractDependencyGraph.d.ts.map +1 -1
  3. package/dist/analysis/extractDependencyGraph.js +9 -1
  4. package/dist/analysis/extractDependencyGraph.js.map +1 -1
  5. package/dist/analysis/extractInputs.d.ts.map +1 -1
  6. package/dist/analysis/extractInputs.js +2 -0
  7. package/dist/analysis/extractInputs.js.map +1 -1
  8. package/dist/analysis/extractMaxLookback.d.ts +2 -1
  9. package/dist/analysis/extractMaxLookback.d.ts.map +1 -1
  10. package/dist/analysis/extractMaxLookback.js +90 -6
  11. package/dist/analysis/extractMaxLookback.js.map +1 -1
  12. package/dist/analysis/extractRequestedIntervals.d.ts +63 -1
  13. package/dist/analysis/extractRequestedIntervals.d.ts.map +1 -1
  14. package/dist/analysis/extractRequestedIntervals.js +245 -29
  15. package/dist/analysis/extractRequestedIntervals.js.map +1 -1
  16. package/dist/analysis/forbiddenConstructs.d.ts.map +1 -1
  17. package/dist/analysis/forbiddenConstructs.js +2 -41
  18. package/dist/analysis/forbiddenConstructs.js.map +1 -1
  19. package/dist/analysis/index.d.ts +4 -1
  20. package/dist/analysis/index.d.ts.map +1 -1
  21. package/dist/analysis/index.js +3 -1
  22. package/dist/analysis/index.js.map +1 -1
  23. package/dist/analysis/loopBounds.d.ts +91 -0
  24. package/dist/analysis/loopBounds.d.ts.map +1 -0
  25. package/dist/analysis/loopBounds.js +132 -0
  26. package/dist/analysis/loopBounds.js.map +1 -0
  27. package/dist/analysis/resolveIndexBound.d.ts +73 -0
  28. package/dist/analysis/resolveIndexBound.d.ts.map +1 -0
  29. package/dist/analysis/resolveIndexBound.js +336 -0
  30. package/dist/analysis/resolveIndexBound.js.map +1 -0
  31. package/dist/analysis/stateArrayCapacity.d.ts +58 -0
  32. package/dist/analysis/stateArrayCapacity.d.ts.map +1 -0
  33. package/dist/analysis/stateArrayCapacity.js +108 -0
  34. package/dist/analysis/stateArrayCapacity.js.map +1 -0
  35. package/dist/analysis/validateSecurityExpr.d.ts +25 -0
  36. package/dist/analysis/validateSecurityExpr.d.ts.map +1 -0
  37. package/dist/analysis/validateSecurityExpr.js +154 -0
  38. package/dist/analysis/validateSecurityExpr.js.map +1 -0
  39. package/dist/api.d.ts.map +1 -1
  40. package/dist/api.js +22 -3
  41. package/dist/api.js.map +1 -1
  42. package/dist/diagnostics.d.ts +8 -2
  43. package/dist/diagnostics.d.ts.map +1 -1
  44. package/dist/diagnostics.js.map +1 -1
  45. package/dist/manifest.d.ts +3 -1
  46. package/dist/manifest.d.ts.map +1 -1
  47. package/dist/manifest.js +11 -0
  48. package/dist/manifest.js.map +1 -1
  49. package/dist/program.d.ts.map +1 -1
  50. package/dist/program.js +148 -15
  51. package/dist/program.js.map +1 -1
  52. package/dist/transformers/callsiteIdInjection.d.ts +21 -0
  53. package/dist/transformers/callsiteIdInjection.d.ts.map +1 -1
  54. package/dist/transformers/callsiteIdInjection.js +34 -4
  55. package/dist/transformers/callsiteIdInjection.js.map +1 -1
  56. package/dist/transformers/plotKindFromCallsite.d.ts +3 -0
  57. package/dist/transformers/plotKindFromCallsite.d.ts.map +1 -1
  58. package/dist/transformers/plotKindFromCallsite.js +7 -0
  59. package/dist/transformers/plotKindFromCallsite.js.map +1 -1
  60. package/dist/transformers/resolveCallee.d.ts +21 -0
  61. package/dist/transformers/resolveCallee.d.ts.map +1 -1
  62. package/dist/transformers/resolveCallee.js +14 -1
  63. package/dist/transformers/resolveCallee.js.map +1 -1
  64. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"extractDependencyGraph.js","sourceRoot":"","sources":["../../src/analysis/extractDependencyGraph.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, OutputDeclaration } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\nimport type { StructuralBindingInfo } from \"./structuralChecks.js\";\n\n/**\n * Producer reference recorded on a consumer-side `const` binding. The\n * same-file variant carries the local binding name; the cross-file\n * variant carries the resolved POSIX path + ES-module export name.\n *\n * @since 0.7\n * @stable\n * @example\n * const r: ProducerRef = { kind: \"same-file\", bindingName: \"baseTrend\" };\n * void r;\n */\nexport type ProducerRef =\n | Readonly<{ kind: \"same-file\"; bindingName: string }>\n | Readonly<{ kind: \"cross-file\"; sourcePath: string; exportName: string }>;\n\n/**\n * One dep-graph edge — consumer binding → producer with the merged\n * effective inputs the bundler needs to fold into the producer's\n * compiled module at emit time.\n *\n * @since 0.7\n * @stable\n * @example\n * declare const dummyOutputs: ReadonlyArray<OutputDeclaration>;\n * const e: DepConsumesEntry = {\n * localId: \"fastTrend\",\n * producerRef: { kind: \"same-file\", bindingName: \"baseTrend\" },\n * outputs: dummyOutputs,\n * effectiveInputs: { length: 20 },\n * };\n * void e;\n */\nexport type DepConsumesEntry = Readonly<{\n readonly localId: string;\n readonly producerRef: ProducerRef;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly effectiveInputs: Readonly<Record<string, JsonValue>>;\n}>;\n\n/**\n * One exported (drawn) indicator the file declares. `exportName` is\n * `\"default\"` for `export default`, the identifier text otherwise.\n *\n * @since 0.7\n * @stable\n * @example\n * // declare const callExpression: ts.CallExpression;\n * const d: DrawnScript = {\n * exportName: \"default\",\n * bindingName: \"default\",\n * defineCall: undefined as unknown as ts.CallExpression,\n * outputs: [],\n * consumes: [],\n * };\n * void d;\n */\nexport type DrawnScript = Readonly<{\n readonly exportName: string;\n readonly bindingName: string;\n readonly defineCall: ts.CallExpression;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly consumes: ReadonlyArray<DepConsumesEntry>;\n}>;\n\n/**\n * One private (data-only) dep binding the file declares. `defineCall`\n * is `null` when the dep is a cross-file binding (the AST node lives\n * in the producer's source file).\n *\n * @since 0.7\n * @stable\n * @example\n * const d: PrivateDep = {\n * localId: \"fastTrend\",\n * producerRef: { kind: \"same-file\", bindingName: \"baseTrend\" },\n * effectiveInputs: { length: 20 },\n * defineCall: null,\n * outputs: [],\n * consumes: [],\n * };\n * void d;\n */\nexport type PrivateDep = Readonly<{\n readonly localId: string;\n readonly producerRef: ProducerRef;\n readonly effectiveInputs: Readonly<Record<string, JsonValue>>;\n readonly defineCall: ts.CallExpression | null;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly consumes: ReadonlyArray<DepConsumesEntry>;\n}>;\n\n/**\n * Producer snapshot returned by `resolveProducer` for cross-file\n * `import X from \"./Y.chart\"` consumer references.\n *\n * @since 0.7\n * @stable\n * @example\n * const snap: ProducerSnapshot = { name: \"trend\", outputs: [], inputs: {} };\n * void snap;\n */\nexport type ProducerSnapshot = Readonly<{\n readonly name: string;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly inputs: Readonly<Record<string, unknown>>;\n}>;\n\n/**\n * Callback the bundler supplies so the analysis pass can recursively\n * compile sibling `.chart.ts` files. Returns `null` when the producer\n * cannot be resolved (cycle, unknown path, no `defineIndicator(...)`).\n *\n * @since 0.7\n * @stable\n * @example\n * const r: ResolveProducer = () => null;\n * void r;\n */\nexport type ResolveProducer = (sourcePath: string, exportName: string) => ProducerSnapshot | null;\n\n/**\n * The compiled dep-graph artefact returned by `extractDependencyGraph`.\n * `drawn` + `privateDeps` are the indexed binding sets; `diagnostics`\n * is the union of every per-binding diagnostic surfaced during\n * walking + validation.\n *\n * @since 0.7\n * @stable\n * @example\n * const g: DepGraph = { drawn: [], privateDeps: [], diagnostics: [] };\n * void g;\n */\nexport type DepGraph = Readonly<{\n readonly drawn: ReadonlyArray<DrawnScript>;\n readonly privateDeps: ReadonlyArray<PrivateDep>;\n readonly diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\ntype BindingOutputs = Readonly<{\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly hasUntitledPlot: boolean;\n}>;\n\ntype DepConsumesMutable = {\n localId: string;\n producerRef: ProducerRef;\n outputs: ReadonlyArray<OutputDeclaration>;\n effectiveInputs: Readonly<Record<string, JsonValue>>;\n};\n\n/**\n * Read a JSON-clean literal from a TS expression — number, string,\n * boolean, or null. Returns `undefined` for non-literal expressions\n * (identifiers, computed access, calls, …).\n */\nfunction readJsonLiteral(node: ts.Expression): JsonValue | undefined {\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (ts.isStringLiteral(node)) return node.text;\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n return undefined;\n}\n\n/**\n * Read the function body the `compute` property assignment of a\n * `define*({ compute })` call literal points at. Returns `null` when\n * the property is missing or non-function (treat as zero plot calls).\n *\n * Handles both arrow functions (`compute: () => {}`) and method\n * shorthand (`compute() {}`).\n */\nfunction readComputeBody(defineCall: ts.CallExpression): ts.Node | null {\n const arg = defineCall.arguments[0];\n /* v8 ignore next */\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) return null;\n const computeProperty = arg.properties.find((property) => {\n const name = (property as { name?: ts.PropertyName }).name;\n return name !== undefined && ts.isIdentifier(name) && name.text === \"compute\";\n });\n if (computeProperty === undefined) return null;\n if (ts.isPropertyAssignment(computeProperty)) {\n const initializer = computeProperty.initializer;\n return ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)\n ? initializer.body\n : null;\n }\n /* v8 ignore start */\n if (ts.isMethodDeclaration(computeProperty)) {\n return computeProperty.body ?? null;\n }\n return null;\n}\n/* v8 ignore stop */\n\n/**\n * Sweep D — extract producer outputs from `plot(value, { title })`\n * calls inside the binding's compute body. Emits\n * `duplicate-output-title` for clashes.\n */\nfunction extractBindingOutputs(\n binding: StructuralBindingInfo,\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): BindingOutputs {\n const body = readComputeBody(binding.defineCall);\n const outputs: OutputDeclaration[] = [];\n const seenTitles = new Set<string>();\n let hasUntitledPlot = false;\n\n /* v8 ignore next 3 */\n if (body === null) {\n return Object.freeze({ outputs: Object.freeze(outputs.slice()), hasUntitledPlot });\n }\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const callee = resolveCalleeName(node, checker);\n if (callee === \"plot\") {\n const optsArg = node.arguments[1];\n let title: string | undefined;\n if (optsArg !== undefined && ts.isObjectLiteralExpression(optsArg)) {\n for (const property of optsArg.properties) {\n /* v8 ignore next */\n if (!ts.isPropertyAssignment(property)) continue;\n const propertyName = property.name;\n if (!ts.isIdentifier(propertyName) || propertyName.text !== \"title\") {\n continue;\n }\n const initializer = property.initializer;\n /* v8 ignore next */\n if (!ts.isStringLiteral(initializer)) continue;\n title = initializer.text;\n }\n }\n if (title === undefined) {\n hasUntitledPlot = true;\n } else if (seenTitles.has(title)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"duplicate-output-title\",\n message: `\\`${binding.bindingName}\\` declares two outputs titled \"${title}\". Titles must be unique within a script.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n } else {\n seenTitles.add(title);\n outputs.push(Object.freeze({ title, kind: \"series-number\" as const }));\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(body, visit);\n return Object.freeze({ outputs: Object.freeze(outputs.slice()), hasUntitledPlot });\n}\n\ntype ChainResolution = Readonly<{\n readonly root: ts.Identifier;\n readonly inputs: Readonly<Record<string, JsonValue>>;\n readonly ok: boolean;\n}>;\n\n/**\n * Sweep B — resolve a `<binding>.withInputs({...}).withInputs({...})`\n * chain back to its rooted identifier and the merged effective-inputs\n * map. Emits `dep-dynamic` / `dep-invalid-input-override` for invalid\n * argument shapes.\n */\nfunction resolveWithInputsChain(\n expression: ts.Expression,\n sourceFile: ts.SourceFile,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): ChainResolution | null {\n type Layer = { args: ts.ObjectLiteralExpression; ok: boolean };\n const layers: Layer[] = [];\n let current: ts.Expression = expression;\n while (ts.isCallExpression(current)) {\n const callee = current.expression;\n /* v8 ignore next 2 */\n if (!ts.isPropertyAccessExpression(callee)) return null;\n if (callee.name.text !== \"withInputs\") return null;\n const arg = current.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.withInputs(...)` requires an object literal with literal-only property values.\",\n file: sourcePath,\n node: arg ?? /* v8 ignore next */ current,\n sourceFile,\n }),\n );\n layers.unshift({ args: ts.factory.createObjectLiteralExpression([]), ok: false });\n } else {\n layers.unshift({ args: arg, ok: true });\n }\n current = callee.expression;\n }\n /* v8 ignore next */\n if (!ts.isIdentifier(current)) return null;\n\n const merged: Record<string, JsonValue> = {};\n let ok = true;\n for (const layer of layers) {\n if (!layer.ok) {\n ok = false;\n continue;\n }\n for (const property of layer.args.properties) {\n if (!ts.isPropertyAssignment(property)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.withInputs(...)` requires a plain object literal — no spread, shorthand, or computed keys.\",\n file: sourcePath,\n node: property,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n const key = property.name;\n if (!ts.isIdentifier(key) && !ts.isStringLiteral(key)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: \"`.withInputs(...)` keys must be identifiers or string literals.\",\n file: sourcePath,\n node: key,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n const literal = readJsonLiteral(property.initializer);\n if (literal === undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: `\\`.withInputs({ ${key.text}: ... })\\` value must be a JSON literal (number, string, boolean, or null).`,\n file: sourcePath,\n node: property.initializer,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n merged[key.text] = literal;\n }\n }\n return Object.freeze({\n root: current,\n inputs: Object.freeze({ ...merged }),\n ok,\n });\n}\n\n/**\n * Validate an `effectiveInputs` map against the producer's `inputs`\n * schema. Each producer-input descriptor is shaped like\n * `{ kind: \"int\", defaultValue: 14, ... }`. Type-mismatch and unknown\n * keys both emit `dep-invalid-input-override`.\n */\nfunction validateInputOverrides(\n bindingName: string,\n inputs: Readonly<Record<string, JsonValue>>,\n producerInputs: Readonly<Record<string, unknown>>,\n node: ts.Node,\n sourceFile: ts.SourceFile,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): void {\n for (const [key, value] of Object.entries(inputs)) {\n const descriptor = producerInputs[key];\n if (descriptor === undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-invalid-input-override\",\n message: `\\`${bindingName}\\` overrides input \"${key}\" which the producer does not declare.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n continue;\n }\n const expectedKind =\n typeof descriptor === \"object\" && descriptor !== null && \"kind\" in descriptor\n ? (descriptor as { kind: unknown }).kind\n : undefined;\n if (typeof expectedKind === \"string\") {\n const valueType = describeJsonValueKind(value);\n const expectedType = expectedTypeForKind(expectedKind);\n if (expectedType !== null && expectedType !== valueType) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-invalid-input-override\",\n message: `\\`${bindingName}\\` override for \"${key}\" expects ${expectedType} (producer declared \\`${expectedKind}\\`), received ${valueType}.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n }\n }\n}\n\nfunction describeJsonValueKind(value: JsonValue): string {\n if (value === null) return \"null\";\n /* v8 ignore next */\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\nconst KIND_TO_VALUE_TYPE: ReadonlyMap<string, string> = new Map([\n [\"int\", \"number\"],\n [\"float\", \"number\"],\n [\"price\", \"number\"],\n [\"time\", \"number\"],\n [\"string\", \"string\"],\n [\"enum\", \"string\"],\n [\"color\", \"string\"],\n [\"symbol\", \"string\"],\n [\"interval\", \"string\"],\n [\"bool\", \"boolean\"],\n]);\n\nfunction expectedTypeForKind(kind: string): string | null {\n return KIND_TO_VALUE_TYPE.get(kind) ?? null;\n}\n\n/**\n * Walk back from a `<receiver>.output(\"title\")` callee to a same-file\n * binding identifier OR an imported identifier — whichever applies.\n * Returns the underlying identifier or `null` when the receiver is a\n * non-resolvable shape (computed access, call result, etc.).\n */\nfunction resolveOutputReceiverRoot(receiver: ts.Expression): ts.Identifier | null {\n if (ts.isIdentifier(receiver)) return receiver;\n return null;\n}\n\nfunction originIsImport(symbol: ts.Symbol): {\n moduleSpecifier: string;\n exportName: string;\n} | null {\n const declarations = symbol.declarations ?? /* v8 ignore next */ [];\n for (const declaration of declarations) {\n if (ts.isImportClause(declaration)) {\n const importDecl = declaration.parent;\n const specifier = importDecl.moduleSpecifier;\n /* v8 ignore next */\n if (!ts.isStringLiteral(specifier)) continue;\n return { moduleSpecifier: specifier.text, exportName: \"default\" };\n }\n if (ts.isImportSpecifier(declaration)) {\n const importDecl = declaration.parent.parent.parent;\n const specifier = importDecl.moduleSpecifier;\n /* v8 ignore next */\n if (!ts.isStringLiteral(specifier)) continue;\n const exportName = declaration.propertyName?.text ?? declaration.name.text;\n return { moduleSpecifier: specifier.text, exportName };\n }\n }\n return null;\n}\n\ntype ResolvedBinding =\n | Readonly<{ kind: \"same-file\"; binding: StructuralBindingInfo }>\n | Readonly<{\n kind: \"cross-file\";\n sourcePath: string;\n exportName: string;\n snapshot: ProducerSnapshot;\n }>;\n\nfunction resolveBinding(\n identifier: ts.Identifier,\n checker: ts.TypeChecker,\n bindingsByName: ReadonlyMap<string, StructuralBindingInfo>,\n resolveProducer: ResolveProducer,\n): ResolvedBinding | null {\n const sameFile = bindingsByName.get(identifier.text);\n if (sameFile !== undefined) {\n return Object.freeze({ kind: \"same-file\", binding: sameFile });\n }\n const symbol = checker.getSymbolAtLocation(identifier);\n /* v8 ignore next */\n if (symbol === undefined) return null;\n const importOrigin = originIsImport(symbol);\n if (importOrigin === null) return null;\n const snapshot = resolveProducer(importOrigin.moduleSpecifier, importOrigin.exportName);\n if (snapshot === null) return null;\n return Object.freeze({\n kind: \"cross-file\",\n sourcePath: importOrigin.moduleSpecifier,\n exportName: importOrigin.exportName,\n snapshot,\n });\n}\n\n/**\n * Run the dependency-graph analysis pass over a `.chart.ts` source\n * file. Sweeps the AST four times — outputs, withInputs chains,\n * consumer `.output(...)` calls, cycle detection — and returns a\n * frozen `DepGraph` plus the diagnostics surfaced along the way.\n *\n * `resolveProducer` is a caller-supplied callback that the bundler\n * (Task 3) wires to a recursive compile entry point. In Task 2 the\n * pass works against `() => null` for cross-file edges; tests pass\n * mocked snapshots instead.\n *\n * @since 0.7\n * @stable\n * @example\n * // const graph = extractDependencyGraph(sf, checker, \"demo.chart.ts\", bindings, () => null);\n * const fn: typeof extractDependencyGraph = extractDependencyGraph;\n * void fn;\n */\nexport function extractDependencyGraph(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n structuralBindings: ReadonlyArray<StructuralBindingInfo>,\n resolveProducer: ResolveProducer,\n): DepGraph {\n const diagnostics: CompileDiagnostic[] = [];\n const bindingsByName = new Map<string, StructuralBindingInfo>();\n for (const binding of structuralBindings) {\n if (binding.exportKind === \"default\") continue;\n bindingsByName.set(binding.bindingName, binding);\n }\n\n const outputsByBinding = new Map<string, BindingOutputs>();\n for (const binding of structuralBindings) {\n outputsByBinding.set(\n binding.bindingName,\n extractBindingOutputs(binding, sourceFile, checker, sourcePath, diagnostics),\n );\n }\n\n type BindingEffectiveInputs = Readonly<{\n rootName: string;\n rootBinding: ResolvedBinding | null;\n inputs: Readonly<Record<string, JsonValue>>;\n }>;\n const effectiveInputsByBinding = new Map<string, BindingEffectiveInputs>();\n\n for (const statement of sourceFile.statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n /* v8 ignore next */\n if (!ts.isIdentifier(declaration.name)) continue;\n const initializer = declaration.initializer;\n if (initializer === undefined) continue;\n if (!ts.isCallExpression(initializer)) continue;\n const callee = initializer.expression;\n if (ts.isPropertyAccessExpression(callee) && callee.name.text === \"withInputs\") {\n const chain = resolveWithInputsChain(\n initializer,\n sourceFile,\n sourcePath,\n diagnostics,\n );\n /* v8 ignore next */\n if (chain === null) continue;\n const root = resolveBinding(chain.root, checker, bindingsByName, resolveProducer);\n effectiveInputsByBinding.set(declaration.name.text, {\n rootName: chain.root.text,\n rootBinding: root,\n inputs: chain.inputs,\n });\n if (root !== null && chain.ok) {\n const producerInputs = root.kind === \"cross-file\" ? root.snapshot.inputs : {};\n validateInputOverrides(\n declaration.name.text,\n chain.inputs,\n producerInputs,\n initializer,\n sourceFile,\n sourcePath,\n diagnostics,\n );\n }\n }\n }\n }\n\n const consumesByBinding = new Map<string, DepConsumesMutable[]>();\n for (const binding of structuralBindings) {\n consumesByBinding.set(binding.bindingName, []);\n }\n\n for (const binding of structuralBindings) {\n const body = readComputeBody(binding.defineCall);\n if (body === null) continue;\n const consumerConsumes = consumesByBinding.get(binding.bindingName);\n /* v8 ignore next */\n if (consumerConsumes === undefined) continue;\n const seenLocalIds = new Set<string>();\n const visit = (node: ts.Node): void => {\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.name.text === \"output\"\n ) {\n const arg = node.arguments[0];\n if (arg === undefined || !ts.isStringLiteral(arg)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`<binding>.output(...)` requires a single string-literal argument.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n const title = arg.text;\n const root = resolveOutputReceiverRoot(node.expression.expression);\n if (root === null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.output(...)` receiver must trace back to a `const`-bound `defineIndicator(...)` result.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n const effective = effectiveInputsByBinding.get(root.text);\n let resolvedRootName: string;\n let resolvedRoot: ResolvedBinding | null;\n let effectiveInputs: Readonly<Record<string, JsonValue>>;\n if (effective !== undefined) {\n resolvedRootName = effective.rootName;\n resolvedRoot = effective.rootBinding;\n effectiveInputs = effective.inputs;\n } else {\n resolvedRootName = root.text;\n resolvedRoot = resolveBinding(root, checker, bindingsByName, resolveProducer);\n effectiveInputs = Object.freeze({});\n }\n if (resolvedRoot === null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: `\\`.output(\"${title}\")\\` receiver \\`${root.text}\\` does not resolve to a known same-file or imported indicator binding.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n\n const producerOutputs: ReadonlyArray<OutputDeclaration> =\n resolvedRoot.kind === \"same-file\"\n ? (outputsByBinding.get(resolvedRoot.binding.bindingName) as BindingOutputs)\n .outputs\n : resolvedRoot.snapshot.outputs;\n const producerHasUntitled =\n resolvedRoot.kind === \"same-file\" &&\n (outputsByBinding.get(resolvedRoot.binding.bindingName) as BindingOutputs)\n .hasUntitledPlot;\n const titles = new Set(producerOutputs.map((o) => o.title));\n if (!titles.has(title)) {\n if (producerHasUntitled) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-output-not-titled\",\n message: `Producer \\`${resolvedRootName}\\` declares an untitled \\`plot(...)\\` but consumer references \\`.output(\"${title}\")\\`. Title every \\`plot\\` the producer emits or remove the consumer reference.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n } else {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-unknown-output\",\n message: `Producer \\`${resolvedRootName}\\` does not declare an output titled \"${title}\".`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n ts.forEachChild(node, visit);\n return;\n }\n\n const localId = effective !== undefined ? root.text : root.text;\n if (!seenLocalIds.has(localId)) {\n seenLocalIds.add(localId);\n const producerRef: ProducerRef =\n resolvedRoot.kind === \"same-file\"\n ? Object.freeze({\n kind: \"same-file\",\n bindingName: resolvedRoot.binding.bindingName,\n })\n : Object.freeze({\n kind: \"cross-file\",\n sourcePath: resolvedRoot.sourcePath,\n exportName: resolvedRoot.exportName,\n });\n consumerConsumes.push({\n localId,\n producerRef,\n outputs: producerOutputs,\n effectiveInputs,\n });\n }\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(body, visit);\n }\n\n const sameFileEdges = new Map<string, Set<string>>();\n for (const [bindingName, consumes] of consumesByBinding.entries()) {\n const targets = new Set<string>();\n for (const entry of consumes) {\n if (entry.producerRef.kind === \"same-file\") {\n targets.add(entry.producerRef.bindingName);\n }\n }\n sameFileEdges.set(bindingName, targets);\n }\n const cycles = detectCycles(sameFileEdges);\n for (const cycle of cycles) {\n const path = `${cycle.join(\" -> \")} -> ${cycle[0] ?? /* v8 ignore next */ \"\"}`;\n for (const member of cycle) {\n const binding = structuralBindings.find((b) => b.bindingName === member);\n /* v8 ignore next */\n if (binding === undefined) continue;\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-cycle\",\n message: `Dependency cycle detected: ${path}`,\n file: sourcePath,\n node: binding.defineCall,\n sourceFile,\n }),\n );\n }\n }\n\n const drawn: DrawnScript[] = [];\n const privateDeps: PrivateDep[] = [];\n // First emit any withInputs-derived alias bindings as synthetic\n // private deps so the bundler + runtime can mount one DepRunner\n // per unique alias. The alias has no `defineCall` of its own —\n // its compute body lives on the producer the alias chains off.\n for (const [aliasName, info] of effectiveInputsByBinding.entries()) {\n /* v8 ignore start */\n if (bindingsByName.has(aliasName)) continue;\n if (info.rootBinding === null) continue;\n /* v8 ignore stop */\n const producerRef: ProducerRef =\n info.rootBinding.kind === \"same-file\"\n ? Object.freeze({\n kind: \"same-file\",\n bindingName: info.rootBinding.binding.bindingName,\n })\n : Object.freeze({\n kind: \"cross-file\",\n sourcePath: info.rootBinding.sourcePath,\n exportName: info.rootBinding.exportName,\n });\n const aliasOutputs: ReadonlyArray<OutputDeclaration> =\n info.rootBinding.kind === \"same-file\"\n ? (outputsByBinding.get(info.rootBinding.binding.bindingName) as BindingOutputs)\n .outputs\n : info.rootBinding.snapshot.outputs;\n privateDeps.push(\n Object.freeze({\n localId: aliasName,\n producerRef,\n effectiveInputs: info.inputs,\n defineCall: null,\n outputs: aliasOutputs,\n consumes: Object.freeze([]),\n }),\n );\n }\n for (const binding of structuralBindings) {\n const outputs = (outputsByBinding.get(binding.bindingName) as BindingOutputs).outputs;\n const consumes = (consumesByBinding.get(binding.bindingName) as DepConsumesMutable[]).map(\n (entry) =>\n Object.freeze({\n localId: entry.localId,\n producerRef: entry.producerRef,\n outputs: entry.outputs,\n effectiveInputs: entry.effectiveInputs,\n }),\n );\n const frozenConsumes = Object.freeze(consumes);\n if (binding.exportKind === \"private\") {\n // Private structural bindings are always `const X =\n // defineIndicator(...)` direct calls — withInputs-derived\n // aliases live in `effectiveInputsByBinding` and were\n // already emitted as synthetic private deps above. Hence\n // the alias-via-private-binding branch is structurally\n // unreachable here.\n const producerRef: ProducerRef = Object.freeze({\n kind: \"same-file\",\n bindingName: binding.bindingName,\n });\n privateDeps.push(\n Object.freeze({\n localId: binding.bindingName,\n producerRef,\n effectiveInputs: Object.freeze({}),\n defineCall: binding.defineCall,\n outputs,\n consumes: frozenConsumes,\n }),\n );\n } else {\n drawn.push(\n Object.freeze({\n exportName: binding.exportKind === \"default\" ? \"default\" : binding.bindingName,\n bindingName: binding.bindingName,\n defineCall: binding.defineCall,\n outputs,\n consumes: frozenConsumes,\n }),\n );\n }\n }\n\n return Object.freeze({\n drawn: Object.freeze(drawn.slice()),\n privateDeps: Object.freeze(privateDeps.slice()),\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n\n/**\n * Colour-marking iterative DFS — returns every cycle found in the\n * directed adjacency map. Each cycle is the ordered list of node ids\n * along the back-edge. Used by `extractDependencyGraph` to surface\n * `dep-cycle` diagnostics at every binding in the cycle.\n */\nfunction detectCycles(edges: ReadonlyMap<string, ReadonlySet<string>>): string[][] {\n const WHITE = 0;\n const GREY = 1;\n const BLACK = 2;\n const colour = new Map<string, number>();\n for (const key of edges.keys()) colour.set(key, WHITE);\n\n const cycles: string[][] = [];\n const seenCycles = new Set<string>();\n\n const dfs = (start: string): void => {\n type Frame = { node: string; iter: Iterator<string> };\n const stack: Frame[] = [];\n const pathIndex = new Map<string, number>();\n const pathOrder: string[] = [];\n\n const targets = edges.get(start) ?? /* v8 ignore next */ new Set<string>();\n colour.set(start, GREY);\n pathIndex.set(start, 0);\n pathOrder.push(start);\n stack.push({ node: start, iter: targets[Symbol.iterator]() });\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n /* v8 ignore next */\n if (top === undefined) break;\n const next = top.iter.next();\n if (next.done) {\n colour.set(top.node, BLACK);\n pathIndex.delete(top.node);\n pathOrder.pop();\n stack.pop();\n continue;\n }\n const child = next.value;\n const childColour = colour.get(child) ?? /* v8 ignore next */ WHITE;\n if (childColour === BLACK) continue;\n if (childColour === GREY) {\n const startIdx = pathIndex.get(child);\n /* v8 ignore next */\n if (startIdx === undefined) continue;\n const cycle = pathOrder.slice(startIdx);\n const sortedKey = [...cycle].sort().join(\"|\");\n if (!seenCycles.has(sortedKey)) {\n seenCycles.add(sortedKey);\n cycles.push(cycle);\n }\n continue;\n }\n colour.set(child, GREY);\n pathIndex.set(child, pathOrder.length);\n pathOrder.push(child);\n const childTargets = edges.get(child) ?? /* v8 ignore next */ new Set<string>();\n stack.push({ node: child, iter: childTargets[Symbol.iterator]() });\n }\n };\n\n for (const key of edges.keys()) {\n if (colour.get(key) === WHITE) dfs(key);\n }\n return cycles;\n}\n"]}
1
+ {"version":3,"file":"extractDependencyGraph.js","sourceRoot":"","sources":["../../src/analysis/extractDependencyGraph.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { JsonValue, OutputDeclaration } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\nimport type { StructuralBindingInfo } from \"./structuralChecks.js\";\n\n/**\n * Producer reference recorded on a consumer-side `const` binding. The\n * same-file variant carries the local binding name; the cross-file\n * variant carries the resolved POSIX path + ES-module export name.\n *\n * @since 0.7\n * @stable\n * @example\n * const r: ProducerRef = { kind: \"same-file\", bindingName: \"baseTrend\" };\n * void r;\n */\nexport type ProducerRef =\n | Readonly<{ kind: \"same-file\"; bindingName: string }>\n | Readonly<{ kind: \"cross-file\"; sourcePath: string; exportName: string }>;\n\n/**\n * One dep-graph edge — consumer binding → producer with the merged\n * effective inputs the bundler needs to fold into the producer's\n * compiled module at emit time.\n *\n * @since 0.7\n * @stable\n * @example\n * declare const dummyOutputs: ReadonlyArray<OutputDeclaration>;\n * const e: DepConsumesEntry = {\n * localId: \"fastTrend\",\n * producerRef: { kind: \"same-file\", bindingName: \"baseTrend\" },\n * outputs: dummyOutputs,\n * effectiveInputs: { length: 20 },\n * };\n * void e;\n */\nexport type DepConsumesEntry = Readonly<{\n readonly localId: string;\n readonly producerRef: ProducerRef;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly effectiveInputs: Readonly<Record<string, JsonValue>>;\n}>;\n\n/**\n * One exported (drawn) indicator the file declares. `exportName` is\n * `\"default\"` for `export default`, the identifier text otherwise.\n *\n * @since 0.7\n * @stable\n * @example\n * // declare const callExpression: ts.CallExpression;\n * const d: DrawnScript = {\n * exportName: \"default\",\n * bindingName: \"default\",\n * defineCall: undefined as unknown as ts.CallExpression,\n * outputs: [],\n * consumes: [],\n * };\n * void d;\n */\nexport type DrawnScript = Readonly<{\n readonly exportName: string;\n readonly bindingName: string;\n readonly defineCall: ts.CallExpression;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly consumes: ReadonlyArray<DepConsumesEntry>;\n}>;\n\n/**\n * One private (data-only) dep binding the file declares. `defineCall`\n * is `null` when the dep is a cross-file binding (the AST node lives\n * in the producer's source file).\n *\n * @since 0.7\n * @stable\n * @example\n * const d: PrivateDep = {\n * localId: \"fastTrend\",\n * producerRef: { kind: \"same-file\", bindingName: \"baseTrend\" },\n * effectiveInputs: { length: 20 },\n * defineCall: null,\n * outputs: [],\n * consumes: [],\n * };\n * void d;\n */\nexport type PrivateDep = Readonly<{\n readonly localId: string;\n readonly producerRef: ProducerRef;\n readonly effectiveInputs: Readonly<Record<string, JsonValue>>;\n readonly defineCall: ts.CallExpression | null;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly consumes: ReadonlyArray<DepConsumesEntry>;\n}>;\n\n/**\n * Producer snapshot returned by `resolveProducer` for cross-file\n * `import X from \"./Y.chart\"` consumer references.\n *\n * @since 0.7\n * @stable\n * @example\n * const snap: ProducerSnapshot = { name: \"trend\", outputs: [], inputs: {} };\n * void snap;\n */\nexport type ProducerSnapshot = Readonly<{\n readonly name: string;\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly inputs: Readonly<Record<string, unknown>>;\n}>;\n\n/**\n * Callback the bundler supplies so the analysis pass can recursively\n * compile sibling `.chart.ts` files. Returns `null` when the producer\n * cannot be resolved (cycle, unknown path, no `defineIndicator(...)`).\n *\n * @since 0.7\n * @stable\n * @example\n * const r: ResolveProducer = () => null;\n * void r;\n */\nexport type ResolveProducer = (sourcePath: string, exportName: string) => ProducerSnapshot | null;\n\n/**\n * The compiled dep-graph artefact returned by `extractDependencyGraph`.\n * `drawn` + `privateDeps` are the indexed binding sets; `diagnostics`\n * is the union of every per-binding diagnostic surfaced during\n * walking + validation.\n *\n * @since 0.7\n * @stable\n * @example\n * const g: DepGraph = { drawn: [], privateDeps: [], diagnostics: [] };\n * void g;\n */\nexport type DepGraph = Readonly<{\n readonly drawn: ReadonlyArray<DrawnScript>;\n readonly privateDeps: ReadonlyArray<PrivateDep>;\n readonly diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\ntype BindingOutputs = Readonly<{\n readonly outputs: ReadonlyArray<OutputDeclaration>;\n readonly hasUntitledPlot: boolean;\n}>;\n\ntype DepConsumesMutable = {\n localId: string;\n producerRef: ProducerRef;\n outputs: ReadonlyArray<OutputDeclaration>;\n effectiveInputs: Readonly<Record<string, JsonValue>>;\n};\n\n/**\n * Read a JSON-clean literal from a TS expression — number, string,\n * boolean, or null. Returns `undefined` for non-literal expressions\n * (identifiers, computed access, calls, …).\n */\nfunction readJsonLiteral(node: ts.Expression): JsonValue | undefined {\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (ts.isStringLiteral(node)) return node.text;\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n return undefined;\n}\n\n/**\n * Read the function body the `compute` property assignment of a\n * `define*({ compute })` call literal points at. Returns `null` when\n * the property is missing or non-function (treat as zero plot calls).\n *\n * Handles both arrow functions (`compute: () => {}`) and method\n * shorthand (`compute() {}`).\n */\nfunction readComputeBody(defineCall: ts.CallExpression): ts.Node | null {\n const arg = defineCall.arguments[0];\n /* v8 ignore next */\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) return null;\n const computeProperty = arg.properties.find((property) => {\n const name = (property as { name?: ts.PropertyName }).name;\n return name !== undefined && ts.isIdentifier(name) && name.text === \"compute\";\n });\n if (computeProperty === undefined) return null;\n if (ts.isPropertyAssignment(computeProperty)) {\n const initializer = computeProperty.initializer;\n return ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)\n ? initializer.body\n : null;\n }\n /* v8 ignore start */\n if (ts.isMethodDeclaration(computeProperty)) {\n return computeProperty.body ?? null;\n }\n return null;\n}\n/* v8 ignore stop */\n\n/**\n * Sweep D — extract producer outputs from `plot(value, { title })`\n * calls inside the binding's compute body. Emits\n * `duplicate-output-title` for clashes.\n */\nfunction extractBindingOutputs(\n binding: StructuralBindingInfo,\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): BindingOutputs {\n const body = readComputeBody(binding.defineCall);\n const outputs: OutputDeclaration[] = [];\n const seenTitles = new Set<string>();\n let hasUntitledPlot = false;\n\n /* v8 ignore next 3 */\n if (body === null) {\n return Object.freeze({ outputs: Object.freeze(outputs.slice()), hasUntitledPlot });\n }\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const callee = resolveCalleeName(node, checker);\n // `bgcolor`/`barcolor` are plot-producing callees, so a binding\n // that only paints a background still counts as \"produces plots\"\n // (drives the `dep-output-not-titled` guard). Their `title` opt is\n // a plot label, NOT a `.output()`-referenceable series-number, so\n // they never add a titled output nor trip `duplicate-output-title`.\n if (callee === \"bgcolor\" || callee === \"barcolor\") {\n hasUntitledPlot = true;\n } else if (callee === \"plot\") {\n const optsArg = node.arguments[1];\n let title: string | undefined;\n if (optsArg !== undefined && ts.isObjectLiteralExpression(optsArg)) {\n for (const property of optsArg.properties) {\n /* v8 ignore next */\n if (!ts.isPropertyAssignment(property)) continue;\n const propertyName = property.name;\n if (!ts.isIdentifier(propertyName) || propertyName.text !== \"title\") {\n continue;\n }\n const initializer = property.initializer;\n /* v8 ignore next */\n if (!ts.isStringLiteral(initializer)) continue;\n title = initializer.text;\n }\n }\n if (title === undefined) {\n hasUntitledPlot = true;\n } else if (seenTitles.has(title)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"duplicate-output-title\",\n message: `\\`${binding.bindingName}\\` declares two outputs titled \"${title}\". Titles must be unique within a script.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n } else {\n seenTitles.add(title);\n outputs.push(Object.freeze({ title, kind: \"series-number\" as const }));\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(body, visit);\n return Object.freeze({ outputs: Object.freeze(outputs.slice()), hasUntitledPlot });\n}\n\ntype ChainResolution = Readonly<{\n readonly root: ts.Identifier;\n readonly inputs: Readonly<Record<string, JsonValue>>;\n readonly ok: boolean;\n}>;\n\n/**\n * Sweep B — resolve a `<binding>.withInputs({...}).withInputs({...})`\n * chain back to its rooted identifier and the merged effective-inputs\n * map. Emits `dep-dynamic` / `dep-invalid-input-override` for invalid\n * argument shapes.\n */\nfunction resolveWithInputsChain(\n expression: ts.Expression,\n sourceFile: ts.SourceFile,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): ChainResolution | null {\n type Layer = { args: ts.ObjectLiteralExpression; ok: boolean };\n const layers: Layer[] = [];\n let current: ts.Expression = expression;\n while (ts.isCallExpression(current)) {\n const callee = current.expression;\n /* v8 ignore next 2 */\n if (!ts.isPropertyAccessExpression(callee)) return null;\n if (callee.name.text !== \"withInputs\") return null;\n const arg = current.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.withInputs(...)` requires an object literal with literal-only property values.\",\n file: sourcePath,\n node: arg ?? /* v8 ignore next */ current,\n sourceFile,\n }),\n );\n layers.unshift({ args: ts.factory.createObjectLiteralExpression([]), ok: false });\n } else {\n layers.unshift({ args: arg, ok: true });\n }\n current = callee.expression;\n }\n /* v8 ignore next */\n if (!ts.isIdentifier(current)) return null;\n\n const merged: Record<string, JsonValue> = {};\n let ok = true;\n for (const layer of layers) {\n if (!layer.ok) {\n ok = false;\n continue;\n }\n for (const property of layer.args.properties) {\n if (!ts.isPropertyAssignment(property)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.withInputs(...)` requires a plain object literal — no spread, shorthand, or computed keys.\",\n file: sourcePath,\n node: property,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n const key = property.name;\n if (!ts.isIdentifier(key) && !ts.isStringLiteral(key)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: \"`.withInputs(...)` keys must be identifiers or string literals.\",\n file: sourcePath,\n node: key,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n const literal = readJsonLiteral(property.initializer);\n if (literal === undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: `\\`.withInputs({ ${key.text}: ... })\\` value must be a JSON literal (number, string, boolean, or null).`,\n file: sourcePath,\n node: property.initializer,\n sourceFile,\n }),\n );\n ok = false;\n continue;\n }\n merged[key.text] = literal;\n }\n }\n return Object.freeze({\n root: current,\n inputs: Object.freeze({ ...merged }),\n ok,\n });\n}\n\n/**\n * Validate an `effectiveInputs` map against the producer's `inputs`\n * schema. Each producer-input descriptor is shaped like\n * `{ kind: \"int\", defaultValue: 14, ... }`. Type-mismatch and unknown\n * keys both emit `dep-invalid-input-override`.\n */\nfunction validateInputOverrides(\n bindingName: string,\n inputs: Readonly<Record<string, JsonValue>>,\n producerInputs: Readonly<Record<string, unknown>>,\n node: ts.Node,\n sourceFile: ts.SourceFile,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): void {\n for (const [key, value] of Object.entries(inputs)) {\n const descriptor = producerInputs[key];\n if (descriptor === undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-invalid-input-override\",\n message: `\\`${bindingName}\\` overrides input \"${key}\" which the producer does not declare.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n continue;\n }\n const expectedKind =\n typeof descriptor === \"object\" && descriptor !== null && \"kind\" in descriptor\n ? (descriptor as { kind: unknown }).kind\n : undefined;\n if (typeof expectedKind === \"string\") {\n const valueType = describeJsonValueKind(value);\n const expectedType = expectedTypeForKind(expectedKind);\n if (expectedType !== null && expectedType !== valueType) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-invalid-input-override\",\n message: `\\`${bindingName}\\` override for \"${key}\" expects ${expectedType} (producer declared \\`${expectedKind}\\`), received ${valueType}.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n }\n }\n}\n\nfunction describeJsonValueKind(value: JsonValue): string {\n if (value === null) return \"null\";\n /* v8 ignore next */\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\nconst KIND_TO_VALUE_TYPE: ReadonlyMap<string, string> = new Map([\n [\"int\", \"number\"],\n [\"float\", \"number\"],\n [\"price\", \"number\"],\n [\"time\", \"number\"],\n [\"string\", \"string\"],\n [\"enum\", \"string\"],\n [\"color\", \"string\"],\n [\"symbol\", \"string\"],\n [\"interval\", \"string\"],\n [\"bool\", \"boolean\"],\n]);\n\nfunction expectedTypeForKind(kind: string): string | null {\n return KIND_TO_VALUE_TYPE.get(kind) ?? null;\n}\n\n/**\n * Walk back from a `<receiver>.output(\"title\")` callee to a same-file\n * binding identifier OR an imported identifier — whichever applies.\n * Returns the underlying identifier or `null` when the receiver is a\n * non-resolvable shape (computed access, call result, etc.).\n */\nfunction resolveOutputReceiverRoot(receiver: ts.Expression): ts.Identifier | null {\n if (ts.isIdentifier(receiver)) return receiver;\n return null;\n}\n\nfunction originIsImport(symbol: ts.Symbol): {\n moduleSpecifier: string;\n exportName: string;\n} | null {\n const declarations = symbol.declarations ?? /* v8 ignore next */ [];\n for (const declaration of declarations) {\n if (ts.isImportClause(declaration)) {\n const importDecl = declaration.parent;\n const specifier = importDecl.moduleSpecifier;\n /* v8 ignore next */\n if (!ts.isStringLiteral(specifier)) continue;\n return { moduleSpecifier: specifier.text, exportName: \"default\" };\n }\n if (ts.isImportSpecifier(declaration)) {\n const importDecl = declaration.parent.parent.parent;\n const specifier = importDecl.moduleSpecifier;\n /* v8 ignore next */\n if (!ts.isStringLiteral(specifier)) continue;\n const exportName = declaration.propertyName?.text ?? declaration.name.text;\n return { moduleSpecifier: specifier.text, exportName };\n }\n }\n return null;\n}\n\ntype ResolvedBinding =\n | Readonly<{ kind: \"same-file\"; binding: StructuralBindingInfo }>\n | Readonly<{\n kind: \"cross-file\";\n sourcePath: string;\n exportName: string;\n snapshot: ProducerSnapshot;\n }>;\n\nfunction resolveBinding(\n identifier: ts.Identifier,\n checker: ts.TypeChecker,\n bindingsByName: ReadonlyMap<string, StructuralBindingInfo>,\n resolveProducer: ResolveProducer,\n): ResolvedBinding | null {\n const sameFile = bindingsByName.get(identifier.text);\n if (sameFile !== undefined) {\n return Object.freeze({ kind: \"same-file\", binding: sameFile });\n }\n const symbol = checker.getSymbolAtLocation(identifier);\n /* v8 ignore next */\n if (symbol === undefined) return null;\n const importOrigin = originIsImport(symbol);\n if (importOrigin === null) return null;\n const snapshot = resolveProducer(importOrigin.moduleSpecifier, importOrigin.exportName);\n if (snapshot === null) return null;\n return Object.freeze({\n kind: \"cross-file\",\n sourcePath: importOrigin.moduleSpecifier,\n exportName: importOrigin.exportName,\n snapshot,\n });\n}\n\n/**\n * Run the dependency-graph analysis pass over a `.chart.ts` source\n * file. Sweeps the AST four times — outputs, withInputs chains,\n * consumer `.output(...)` calls, cycle detection — and returns a\n * frozen `DepGraph` plus the diagnostics surfaced along the way.\n *\n * `resolveProducer` is a caller-supplied callback that the bundler\n * (Task 3) wires to a recursive compile entry point. In Task 2 the\n * pass works against `() => null` for cross-file edges; tests pass\n * mocked snapshots instead.\n *\n * @since 0.7\n * @stable\n * @example\n * // const graph = extractDependencyGraph(sf, checker, \"demo.chart.ts\", bindings, () => null);\n * const fn: typeof extractDependencyGraph = extractDependencyGraph;\n * void fn;\n */\nexport function extractDependencyGraph(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n structuralBindings: ReadonlyArray<StructuralBindingInfo>,\n resolveProducer: ResolveProducer,\n): DepGraph {\n const diagnostics: CompileDiagnostic[] = [];\n const bindingsByName = new Map<string, StructuralBindingInfo>();\n for (const binding of structuralBindings) {\n if (binding.exportKind === \"default\") continue;\n bindingsByName.set(binding.bindingName, binding);\n }\n\n const outputsByBinding = new Map<string, BindingOutputs>();\n for (const binding of structuralBindings) {\n outputsByBinding.set(\n binding.bindingName,\n extractBindingOutputs(binding, sourceFile, checker, sourcePath, diagnostics),\n );\n }\n\n type BindingEffectiveInputs = Readonly<{\n rootName: string;\n rootBinding: ResolvedBinding | null;\n inputs: Readonly<Record<string, JsonValue>>;\n }>;\n const effectiveInputsByBinding = new Map<string, BindingEffectiveInputs>();\n\n for (const statement of sourceFile.statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n /* v8 ignore next */\n if (!ts.isIdentifier(declaration.name)) continue;\n const initializer = declaration.initializer;\n if (initializer === undefined) continue;\n if (!ts.isCallExpression(initializer)) continue;\n const callee = initializer.expression;\n if (ts.isPropertyAccessExpression(callee) && callee.name.text === \"withInputs\") {\n const chain = resolveWithInputsChain(\n initializer,\n sourceFile,\n sourcePath,\n diagnostics,\n );\n /* v8 ignore next */\n if (chain === null) continue;\n const root = resolveBinding(chain.root, checker, bindingsByName, resolveProducer);\n effectiveInputsByBinding.set(declaration.name.text, {\n rootName: chain.root.text,\n rootBinding: root,\n inputs: chain.inputs,\n });\n if (root !== null && chain.ok) {\n const producerInputs = root.kind === \"cross-file\" ? root.snapshot.inputs : {};\n validateInputOverrides(\n declaration.name.text,\n chain.inputs,\n producerInputs,\n initializer,\n sourceFile,\n sourcePath,\n diagnostics,\n );\n }\n }\n }\n }\n\n const consumesByBinding = new Map<string, DepConsumesMutable[]>();\n for (const binding of structuralBindings) {\n consumesByBinding.set(binding.bindingName, []);\n }\n\n for (const binding of structuralBindings) {\n const body = readComputeBody(binding.defineCall);\n if (body === null) continue;\n const consumerConsumes = consumesByBinding.get(binding.bindingName);\n /* v8 ignore next */\n if (consumerConsumes === undefined) continue;\n const seenLocalIds = new Set<string>();\n const visit = (node: ts.Node): void => {\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.name.text === \"output\"\n ) {\n const arg = node.arguments[0];\n if (arg === undefined || !ts.isStringLiteral(arg)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`<binding>.output(...)` requires a single string-literal argument.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n const title = arg.text;\n const root = resolveOutputReceiverRoot(node.expression.expression);\n if (root === null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message:\n \"`.output(...)` receiver must trace back to a `const`-bound `defineIndicator(...)` result.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n const effective = effectiveInputsByBinding.get(root.text);\n let resolvedRootName: string;\n let resolvedRoot: ResolvedBinding | null;\n let effectiveInputs: Readonly<Record<string, JsonValue>>;\n if (effective !== undefined) {\n resolvedRootName = effective.rootName;\n resolvedRoot = effective.rootBinding;\n effectiveInputs = effective.inputs;\n } else {\n resolvedRootName = root.text;\n resolvedRoot = resolveBinding(root, checker, bindingsByName, resolveProducer);\n effectiveInputs = Object.freeze({});\n }\n if (resolvedRoot === null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-dynamic\",\n message: `\\`.output(\"${title}\")\\` receiver \\`${root.text}\\` does not resolve to a known same-file or imported indicator binding.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n ts.forEachChild(node, visit);\n return;\n }\n\n const producerOutputs: ReadonlyArray<OutputDeclaration> =\n resolvedRoot.kind === \"same-file\"\n ? (outputsByBinding.get(resolvedRoot.binding.bindingName) as BindingOutputs)\n .outputs\n : resolvedRoot.snapshot.outputs;\n const producerHasUntitled =\n resolvedRoot.kind === \"same-file\" &&\n (outputsByBinding.get(resolvedRoot.binding.bindingName) as BindingOutputs)\n .hasUntitledPlot;\n const titles = new Set(producerOutputs.map((o) => o.title));\n if (!titles.has(title)) {\n if (producerHasUntitled) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-output-not-titled\",\n message: `Producer \\`${resolvedRootName}\\` declares an untitled \\`plot(...)\\` but consumer references \\`.output(\"${title}\")\\`. Title every \\`plot\\` the producer emits or remove the consumer reference.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n } else {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-unknown-output\",\n message: `Producer \\`${resolvedRootName}\\` does not declare an output titled \"${title}\".`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n ts.forEachChild(node, visit);\n return;\n }\n\n const localId = effective !== undefined ? root.text : root.text;\n if (!seenLocalIds.has(localId)) {\n seenLocalIds.add(localId);\n const producerRef: ProducerRef =\n resolvedRoot.kind === \"same-file\"\n ? Object.freeze({\n kind: \"same-file\",\n bindingName: resolvedRoot.binding.bindingName,\n })\n : Object.freeze({\n kind: \"cross-file\",\n sourcePath: resolvedRoot.sourcePath,\n exportName: resolvedRoot.exportName,\n });\n consumerConsumes.push({\n localId,\n producerRef,\n outputs: producerOutputs,\n effectiveInputs,\n });\n }\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(body, visit);\n }\n\n const sameFileEdges = new Map<string, Set<string>>();\n for (const [bindingName, consumes] of consumesByBinding.entries()) {\n const targets = new Set<string>();\n for (const entry of consumes) {\n if (entry.producerRef.kind === \"same-file\") {\n targets.add(entry.producerRef.bindingName);\n }\n }\n sameFileEdges.set(bindingName, targets);\n }\n const cycles = detectCycles(sameFileEdges);\n for (const cycle of cycles) {\n const path = `${cycle.join(\" -> \")} -> ${cycle[0] ?? /* v8 ignore next */ \"\"}`;\n for (const member of cycle) {\n const binding = structuralBindings.find((b) => b.bindingName === member);\n /* v8 ignore next */\n if (binding === undefined) continue;\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"dep-cycle\",\n message: `Dependency cycle detected: ${path}`,\n file: sourcePath,\n node: binding.defineCall,\n sourceFile,\n }),\n );\n }\n }\n\n const drawn: DrawnScript[] = [];\n const privateDeps: PrivateDep[] = [];\n // First emit any withInputs-derived alias bindings as synthetic\n // private deps so the bundler + runtime can mount one DepRunner\n // per unique alias. The alias has no `defineCall` of its own —\n // its compute body lives on the producer the alias chains off.\n for (const [aliasName, info] of effectiveInputsByBinding.entries()) {\n /* v8 ignore start */\n if (bindingsByName.has(aliasName)) continue;\n if (info.rootBinding === null) continue;\n /* v8 ignore stop */\n const producerRef: ProducerRef =\n info.rootBinding.kind === \"same-file\"\n ? Object.freeze({\n kind: \"same-file\",\n bindingName: info.rootBinding.binding.bindingName,\n })\n : Object.freeze({\n kind: \"cross-file\",\n sourcePath: info.rootBinding.sourcePath,\n exportName: info.rootBinding.exportName,\n });\n const aliasOutputs: ReadonlyArray<OutputDeclaration> =\n info.rootBinding.kind === \"same-file\"\n ? (outputsByBinding.get(info.rootBinding.binding.bindingName) as BindingOutputs)\n .outputs\n : info.rootBinding.snapshot.outputs;\n privateDeps.push(\n Object.freeze({\n localId: aliasName,\n producerRef,\n effectiveInputs: info.inputs,\n defineCall: null,\n outputs: aliasOutputs,\n consumes: Object.freeze([]),\n }),\n );\n }\n for (const binding of structuralBindings) {\n const outputs = (outputsByBinding.get(binding.bindingName) as BindingOutputs).outputs;\n const consumes = (consumesByBinding.get(binding.bindingName) as DepConsumesMutable[]).map(\n (entry) =>\n Object.freeze({\n localId: entry.localId,\n producerRef: entry.producerRef,\n outputs: entry.outputs,\n effectiveInputs: entry.effectiveInputs,\n }),\n );\n const frozenConsumes = Object.freeze(consumes);\n if (binding.exportKind === \"private\") {\n // Private structural bindings are always `const X =\n // defineIndicator(...)` direct calls — withInputs-derived\n // aliases live in `effectiveInputsByBinding` and were\n // already emitted as synthetic private deps above. Hence\n // the alias-via-private-binding branch is structurally\n // unreachable here.\n const producerRef: ProducerRef = Object.freeze({\n kind: \"same-file\",\n bindingName: binding.bindingName,\n });\n privateDeps.push(\n Object.freeze({\n localId: binding.bindingName,\n producerRef,\n effectiveInputs: Object.freeze({}),\n defineCall: binding.defineCall,\n outputs,\n consumes: frozenConsumes,\n }),\n );\n } else {\n drawn.push(\n Object.freeze({\n exportName: binding.exportKind === \"default\" ? \"default\" : binding.bindingName,\n bindingName: binding.bindingName,\n defineCall: binding.defineCall,\n outputs,\n consumes: frozenConsumes,\n }),\n );\n }\n }\n\n return Object.freeze({\n drawn: Object.freeze(drawn.slice()),\n privateDeps: Object.freeze(privateDeps.slice()),\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n\n/**\n * Colour-marking iterative DFS — returns every cycle found in the\n * directed adjacency map. Each cycle is the ordered list of node ids\n * along the back-edge. Used by `extractDependencyGraph` to surface\n * `dep-cycle` diagnostics at every binding in the cycle.\n */\nfunction detectCycles(edges: ReadonlyMap<string, ReadonlySet<string>>): string[][] {\n const WHITE = 0;\n const GREY = 1;\n const BLACK = 2;\n const colour = new Map<string, number>();\n for (const key of edges.keys()) colour.set(key, WHITE);\n\n const cycles: string[][] = [];\n const seenCycles = new Set<string>();\n\n const dfs = (start: string): void => {\n type Frame = { node: string; iter: Iterator<string> };\n const stack: Frame[] = [];\n const pathIndex = new Map<string, number>();\n const pathOrder: string[] = [];\n\n const targets = edges.get(start) ?? /* v8 ignore next */ new Set<string>();\n colour.set(start, GREY);\n pathIndex.set(start, 0);\n pathOrder.push(start);\n stack.push({ node: start, iter: targets[Symbol.iterator]() });\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n /* v8 ignore next */\n if (top === undefined) break;\n const next = top.iter.next();\n if (next.done) {\n colour.set(top.node, BLACK);\n pathIndex.delete(top.node);\n pathOrder.pop();\n stack.pop();\n continue;\n }\n const child = next.value;\n const childColour = colour.get(child) ?? /* v8 ignore next */ WHITE;\n if (childColour === BLACK) continue;\n if (childColour === GREY) {\n const startIdx = pathIndex.get(child);\n /* v8 ignore next */\n if (startIdx === undefined) continue;\n const cycle = pathOrder.slice(startIdx);\n const sortedKey = [...cycle].sort().join(\"|\");\n if (!seenCycles.has(sortedKey)) {\n seenCycles.add(sortedKey);\n cycles.push(cycle);\n }\n continue;\n }\n colour.set(child, GREY);\n pathIndex.set(child, pathOrder.length);\n pathOrder.push(child);\n const childTargets = edges.get(child) ?? /* v8 ignore next */ new Set<string>();\n stack.push({ node: child, iter: childTargets[Symbol.iterator]() });\n }\n };\n\n for (const key of edges.keys()) {\n if (colour.get(key) === WHITE) dfs(key);\n }\n return cycles;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extractInputs.d.ts","sourceRoot":"","sources":["../../src/analysis/extractInputs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AA0C7E;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACtD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,UAAU,GAAE,MAA4B,EACxC,KAAK,GAAE,EAAE,CAAC,IAAiB,GAC5B,mBAAmB,CAwErB"}
1
+ {"version":3,"file":"extractInputs.d.ts","sourceRoot":"","sources":["../../src/analysis/extractInputs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AA4C7E;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACtD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,UAAU,GAAE,MAA4B,EACxC,KAAK,GAAE,EAAE,CAAC,IAAiB,GAC5B,mBAAmB,CAwErB"}
@@ -22,6 +22,7 @@ const INPUT_KINDS = new Set([
22
22
  "price",
23
23
  "symbol",
24
24
  "interval",
25
+ "session",
25
26
  "externalSeries",
26
27
  ]);
27
28
  /** Wire-tag mapping — camelCase builder names become kebab-case manifest tags. */
@@ -37,6 +38,7 @@ const KIND_TO_WIRE = Object.freeze({
37
38
  price: "price",
38
39
  symbol: "symbol",
39
40
  interval: "interval",
41
+ session: "session",
40
42
  externalSeries: "external-series",
41
43
  });
42
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"extractInputs.js","sourceRoot":"","sources":["../../src/analysis/extractInputs.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\n\nconst DEFINE_CALLS = new Set([\n \"defineIndicator\",\n \"defineAlert\",\n \"defineDrawing\",\n \"defineAlertCondition\",\n]);\n\n/** Names the walker recognises as `input.*` calls. */\nconst INPUT_KINDS = new Set([\n \"int\",\n \"float\",\n \"bool\",\n \"string\",\n \"enum\",\n \"color\",\n \"source\",\n \"time\",\n \"price\",\n \"symbol\",\n \"interval\",\n \"externalSeries\",\n]);\n\n/** Wire-tag mapping — camelCase builder names become kebab-case manifest tags. */\nconst KIND_TO_WIRE: Readonly<Record<string, string>> = Object.freeze({\n int: \"int\",\n float: \"float\",\n bool: \"bool\",\n string: \"string\",\n enum: \"enum\",\n color: \"color\",\n source: \"source\",\n time: \"time\",\n price: \"price\",\n symbol: \"symbol\",\n interval: \"interval\",\n externalSeries: \"external-series\",\n});\n\n/**\n * Frozen, JSON-clean input descriptor extracted from a script's\n * `define*({ inputs })` object.\n *\n * @since 0.4\n * @example\n * const d: ExtractedDescriptor = { kind: \"int\", defaultValue: 14 };\n * void d;\n */\nexport type ExtractedDescriptor = Readonly<Record<string, unknown>>;\n\n/**\n * Result of input extraction. Diagnostics are hard errors when the\n * declaration uses an unknown builder or non-literal descriptor values.\n *\n * @since 0.4\n * @example\n * const r: ExtractInputsResult = {\n * inputs: { length: { kind: \"int\", defaultValue: 14 } },\n * userPickableInterval: false,\n * diagnostics: [],\n * };\n * void r;\n */\nexport type ExtractInputsResult = Readonly<{\n inputs: Readonly<Record<string, ExtractedDescriptor>>;\n userPickableInterval: boolean;\n diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\n/**\n * Walk a script's AST and serialise every `input.*` call inside\n * `defineIndicator({ inputs: { ... } })`, `defineAlert`, or\n * `defineDrawing` into the manifest's `inputs` record.\n *\n * The optional `scope` parameter narrows the walk to a single AST subtree\n * (typically one binding's `defineCall`) so multi-export files derive\n * per-binding inputs. Defaults to the whole `sourceFile`.\n *\n * @since 0.4\n * @example\n * // const r = extractInputs(sourceFile, checker, \"demo.chart.ts\");\n * // r.inputs.length === { kind: \"int\", defaultValue: 14 };\n * const fn: typeof extractInputs = extractInputs;\n * void fn;\n */\nexport function extractInputs(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string = sourceFile.fileName,\n scope: ts.Node = sourceFile,\n): ExtractInputsResult {\n const inputs: Record<string, ExtractedDescriptor> = {};\n const diagnostics: CompileDiagnostic[] = [];\n let userPickableInterval = false;\n let intervalCount = 0;\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && isDefineCall(node, checker)) {\n const inputsObject = readInputsArg(node);\n if (inputsObject !== null) {\n for (const property of inputsObject.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {\n continue;\n }\n const initializer = property.initializer;\n if (!ts.isCallExpression(initializer)) continue;\n const callee = resolveCalleeName(initializer, checker);\n if (callee === null || !callee.startsWith(\"input.\")) continue;\n\n const kind = callee.slice(\"input.\".length);\n if (!INPUT_KINDS.has(kind)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"unknown-input-kind\",\n message: `input.${kind} is not a recognised input builder`,\n file: sourcePath,\n node: initializer.expression,\n sourceFile,\n }),\n );\n continue;\n }\n\n const wireKind = KIND_TO_WIRE[kind] as string;\n if (wireKind === \"interval\") {\n intervalCount += 1;\n userPickableInterval = true;\n if (intervalCount > 1) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"multiple-input-interval\",\n message: \"Only one input.interval() per script (PLAN §4.5)\",\n file: sourcePath,\n node: initializer.expression,\n sourceFile,\n }),\n );\n }\n }\n\n const descriptor = serialiseDescriptor(wireKind, kind, initializer, {\n sourceFile,\n sourcePath,\n diagnostics,\n });\n if (descriptor !== null) {\n inputs[property.name.text] = descriptor;\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(scope);\n\n return Object.freeze({\n inputs: Object.freeze({ ...inputs }),\n userPickableInterval,\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n\ntype SerialiseContext = Readonly<{\n sourceFile: ts.SourceFile;\n sourcePath: string;\n diagnostics: CompileDiagnostic[];\n}>;\n\nfunction isDefineCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n const calleeName = resolveCalleeName(node, checker);\n return calleeName !== null && DEFINE_CALLS.has(calleeName);\n}\n\nfunction readInputsArg(node: ts.CallExpression): ts.ObjectLiteralExpression | null {\n const argument = node.arguments[0];\n if (argument === undefined || !ts.isObjectLiteralExpression(argument)) return null;\n for (const property of argument.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n if (!ts.isIdentifier(property.name) || property.name.text !== \"inputs\") continue;\n const initializer = property.initializer;\n if (ts.isObjectLiteralExpression(initializer)) return initializer;\n }\n return null;\n}\n\nfunction serialiseDescriptor(\n wireKind: string,\n builderKind: string,\n call: ts.CallExpression,\n context: SerialiseContext,\n): ExtractedDescriptor | null {\n if (wireKind === \"external-series\") {\n return serialiseExternalSeries(call, context);\n }\n\n const defaultArg = call.arguments[0];\n if (defaultArg === undefined) {\n addDefaultLiteralDiagnostic(builderKind, call.expression, context);\n return null;\n }\n const defaultValue = readLiteral(defaultArg);\n if (defaultValue === undefined || Array.isArray(defaultValue)) {\n addDefaultLiteralDiagnostic(builderKind, defaultArg, context);\n return null;\n }\n\n const descriptor: Record<string, unknown> = {\n kind: wireKind,\n defaultValue,\n };\n\n if (wireKind === \"enum\") {\n const optionsArg = call.arguments[1];\n const options = optionsArg === undefined ? null : readStringArray(optionsArg);\n if (options === null) {\n addDefaultLiteralDiagnostic(builderKind, optionsArg ?? call.expression, context);\n return null;\n }\n descriptor.options = Object.freeze(options.slice());\n copyObjectLiteralFields(call.arguments[2], descriptor, builderKind, context);\n } else {\n copyObjectLiteralFields(call.arguments[1], descriptor, builderKind, context);\n }\n\n return Object.freeze(descriptor);\n}\n\nfunction serialiseExternalSeries(\n call: ts.CallExpression,\n context: SerialiseContext,\n): ExtractedDescriptor | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n addDefaultLiteralDiagnostic(\"externalSeries\", arg ?? call.expression, context);\n return null;\n }\n\n const descriptor: Record<string, unknown> = { kind: \"external-series\" };\n let sawName = false;\n let sawSchema = false;\n\n for (const property of arg.properties) {\n if (ts.isShorthandPropertyAssignment(property) && property.name.text === \"schema\") {\n descriptor.schema = Object.freeze({ kind: \"external-series-schema\" });\n sawSchema = true;\n continue;\n }\n if (!ts.isPropertyAssignment(property)) continue;\n const key = propertyNameText(property.name);\n if (key === null) continue;\n if (key === \"name\") {\n const value = readLiteral(property.initializer);\n if (typeof value !== \"string\") {\n addDefaultLiteralDiagnostic(\"externalSeries\", property.initializer, context);\n return null;\n }\n descriptor.name = value;\n sawName = true;\n } else if (key === \"schema\") {\n descriptor.schema = Object.freeze({ kind: \"external-series-schema\" });\n sawSchema = true;\n } else if (key === \"title\") {\n const value = readLiteral(property.initializer);\n if (typeof value !== \"string\") {\n addDefaultLiteralDiagnostic(\"externalSeries\", property.initializer, context);\n return null;\n }\n descriptor.title = value;\n }\n }\n\n if (!sawName || !sawSchema) {\n addDefaultLiteralDiagnostic(\"externalSeries\", arg, context);\n return null;\n }\n return Object.freeze(descriptor);\n}\n\nfunction copyObjectLiteralFields(\n arg: ts.Expression | undefined,\n descriptor: Record<string, unknown>,\n builderKind: string,\n context: SerialiseContext,\n): void {\n if (arg === undefined) return;\n const unwrapped = unwrapConstAssertion(arg);\n if (!ts.isObjectLiteralExpression(unwrapped)) {\n addDefaultLiteralDiagnostic(builderKind, arg, context);\n return;\n }\n\n for (const property of unwrapped.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n const key = propertyNameText(property.name);\n if (key === null) continue;\n const value = readLiteral(property.initializer);\n if (value === undefined) {\n addDefaultLiteralDiagnostic(builderKind, property.initializer, context);\n continue;\n }\n descriptor[key] = value;\n }\n}\n\nfunction readLiteral(node: ts.Expression): unknown | undefined {\n const unwrapped = unwrapConstAssertion(node);\n if (ts.isNumericLiteral(unwrapped)) return Number(unwrapped.text);\n if (\n ts.isPrefixUnaryExpression(unwrapped) &&\n (unwrapped.operator === ts.SyntaxKind.MinusToken ||\n unwrapped.operator === ts.SyntaxKind.PlusToken) &&\n ts.isNumericLiteral(unwrapped.operand)\n ) {\n const value = Number(unwrapped.operand.text);\n return unwrapped.operator === ts.SyntaxKind.MinusToken ? -value : value;\n }\n if (ts.isStringLiteral(unwrapped) || ts.isNoSubstitutionTemplateLiteral(unwrapped)) {\n return unwrapped.text;\n }\n if (unwrapped.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (unwrapped.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (ts.isArrayLiteralExpression(unwrapped)) {\n const values: string[] = [];\n for (const element of unwrapped.elements) {\n const literal = readLiteral(element);\n if (typeof literal !== \"string\") return undefined;\n values.push(literal);\n }\n return Object.freeze(values);\n }\n return undefined;\n}\n\nfunction readStringArray(node: ts.Expression): ReadonlyArray<string> | null {\n const value = readLiteral(node);\n if (!Array.isArray(value)) return null;\n return Object.freeze(value.slice());\n}\n\nfunction unwrapConstAssertion(node: ts.Expression): ts.Expression {\n let current = node;\n while (ts.isParenthesizedExpression(current) || ts.isAsExpression(current)) {\n if (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n } else {\n current = current.expression;\n }\n }\n return current;\n}\n\nfunction propertyNameText(name: ts.PropertyName): string | null {\n if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n return null;\n}\n\nfunction addDefaultLiteralDiagnostic(kind: string, node: ts.Node, context: SerialiseContext): void {\n context.diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"input-default-not-literal\",\n message: `input.${kind} default must be a literal (number / string / boolean), not a variable reference`,\n file: context.sourcePath,\n node,\n sourceFile: context.sourceFile,\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"extractInputs.js","sourceRoot":"","sources":["../../src/analysis/extractInputs.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\n\nconst DEFINE_CALLS = new Set([\n \"defineIndicator\",\n \"defineAlert\",\n \"defineDrawing\",\n \"defineAlertCondition\",\n]);\n\n/** Names the walker recognises as `input.*` calls. */\nconst INPUT_KINDS = new Set([\n \"int\",\n \"float\",\n \"bool\",\n \"string\",\n \"enum\",\n \"color\",\n \"source\",\n \"time\",\n \"price\",\n \"symbol\",\n \"interval\",\n \"session\",\n \"externalSeries\",\n]);\n\n/** Wire-tag mapping — camelCase builder names become kebab-case manifest tags. */\nconst KIND_TO_WIRE: Readonly<Record<string, string>> = Object.freeze({\n int: \"int\",\n float: \"float\",\n bool: \"bool\",\n string: \"string\",\n enum: \"enum\",\n color: \"color\",\n source: \"source\",\n time: \"time\",\n price: \"price\",\n symbol: \"symbol\",\n interval: \"interval\",\n session: \"session\",\n externalSeries: \"external-series\",\n});\n\n/**\n * Frozen, JSON-clean input descriptor extracted from a script's\n * `define*({ inputs })` object.\n *\n * @since 0.4\n * @example\n * const d: ExtractedDescriptor = { kind: \"int\", defaultValue: 14 };\n * void d;\n */\nexport type ExtractedDescriptor = Readonly<Record<string, unknown>>;\n\n/**\n * Result of input extraction. Diagnostics are hard errors when the\n * declaration uses an unknown builder or non-literal descriptor values.\n *\n * @since 0.4\n * @example\n * const r: ExtractInputsResult = {\n * inputs: { length: { kind: \"int\", defaultValue: 14 } },\n * userPickableInterval: false,\n * diagnostics: [],\n * };\n * void r;\n */\nexport type ExtractInputsResult = Readonly<{\n inputs: Readonly<Record<string, ExtractedDescriptor>>;\n userPickableInterval: boolean;\n diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\n/**\n * Walk a script's AST and serialise every `input.*` call inside\n * `defineIndicator({ inputs: { ... } })`, `defineAlert`, or\n * `defineDrawing` into the manifest's `inputs` record.\n *\n * The optional `scope` parameter narrows the walk to a single AST subtree\n * (typically one binding's `defineCall`) so multi-export files derive\n * per-binding inputs. Defaults to the whole `sourceFile`.\n *\n * @since 0.4\n * @example\n * // const r = extractInputs(sourceFile, checker, \"demo.chart.ts\");\n * // r.inputs.length === { kind: \"int\", defaultValue: 14 };\n * const fn: typeof extractInputs = extractInputs;\n * void fn;\n */\nexport function extractInputs(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string = sourceFile.fileName,\n scope: ts.Node = sourceFile,\n): ExtractInputsResult {\n const inputs: Record<string, ExtractedDescriptor> = {};\n const diagnostics: CompileDiagnostic[] = [];\n let userPickableInterval = false;\n let intervalCount = 0;\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && isDefineCall(node, checker)) {\n const inputsObject = readInputsArg(node);\n if (inputsObject !== null) {\n for (const property of inputsObject.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {\n continue;\n }\n const initializer = property.initializer;\n if (!ts.isCallExpression(initializer)) continue;\n const callee = resolveCalleeName(initializer, checker);\n if (callee === null || !callee.startsWith(\"input.\")) continue;\n\n const kind = callee.slice(\"input.\".length);\n if (!INPUT_KINDS.has(kind)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"unknown-input-kind\",\n message: `input.${kind} is not a recognised input builder`,\n file: sourcePath,\n node: initializer.expression,\n sourceFile,\n }),\n );\n continue;\n }\n\n const wireKind = KIND_TO_WIRE[kind] as string;\n if (wireKind === \"interval\") {\n intervalCount += 1;\n userPickableInterval = true;\n if (intervalCount > 1) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"multiple-input-interval\",\n message: \"Only one input.interval() per script (PLAN §4.5)\",\n file: sourcePath,\n node: initializer.expression,\n sourceFile,\n }),\n );\n }\n }\n\n const descriptor = serialiseDescriptor(wireKind, kind, initializer, {\n sourceFile,\n sourcePath,\n diagnostics,\n });\n if (descriptor !== null) {\n inputs[property.name.text] = descriptor;\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(scope);\n\n return Object.freeze({\n inputs: Object.freeze({ ...inputs }),\n userPickableInterval,\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n\ntype SerialiseContext = Readonly<{\n sourceFile: ts.SourceFile;\n sourcePath: string;\n diagnostics: CompileDiagnostic[];\n}>;\n\nfunction isDefineCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n const calleeName = resolveCalleeName(node, checker);\n return calleeName !== null && DEFINE_CALLS.has(calleeName);\n}\n\nfunction readInputsArg(node: ts.CallExpression): ts.ObjectLiteralExpression | null {\n const argument = node.arguments[0];\n if (argument === undefined || !ts.isObjectLiteralExpression(argument)) return null;\n for (const property of argument.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n if (!ts.isIdentifier(property.name) || property.name.text !== \"inputs\") continue;\n const initializer = property.initializer;\n if (ts.isObjectLiteralExpression(initializer)) return initializer;\n }\n return null;\n}\n\nfunction serialiseDescriptor(\n wireKind: string,\n builderKind: string,\n call: ts.CallExpression,\n context: SerialiseContext,\n): ExtractedDescriptor | null {\n if (wireKind === \"external-series\") {\n return serialiseExternalSeries(call, context);\n }\n\n const defaultArg = call.arguments[0];\n if (defaultArg === undefined) {\n addDefaultLiteralDiagnostic(builderKind, call.expression, context);\n return null;\n }\n const defaultValue = readLiteral(defaultArg);\n if (defaultValue === undefined || Array.isArray(defaultValue)) {\n addDefaultLiteralDiagnostic(builderKind, defaultArg, context);\n return null;\n }\n\n const descriptor: Record<string, unknown> = {\n kind: wireKind,\n defaultValue,\n };\n\n if (wireKind === \"enum\") {\n const optionsArg = call.arguments[1];\n const options = optionsArg === undefined ? null : readStringArray(optionsArg);\n if (options === null) {\n addDefaultLiteralDiagnostic(builderKind, optionsArg ?? call.expression, context);\n return null;\n }\n descriptor.options = Object.freeze(options.slice());\n copyObjectLiteralFields(call.arguments[2], descriptor, builderKind, context);\n } else {\n copyObjectLiteralFields(call.arguments[1], descriptor, builderKind, context);\n }\n\n return Object.freeze(descriptor);\n}\n\nfunction serialiseExternalSeries(\n call: ts.CallExpression,\n context: SerialiseContext,\n): ExtractedDescriptor | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n addDefaultLiteralDiagnostic(\"externalSeries\", arg ?? call.expression, context);\n return null;\n }\n\n const descriptor: Record<string, unknown> = { kind: \"external-series\" };\n let sawName = false;\n let sawSchema = false;\n\n for (const property of arg.properties) {\n if (ts.isShorthandPropertyAssignment(property) && property.name.text === \"schema\") {\n descriptor.schema = Object.freeze({ kind: \"external-series-schema\" });\n sawSchema = true;\n continue;\n }\n if (!ts.isPropertyAssignment(property)) continue;\n const key = propertyNameText(property.name);\n if (key === null) continue;\n if (key === \"name\") {\n const value = readLiteral(property.initializer);\n if (typeof value !== \"string\") {\n addDefaultLiteralDiagnostic(\"externalSeries\", property.initializer, context);\n return null;\n }\n descriptor.name = value;\n sawName = true;\n } else if (key === \"schema\") {\n descriptor.schema = Object.freeze({ kind: \"external-series-schema\" });\n sawSchema = true;\n } else if (key === \"title\") {\n const value = readLiteral(property.initializer);\n if (typeof value !== \"string\") {\n addDefaultLiteralDiagnostic(\"externalSeries\", property.initializer, context);\n return null;\n }\n descriptor.title = value;\n }\n }\n\n if (!sawName || !sawSchema) {\n addDefaultLiteralDiagnostic(\"externalSeries\", arg, context);\n return null;\n }\n return Object.freeze(descriptor);\n}\n\nfunction copyObjectLiteralFields(\n arg: ts.Expression | undefined,\n descriptor: Record<string, unknown>,\n builderKind: string,\n context: SerialiseContext,\n): void {\n if (arg === undefined) return;\n const unwrapped = unwrapConstAssertion(arg);\n if (!ts.isObjectLiteralExpression(unwrapped)) {\n addDefaultLiteralDiagnostic(builderKind, arg, context);\n return;\n }\n\n for (const property of unwrapped.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n const key = propertyNameText(property.name);\n if (key === null) continue;\n const value = readLiteral(property.initializer);\n if (value === undefined) {\n addDefaultLiteralDiagnostic(builderKind, property.initializer, context);\n continue;\n }\n descriptor[key] = value;\n }\n}\n\nfunction readLiteral(node: ts.Expression): unknown | undefined {\n const unwrapped = unwrapConstAssertion(node);\n if (ts.isNumericLiteral(unwrapped)) return Number(unwrapped.text);\n if (\n ts.isPrefixUnaryExpression(unwrapped) &&\n (unwrapped.operator === ts.SyntaxKind.MinusToken ||\n unwrapped.operator === ts.SyntaxKind.PlusToken) &&\n ts.isNumericLiteral(unwrapped.operand)\n ) {\n const value = Number(unwrapped.operand.text);\n return unwrapped.operator === ts.SyntaxKind.MinusToken ? -value : value;\n }\n if (ts.isStringLiteral(unwrapped) || ts.isNoSubstitutionTemplateLiteral(unwrapped)) {\n return unwrapped.text;\n }\n if (unwrapped.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (unwrapped.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (ts.isArrayLiteralExpression(unwrapped)) {\n const values: string[] = [];\n for (const element of unwrapped.elements) {\n const literal = readLiteral(element);\n if (typeof literal !== \"string\") return undefined;\n values.push(literal);\n }\n return Object.freeze(values);\n }\n return undefined;\n}\n\nfunction readStringArray(node: ts.Expression): ReadonlyArray<string> | null {\n const value = readLiteral(node);\n if (!Array.isArray(value)) return null;\n return Object.freeze(value.slice());\n}\n\nfunction unwrapConstAssertion(node: ts.Expression): ts.Expression {\n let current = node;\n while (ts.isParenthesizedExpression(current) || ts.isAsExpression(current)) {\n if (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n } else {\n current = current.expression;\n }\n }\n return current;\n}\n\nfunction propertyNameText(name: ts.PropertyName): string | null {\n if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n return null;\n}\n\nfunction addDefaultLiteralDiagnostic(kind: string, node: ts.Node, context: SerialiseContext): void {\n context.diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"input-default-not-literal\",\n message: `input.${kind} default must be a literal (number / string / boolean), not a variable reference`,\n file: context.sourcePath,\n node,\n sourceFile: context.sourceFile,\n }),\n );\n}\n"]}
@@ -24,7 +24,8 @@ export type ExtractMaxLookbackResult = Readonly<{
24
24
  * Walk the source file's `ElementAccessExpression` nodes and infer
25
25
  * `maxLookback` plus any `dynamicFallback` capacity from non-literal index
26
26
  * reads on Phase-1 series shapes: `bar.<ohlcv>[N]`, `ta.<name>(...)[N]`,
27
- * and identifier-bound series variables (`const e = ta.ema(...); e[N];`).
27
+ * and identifier-bound series variables (`const e = ta.ema(...); e[N];` or
28
+ * `const s = state.series(...); s[N];`).
28
29
  *
29
30
  * The optional `scope` parameter narrows both the series-variable
30
31
  * collection and the lookback walk to a single AST subtree (typically
@@ -1 +1 @@
1
- {"version":3,"file":"extractMaxLookback.d.ts","sourceRoot":"","sources":["../../src/analysis/extractMaxLookback.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAK7E;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,EAAE,CAAC,IAAiB,GAC5B,wBAAwB,CAuC1B"}
1
+ {"version":3,"file":"extractMaxLookback.d.ts","sourceRoot":"","sources":["../../src/analysis/extractMaxLookback.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAO7E;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,EAAE,CAAC,IAAiB,GAC5B,wBAAwB,CAmD1B"}
@@ -3,12 +3,15 @@
3
3
  import ts from "typescript";
4
4
  import { createDiagnostic } from "../diagnostics.js";
5
5
  import { resolveCalleeName } from "../transformers/resolveCallee.js";
6
+ import { unwrapParens } from "./loopBounds.js";
7
+ import { collectConstNumberEnv, resolveIndexUpperBound } from "./resolveIndexBound.js";
6
8
  const OHLCV_FIELDS = new Set(["close", "open", "high", "low", "volume", "time"]);
7
9
  /**
8
10
  * Walk the source file's `ElementAccessExpression` nodes and infer
9
11
  * `maxLookback` plus any `dynamicFallback` capacity from non-literal index
10
12
  * reads on Phase-1 series shapes: `bar.<ohlcv>[N]`, `ta.<name>(...)[N]`,
11
- * and identifier-bound series variables (`const e = ta.ema(...); e[N];`).
13
+ * and identifier-bound series variables (`const e = ta.ema(...); e[N];` or
14
+ * `const s = state.series(...); s[N];`).
12
15
  *
13
16
  * The optional `scope` parameter narrows both the series-variable
14
17
  * collection and the lookback walk to a single AST subtree (typically
@@ -28,13 +31,27 @@ export function extractMaxLookback(sourceFile, checker, sourcePath, scope = sour
28
31
  const diagnostics = [];
29
32
  const seriesVarNames = collectSeriesVarNames(scope, checker);
30
33
  const visit = (node) => {
34
+ if (ts.isCallExpression(node)) {
35
+ const calleeName = resolveCalleeName(node, checker);
36
+ if (calleeName?.startsWith("ta.")) {
37
+ const barsDepth = readHighestLowestBarsDepth(calleeName, node);
38
+ if (barsDepth > maxLookback)
39
+ maxLookback = barsDepth;
40
+ }
41
+ if (isBarPointCall(node)) {
42
+ const depth = readBarPointLookback(node);
43
+ if (depth > maxLookback)
44
+ maxLookback = depth;
45
+ }
46
+ }
31
47
  if (ts.isElementAccessExpression(node)) {
32
48
  if (isSeriesShapedAccess(node, checker, seriesVarNames)) {
33
49
  const argument = node.argumentExpression;
34
- if (ts.isNumericLiteral(argument)) {
35
- const n = Number(argument.text);
36
- if (Number.isFinite(n) && n > maxLookback)
37
- maxLookback = n;
50
+ const constEnv = collectConstNumberEnv(argument, scope);
51
+ const bound = resolveIndexUpperBound(argument, node, { constEnv, checker });
52
+ if (bound !== null) {
53
+ if (bound > maxLookback)
54
+ maxLookback = bound;
38
55
  }
39
56
  else {
40
57
  diagnostics.push(createDiagnostic({
@@ -58,6 +75,46 @@ export function extractMaxLookback(sourceFile, checker, sourcePath, scope = sour
58
75
  diagnostics: Object.freeze(diagnostics.slice()),
59
76
  });
60
77
  }
78
+ /**
79
+ * Whether a call is a `bar.point(…)` invocation. Matched textually on the
80
+ * `bar.point` property-access shape — the same OHLCV-style textual recognition
81
+ * `isSeriesShapedAccess` uses — so it fires for both the destructured
82
+ * `compute({ bar })` binding and a `declare const bar: Bar` test fixture.
83
+ */
84
+ function isBarPointCall(call) {
85
+ const expression = call.expression;
86
+ return (ts.isPropertyAccessExpression(expression) &&
87
+ expression.name.text === "point" &&
88
+ ts.isIdentifier(expression.expression) &&
89
+ expression.expression.text === "bar");
90
+ }
91
+ /**
92
+ * The historical-lookback depth a `bar.point(offset, …)` call contributes,
93
+ * or `0` when it reads the current / a future bar. A negative integer-literal
94
+ * first argument (`bar.point(-N, …)` — or the converter's parenthesised
95
+ * `bar.point(-(N), …)`) anchors `N` bars back, so the runtime's time ring
96
+ * buffer must retain `N` extra slots — exactly like a `series[N]` lookback.
97
+ * `bar.point(0, …)` (current) and positive offsets (future, extrapolated, no
98
+ * buffer depth) contribute `0`; a non-literal / dynamic offset (e.g. a bound
99
+ * `-k` or a computed `-(2 + 3)`) cannot be sized at compile time and also
100
+ * contributes `0` (reads past retention degrade to a NaN time at runtime, per
101
+ * `bar.point`'s contract).
102
+ */
103
+ function readBarPointLookback(call) {
104
+ const first = call.arguments[0];
105
+ if (first === undefined)
106
+ return 0;
107
+ const expr = unwrapParens(first);
108
+ if (ts.isPrefixUnaryExpression(expr) && expr.operator === ts.SyntaxKind.MinusToken) {
109
+ const operand = unwrapParens(expr.operand);
110
+ if (ts.isNumericLiteral(operand)) {
111
+ const n = Number(operand.text);
112
+ if (Number.isFinite(n) && n > 0)
113
+ return n;
114
+ }
115
+ }
116
+ return 0;
117
+ }
61
118
  function collectSeriesVarNames(scope, checker) {
62
119
  const names = new Set();
63
120
  const visit = (node) => {
@@ -65,7 +122,14 @@ function collectSeriesVarNames(scope, checker) {
65
122
  const initializer = node.initializer;
66
123
  if (initializer && ts.isCallExpression(initializer)) {
67
124
  const calleeName = resolveCalleeName(initializer, checker);
68
- if (calleeName?.startsWith("ta.")) {
125
+ // A `state.series(...)`-bound variable is series-shaped just
126
+ // like a `ta.*`-bound one: `s[N]` reads the slot's ring buffer,
127
+ // so its literal index must fold into `maxLookback`. Matched on
128
+ // the resolved callee name (the slot-injection path) so an
129
+ // element-access form like `state["series"](...)` is not
130
+ // recognised — that form is rejected upstream as
131
+ // `stateful-call-element-access`.
132
+ if (calleeName?.startsWith("ta.") || calleeName === "state.series") {
69
133
  names.add(node.name.text);
70
134
  }
71
135
  }
@@ -75,6 +139,26 @@ function collectSeriesVarNames(scope, checker) {
75
139
  visit(scope);
76
140
  return names;
77
141
  }
142
+ /**
143
+ * The historical-lookback depth a `ta.highestbars` / `ta.lowestbars` call
144
+ * contributes. Both primitives return the bar OFFSET (≤ 0) to the extreme
145
+ * over the trailing `length`-bar window, so the deepest offset they can
146
+ * return is `-(length − 1)`. A downstream `bar.point(<that offset>, …)`
147
+ * anchor reads `time.at(length − 1)`, so the runtime's time ring buffer
148
+ * must retain `length − 1` slots. Only a LITERAL second positional `length`
149
+ * arg can be sized at compile time; a non-literal length contributes `0`.
150
+ */
151
+ function readHighestLowestBarsDepth(calleeName, call) {
152
+ if (calleeName !== "ta.highestbars" && calleeName !== "ta.lowestbars")
153
+ return 0;
154
+ const lengthArg = call.arguments[1];
155
+ if (lengthArg === undefined || !ts.isNumericLiteral(lengthArg))
156
+ return 0;
157
+ const length = Number(lengthArg.text);
158
+ if (!Number.isFinite(length) || length <= 1)
159
+ return 0;
160
+ return length - 1;
161
+ }
78
162
  function isSeriesShapedAccess(node, checker, seriesVarNames) {
79
163
  const expression = node.expression;
80
164
  if (ts.isPropertyAccessExpression(expression)) {