@invinite-org/chartlang-compiler 1.2.0 → 1.3.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 (66) hide show
  1. package/CHANGELOG.md +254 -0
  2. package/dist/analysis/extractAlertConditions.js.map +1 -1
  3. package/dist/analysis/extractCapabilities.js.map +1 -1
  4. package/dist/analysis/extractDependencyGraph.js.map +1 -1
  5. package/dist/analysis/extractInputs.js.map +1 -1
  6. package/dist/analysis/extractMaxLookback.d.ts +2 -1
  7. package/dist/analysis/extractMaxLookback.d.ts.map +1 -1
  8. package/dist/analysis/extractMaxLookback.js +90 -6
  9. package/dist/analysis/extractMaxLookback.js.map +1 -1
  10. package/dist/analysis/extractRequestedIntervals.d.ts +43 -1
  11. package/dist/analysis/extractRequestedIntervals.d.ts.map +1 -1
  12. package/dist/analysis/extractRequestedIntervals.js +95 -10
  13. package/dist/analysis/extractRequestedIntervals.js.map +1 -1
  14. package/dist/analysis/extractRequiresIntervals.js.map +1 -1
  15. package/dist/analysis/forbiddenConstructs.d.ts.map +1 -1
  16. package/dist/analysis/forbiddenConstructs.js +2 -41
  17. package/dist/analysis/forbiddenConstructs.js.map +1 -1
  18. package/dist/analysis/index.d.ts +3 -1
  19. package/dist/analysis/index.d.ts.map +1 -1
  20. package/dist/analysis/index.js +2 -1
  21. package/dist/analysis/index.js.map +1 -1
  22. package/dist/analysis/loopBounds.d.ts +91 -0
  23. package/dist/analysis/loopBounds.d.ts.map +1 -0
  24. package/dist/analysis/loopBounds.js +132 -0
  25. package/dist/analysis/loopBounds.js.map +1 -0
  26. package/dist/analysis/resolveIndexBound.d.ts +73 -0
  27. package/dist/analysis/resolveIndexBound.d.ts.map +1 -0
  28. package/dist/analysis/resolveIndexBound.js +336 -0
  29. package/dist/analysis/resolveIndexBound.js.map +1 -0
  30. package/dist/analysis/statefulCallInLoop.js.map +1 -1
  31. package/dist/analysis/structuralChecks.js.map +1 -1
  32. package/dist/analysis/validateLowerTfIntervals.js.map +1 -1
  33. package/dist/analysis/validateSecurityExpr.d.ts +25 -0
  34. package/dist/analysis/validateSecurityExpr.d.ts.map +1 -0
  35. package/dist/analysis/validateSecurityExpr.js +154 -0
  36. package/dist/analysis/validateSecurityExpr.js.map +1 -0
  37. package/dist/api.d.ts.map +1 -1
  38. package/dist/api.js +13 -3
  39. package/dist/api.js.map +1 -1
  40. package/dist/bundle.js.map +1 -1
  41. package/dist/dependency/index.js.map +1 -1
  42. package/dist/dependency/resolveProducer.js.map +1 -1
  43. package/dist/diagnostics.d.ts +4 -2
  44. package/dist/diagnostics.d.ts.map +1 -1
  45. package/dist/diagnostics.js.map +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/manifest.d.ts +2 -1
  48. package/dist/manifest.d.ts.map +1 -1
  49. package/dist/manifest.js +7 -0
  50. package/dist/manifest.js.map +1 -1
  51. package/dist/program.d.ts.map +1 -1
  52. package/dist/program.js +91 -14
  53. package/dist/program.js.map +1 -1
  54. package/dist/transformers/callsiteIdInjection.d.ts +21 -0
  55. package/dist/transformers/callsiteIdInjection.d.ts.map +1 -1
  56. package/dist/transformers/callsiteIdInjection.js +26 -3
  57. package/dist/transformers/callsiteIdInjection.js.map +1 -1
  58. package/dist/transformers/index.js.map +1 -1
  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/dist/transformers/rewriteDependencyAccessors.js.map +1 -1
  65. package/dist/typesEmit.js.map +1 -1
  66. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveIndexBound.js","sourceRoot":"","sources":["../../src/analysis/resolveIndexBound.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 {\n type BoundedForLoop,\n boundedLoopVarId,\n parseBoundedForLoop,\n unwrapParens,\n} from \"./loopBounds.js\";\n\n/**\n * Compile-time context for resolving a series index's upper bound.\n *\n * @since 0.1\n * @stable\n * @example\n * const ctx: IndexBoundContext = {\n * constEnv: new Map([[\"k\", 3]]),\n * checker, // ts.TypeChecker\n * };\n * void ctx;\n */\nexport type IndexBoundContext = Readonly<{\n /** `const <id> = <numeric literal>` bindings visible at the index use site. */\n constEnv: ReadonlyMap<string, number>;\n /** Checker used to avoid resolving loop variables through a shadowed name. */\n checker: ts.TypeChecker;\n}>;\n\n/**\n * The compile-time integer range an index sub-expression can span. Every\n * input is an integer and `+`/`−`/`*`/unary-`±` preserve integers, so the\n * endpoints are exact integers — no rounding and no `Number.isInteger`\n * guard is needed.\n */\ntype Interval = Readonly<{ lo: number; hi: number }>;\n\n/**\n * The provable maximum non-negative integer a series-index expression\n * can reach at runtime, or `null` when no sound upper bound exists.\n * Over-approximates: a result is always `>=` the true max index, so the\n * runtime buffer (sized `maxLookback + 1`) never under-sizes. `null`\n * signals the caller to fall back to the 5000-slot dynamic buffer.\n *\n * Resolves any expression built from numeric literals, `const`\n * numeric-literal bindings (`ctx.constEnv`), bounded-loop induction\n * variables (resolved to their full range), the binary operators `+`,\n * `−`, `*`, unary `±`, and parentheses, by computing its integer\n * interval and returning the **upper** endpoint. Any other node (another\n * identifier, a call, `/`, `%`, `**`, a bitwise op, a non-numeric\n * literal) collapses the containing interval — and thus the whole\n * index — to `null`.\n *\n * @since 0.1\n * @stable\n * @example\n * // for (let i = 0; i < 5; i++) { series[i + 1]; }\n * // resolveIndexUpperBound(<the `i + 1` arg>, <access node>, ctx) → 5\n * const fn: typeof resolveIndexUpperBound = resolveIndexUpperBound;\n * void fn;\n */\nexport function resolveIndexUpperBound(\n argument: ts.Expression,\n node: ts.Node,\n ctx: IndexBoundContext,\n): number | null {\n const interval = evalInterval(argument, node, ctx);\n return interval === null ? null : interval.hi;\n}\n\n/**\n * The integer interval an index sub-expression spans, or `null` when any\n * leaf or operator cannot be soundly bounded. The single evaluator that\n * subsumes the leaf cases (literal / bounded-loop var / `const` number)\n * and their affine combinations (`+`, `−`, `*`, unary `±`, parens).\n */\nfunction evalInterval(expr: ts.Expression, node: ts.Node, ctx: IndexBoundContext): Interval | null {\n const inner = unwrapParens(expr);\n\n if (ts.isNumericLiteral(inner)) {\n const value = Number(inner.text);\n return finiteInterval(value, value);\n }\n\n if (ts.isIdentifier(inner)) {\n const loopInterval = resolveLoopVarInterval(inner, node, ctx.checker);\n if (loopInterval !== null) return loopInterval;\n const constValue = ctx.constEnv.get(inner.text);\n return constValue === undefined ? null : finiteInterval(constValue, constValue);\n }\n\n if (ts.isPrefixUnaryExpression(inner)) {\n if (inner.operator === ts.SyntaxKind.PlusToken) {\n return evalInterval(inner.operand, node, ctx);\n }\n if (inner.operator === ts.SyntaxKind.MinusToken) {\n const operand = evalInterval(inner.operand, node, ctx);\n return operand === null ? null : finiteInterval(-operand.hi, -operand.lo);\n }\n return null;\n }\n\n if (ts.isBinaryExpression(inner)) {\n return evalBinaryInterval(inner, node, ctx);\n }\n\n return null;\n}\n\n/**\n * The interval of a `+`/`−`/`*` over two sub-intervals, or `null` when\n * either operand is unbounded or the operator is unsupported (`/`, `%`,\n * `**`, bitwise, …). Multiplication takes the min/max of the four\n * endpoint products so the bound is correct for any sign combination.\n */\nfunction evalBinaryInterval(\n expr: ts.BinaryExpression,\n node: ts.Node,\n ctx: IndexBoundContext,\n): Interval | null {\n const left = evalInterval(expr.left, node, ctx);\n if (left === null) return null;\n const right = evalInterval(expr.right, node, ctx);\n if (right === null) return null;\n\n switch (expr.operatorToken.kind) {\n case ts.SyntaxKind.PlusToken:\n return finiteInterval(left.lo + right.lo, left.hi + right.hi);\n case ts.SyntaxKind.MinusToken:\n return finiteInterval(left.lo - right.hi, left.hi - right.lo);\n case ts.SyntaxKind.AsteriskToken: {\n const products = [\n left.lo * right.lo,\n left.lo * right.hi,\n left.hi * right.lo,\n left.hi * right.hi,\n ];\n return finiteInterval(Math.min(...products), Math.max(...products));\n }\n default:\n return null;\n }\n}\n\n/**\n * An interval with finite endpoints, or `null` when either endpoint is\n * non-finite. A defensive guard against a pathological literal\n * (`1e400` → `Infinity`) or an overflow product feeding a non-finite\n * `hi` into `maxLookback`; integer-ness needs no check (see `Interval`).\n */\nfunction finiteInterval(lo: number, hi: number): Interval | null {\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) return null;\n // Normalise `-0` (e.g. `-2 * 0`) to `0` so a resolved bound is never the\n // negative zero a downstream `Object.is`/strict consumer would distinguish.\n return { lo: lo + 0, hi: hi + 0 };\n}\n\n/**\n * The index range a bare bounded-loop induction variable can span, or\n * `null` when the identifier is not the induction variable of an\n * enclosing legal `for`, is reassigned in the body, runs a\n * non-terminating `>`/`>=` loop, or is a shadowed name that does not\n * resolve to the loop's own declaration. Affine forms need the full\n * range (`K - i` is largest when `i` is smallest); a bare loop-var read\n * still takes `interval.hi`, identical to the leaf max.\n */\nfunction resolveLoopVarInterval(\n id: ts.Identifier,\n node: ts.Node,\n checker: ts.TypeChecker,\n): Interval | null {\n const idSymbol = checker.getSymbolAtLocation(id);\n\n let current: ts.Node | undefined = node;\n while (current) {\n if (ts.isForStatement(current)) {\n const loopVarId = boundedLoopVarId(current);\n if (loopVarId && loopVarId.text === id.text) {\n // Confirm the use refers to THIS loop's induction variable\n // and not a nested binding that shadows the same text.\n const loopSymbol = checker.getSymbolAtLocation(loopVarId);\n if (!idSymbol || !loopSymbol || idSymbol !== loopSymbol) return null;\n const loop = parseBoundedForLoop(current);\n if (loop === null) return null;\n if (isLoopVarReassigned(current, loop.varName)) return null;\n return loopVarInterval(loop);\n }\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * The full index range a terminating `for` reaches (`[start, max]`), or\n * `null` for a non-terminating (`>`/`>=` with `i++`) header the resolver\n * cannot bound. `<` reaches `limit - 1`; `<=` reaches `limit`.\n */\nfunction loopVarInterval(loop: BoundedForLoop): Interval | null {\n if (loop.op === ts.SyntaxKind.LessThanToken) {\n return finiteInterval(loop.start, loop.limit - 1);\n }\n if (loop.op === ts.SyntaxKind.LessThanEqualsToken) {\n return finiteInterval(loop.start, loop.limit);\n }\n return null;\n}\n\n/**\n * Whether the loop body reassigns `varName` beyond the header `i++`\n * incrementor (a plain `=`, a compound assignment, or an extra `++`/`--`\n * whose target is the induction variable). Such a body breaks the\n * `limit`-based bound, so the resolver refuses to size the read.\n */\nfunction isLoopVarReassigned(loop: ts.ForStatement, varName: string): boolean {\n const body = loop.statement;\n let reassigned = false;\n const visit = (node: ts.Node): void => {\n if (reassigned) return;\n if (\n ts.isBinaryExpression(node) &&\n isAssignmentOperator(node.operatorToken.kind) &&\n ts.isIdentifier(node.left) &&\n node.left.text === varName\n ) {\n reassigned = true;\n return;\n }\n if (\n (ts.isPostfixUnaryExpression(node) || ts.isPrefixUnaryExpression(node)) &&\n (node.operator === ts.SyntaxKind.PlusPlusToken ||\n node.operator === ts.SyntaxKind.MinusMinusToken) &&\n ts.isIdentifier(node.operand) &&\n node.operand.text === varName\n ) {\n reassigned = true;\n return;\n }\n ts.forEachChild(node, visit);\n };\n visit(body);\n return reassigned;\n}\n\n/** Whether a binary operator token writes to its left operand. */\nfunction isAssignmentOperator(kind: ts.SyntaxKind): boolean {\n return kind >= ts.SyntaxKind.FirstAssignment && kind <= ts.SyntaxKind.LastAssignment;\n}\n\n/**\n * The `const <id> = <numeric literal>` bindings lexically visible at a\n * specific series-index expression. Only `const` initialised with a\n * numeric literal — or a unary `+`/`-` on one — is included (mirroring\n * `extractInputs.readLiteral`'s numeric handling); a binary initialiser\n * is left for Task 2's interval evaluator and is simply omitted. The walk\n * runs from `useSite` outward through its lexical containers up to\n * `scopeRoot`, collecting only declarations that occur before\n * `useSite.pos` within each container, so it never sees a declaration\n * after the read, inside a sibling block, or in a nested function/class\n * that does not contain `useSite`. The innermost visible binding for a\n * name wins (normal shadowing) — including binders that are not\n * `var`/`let`/`const` statements: a `for`-init induction variable and a\n * function parameter shadow an outer numeric `const` of the same name\n * (`markContainerBinders`), so a reassigned `for (let i …)` index or a\n * `request.security((k) => series[k])` callback parameter can never leak\n * an unrelated outer `const k`'s value into the bound (which would\n * under-size the buffer).\n *\n * @since 0.1\n * @stable\n * @example\n * // const k = 3; series[k];\n * // collectConstNumberEnv(<the `k` arg>, scope).get(\"k\") → 3\n * const fn: typeof collectConstNumberEnv = collectConstNumberEnv;\n * void fn;\n */\nexport function collectConstNumberEnv(\n useSite: ts.Node,\n scopeRoot: ts.Node,\n): ReadonlyMap<string, number> {\n const env = new Map<string, number>();\n // Every `var`/`let`/`const` name bound at or inside a nearer container,\n // numeric or not. A nearer binding shadows an outer one even when it is\n // a `let` or a non-numeric `const`, so an outer `const k = 5` must not\n // leak through it — once a name is `seen`, no outer container can set it.\n const seen = new Set<string>();\n\n let container: ts.Node | undefined = useSite.parent;\n while (container) {\n // A `for`-init variable / function parameter introduced by this\n // container shadows any same-named outer `const`, even though it is\n // not a `var`/`let`/`const` statement `variableDeclarationsIn` scans.\n markContainerBinders(container, seen);\n for (const declaration of variableDeclarationsIn(container)) {\n if (declaration.pos >= useSite.pos) continue;\n if (!ts.isIdentifier(declaration.name)) continue;\n const name = declaration.name.text;\n if (seen.has(name)) continue;\n seen.add(name);\n const list = declaration.parent;\n if (ts.isVariableDeclarationList(list) && (list.flags & ts.NodeFlags.Const) !== 0) {\n const value = readNumericLiteralInit(declaration);\n if (value !== null) env.set(name, value);\n }\n }\n if (container === scopeRoot) break;\n container = container.parent;\n }\n\n return env;\n}\n\n/**\n * Mark every binding name a container introduces at its OWN level — a\n * `for` initializer's induction variable and a function-like's parameters\n * — as `seen`, so an outer numeric `const` of the same name cannot leak\n * past it. These binders are never numeric `const`s the resolver trusts,\n * so marking them only blocks unsound shadow leaks: a reassigned\n * `for (let i …)` index or a callback parameter (`(k) => series[k]`) that\n * collides with an outer `const i`/`const k`. Only identifier binders\n * matter here (a numeric series index is an identifier); destructured\n * parameter/loop patterns bind no numeric index and are skipped.\n */\nfunction markContainerBinders(container: ts.Node, seen: Set<string>): void {\n if (ts.isForStatement(container)) {\n const init = container.initializer;\n if (init && ts.isVariableDeclarationList(init)) {\n for (const declaration of init.declarations) {\n if (ts.isIdentifier(declaration.name)) seen.add(declaration.name.text);\n }\n }\n return;\n }\n if (ts.isFunctionLike(container)) {\n for (const parameter of container.parameters) {\n if (ts.isIdentifier(parameter.name)) seen.add(parameter.name.text);\n }\n }\n}\n\n/**\n * The direct `var`/`let`/`const` `VariableDeclaration`s of a container —\n * of every declaration kind, so the caller can detect a nearer binding\n * that shadows an outer numeric `const` — without descending into nested\n * functions, classes, or blocks (those are handled by their own\n * enclosing-container pass when they actually contain the use site).\n * `Block`, `SourceFile`, function bodies, and case clauses hold their\n * declarations as `statements`/`clauses` we scan directly.\n */\nfunction variableDeclarationsIn(container: ts.Node): ReadonlyArray<ts.VariableDeclaration> {\n const declarations: ts.VariableDeclaration[] = [];\n const statements = statementsOf(container);\n for (const statement of statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n declarations.push(declaration);\n }\n }\n return declarations;\n}\n\n/** The lexical statement list a container exposes, or `[]` when it holds none. */\nfunction statementsOf(container: ts.Node): ReadonlyArray<ts.Statement> {\n if (ts.isSourceFile(container) || ts.isBlock(container) || ts.isModuleBlock(container)) {\n return container.statements;\n }\n if (ts.isCaseClause(container) || ts.isDefaultClause(container)) {\n return container.statements;\n }\n return [];\n}\n\n/**\n * The numeric value of a `const k = <numeric literal>` /\n * `const k = <unary ± numeric literal>` initialiser, or `null` for any\n * other initialiser (no binary folding here — that is Task 2).\n */\nfunction readNumericLiteralInit(declaration: ts.VariableDeclaration): number | null {\n const initializer = declaration.initializer;\n if (!initializer) return null;\n const expr = unwrapParens(initializer);\n if (ts.isNumericLiteral(expr)) return Number(expr.text);\n if (\n ts.isPrefixUnaryExpression(expr) &&\n (expr.operator === ts.SyntaxKind.MinusToken || expr.operator === ts.SyntaxKind.PlusToken) &&\n ts.isNumericLiteral(expr.operand)\n ) {\n const value = Number(expr.operand.text);\n return expr.operator === ts.SyntaxKind.MinusToken ? -value : value;\n }\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"statefulCallInLoop.js","sourceRoot":"","sources":["../../src/analysis/statefulCallInLoop.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAG/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAA0B,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CACjC,UAAyB,EACzB,OAAuB,EACvB,UAAkB,EAClB,cAA2D;IAE3D,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,UAAU,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CACZ,gBAAgB,CAAC;wBACb,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,2BAA2B;wBACjC,OAAO,EAAE,wBAAwB,UAAU,oCAAoC;wBAC/E,IAAI,EAAE,UAAU;wBAChB,IAAI;wBACJ,UAAU;qBACb,CAAC,CACL,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC7B,IAAI,OAAO,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC/C,OAAO,OAAO,EAAE,CAAC;QACb,IACI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;YAC1B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAC3B,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"statefulCallInLoop.js","sourceRoot":"","sources":["../../src/analysis/statefulCallInLoop.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAG/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAA0B,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CACjC,UAAyB,EACzB,OAAuB,EACvB,UAAkB,EAClB,cAA2D;IAE3D,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,UAAU,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CACZ,gBAAgB,CAAC;wBACb,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,2BAA2B;wBACjC,OAAO,EAAE,wBAAwB,UAAU,oCAAoC;wBAC/E,IAAI,EAAE,UAAU;wBAChB,IAAI;wBACJ,UAAU;qBACb,CAAC,CACL,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC7B,IAAI,OAAO,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC/C,OAAO,OAAO,EAAE,CAAC;QACb,IACI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;YAC1B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAC3B,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","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 { StatefulPrimitiveEntry } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\n\n/**\n * Walk the source file and flag every stateful primitive call that sits\n * inside any loop kind (`for`, `for-of`, `for-in`, `while`, `do-while`).\n * Mirrors Pine's identical restriction: a stateful call inside a loop would\n * receive one slot id per iteration, silently corrupting per-call state.\n * `slot: false` entries (e.g. `ta.nz`) are flagged too — they're stateless\n * but Pine still forbids them in loops, and the diagnostic message stays\n * the same.\n *\n * The walk runs on the **original** AST (positions match the user's source).\n * Loop ancestry detection uses `node.parent` directly — the source file is\n * created with `setParentNodes: true` so `.parent` is populated.\n *\n * @since 0.1\n * @example\n * // const diagnostics = runStatefulCallInLoop(\n * // sourceFile, checker, \"demo.chart.ts\", STATEFUL_PRIMITIVES_BY_NAME,\n * // );\n * const fn: typeof runStatefulCallInLoop = runStatefulCallInLoop;\n * void fn;\n */\nexport function runStatefulCallInLoop(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n statefulByName: ReadonlyMap<string, StatefulPrimitiveEntry>,\n): ReadonlyArray<CompileDiagnostic> {\n const diagnostics: CompileDiagnostic[] = [];\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const calleeName = resolveCalleeName(node, checker);\n if (calleeName !== null && statefulByName.has(calleeName)) {\n if (insideLoop(node)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"stateful-call-inside-loop\",\n message: `Stateful primitive \\`${calleeName}\\` cannot be called inside a loop.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n\n ts.forEachChild(sourceFile, visit);\n return Object.freeze(diagnostics.slice());\n}\n\nfunction insideLoop(node: ts.Node): boolean {\n let current: ts.Node | undefined = node.parent;\n while (current) {\n if (\n ts.isForStatement(current) ||\n ts.isForOfStatement(current) ||\n ts.isForInStatement(current) ||\n ts.isWhileStatement(current) ||\n ts.isDoStatement(current)\n ) {\n return true;\n }\n current = current.parent;\n }\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"structuralChecks.js","sourceRoot":"","sources":["../../src/analysis/structuralChecks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structuralChecks.js","sourceRoot":"","sources":["../../src/analysis/structuralChecks.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\ntype ValueFormat = \"price\" | \"volume\" | \"percent\" | \"compact\";\ntype ScaleAxis = \"price\" | \"left\" | \"right\" | \"new\";\n\n/**\n * Static script-author overrides extracted from the `define*` object\n * literal. Non-literal values are ignored here; later Phase 4 passes attach\n * dedicated diagnostics for stricter validation.\n *\n * @since 0.4\n * @example\n * const o: StructuralScriptOverrides = { shortName: \"EMA\", format: \"price\" };\n * void o;\n */\nexport type StructuralScriptOverrides = Readonly<{\n /**\n * `defineIndicator({ overlay })` literal-boolean extraction. Persisted\n * onto `ScriptManifest.overlay` so the runtime can derive each script's\n * default pane at mount. Only `true` / `false` literals are picked up;\n * any other initializer is silently ignored.\n *\n * @since 0.2\n */\n overlay?: boolean;\n maxBarsBack?: number;\n format?: ValueFormat;\n precision?: number;\n scale?: ScaleAxis;\n requiresIntervals?: ReadonlyArray<string>;\n shortName?: string;\n}>;\n\n/**\n * Classified `defineIndicator(...)` / `defineAlert(...)` /\n * `defineDrawing(...)` / `defineAlertCondition(...)` binding discovered\n * by `runStructuralChecks`. Phase 7's indicator-composition pass reads\n * this list to walk the file's full dependency graph.\n *\n * `exportKind: \"default\"` = the file's `export default define*(...)`\n * binding. There is always at most one in a valid file.\n * `exportKind: \"named\"` = `export const X = define*(...);` — a drawn\n * sibling that the host will mount alongside the default.\n * `exportKind: \"private\"` = `const X = define*(...);` (no `export`)\n * — a data-only dependency that only flows into other indicators.\n *\n * `bindingName` is the local identifier; for `default` bindings it is\n * always the synthetic string `\"default\"` so consumers can index by\n * binding-name uniformly.\n *\n * @since 0.7\n * @stable\n * @example\n * const info: StructuralBindingInfo = {\n * exportKind: \"default\",\n * bindingName: \"default\",\n * defineKind: \"indicator\",\n * defineCall: undefined as unknown as ts.CallExpression,\n * };\n * void info;\n */\nexport type StructuralBindingInfo = Readonly<{\n readonly exportKind: \"default\" | \"named\" | \"private\";\n readonly bindingName: string;\n readonly defineKind: \"indicator\" | \"drawing\" | \"alert\" | \"alertCondition\";\n readonly defineCall: ts.CallExpression;\n}>;\n\n/**\n * Result of `runStructuralChecks` — the discovered script `name` / `kind`\n * for the manifest, plus any structural diagnostics. `name` is `\"\"` when no\n * default export is present; `kind` defaults to `\"indicator\"` for the same\n * reason. The driver only consumes these fields when there are zero\n * error-severity diagnostics.\n *\n * The `\"drawing\"` kind (Phase 3 / `defineDrawing`) maps to\n * the same code path the other two kinds use — only the manifest's\n * discriminator differs so the editor can route the script to the\n * drawing-tool picker vs the indicator-picker UI.\n *\n * `bindings` (Phase 7) lists every top-level `defineIndicator(...)` /\n * `defineAlert(...)` / `defineDrawing(...)` / `defineAlertCondition(...)`\n * `const` binding the file declares — default + named + private. Empty\n * on files with no recognised default export.\n *\n * @since 0.1\n * @example\n * const r: StructuralCheckResult = {\n * diagnostics: [],\n * name: \"demo\",\n * kind: \"indicator\",\n * overrides: {},\n * bindings: [],\n * };\n * void r;\n */\nexport type StructuralCheckResult = Readonly<{\n diagnostics: ReadonlyArray<CompileDiagnostic>;\n name: string;\n kind: \"indicator\" | \"drawing\" | \"alert\" | \"alertCondition\";\n overrides: StructuralScriptOverrides;\n /** @since 0.7 */\n bindings: ReadonlyArray<StructuralBindingInfo>;\n}>;\n\nfunction readStringArray(node: ts.Expression): ReadonlyArray<string> | undefined {\n if (!ts.isArrayLiteralExpression(node)) return undefined;\n const values: string[] = [];\n for (const element of node.elements) {\n if (!ts.isStringLiteral(element)) return undefined;\n values.push(element.text);\n }\n return Object.freeze(values);\n}\n\nfunction readValueFormat(node: ts.Expression): ValueFormat | undefined {\n if (!ts.isStringLiteral(node)) return undefined;\n if (\n node.text === \"price\" ||\n node.text === \"volume\" ||\n node.text === \"percent\" ||\n node.text === \"compact\"\n ) {\n return node.text;\n }\n return undefined;\n}\n\nfunction readScaleAxis(node: ts.Expression): ScaleAxis | undefined {\n if (!ts.isStringLiteral(node)) return undefined;\n if (\n node.text === \"price\" ||\n node.text === \"left\" ||\n node.text === \"right\" ||\n node.text === \"new\"\n ) {\n return node.text;\n }\n return undefined;\n}\n\nfunction extractOverrides(\n argument: ts.ObjectLiteralExpression,\n kind: \"indicator\" | \"drawing\" | \"alert\" | \"alertCondition\",\n): StructuralScriptOverrides {\n let overlay: boolean | undefined;\n let maxBarsBack: number | undefined;\n let format: ValueFormat | undefined;\n let precision: number | undefined;\n let scale: ScaleAxis | undefined;\n let requiresIntervals: ReadonlyArray<string> | undefined;\n let shortName: string | undefined;\n\n for (const property of argument.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n const propertyName = property.name;\n if (!ts.isIdentifier(propertyName)) continue;\n const initializer = property.initializer;\n if (propertyName.text === \"overlay\" && kind === \"indicator\") {\n if (initializer.kind === ts.SyntaxKind.TrueKeyword) overlay = true;\n else if (initializer.kind === ts.SyntaxKind.FalseKeyword) overlay = false;\n } else if (propertyName.text === \"maxBarsBack\" && kind !== \"drawing\") {\n if (ts.isNumericLiteral(initializer)) maxBarsBack = Number(initializer.text);\n } else if (propertyName.text === \"format\" && kind !== \"alert\") {\n format = readValueFormat(initializer);\n } else if (propertyName.text === \"precision\" && kind !== \"alert\") {\n if (ts.isNumericLiteral(initializer)) precision = Number(initializer.text);\n } else if (propertyName.text === \"scale\" && kind === \"indicator\") {\n scale = readScaleAxis(initializer);\n } else if (propertyName.text === \"requiresIntervals\") {\n requiresIntervals = readStringArray(initializer);\n } else if (propertyName.text === \"shortName\") {\n if (ts.isStringLiteral(initializer)) shortName = initializer.text;\n }\n }\n\n return Object.freeze({\n ...(overlay === undefined ? {} : { overlay }),\n ...(maxBarsBack === undefined ? {} : { maxBarsBack }),\n ...(format === undefined ? {} : { format }),\n ...(precision === undefined ? {} : { precision }),\n ...(scale === undefined ? {} : { scale }),\n ...(requiresIntervals === undefined ? {} : { requiresIntervals }),\n ...(shortName === undefined ? {} : { shortName }),\n });\n}\n\nfunction defineKindFromCallee(\n calleeName: string,\n): \"indicator\" | \"drawing\" | \"alert\" | \"alertCondition\" {\n if (calleeName === \"defineAlert\") return \"alert\";\n if (calleeName === \"defineAlertCondition\") return \"alertCondition\";\n if (calleeName === \"defineDrawing\") return \"drawing\";\n return \"indicator\";\n}\n\ntype BindingCollector = Readonly<{\n readonly bindings: StructuralBindingInfo[];\n readonly defaultAssignments: ts.ExportAssignment[];\n}>;\n\nfunction collectBindings(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n diagnostics: CompileDiagnostic[],\n): BindingCollector {\n const bindings: StructuralBindingInfo[] = [];\n const defaultAssignments: ts.ExportAssignment[] = [];\n\n for (const statement of sourceFile.statements) {\n if (ts.isExportAssignment(statement) && !statement.isExportEquals) {\n defaultAssignments.push(statement);\n const expression = statement.expression;\n if (!ts.isCallExpression(expression)) continue;\n const calleeName = resolveCalleeName(expression, checker);\n if (calleeName === null || !DEFINE_CALLS.has(calleeName)) continue;\n bindings.push(\n Object.freeze({\n exportKind: \"default\",\n bindingName: \"default\",\n defineKind: defineKindFromCallee(calleeName),\n defineCall: expression,\n }),\n );\n continue;\n }\n if (ts.isVariableStatement(statement)) {\n const isExported = (statement.modifiers ?? []).some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword,\n );\n const declarationList = statement.declarationList;\n const isConst = (declarationList.flags & ts.NodeFlags.Const) === ts.NodeFlags.Const;\n for (const declaration of declarationList.declarations) {\n /* v8 ignore next */\n if (!ts.isIdentifier(declaration.name)) continue;\n const initializer = declaration.initializer;\n if (initializer === undefined || !ts.isCallExpression(initializer)) continue;\n const calleeName = resolveCalleeName(initializer, checker);\n if (calleeName === null || !DEFINE_CALLS.has(calleeName)) continue;\n if (!isConst) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"non-const-define-binding\",\n message: `\\`${calleeName}(...)\\` must be assigned to a \\`const\\` binding so the compiler can statically resolve it.`,\n file: sourcePath,\n node: declaration,\n sourceFile,\n }),\n );\n continue;\n }\n bindings.push(\n Object.freeze({\n exportKind: isExported ? \"named\" : \"private\",\n bindingName: declaration.name.text,\n defineKind: defineKindFromCallee(calleeName),\n defineCall: initializer,\n }),\n );\n }\n }\n }\n\n return Object.freeze({ bindings, defaultAssignments });\n}\n\n/**\n * Walk the source file's top-level statements to verify:\n *\n * - Exactly one default export exists and is `defineIndicator(...)`,\n * `defineDrawing(...)`, `defineAlert(...)`, or\n * `defineAlertCondition(...)` from `@invinite-org/chartlang-core`.\n * - Every `define*(...)` call sits on a `const` binding (Phase 7\n * composition pass requires static resolution).\n * - The default export's first argument is an object literal carrying\n * `apiVersion: 1`.\n *\n * On any violation, emits `missing-default-export`,\n * `multiple-default-exports`, `non-const-define-binding`, or\n * `api-version-mismatch`. Returns the discovered script name + kind\n * for the manifest assembly step plus the classified `bindings` list\n * the composition pass walks (Phase 7).\n *\n * @since 0.1\n * @example\n * // const { diagnostics, name, kind, bindings } = runStructuralChecks(\n * // sourceFile, checker, \"demo.chart.ts\",\n * // );\n * const fn: typeof runStructuralChecks = runStructuralChecks;\n * void fn;\n */\nexport function runStructuralChecks(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n sourcePath: string,\n): StructuralCheckResult {\n const diagnostics: CompileDiagnostic[] = [];\n let name = \"\";\n let kind: \"indicator\" | \"drawing\" | \"alert\" | \"alertCondition\" = \"indicator\";\n\n const { bindings, defaultAssignments } = collectBindings(\n sourceFile,\n checker,\n sourcePath,\n diagnostics,\n );\n const frozenBindings = Object.freeze(bindings.slice());\n\n if (defaultAssignments.length > 1) {\n for (let i = 1; i < defaultAssignments.length; i += 1) {\n const extra = defaultAssignments[i];\n /* v8 ignore next */\n if (extra === undefined) continue;\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"multiple-default-exports\",\n message:\n \"A `.chart.ts` file may declare at most one `export default define*(...)`; remove the extra default export.\",\n file: sourcePath,\n node: extra,\n sourceFile,\n }),\n );\n }\n }\n\n const exportAssignment = defaultAssignments[0];\n if (!exportAssignment) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"missing-default-export\",\n message:\n \"Script must default-export a defineIndicator(...), defineDrawing(...), defineAlert(...), or defineAlertCondition(...) call.\",\n file: sourcePath,\n node: sourceFile,\n sourceFile,\n }),\n );\n return Object.freeze({\n diagnostics: Object.freeze(diagnostics),\n name,\n kind,\n overrides: Object.freeze({}),\n bindings: frozenBindings,\n });\n }\n\n const expression = exportAssignment.expression;\n if (!ts.isCallExpression(expression)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"missing-default-export\",\n message:\n \"Default export must be a defineIndicator/defineDrawing/defineAlert/defineAlertCondition call.\",\n file: sourcePath,\n node: expression,\n sourceFile,\n }),\n );\n return Object.freeze({\n diagnostics: Object.freeze(diagnostics),\n name,\n kind,\n overrides: Object.freeze({}),\n bindings: frozenBindings,\n });\n }\n\n const calleeName = resolveCalleeName(expression, checker);\n if (calleeName === null || !DEFINE_CALLS.has(calleeName)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"missing-default-export\",\n message:\n \"Default export must call defineIndicator, defineDrawing, defineAlert, or defineAlertCondition from core.\",\n file: sourcePath,\n node: expression,\n sourceFile,\n }),\n );\n return Object.freeze({\n diagnostics: Object.freeze(diagnostics),\n name,\n kind,\n overrides: Object.freeze({}),\n bindings: frozenBindings,\n });\n }\n kind = defineKindFromCallee(calleeName);\n\n const argument = expression.arguments[0];\n if (!argument || !ts.isObjectLiteralExpression(argument)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"api-version-mismatch\",\n message:\n \"defineIndicator/defineDrawing/defineAlert/defineAlertCondition requires an object-literal argument.\",\n file: sourcePath,\n node: expression,\n sourceFile,\n }),\n );\n return Object.freeze({\n diagnostics: Object.freeze(diagnostics),\n name,\n kind,\n overrides: Object.freeze({}),\n bindings: frozenBindings,\n });\n }\n\n let apiVersionOk = false;\n for (const property of argument.properties) {\n if (!ts.isPropertyAssignment(property)) continue;\n const propertyName = property.name;\n if (!ts.isIdentifier(propertyName)) continue;\n if (propertyName.text === \"apiVersion\") {\n const initializer = property.initializer;\n if (ts.isNumericLiteral(initializer) && Number(initializer.text) === 1) {\n apiVersionOk = true;\n } else {\n const found = initializer.getText(sourceFile);\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"api-version-mismatch\",\n message: `\\`apiVersion: ${found}\\` is not supported — this compiler implements the frozen \\`apiVersion: 1\\` contract. Future language versions require a compiler that declares support for them.`,\n file: sourcePath,\n node: initializer,\n sourceFile,\n }),\n );\n }\n } else if (propertyName.text === \"name\") {\n const initializer = property.initializer;\n if (ts.isStringLiteral(initializer)) {\n name = initializer.text;\n }\n }\n }\n if (!apiVersionOk && diagnostics.length === 0) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"api-version-mismatch\",\n message:\n \"defineIndicator/defineDrawing/defineAlert/defineAlertCondition requires `apiVersion: 1` — the frozen language version this compiler implements.\",\n file: sourcePath,\n node: argument,\n sourceFile,\n }),\n );\n }\n\n return Object.freeze({\n diagnostics: Object.freeze(diagnostics),\n name,\n kind,\n overrides: extractOverrides(argument, kind),\n bindings: frozenBindings,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validateLowerTfIntervals.js","sourceRoot":"","sources":["../../src/analysis/validateLowerTfIntervals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validateLowerTfIntervals.js","sourceRoot":"","sources":["../../src/analysis/validateLowerTfIntervals.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 IntervalDescriptor, intervalToSeconds } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { resolveCalleeName } from \"../transformers/resolveCallee.js\";\n\nfunction secondsOrNull(descriptor: IntervalDescriptor): number | null {\n try {\n return intervalToSeconds(descriptor);\n } catch {\n return null;\n }\n}\n\ntype SmallestMain = Readonly<{ descriptor: IntervalDescriptor; seconds: number }>;\n\nfunction smallestParseableMain(\n declaredIntervals: ReadonlyArray<IntervalDescriptor>,\n): SmallestMain | null {\n let smallest: SmallestMain | null = null;\n for (const descriptor of declaredIntervals) {\n const seconds = secondsOrNull(descriptor);\n if (seconds !== null && (smallest === null || seconds < smallest.seconds)) {\n smallest = { descriptor, seconds };\n }\n }\n return smallest;\n}\n\n/**\n * Validate static `request.lowerTf({ interval })` calls against declared main\n * intervals and emit `lower-tf-not-lower` when the requested interval is not\n * strictly lower than the smallest declared main interval. Non-literal and\n * unparseable interval values are skipped — the literal-check pass and the\n * runtime's `unsupported-interval` gate own those.\n *\n * Ordering uses {@link intervalToSeconds}, which treats `1M` as 30 days and\n * `1Y` as 365 days. Comparisons that hinge on calendar-exact durations (e.g.\n * `30D` vs `1M`) should provide `intervalSeconds` on the {@link IntervalDescriptor}\n * to override the approximation.\n *\n * @since 0.6\n * @stable\n * @example\n * // const diagnostics = validateLowerTfIntervals(\n * // sourceFile, checker, \"demo.chart.ts\", capabilities.intervals,\n * // );\n * const fn: typeof validateLowerTfIntervals = validateLowerTfIntervals;\n * void fn;\n */\nexport function validateLowerTfIntervals(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n filePath: string,\n declaredIntervals: ReadonlyArray<IntervalDescriptor>,\n): ReadonlyArray<CompileDiagnostic> {\n const main = smallestParseableMain(declaredIntervals);\n if (main === null) return [];\n\n const diagnostics: CompileDiagnostic[] = [];\n const checkCall = (call: ts.CallExpression): void => {\n const literal = readLiteralInterval(call);\n if (literal === null) return;\n const requestedSec = secondsOrNull({\n value: literal.text,\n label: literal.text,\n group: \"request\",\n });\n if (requestedSec === null || requestedSec < main.seconds) return;\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"lower-tf-not-lower\",\n message: `request.lowerTf({ interval: \"${literal.text}\" }) must be strictly lower than the main interval \"${main.descriptor.value}\" (requested ${requestedSec}s >= main ${main.seconds}s)`,\n file: filePath,\n node: literal,\n sourceFile,\n }),\n );\n };\n\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && resolveCalleeName(node, checker) === \"request.lowerTf\") {\n checkCall(node);\n }\n ts.forEachChild(node, visit);\n };\n\n ts.forEachChild(sourceFile, visit);\n return Object.freeze(diagnostics.slice());\n}\n\nfunction readLiteralInterval(call: ts.CallExpression): ts.StringLiteral | null {\n const opts = call.arguments[0];\n if (opts === undefined || !ts.isObjectLiteralExpression(opts)) return null;\n const property = opts.properties\n .filter(ts.isPropertyAssignment)\n .find((p) => ts.isIdentifier(p.name) && p.name.text === \"interval\");\n if (property === undefined || !ts.isStringLiteral(property.initializer)) return null;\n return property.initializer;\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import ts from "typescript";
2
+ import { type CompileDiagnostic } from "../diagnostics.js";
3
+ /**
4
+ * Validate that a `request.security({ interval }, (bar) => …)` expression
5
+ * callback references only its `bar` parameter (and locals derived from it),
6
+ * the ambient `ta` namespace, `inputs`, safe `Math.*` globals, and literal
7
+ * constants. Any other free identifier is a captured outer binding — it would
8
+ * smuggle the main-timeline clock into the higher-timeframe expression — and
9
+ * is rejected with `request-security-expr-captures-local`.
10
+ *
11
+ * Function / arrow expressions nested deeper inside the callback are out of
12
+ * the v1 subset and rejected too (keeps the expression unit flat), as is a
13
+ * `this` reference. Parameter default initialisers are walked alongside the
14
+ * body so a default that captures an outer binding is flagged too.
15
+ *
16
+ * @since 0.7
17
+ * @stable
18
+ * @example
19
+ * // Inside extractRequestAnalysis, once per expression callsite:
20
+ * // validateSecurityExpr(callback, checker, diagnostics, sourcePath);
21
+ * const fn: typeof validateSecurityExpr = validateSecurityExpr;
22
+ * void fn;
23
+ */
24
+ export declare function validateSecurityExpr(callback: ts.ArrowFunction | ts.FunctionExpression, checker: ts.TypeChecker, diagnostics: CompileDiagnostic[], sourcePath: string): void;
25
+ //# sourceMappingURL=validateSecurityExpr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSecurityExpr.d.ts","sourceRoot":"","sources":["../../src/analysis/validateSecurityExpr.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAG7E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EAClD,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,WAAW,EAAE,iBAAiB,EAAE,EAChC,UAAU,EAAE,MAAM,GACnB,IAAI,CA2DN"}
@@ -0,0 +1,154 @@
1
+ // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
+ // See the LICENSE file in the repo root for full license text.
3
+ import ts from "typescript";
4
+ import { createDiagnostic } from "../diagnostics.js";
5
+ import { resolveCoreSymbolName } from "../transformers/resolveCallee.js";
6
+ /**
7
+ * Validate that a `request.security({ interval }, (bar) => …)` expression
8
+ * callback references only its `bar` parameter (and locals derived from it),
9
+ * the ambient `ta` namespace, `inputs`, safe `Math.*` globals, and literal
10
+ * constants. Any other free identifier is a captured outer binding — it would
11
+ * smuggle the main-timeline clock into the higher-timeframe expression — and
12
+ * is rejected with `request-security-expr-captures-local`.
13
+ *
14
+ * Function / arrow expressions nested deeper inside the callback are out of
15
+ * the v1 subset and rejected too (keeps the expression unit flat), as is a
16
+ * `this` reference. Parameter default initialisers are walked alongside the
17
+ * body so a default that captures an outer binding is flagged too.
18
+ *
19
+ * @since 0.7
20
+ * @stable
21
+ * @example
22
+ * // Inside extractRequestAnalysis, once per expression callsite:
23
+ * // validateSecurityExpr(callback, checker, diagnostics, sourcePath);
24
+ * const fn: typeof validateSecurityExpr = validateSecurityExpr;
25
+ * void fn;
26
+ */
27
+ export function validateSecurityExpr(callback, checker, diagnostics, sourcePath) {
28
+ const sourceFile = callback.getSourceFile();
29
+ const bound = collectBoundNames(callback);
30
+ const visit = (node) => {
31
+ // Nested functions/arrows are out of the flat v1 subset.
32
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
33
+ diagnostics.push(createDiagnostic({
34
+ severity: "error",
35
+ code: "request-security-expr-captures-local",
36
+ message: "A request.security expression callback may not contain a nested function. Keep the expression flat.",
37
+ file: sourcePath,
38
+ node,
39
+ sourceFile,
40
+ }));
41
+ return;
42
+ }
43
+ // `this` is not a value the flat expression subset may read — in a
44
+ // function-expression callback it would be `undefined` under the
45
+ // module's strict mode and throw at runtime.
46
+ if (node.kind === ts.SyntaxKind.ThisKeyword) {
47
+ diagnostics.push(createDiagnostic({
48
+ severity: "error",
49
+ code: "request-security-expr-captures-local",
50
+ message: "A request.security expression callback may not use `this`.",
51
+ file: sourcePath,
52
+ node,
53
+ sourceFile,
54
+ }));
55
+ return;
56
+ }
57
+ if (ts.isIdentifier(node) && isFreeReference(node)) {
58
+ if (!isAllowedReference(node, bound, checker)) {
59
+ diagnostics.push(createDiagnostic({
60
+ severity: "error",
61
+ code: "request-security-expr-captures-local",
62
+ message: `A request.security expression callback may not capture the outer binding \`${node.text}\`. Inline it as a literal or read it from \`inputs\`.`,
63
+ file: sourcePath,
64
+ node,
65
+ sourceFile,
66
+ }));
67
+ }
68
+ }
69
+ ts.forEachChild(node, visit);
70
+ };
71
+ // A parameter default (`(bar = outer) => …`) is a value read of whatever it
72
+ // initialises to, so it must be checked for captures alongside the body.
73
+ for (const parameter of callback.parameters) {
74
+ if (parameter.initializer !== undefined)
75
+ visit(parameter.initializer);
76
+ }
77
+ visit(callback.body);
78
+ }
79
+ /**
80
+ * Collect every name bound *inside* the callback: the parameter identifiers
81
+ * plus any `const` / `let` / `var` declared in the body. A binding's
82
+ * initialiser is still walked by the caller, so an initialiser that captures
83
+ * an outer name is still flagged.
84
+ */
85
+ function collectBoundNames(callback) {
86
+ const names = new Set();
87
+ for (const parameter of callback.parameters) {
88
+ addBindingNames(parameter.name, names);
89
+ }
90
+ const visit = (node) => {
91
+ if (ts.isVariableDeclaration(node)) {
92
+ addBindingNames(node.name, names);
93
+ }
94
+ ts.forEachChild(node, visit);
95
+ };
96
+ visit(callback.body);
97
+ return names;
98
+ }
99
+ function addBindingNames(name, into) {
100
+ if (ts.isIdentifier(name)) {
101
+ into.add(name.text);
102
+ return;
103
+ }
104
+ for (const element of name.elements) {
105
+ if (ts.isBindingElement(element))
106
+ addBindingNames(element.name, into);
107
+ }
108
+ }
109
+ /**
110
+ * Whether an identifier is a *free reference* — an actual value read, not a
111
+ * property name (`bar.close` → `close`), a property-assignment key, or a
112
+ * binding/declaration name (handled by `collectBoundNames`).
113
+ *
114
+ * A shorthand property (`{ offset }`) is deliberately NOT excluded: the
115
+ * identifier there is both the key and the value read, so `{ outerLength }`
116
+ * inside an opts object must still be checked against the allowed subset.
117
+ */
118
+ function isFreeReference(node) {
119
+ const parent = node.parent;
120
+ if (ts.isPropertyAccessExpression(parent) && parent.name === node)
121
+ return false;
122
+ if (ts.isPropertyAssignment(parent) && parent.name === node)
123
+ return false;
124
+ if (ts.isBindingElement(parent) && parent.propertyName === node)
125
+ return false;
126
+ if (ts.isVariableDeclaration(parent) && parent.name === node)
127
+ return false;
128
+ return true;
129
+ }
130
+ /**
131
+ * Pure value globals that carry no main-timeline data and are morally literals.
132
+ * They cannot smuggle the outer clock in, so they are allowed alongside `Math`.
133
+ * Genuinely hostile globals (`Date`, `fetch`, …) are rejected separately by the
134
+ * file-level `forbiddenConstructs` pass, which also covers the inline callback.
135
+ */
136
+ const SAFE_VALUE_GLOBALS = new Set(["undefined", "NaN", "Infinity"]);
137
+ /**
138
+ * Whether a free identifier is in the allowed subset: a name bound inside the
139
+ * callback (`bar` + locals), a {@link SAFE_VALUE_GLOBALS} constant, the ambient
140
+ * `ta` / `inputs` namespaces, or the `Math` global (individual hostile members
141
+ * such as `Math.random` are rejected by the separate hostile-global pass, not
142
+ * here).
143
+ */
144
+ function isAllowedReference(node, bound, checker) {
145
+ if (bound.has(node.text))
146
+ return true;
147
+ if (node.text === "Math")
148
+ return true;
149
+ if (SAFE_VALUE_GLOBALS.has(node.text))
150
+ return true;
151
+ const canonical = resolveCoreSymbolName(checker, node);
152
+ return canonical === "ta" || canonical === "inputs";
153
+ }
154
+ //# sourceMappingURL=validateSecurityExpr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSecurityExpr.js","sourceRoot":"","sources":["../../src/analysis/validateSecurityExpr.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAA0B,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAChC,QAAkD,EAClD,OAAuB,EACvB,WAAgC,EAChC,UAAkB;IAElB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QAClC,yDAAyD;QACzD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,WAAW,CAAC,IAAI,CACZ,gBAAgB,CAAC;gBACb,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EACH,qGAAqG;gBACzG,IAAI,EAAE,UAAU;gBAChB,IAAI;gBACJ,UAAU;aACb,CAAC,CACL,CAAC;YACF,OAAO;QACX,CAAC;QACD,mEAAmE;QACnE,iEAAiE;QACjE,6CAA6C;QAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC1C,WAAW,CAAC,IAAI,CACZ,gBAAgB,CAAC;gBACb,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EAAE,4DAA4D;gBACrE,IAAI,EAAE,UAAU;gBAChB,IAAI;gBACJ,UAAU;aACb,CAAC,CACL,CAAC;YACF,OAAO;QACX,CAAC;QACD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,WAAW,CAAC,IAAI,CACZ,gBAAgB,CAAC;oBACb,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,sCAAsC;oBAC5C,OAAO,EAAE,8EAA8E,IAAI,CAAC,IAAI,wDAAwD;oBACxJ,IAAI,EAAE,UAAU;oBAChB,IAAI;oBACJ,UAAU;iBACb,CAAC,CACL,CAAC;YACN,CAAC;QACL,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,4EAA4E;IAC5E,yEAAyE;IACzE,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACtB,QAAkD;IAElD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1C,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QAClC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,IAAoB,EAAE,IAAiB;IAC5D,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,IAAmB;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAE1F;;;;;;GAMG;AACH,SAAS,kBAAkB,CACvB,IAAmB,EACnB,KAA0B,EAC1B,OAAuB;IAEvB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,QAAQ,CAAC;AACxD,CAAC","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 { resolveCoreSymbolName } from \"../transformers/resolveCallee.js\";\n\n/**\n * Validate that a `request.security({ interval }, (bar) => …)` expression\n * callback references only its `bar` parameter (and locals derived from it),\n * the ambient `ta` namespace, `inputs`, safe `Math.*` globals, and literal\n * constants. Any other free identifier is a captured outer binding — it would\n * smuggle the main-timeline clock into the higher-timeframe expression — and\n * is rejected with `request-security-expr-captures-local`.\n *\n * Function / arrow expressions nested deeper inside the callback are out of\n * the v1 subset and rejected too (keeps the expression unit flat), as is a\n * `this` reference. Parameter default initialisers are walked alongside the\n * body so a default that captures an outer binding is flagged too.\n *\n * @since 0.7\n * @stable\n * @example\n * // Inside extractRequestAnalysis, once per expression callsite:\n * // validateSecurityExpr(callback, checker, diagnostics, sourcePath);\n * const fn: typeof validateSecurityExpr = validateSecurityExpr;\n * void fn;\n */\nexport function validateSecurityExpr(\n callback: ts.ArrowFunction | ts.FunctionExpression,\n checker: ts.TypeChecker,\n diagnostics: CompileDiagnostic[],\n sourcePath: string,\n): void {\n const sourceFile = callback.getSourceFile();\n const bound = collectBoundNames(callback);\n\n const visit = (node: ts.Node): void => {\n // Nested functions/arrows are out of the flat v1 subset.\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"request-security-expr-captures-local\",\n message:\n \"A request.security expression callback may not contain a nested function. Keep the expression flat.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return;\n }\n // `this` is not a value the flat expression subset may read — in a\n // function-expression callback it would be `undefined` under the\n // module's strict mode and throw at runtime.\n if (node.kind === ts.SyntaxKind.ThisKeyword) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"request-security-expr-captures-local\",\n message: \"A request.security expression callback may not use `this`.\",\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return;\n }\n if (ts.isIdentifier(node) && isFreeReference(node)) {\n if (!isAllowedReference(node, bound, checker)) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"request-security-expr-captures-local\",\n message: `A request.security expression callback may not capture the outer binding \\`${node.text}\\`. Inline it as a literal or read it from \\`inputs\\`.`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n }\n }\n ts.forEachChild(node, visit);\n };\n\n // A parameter default (`(bar = outer) => …`) is a value read of whatever it\n // initialises to, so it must be checked for captures alongside the body.\n for (const parameter of callback.parameters) {\n if (parameter.initializer !== undefined) visit(parameter.initializer);\n }\n visit(callback.body);\n}\n\n/**\n * Collect every name bound *inside* the callback: the parameter identifiers\n * plus any `const` / `let` / `var` declared in the body. A binding's\n * initialiser is still walked by the caller, so an initialiser that captures\n * an outer name is still flagged.\n */\nfunction collectBoundNames(\n callback: ts.ArrowFunction | ts.FunctionExpression,\n): ReadonlySet<string> {\n const names = new Set<string>();\n for (const parameter of callback.parameters) {\n addBindingNames(parameter.name, names);\n }\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node)) {\n addBindingNames(node.name, names);\n }\n ts.forEachChild(node, visit);\n };\n visit(callback.body);\n return names;\n}\n\nfunction addBindingNames(name: ts.BindingName, into: Set<string>): void {\n if (ts.isIdentifier(name)) {\n into.add(name.text);\n return;\n }\n for (const element of name.elements) {\n if (ts.isBindingElement(element)) addBindingNames(element.name, into);\n }\n}\n\n/**\n * Whether an identifier is a *free reference* — an actual value read, not a\n * property name (`bar.close` → `close`), a property-assignment key, or a\n * binding/declaration name (handled by `collectBoundNames`).\n *\n * A shorthand property (`{ offset }`) is deliberately NOT excluded: the\n * identifier there is both the key and the value read, so `{ outerLength }`\n * inside an opts object must still be checked against the allowed subset.\n */\nfunction isFreeReference(node: ts.Identifier): boolean {\n const parent = node.parent;\n if (ts.isPropertyAccessExpression(parent) && parent.name === node) return false;\n if (ts.isPropertyAssignment(parent) && parent.name === node) return false;\n if (ts.isBindingElement(parent) && parent.propertyName === node) return false;\n if (ts.isVariableDeclaration(parent) && parent.name === node) return false;\n return true;\n}\n\n/**\n * Pure value globals that carry no main-timeline data and are morally literals.\n * They cannot smuggle the outer clock in, so they are allowed alongside `Math`.\n * Genuinely hostile globals (`Date`, `fetch`, …) are rejected separately by the\n * file-level `forbiddenConstructs` pass, which also covers the inline callback.\n */\nconst SAFE_VALUE_GLOBALS: ReadonlySet<string> = new Set([\"undefined\", \"NaN\", \"Infinity\"]);\n\n/**\n * Whether a free identifier is in the allowed subset: a name bound inside the\n * callback (`bar` + locals), a {@link SAFE_VALUE_GLOBALS} constant, the ambient\n * `ta` / `inputs` namespaces, or the `Math` global (individual hostile members\n * such as `Math.random` are rejected by the separate hostile-global pass, not\n * here).\n */\nfunction isAllowedReference(\n node: ts.Identifier,\n bound: ReadonlySet<string>,\n checker: ts.TypeChecker,\n): boolean {\n if (bound.has(node.text)) return true;\n if (node.text === \"Math\") return true;\n if (SAFE_VALUE_GLOBALS.has(node.text)) return true;\n const canonical = resolveCoreSymbolName(checker, node);\n return canonical === \"ta\" || canonical === \"inputs\";\n}\n"]}
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js CHANGED
@@ -5,7 +5,7 @@ import { readFile, readdir, rename, unlink, writeFile } from "node:fs/promises";
5
5
  import { dirname, isAbsolute, join, relative, resolve as resolvePath } from "node:path";
6
6
  import { STATEFUL_PRIMITIVES_BY_NAME } from "@invinite-org/chartlang-core";
7
7
  import ts from "typescript";
8
- import { extractAlertConditions, extractCapabilities, extractDependencyGraph, extractInputs, extractMaxLookback, extractRequestedIntervals, extractRequiresIntervals, runForbiddenConstructs, runStatefulCallInLoop, runStructuralChecks, validateLowerTfIntervals, } from "./analysis/index.js";
8
+ import { extractAlertConditions, extractCapabilities, extractDependencyGraph, extractInputs, extractMaxLookback, extractRequestAnalysis, extractRequiresIntervals, runForbiddenConstructs, runStatefulCallInLoop, runStructuralChecks, validateLowerTfIntervals, } from "./analysis/index.js";
9
9
  import { bundleModule, formatDependenciesAssignment, formatManifestAssignment } from "./bundle.js";
10
10
  import { createProducerResolver, } from "./dependency/index.js";
11
11
  import { mapTsDiagnostic } from "./diagnostics.js";
@@ -127,7 +127,8 @@ export function transformAndAnalyse(source, opts) {
127
127
  const fileCapabilities = extractCapabilities(sourceFile, checker, structural.kind);
128
128
  const fileLookback = extractMaxLookback(sourceFile, checker, sourcePath);
129
129
  const fileInputs = extractInputs(sourceFile, checker, sourcePath);
130
- const fileRequestedIntervalsFromCalls = extractRequestedIntervals(sourceFile, checker, fileInputs.inputs, intervalDiagnostics, sourcePath);
130
+ const fileRequestAnalysis = extractRequestAnalysis(sourceFile, checker, fileInputs.inputs, intervalDiagnostics, sourcePath, true);
131
+ const fileRequestedIntervalsFromCalls = fileRequestAnalysis.intervals;
131
132
  const fileRequiresIntervals = extractRequiresIntervals(sourceFile, checker, intervalDiagnostics, sourcePath);
132
133
  const fileRequestedIntervals = Array.from(new Set([...fileRequestedIntervalsFromCalls, ...fileRequiresIntervals])).sort();
133
134
  const namedManifests = [];
@@ -163,6 +164,9 @@ export function transformAndAnalyse(source, opts) {
163
164
  : { dependencies: defaultDependencies }),
164
165
  ...(defaultOutputs === undefined ? {} : { outputs: defaultOutputs }),
165
166
  ...(plotSlots.length === 0 ? {} : { plots: plotSlots }),
167
+ ...(fileRequestAnalysis.securityExpressions.length === 0
168
+ ? {}
169
+ : { securityExpressions: fileRequestAnalysis.securityExpressions }),
166
170
  });
167
171
  const allDiagnostics = [
168
172
  ...earlyDiagnostics,
@@ -187,7 +191,8 @@ function buildDrawnManifest(drawn, depGraph, sourceFile, checker, sourcePath, ki
187
191
  const capabilities = extractCapabilities(sourceFile, checker, kind, scope);
188
192
  const lookback = extractMaxLookback(sourceFile, checker, sourcePath, scope);
189
193
  const inputs = extractInputs(sourceFile, checker, sourcePath, scope);
190
- const requestedFromCalls = extractRequestedIntervals(sourceFile, checker, inputs.inputs, intervalDiagnostics, sourcePath);
194
+ const requestAnalysis = extractRequestAnalysis(sourceFile, checker, inputs.inputs, intervalDiagnostics, sourcePath);
195
+ const requestedFromCalls = requestAnalysis.intervals;
191
196
  const requiresIntervalsScoped = extractRequiresIntervals(sourceFile, checker, intervalDiagnostics, sourcePath);
192
197
  const requestedIntervals = Array.from(new Set([...requestedFromCalls, ...requiresIntervalsScoped])).sort();
193
198
  const dependencies = buildDependencyDeclarations(drawn, depGraph, sourcePath);
@@ -213,6 +218,11 @@ function buildDrawnManifest(drawn, depGraph, sourceFile, checker, sourcePath, ki
213
218
  ...(dependencies === undefined || dependencies.length === 0 ? {} : { dependencies }),
214
219
  ...(outputs === undefined ? {} : { outputs }),
215
220
  ...(plotSlots === undefined || plotSlots.length === 0 ? {} : { plots: plotSlots }),
221
+ // Mirror `plots` scoping: the flat security-expression list attaches to
222
+ // the default manifest only (the call that also receives `plotSlots`).
223
+ ...(plotSlots === undefined || requestAnalysis.securityExpressions.length === 0
224
+ ? {}
225
+ : { securityExpressions: requestAnalysis.securityExpressions }),
216
226
  exportName: drawn.exportName,
217
227
  isDrawn: true,
218
228
  ...(siblings !== undefined && siblings.length > 0 ? { siblings } : {}),