@invinite-org/chartlang-compiler 1.3.0 → 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.
- package/CHANGELOG.md +64 -0
- package/dist/analysis/extractDependencyGraph.d.ts.map +1 -1
- package/dist/analysis/extractDependencyGraph.js +9 -1
- package/dist/analysis/extractDependencyGraph.js.map +1 -1
- package/dist/analysis/extractInputs.d.ts.map +1 -1
- package/dist/analysis/extractInputs.js +2 -0
- package/dist/analysis/extractInputs.js.map +1 -1
- package/dist/analysis/extractRequestedIntervals.d.ts +29 -9
- package/dist/analysis/extractRequestedIntervals.d.ts.map +1 -1
- package/dist/analysis/extractRequestedIntervals.js +173 -42
- package/dist/analysis/extractRequestedIntervals.js.map +1 -1
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.d.ts.map +1 -1
- package/dist/analysis/index.js +1 -0
- package/dist/analysis/index.js.map +1 -1
- package/dist/analysis/stateArrayCapacity.d.ts +58 -0
- package/dist/analysis/stateArrayCapacity.d.ts.map +1 -0
- package/dist/analysis/stateArrayCapacity.js +108 -0
- package/dist/analysis/stateArrayCapacity.js.map +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +12 -3
- package/dist/api.js.map +1 -1
- package/dist/diagnostics.d.ts +6 -2
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/manifest.d.ts +2 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +4 -0
- package/dist/manifest.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +57 -1
- package/dist/program.js.map +1 -1
- package/dist/transformers/callsiteIdInjection.d.ts.map +1 -1
- package/dist/transformers/callsiteIdInjection.js +8 -1
- package/dist/transformers/callsiteIdInjection.js.map +1 -1
- package/dist/transformers/plotKindFromCallsite.d.ts +3 -0
- package/dist/transformers/plotKindFromCallsite.d.ts.map +1 -1
- package/dist/transformers/plotKindFromCallsite.js +7 -0
- package/dist/transformers/plotKindFromCallsite.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callsiteIdInjection.js","sourceRoot":"","sources":["../../src/transformers/callsiteIdInjection.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 { PlotSlotDescriptor, StatefulPrimitiveEntry } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { plotKindFromCallsite, readLiteralTitle } from \"./plotKindFromCallsite.js\";\nimport { resolveCalleeName, resolveCoreSymbolForElementAccess } from \"./resolveCallee.js\";\n\n/**\n * Output of `injectCallsiteIds` — the rewritten source file plus any\n * diagnostics produced during the rewrite. Only `callsite-id-conflict`\n * surfaces here; every other transformer-related check lives in the\n * `analysis/` modules.\n *\n * @since 0.1\n * @example\n * // const { transformed, diagnostics } = injectCallsiteIds(src, checker, opts);\n * const shape: { transformed: unknown; diagnostics: ReadonlyArray<unknown> } = {\n * transformed: null,\n * diagnostics: [],\n * };\n * void shape;\n */\nexport type InjectCallsiteIdsResult = Readonly<{\n transformed: ts.SourceFile;\n diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\n/**\n * Mint the callsite slot id for a single call expression. The format is\n * load-bearing — `<sourcePath>:<line>:<col>#<callIndex>` (§5.5), with 1-based\n * line/column read from the call's start position in the **input** source\n * file. `callIndex` is hardcoded to `0` for hand-written code (Phase 1\n * reserves non-zero for future macros).\n *\n * Shared by `injectCallsiteIds` (which injects the literal as the leading\n * argument) and the `request.security` expression analyser (which records\n * the same id in `manifest.securityExpressions[*].slotId`) so the two never\n * drift.\n *\n * @since 0.7\n * @stable\n * @example\n * // const slotId = callsiteIdFor(sourceFile, callNode, \"demo.chart.ts\");\n * // slotId === \"demo.chart.ts:5:13#0\"\n * const fn: typeof callsiteIdFor = callsiteIdFor;\n * void fn;\n */\nexport function callsiteIdFor(\n sourceFile: ts.SourceFile,\n call: ts.CallExpression,\n sourcePath: string,\n): string {\n const start = call.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(start);\n return `${sourcePath}:${line + 1}:${character + 1}#0`;\n}\n\n/**\n * Inject a `__slot` string-literal first argument into every stateful\n * primitive call. Slot id format:\n * `<sourcePath>:<line>:<col>#<callIndex>`. `callIndex` is hardcoded to `0`\n * for hand-written code (Phase 1 reserves non-zero for future macros).\n *\n * The transformer is a pure rewrite — input nodes are never mutated. Lines\n * and columns are 1-based and read from the **input** source file before\n * any rewrite happens. Duplicate ids at the same `(line, col)` (impossible\n * in hand-written TS but reachable by future macros) trigger a\n * `callsite-id-conflict` diagnostic; only the first call at the duplicated\n * position gets the slot.\n *\n * @since 0.1\n * @example\n * // Input: ta.ema(close, 20)\n * // Output: ta.ema(\"demo.chart.ts:5:13#0\", close, 20)\n * const fn: typeof injectCallsiteIds = injectCallsiteIds;\n * void fn;\n */\nexport function injectCallsiteIds(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n opts: {\n readonly sourcePath: string;\n readonly statefulByName: ReadonlyMap<string, StatefulPrimitiveEntry>;\n readonly slotsSeen?: Map<string, ts.CallExpression>;\n readonly plotSlots?: PlotSlotDescriptor[];\n },\n): InjectCallsiteIdsResult {\n const { sourcePath, statefulByName } = opts;\n const plotSlots = opts.plotSlots;\n const slotsSeen = opts.slotsSeen ?? new Map<string, ts.CallExpression>();\n const diagnostics: CompileDiagnostic[] = [];\n\n const factory: ts.TransformerFactory<ts.SourceFile> = (context) => {\n const visit: ts.Visitor = (node) => {\n if (ts.isCallExpression(node)) {\n // Element-access calls (`ta[\"ema\"](...)`, `alert?.[chan](...)`)\n // bypass slot-id injection because the property name is not\n // statically known. Detecting these explicitly turns the\n // silent-state-corruption footgun into a compile-time error.\n if (ts.isElementAccessExpression(node.expression)) {\n const coreName = resolveCoreSymbolForElementAccess(node.expression, checker);\n if (coreName !== null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"stateful-call-element-access\",\n message: `Element-access calls on the \\`${coreName}\\` namespace bypass callsite-id injection. Use the property-access form (\\`${coreName}.<name>(...)\\`).`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return ts.visitEachChild(node, visit, context);\n }\n }\n const calleeName = resolveCalleeName(node, checker);\n const entry = calleeName === null ? undefined : statefulByName.get(calleeName);\n if (entry?.slot) {\n const slotId = callsiteIdFor(sourceFile, node, sourcePath);\n const existing = slotsSeen.get(slotId);\n if (existing !== undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"callsite-id-conflict\",\n message: `Two stateful calls share the same slot id \"${slotId}\".`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return ts.visitEachChild(node, visit, context);\n }\n slotsSeen.set(slotId, node);\n if (\n plotSlots !== undefined &&\n (calleeName === \"plot\" || calleeName === \"hline\")\n ) {\n const optsArg = node.arguments[1];\n // best-effort dynamic-kind fallback: a callsite whose\n // `style` is non-literal is still listed as \"line\".\n const kind = plotKindFromCallsite(calleeName, optsArg) ?? \"line\";\n const title = readLiteralTitle(optsArg);\n plotSlots.push(\n Object.freeze({\n slotId,\n kind,\n ...(title === undefined ? {} : { title }),\n }),\n );\n }\n const visitedArguments = node.arguments.map((argument) =>\n ts.visitNode(argument, visit, ts.isExpression),\n ) as ReadonlyArray<ts.Expression>;\n const updatedArguments = ts.factory.createNodeArray<ts.Expression>([\n ts.factory.createStringLiteral(slotId),\n ...visitedArguments,\n ]);\n const visitedCallee = ts.visitNode(\n node.expression,\n visit,\n ts.isExpression,\n ) as ts.Expression;\n return ts.factory.updateCallExpression(\n node,\n visitedCallee,\n node.typeArguments,\n updatedArguments,\n );\n }\n }\n return ts.visitEachChild(node, visit, context);\n };\n return (file) => ts.visitNode(file, visit, ts.isSourceFile) as ts.SourceFile;\n };\n\n const result = ts.transform(sourceFile, [factory]);\n const transformed = result.transformed[0];\n result.dispose();\n return Object.freeze({\n transformed,\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"callsiteIdInjection.js","sourceRoot":"","sources":["../../src/transformers/callsiteIdInjection.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 { PlotSlotDescriptor, StatefulPrimitiveEntry } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nimport { type CompileDiagnostic, createDiagnostic } from \"../diagnostics.js\";\nimport { plotKindFromCallsite, readLiteralTitle } from \"./plotKindFromCallsite.js\";\nimport { resolveCalleeName, resolveCoreSymbolForElementAccess } from \"./resolveCallee.js\";\n\n/**\n * Output of `injectCallsiteIds` — the rewritten source file plus any\n * diagnostics produced during the rewrite. Only `callsite-id-conflict`\n * surfaces here; every other transformer-related check lives in the\n * `analysis/` modules.\n *\n * @since 0.1\n * @example\n * // const { transformed, diagnostics } = injectCallsiteIds(src, checker, opts);\n * const shape: { transformed: unknown; diagnostics: ReadonlyArray<unknown> } = {\n * transformed: null,\n * diagnostics: [],\n * };\n * void shape;\n */\nexport type InjectCallsiteIdsResult = Readonly<{\n transformed: ts.SourceFile;\n diagnostics: ReadonlyArray<CompileDiagnostic>;\n}>;\n\n/**\n * Mint the callsite slot id for a single call expression. The format is\n * load-bearing — `<sourcePath>:<line>:<col>#<callIndex>` (§5.5), with 1-based\n * line/column read from the call's start position in the **input** source\n * file. `callIndex` is hardcoded to `0` for hand-written code (Phase 1\n * reserves non-zero for future macros).\n *\n * Shared by `injectCallsiteIds` (which injects the literal as the leading\n * argument) and the `request.security` expression analyser (which records\n * the same id in `manifest.securityExpressions[*].slotId`) so the two never\n * drift.\n *\n * @since 0.7\n * @stable\n * @example\n * // const slotId = callsiteIdFor(sourceFile, callNode, \"demo.chart.ts\");\n * // slotId === \"demo.chart.ts:5:13#0\"\n * const fn: typeof callsiteIdFor = callsiteIdFor;\n * void fn;\n */\nexport function callsiteIdFor(\n sourceFile: ts.SourceFile,\n call: ts.CallExpression,\n sourcePath: string,\n): string {\n const start = call.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(start);\n return `${sourcePath}:${line + 1}:${character + 1}#0`;\n}\n\n/**\n * Inject a `__slot` string-literal first argument into every stateful\n * primitive call. Slot id format:\n * `<sourcePath>:<line>:<col>#<callIndex>`. `callIndex` is hardcoded to `0`\n * for hand-written code (Phase 1 reserves non-zero for future macros).\n *\n * The transformer is a pure rewrite — input nodes are never mutated. Lines\n * and columns are 1-based and read from the **input** source file before\n * any rewrite happens. Duplicate ids at the same `(line, col)` (impossible\n * in hand-written TS but reachable by future macros) trigger a\n * `callsite-id-conflict` diagnostic; only the first call at the duplicated\n * position gets the slot.\n *\n * @since 0.1\n * @example\n * // Input: ta.ema(close, 20)\n * // Output: ta.ema(\"demo.chart.ts:5:13#0\", close, 20)\n * const fn: typeof injectCallsiteIds = injectCallsiteIds;\n * void fn;\n */\nexport function injectCallsiteIds(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n opts: {\n readonly sourcePath: string;\n readonly statefulByName: ReadonlyMap<string, StatefulPrimitiveEntry>;\n readonly slotsSeen?: Map<string, ts.CallExpression>;\n readonly plotSlots?: PlotSlotDescriptor[];\n },\n): InjectCallsiteIdsResult {\n const { sourcePath, statefulByName } = opts;\n const plotSlots = opts.plotSlots;\n const slotsSeen = opts.slotsSeen ?? new Map<string, ts.CallExpression>();\n const diagnostics: CompileDiagnostic[] = [];\n\n const factory: ts.TransformerFactory<ts.SourceFile> = (context) => {\n const visit: ts.Visitor = (node) => {\n if (ts.isCallExpression(node)) {\n // Element-access calls (`ta[\"ema\"](...)`, `alert?.[chan](...)`)\n // bypass slot-id injection because the property name is not\n // statically known. Detecting these explicitly turns the\n // silent-state-corruption footgun into a compile-time error.\n if (ts.isElementAccessExpression(node.expression)) {\n const coreName = resolveCoreSymbolForElementAccess(node.expression, checker);\n if (coreName !== null) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"stateful-call-element-access\",\n message: `Element-access calls on the \\`${coreName}\\` namespace bypass callsite-id injection. Use the property-access form (\\`${coreName}.<name>(...)\\`).`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return ts.visitEachChild(node, visit, context);\n }\n }\n const calleeName = resolveCalleeName(node, checker);\n const entry = calleeName === null ? undefined : statefulByName.get(calleeName);\n if (entry?.slot) {\n const slotId = callsiteIdFor(sourceFile, node, sourcePath);\n const existing = slotsSeen.get(slotId);\n if (existing !== undefined) {\n diagnostics.push(\n createDiagnostic({\n severity: \"error\",\n code: \"callsite-id-conflict\",\n message: `Two stateful calls share the same slot id \"${slotId}\".`,\n file: sourcePath,\n node,\n sourceFile,\n }),\n );\n return ts.visitEachChild(node, visit, context);\n }\n slotsSeen.set(slotId, node);\n if (\n plotSlots !== undefined &&\n (calleeName === \"plot\" ||\n calleeName === \"hline\" ||\n calleeName === \"bgcolor\" ||\n calleeName === \"barcolor\")\n ) {\n // `bgcolor`/`barcolor`'s opts is `arguments[1]` (color\n // is `arguments[0]`) — the same index as `plot`'s opts,\n // so `plotKindFromCallsite` / `readLiteralTitle` read\n // the right node without a callee-specific offset.\n const optsArg = node.arguments[1];\n // best-effort dynamic-kind fallback: a callsite whose\n // `style` is non-literal is still listed as \"line\".\n const kind = plotKindFromCallsite(calleeName, optsArg) ?? \"line\";\n const title = readLiteralTitle(optsArg);\n plotSlots.push(\n Object.freeze({\n slotId,\n kind,\n ...(title === undefined ? {} : { title }),\n }),\n );\n }\n const visitedArguments = node.arguments.map((argument) =>\n ts.visitNode(argument, visit, ts.isExpression),\n ) as ReadonlyArray<ts.Expression>;\n const updatedArguments = ts.factory.createNodeArray<ts.Expression>([\n ts.factory.createStringLiteral(slotId),\n ...visitedArguments,\n ]);\n const visitedCallee = ts.visitNode(\n node.expression,\n visit,\n ts.isExpression,\n ) as ts.Expression;\n return ts.factory.updateCallExpression(\n node,\n visitedCallee,\n node.typeArguments,\n updatedArguments,\n );\n }\n }\n return ts.visitEachChild(node, visit, context);\n };\n return (file) => ts.visitNode(file, visit, ts.isSourceFile) as ts.SourceFile;\n };\n\n const result = ts.transform(sourceFile, [factory]);\n const transformed = result.transformed[0];\n result.dispose();\n return Object.freeze({\n transformed,\n diagnostics: Object.freeze(diagnostics.slice()),\n });\n}\n"]}
|
|
@@ -8,6 +8,9 @@ import ts from "typescript";
|
|
|
8
8
|
* `buildStyle`). Returns:
|
|
9
9
|
*
|
|
10
10
|
* - `"horizontal-line"` for `hline`.
|
|
11
|
+
* - `"bg-color"` for `bgcolor` / `"bar-color"` for `barcolor` — the
|
|
12
|
+
* Pine-ergonomic aliases whose kind IS the callee name (no `style`
|
|
13
|
+
* object to read, like `hline`).
|
|
11
14
|
* - `"line"` for a bare `plot` with no `style` (no opts, opts without
|
|
12
15
|
* `style`, or a non-object opts).
|
|
13
16
|
* - the literal `style.kind` value for `plot(x, { style: { kind: "<lit>" } })`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plotKindFromCallsite.d.ts","sourceRoot":"","sources":["../../src/transformers/plotKindFromCallsite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,YAAY,CAAC;AAyC5B
|
|
1
|
+
{"version":3,"file":"plotKindFromCallsite.d.ts","sourceRoot":"","sources":["../../src/transformers/plotKindFromCallsite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,YAAY,CAAC;AAyC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,GACnC,QAAQ,GAAG,SAAS,CAetB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMvF"}
|
|
@@ -40,6 +40,9 @@ function findProperty(obj, name) {
|
|
|
40
40
|
* `buildStyle`). Returns:
|
|
41
41
|
*
|
|
42
42
|
* - `"horizontal-line"` for `hline`.
|
|
43
|
+
* - `"bg-color"` for `bgcolor` / `"bar-color"` for `barcolor` — the
|
|
44
|
+
* Pine-ergonomic aliases whose kind IS the callee name (no `style`
|
|
45
|
+
* object to read, like `hline`).
|
|
43
46
|
* - `"line"` for a bare `plot` with no `style` (no opts, opts without
|
|
44
47
|
* `style`, or a non-object opts).
|
|
45
48
|
* - the literal `style.kind` value for `plot(x, { style: { kind: "<lit>" } })`
|
|
@@ -60,6 +63,10 @@ function findProperty(obj, name) {
|
|
|
60
63
|
export function plotKindFromCallsite(calleeName, optsArg) {
|
|
61
64
|
if (calleeName === "hline")
|
|
62
65
|
return "horizontal-line";
|
|
66
|
+
if (calleeName === "bgcolor")
|
|
67
|
+
return "bg-color";
|
|
68
|
+
if (calleeName === "barcolor")
|
|
69
|
+
return "bar-color";
|
|
63
70
|
if (calleeName !== "plot")
|
|
64
71
|
return undefined;
|
|
65
72
|
if (optsArg === undefined || !ts.isObjectLiteralExpression(optsArg))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plotKindFromCallsite.js","sourceRoot":"","sources":["../../src/transformers/plotKindFromCallsite.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAG/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,GAA0B,IAAI,GAAG,CAAW;IACxD,MAAM;IACN,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,OAAO;IACP,WAAW;IACX,OAAO;IACP,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,WAAW;IACX,sBAAsB;CACzB,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAQ,UAAkC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CACjB,GAA+B,EAC/B,IAAY;IAEZ,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACpC,IACI,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC;YACjC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAC7B,CAAC;YACC,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"plotKindFromCallsite.js","sourceRoot":"","sources":["../../src/transformers/plotKindFromCallsite.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAG/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,GAA0B,IAAI,GAAG,CAAW;IACxD,MAAM;IACN,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,OAAO;IACP,WAAW;IACX,OAAO;IACP,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,WAAW;IACX,sBAAsB;CACzB,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAQ,UAAkC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CACjB,GAA+B,EAC/B,IAAY;IAEZ,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACpC,IACI,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC;YACjC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAC7B,CAAC;YACC,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,oBAAoB,CAChC,UAAkB,EAClB,OAAkC;IAElC,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,iBAAiB,CAAC;IACrD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAChD,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC;IAClD,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACnF,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAkC;IAC/D,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACtF,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC;IACpC,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,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 { PlotKind } from \"@invinite-org/chartlang-core\";\nimport ts from \"typescript\";\n\nconst PLOT_KINDS: ReadonlySet<PlotKind> = new Set<PlotKind>([\n \"line\",\n \"step-line\",\n \"horizontal-line\",\n \"histogram\",\n \"area\",\n \"filled-band\",\n \"label\",\n \"marker\",\n \"shape\",\n \"character\",\n \"arrow\",\n \"candle-override\",\n \"bar-override\",\n \"bg-color\",\n \"bar-color\",\n \"horizontal-histogram\",\n]);\n\nfunction isPlotKind(value: string): value is PlotKind {\n return (PLOT_KINDS as ReadonlySet<string>).has(value);\n}\n\nfunction findProperty(\n obj: ts.ObjectLiteralExpression,\n name: string,\n): ts.PropertyAssignment | undefined {\n for (const property of obj.properties) {\n if (\n ts.isPropertyAssignment(property) &&\n ts.isIdentifier(property.name) &&\n property.name.text === name\n ) {\n return property;\n }\n }\n return undefined;\n}\n\n/**\n * Derive the statically-known {@link PlotKind} for a plotting callsite from\n * its callee name and opts argument. The chartlang plot surface has no\n * `plot.*` member API — the kind is selected at the callsite via the opts\n * object literal's `style.kind` property (mirrored by the runtime's\n * `buildStyle`). Returns:\n *\n * - `\"horizontal-line\"` for `hline`.\n * - `\"bg-color\"` for `bgcolor` / `\"bar-color\"` for `barcolor` — the\n * Pine-ergonomic aliases whose kind IS the callee name (no `style`\n * object to read, like `hline`).\n * - `\"line\"` for a bare `plot` with no `style` (no opts, opts without\n * `style`, or a non-object opts).\n * - the literal `style.kind` value for `plot(x, { style: { kind: \"<lit>\" } })`\n * when it is a string literal naming a `PlotKind` member.\n * - `undefined` when the kind is not statically determinable: a dynamic\n * `style` (`{ style: someVar }`), a dynamic `kind` (`{ style: { kind:\n * someVar } }`), or a string literal that is not a `PlotKind` member.\n * The caller falls back to `\"line\"` (best-effort) so the slot is still\n * listed.\n *\n * @since 0.8\n * @example\n * // const kind = plotKindFromCallsite(\"plot\", optsObjectLiteralNode);\n * // kind === \"histogram\" | \"line\" | undefined | ...\n * const fn: typeof plotKindFromCallsite = plotKindFromCallsite;\n * void fn;\n */\nexport function plotKindFromCallsite(\n calleeName: string,\n optsArg: ts.Expression | undefined,\n): PlotKind | undefined {\n if (calleeName === \"hline\") return \"horizontal-line\";\n if (calleeName === \"bgcolor\") return \"bg-color\";\n if (calleeName === \"barcolor\") return \"bar-color\";\n if (calleeName !== \"plot\") return undefined;\n if (optsArg === undefined || !ts.isObjectLiteralExpression(optsArg)) return \"line\";\n const styleProp = findProperty(optsArg, \"style\");\n if (styleProp === undefined) return \"line\";\n const style = styleProp.initializer;\n if (!ts.isObjectLiteralExpression(style)) return undefined;\n const kindProp = findProperty(style, \"kind\");\n if (kindProp === undefined) return undefined;\n const kind = kindProp.initializer;\n if (!ts.isStringLiteral(kind)) return undefined;\n return isPlotKind(kind.text) ? kind.text : undefined;\n}\n\n/**\n * Read a string-literal `title` from a plotting callsite's opts object\n * literal. Returns `undefined` for a missing, dynamic, or non-string\n * `title` so the manifest omits the field rather than recording a\n * placeholder.\n *\n * @since 0.8\n * @example\n * // const title = readLiteralTitle(optsObjectLiteralNode);\n * // title === \"Vol\" | undefined\n * const fn: typeof readLiteralTitle = readLiteralTitle;\n * void fn;\n */\nexport function readLiteralTitle(optsArg: ts.Expression | undefined): string | undefined {\n if (optsArg === undefined || !ts.isObjectLiteralExpression(optsArg)) return undefined;\n const titleProp = findProperty(optsArg, \"title\");\n if (titleProp === undefined) return undefined;\n const title = titleProp.initializer;\n return ts.isStringLiteral(title) ? title.text : undefined;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@invinite-org/chartlang-compiler",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "TypeScript transformer + bundler for .chart.ts files",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"esbuild": "^0.24.0",
|
|
23
23
|
"typescript": "^5.6.0",
|
|
24
|
-
"@invinite-org/chartlang-core": "1.
|
|
24
|
+
"@invinite-org/chartlang-core": "1.3.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^20.0.0",
|