@invinite-org/chartlang-compiler 1.0.1 → 1.2.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 (82) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/README.md +3 -0
  3. package/dist/analysis/extractCapabilities.d.ts +5 -1
  4. package/dist/analysis/extractCapabilities.d.ts.map +1 -1
  5. package/dist/analysis/extractCapabilities.js +6 -2
  6. package/dist/analysis/extractCapabilities.js.map +1 -1
  7. package/dist/analysis/extractDependencyGraph.d.ts +160 -0
  8. package/dist/analysis/extractDependencyGraph.d.ts.map +1 -0
  9. package/dist/analysis/extractDependencyGraph.js +690 -0
  10. package/dist/analysis/extractDependencyGraph.js.map +1 -0
  11. package/dist/analysis/extractInputs.d.ts +5 -1
  12. package/dist/analysis/extractInputs.d.ts.map +1 -1
  13. package/dist/analysis/extractInputs.js +6 -2
  14. package/dist/analysis/extractInputs.js.map +1 -1
  15. package/dist/analysis/extractMaxLookback.d.ts +6 -1
  16. package/dist/analysis/extractMaxLookback.d.ts.map +1 -1
  17. package/dist/analysis/extractMaxLookback.js +10 -5
  18. package/dist/analysis/extractMaxLookback.js.map +1 -1
  19. package/dist/analysis/forbiddenConstructs.d.ts +1 -2
  20. package/dist/analysis/forbiddenConstructs.d.ts.map +1 -1
  21. package/dist/analysis/forbiddenConstructs.js +4 -2
  22. package/dist/analysis/forbiddenConstructs.js.map +1 -1
  23. package/dist/analysis/index.d.ts +3 -1
  24. package/dist/analysis/index.d.ts.map +1 -1
  25. package/dist/analysis/index.js +1 -0
  26. package/dist/analysis/index.js.map +1 -1
  27. package/dist/analysis/structuralChecks.d.ts +65 -9
  28. package/dist/analysis/structuralChecks.d.ts.map +1 -1
  29. package/dist/analysis/structuralChecks.js +111 -22
  30. package/dist/analysis/structuralChecks.js.map +1 -1
  31. package/dist/api.d.ts +52 -0
  32. package/dist/api.d.ts.map +1 -1
  33. package/dist/api.js +485 -35
  34. package/dist/api.js.map +1 -1
  35. package/dist/bundle.d.ts +91 -3
  36. package/dist/bundle.d.ts.map +1 -1
  37. package/dist/bundle.js +88 -5
  38. package/dist/bundle.js.map +1 -1
  39. package/dist/dependency/index.d.ts +3 -0
  40. package/dist/dependency/index.d.ts.map +1 -0
  41. package/dist/dependency/index.js +4 -0
  42. package/dist/dependency/index.js.map +1 -0
  43. package/dist/dependency/resolveProducer.d.ts +183 -0
  44. package/dist/dependency/resolveProducer.d.ts.map +1 -0
  45. package/dist/dependency/resolveProducer.js +256 -0
  46. package/dist/dependency/resolveProducer.js.map +1 -0
  47. package/dist/diagnostics.d.ts +6 -2
  48. package/dist/diagnostics.d.ts.map +1 -1
  49. package/dist/diagnostics.js.map +1 -1
  50. package/dist/index.d.ts +3 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/manifest.d.ts +8 -1
  55. package/dist/manifest.d.ts.map +1 -1
  56. package/dist/manifest.js +27 -0
  57. package/dist/manifest.js.map +1 -1
  58. package/dist/program.d.ts +1 -0
  59. package/dist/program.d.ts.map +1 -1
  60. package/dist/program.js +80 -4
  61. package/dist/program.js.map +1 -1
  62. package/dist/transformers/callsiteIdInjection.d.ts +3 -2
  63. package/dist/transformers/callsiteIdInjection.d.ts.map +1 -1
  64. package/dist/transformers/callsiteIdInjection.js +16 -1
  65. package/dist/transformers/callsiteIdInjection.js.map +1 -1
  66. package/dist/transformers/index.d.ts +2 -0
  67. package/dist/transformers/index.d.ts.map +1 -1
  68. package/dist/transformers/index.js +1 -0
  69. package/dist/transformers/index.js.map +1 -1
  70. package/dist/transformers/plotKindFromCallsite.d.ts +43 -0
  71. package/dist/transformers/plotKindFromCallsite.d.ts.map +1 -0
  72. package/dist/transformers/plotKindFromCallsite.js +103 -0
  73. package/dist/transformers/plotKindFromCallsite.js.map +1 -0
  74. package/dist/transformers/rewriteDependencyAccessors.d.ts +65 -0
  75. package/dist/transformers/rewriteDependencyAccessors.d.ts.map +1 -0
  76. package/dist/transformers/rewriteDependencyAccessors.js +204 -0
  77. package/dist/transformers/rewriteDependencyAccessors.js.map +1 -0
  78. package/dist/typesEmit.d.ts +14 -11
  79. package/dist/typesEmit.d.ts.map +1 -1
  80. package/dist/typesEmit.js +91 -7
  81. package/dist/typesEmit.js.map +1 -1
  82. package/package.json +2 -2
package/dist/typesEmit.js CHANGED
@@ -1,11 +1,13 @@
1
1
  // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
2
  // See the LICENSE file in the repo root for full license text.
3
3
  /**
4
- * Generate the Phase-1 minimal `.d.ts` sibling for a compiled script. The
5
- * declarations mirror the runtime expectation in §5.2 a default-exported
6
- * `CompiledScriptObject` plus the `__manifest` symbol the bundler emits at
7
- * the bottom of the JS. Identical content for every script in Phase 1;
8
- * Phase 4+ specialises per-script inputs / outputs.
4
+ * Generate the `.d.ts` sibling for a compiled script. Single-script files
5
+ * with no `outputs` / `dependencies` emit the Phase-1 minimal declarations
6
+ * byte-identically so existing snapshot tests stay green. Multi-export
7
+ * files (array input) or single-export files carrying `outputs` /
8
+ * `dependencies` emit per-binding typed declarations — `output<K extends
9
+ * "title1" | "title2">(name: K): Series<number>` overloads + `withInputs`
10
+ * typed against the binding's `inputs` schema.
9
11
  *
10
12
  * @since 0.1
11
13
  * @example
@@ -14,8 +16,16 @@
14
16
  * const fn: typeof emitTypes = emitTypes;
15
17
  * void fn;
16
18
  */
17
- export function emitTypes(_opts) {
18
- return `// auto-generated by @invinite-org/chartlang-compiler
19
+ export function emitTypes(opts) {
20
+ const manifests = Array.isArray(opts.manifest)
21
+ ? opts.manifest
22
+ : [opts.manifest];
23
+ if (manifests.length === 1 && !needsTypedExports(manifests[0])) {
24
+ return BACK_COMPAT_DTS;
25
+ }
26
+ return emitTypedDeclarations(manifests);
27
+ }
28
+ const BACK_COMPAT_DTS = `// auto-generated by @invinite-org/chartlang-compiler
19
29
  import type { CompiledScriptObject, ScriptManifest } from "@invinite-org/chartlang-core";
20
30
 
21
31
  declare const script: CompiledScriptObject;
@@ -23,5 +33,79 @@ export default script;
23
33
 
24
34
  export declare const __manifest: ScriptManifest;
25
35
  `;
36
+ function needsTypedExports(manifest) {
37
+ const hasOutputs = manifest.outputs !== undefined && manifest.outputs.length > 0;
38
+ const hasDependencies = manifest.dependencies !== undefined && manifest.dependencies.length > 0;
39
+ return hasOutputs || hasDependencies;
40
+ }
41
+ function emitTypedDeclarations(manifests) {
42
+ const lines = [
43
+ "// auto-generated by @invinite-org/chartlang-compiler",
44
+ 'import type { CompiledScriptObject, ScriptManifest, Series } from "@invinite-org/chartlang-core";',
45
+ "",
46
+ ];
47
+ for (const m of manifests) {
48
+ const exportName = m.exportName ?? "default";
49
+ const localName = exportName === "default" ? "script" : exportName;
50
+ lines.push(`declare const ${localName}: CompiledScriptObject & {`, ` output${outputOverloadSignature(m)}: Series<number>;`, ` withInputs(overrides: ${inputsOverrideType(m)}): typeof ${localName};`, "};");
51
+ if (exportName === "default") {
52
+ lines.push(`export default ${localName};`, "");
53
+ }
54
+ else {
55
+ lines.push(`export { ${localName} };`, "");
56
+ }
57
+ }
58
+ const manifestType = manifests.length > 1 ? "ReadonlyArray<ScriptManifest>" : "ScriptManifest";
59
+ lines.push(`export declare const __manifest: ${manifestType};`, "");
60
+ return lines.join("\n");
61
+ }
62
+ function outputOverloadSignature(manifest) {
63
+ const outputs = manifest.outputs ?? [];
64
+ if (outputs.length === 0) {
65
+ return "<K extends never>(name: K)";
66
+ }
67
+ const titleUnion = outputs.map((o) => JSON.stringify(o.title)).join(" | ");
68
+ return `<K extends ${titleUnion}>(name: K)`;
69
+ }
70
+ function inputsOverrideType(manifest) {
71
+ const inputs = manifest.inputs;
72
+ const keys = Object.keys(inputs);
73
+ if (keys.length === 0) {
74
+ return "Readonly<Record<string, never>>";
75
+ }
76
+ const fields = [];
77
+ for (const key of keys) {
78
+ const descriptor = inputs[key];
79
+ const tsType = descriptorToTsType(descriptor);
80
+ fields.push(`${quoteFieldKey(key)}?: ${tsType}`);
81
+ }
82
+ /* v8 ignore next */
83
+ return `Readonly<{ ${fields.join("; ")} }>`;
84
+ }
85
+ const KIND_TO_TS_TYPE = new Map([
86
+ ["int", "number"],
87
+ ["float", "number"],
88
+ ["price", "number"],
89
+ ["time", "number"],
90
+ ["string", "string"],
91
+ ["enum", "string"],
92
+ ["color", "string"],
93
+ ["source", "string"],
94
+ ["symbol", "string"],
95
+ ["interval", "string"],
96
+ ["bool", "boolean"],
97
+ ["external-series", "unknown"],
98
+ ]);
99
+ function descriptorToTsType(descriptor) {
100
+ const kind = descriptor.kind;
101
+ /* v8 ignore next 2 */
102
+ if (typeof kind !== "string")
103
+ return "unknown";
104
+ return KIND_TO_TS_TYPE.get(kind) ?? "unknown";
105
+ }
106
+ const SAFE_FIELD_NAME = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
107
+ function quoteFieldKey(key) {
108
+ /* v8 ignore next */
109
+ return SAFE_FIELD_NAME.test(key) ? key : JSON.stringify(key);
26
110
  }
27
111
  //# sourceMappingURL=typesEmit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typesEmit.js","sourceRoot":"","sources":["../src/typesEmit.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAuB/D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,KAAuB;IAC7C,OAAO;;;;;;;CAOV,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"typesEmit.js","sourceRoot":"","sources":["../src/typesEmit.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@invinite-org/chartlang-compiler",
3
- "version": "1.0.1",
3
+ "version": "1.2.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.0.1"
24
+ "@invinite-org/chartlang-core": "1.1.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^20.0.0",