edict-lang 1.2.0 → 1.6.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 (227) hide show
  1. package/README.md +39 -13
  2. package/dist/ast/nodes.d.ts +4 -3
  3. package/dist/ast/nodes.d.ts.map +1 -1
  4. package/dist/ast/nodes.js +1 -0
  5. package/dist/ast/nodes.js.map +1 -1
  6. package/dist/ast/type-constants.d.ts +12 -0
  7. package/dist/ast/type-constants.d.ts.map +1 -0
  8. package/dist/ast/type-constants.js +16 -0
  9. package/dist/ast/type-constants.js.map +1 -0
  10. package/dist/ast/types.d.ts +1 -1
  11. package/dist/ast/types.d.ts.map +1 -1
  12. package/dist/builtins/builtin-enums.d.ts +12 -0
  13. package/dist/builtins/builtin-enums.d.ts.map +1 -0
  14. package/dist/builtins/builtin-enums.js +45 -0
  15. package/dist/builtins/builtin-enums.js.map +1 -0
  16. package/dist/builtins/builtin-types.d.ts +20 -0
  17. package/dist/builtins/builtin-types.d.ts.map +1 -0
  18. package/dist/builtins/builtin-types.js +6 -0
  19. package/dist/builtins/builtin-types.js.map +1 -0
  20. package/dist/builtins/builtins.d.ts +3 -0
  21. package/dist/builtins/builtins.d.ts.map +1 -0
  22. package/dist/builtins/builtins.js +3 -0
  23. package/dist/builtins/builtins.js.map +1 -0
  24. package/dist/builtins/domains/array.d.ts +3 -0
  25. package/dist/builtins/domains/array.d.ts.map +1 -0
  26. package/dist/builtins/domains/array.js +236 -0
  27. package/dist/builtins/domains/array.js.map +1 -0
  28. package/dist/builtins/domains/core.d.ts +3 -0
  29. package/dist/builtins/domains/core.d.ts.map +1 -0
  30. package/dist/builtins/domains/core.js +45 -0
  31. package/dist/builtins/domains/core.js.map +1 -0
  32. package/dist/builtins/domains/crypto.d.ts +3 -0
  33. package/dist/builtins/domains/crypto.d.ts.map +1 -0
  34. package/dist/builtins/domains/crypto.js +49 -0
  35. package/dist/builtins/domains/crypto.js.map +1 -0
  36. package/dist/builtins/domains/datetime.d.ts +3 -0
  37. package/dist/builtins/domains/datetime.d.ts.map +1 -0
  38. package/dist/builtins/domains/datetime.js +45 -0
  39. package/dist/builtins/domains/datetime.js.map +1 -0
  40. package/dist/builtins/domains/http.d.ts +3 -0
  41. package/dist/builtins/domains/http.d.ts.map +1 -0
  42. package/dist/builtins/domains/http.js +55 -0
  43. package/dist/builtins/domains/http.js.map +1 -0
  44. package/dist/builtins/domains/int64.d.ts +3 -0
  45. package/dist/builtins/domains/int64.d.ts.map +1 -0
  46. package/dist/builtins/domains/int64.js +31 -0
  47. package/dist/builtins/domains/int64.js.map +1 -0
  48. package/dist/builtins/domains/io.d.ts +3 -0
  49. package/dist/builtins/domains/io.d.ts.map +1 -0
  50. package/dist/builtins/domains/io.js +79 -0
  51. package/dist/builtins/domains/io.js.map +1 -0
  52. package/dist/builtins/domains/json.d.ts +3 -0
  53. package/dist/builtins/domains/json.d.ts.map +1 -0
  54. package/dist/builtins/domains/json.js +47 -0
  55. package/dist/builtins/domains/json.js.map +1 -0
  56. package/dist/builtins/domains/math.d.ts +3 -0
  57. package/dist/builtins/domains/math.d.ts.map +1 -0
  58. package/dist/builtins/domains/math.js +47 -0
  59. package/dist/builtins/domains/math.js.map +1 -0
  60. package/dist/builtins/domains/option.d.ts +3 -0
  61. package/dist/builtins/domains/option.d.ts.map +1 -0
  62. package/dist/builtins/domains/option.js +56 -0
  63. package/dist/builtins/domains/option.js.map +1 -0
  64. package/dist/builtins/domains/random.d.ts +3 -0
  65. package/dist/builtins/domains/random.d.ts.map +1 -0
  66. package/dist/builtins/domains/random.js +50 -0
  67. package/dist/builtins/domains/random.js.map +1 -0
  68. package/dist/builtins/domains/regex.d.ts +3 -0
  69. package/dist/builtins/domains/regex.d.ts.map +1 -0
  70. package/dist/builtins/domains/regex.js +69 -0
  71. package/dist/builtins/domains/regex.js.map +1 -0
  72. package/dist/builtins/domains/result.d.ts +3 -0
  73. package/dist/builtins/domains/result.d.ts.map +1 -0
  74. package/dist/builtins/domains/result.js +84 -0
  75. package/dist/builtins/domains/result.js.map +1 -0
  76. package/dist/builtins/domains/string.d.ts +3 -0
  77. package/dist/builtins/domains/string.d.ts.map +1 -0
  78. package/dist/builtins/domains/string.js +139 -0
  79. package/dist/builtins/domains/string.js.map +1 -0
  80. package/dist/builtins/domains/type-conversion.d.ts +3 -0
  81. package/dist/builtins/domains/type-conversion.d.ts.map +1 -0
  82. package/dist/builtins/domains/type-conversion.js +42 -0
  83. package/dist/builtins/domains/type-conversion.js.map +1 -0
  84. package/dist/builtins/host-helpers.d.ts +66 -0
  85. package/dist/builtins/host-helpers.d.ts.map +1 -0
  86. package/dist/builtins/host-helpers.js +127 -0
  87. package/dist/builtins/host-helpers.js.map +1 -0
  88. package/dist/builtins/registry.d.ts +48 -0
  89. package/dist/builtins/registry.d.ts.map +1 -0
  90. package/dist/builtins/registry.js +118 -0
  91. package/dist/builtins/registry.js.map +1 -0
  92. package/dist/check.d.ts +9 -2
  93. package/dist/check.d.ts.map +1 -1
  94. package/dist/check.js +30 -9
  95. package/dist/check.js.map +1 -1
  96. package/dist/checker/check.d.ts +18 -1
  97. package/dist/checker/check.d.ts.map +1 -1
  98. package/dist/checker/check.js +157 -108
  99. package/dist/checker/check.js.map +1 -1
  100. package/dist/checker/type-env.d.ts +2 -0
  101. package/dist/checker/type-env.d.ts.map +1 -1
  102. package/dist/checker/type-env.js +9 -0
  103. package/dist/checker/type-env.js.map +1 -1
  104. package/dist/codegen/browser-host-adapter.d.ts +29 -0
  105. package/dist/codegen/browser-host-adapter.d.ts.map +1 -0
  106. package/dist/codegen/browser-host-adapter.js +51 -0
  107. package/dist/codegen/browser-host-adapter.js.map +1 -0
  108. package/dist/codegen/builtins.d.ts +2 -26
  109. package/dist/codegen/builtins.d.ts.map +1 -1
  110. package/dist/codegen/builtins.js +2 -341
  111. package/dist/codegen/builtins.js.map +1 -1
  112. package/dist/codegen/closures.d.ts +17 -0
  113. package/dist/codegen/closures.d.ts.map +1 -0
  114. package/dist/codegen/closures.js +140 -0
  115. package/dist/codegen/closures.js.map +1 -0
  116. package/dist/codegen/codegen.d.ts +6 -30
  117. package/dist/codegen/codegen.d.ts.map +1 -1
  118. package/dist/codegen/codegen.js +154 -1103
  119. package/dist/codegen/codegen.js.map +1 -1
  120. package/dist/codegen/collect-strings.d.ts +4 -0
  121. package/dist/codegen/collect-strings.d.ts.map +1 -0
  122. package/dist/codegen/collect-strings.js +76 -0
  123. package/dist/codegen/collect-strings.js.map +1 -0
  124. package/dist/codegen/compile-calls.d.ts +10 -0
  125. package/dist/codegen/compile-calls.d.ts.map +1 -0
  126. package/dist/codegen/compile-calls.js +374 -0
  127. package/dist/codegen/compile-calls.js.map +1 -0
  128. package/dist/codegen/compile-data.d.ts +22 -0
  129. package/dist/codegen/compile-data.d.ts.map +1 -0
  130. package/dist/codegen/compile-data.js +243 -0
  131. package/dist/codegen/compile-data.js.map +1 -0
  132. package/dist/codegen/compile-expr.d.ts +10 -0
  133. package/dist/codegen/compile-expr.d.ts.map +1 -0
  134. package/dist/codegen/compile-expr.js +156 -0
  135. package/dist/codegen/compile-expr.js.map +1 -0
  136. package/dist/codegen/compile-match.d.ts +7 -0
  137. package/dist/codegen/compile-match.d.ts.map +1 -0
  138. package/dist/codegen/compile-match.js +195 -0
  139. package/dist/codegen/compile-match.js.map +1 -0
  140. package/dist/codegen/compile-scalars.d.ts +25 -0
  141. package/dist/codegen/compile-scalars.d.ts.map +1 -0
  142. package/dist/codegen/compile-scalars.js +211 -0
  143. package/dist/codegen/compile-scalars.js.map +1 -0
  144. package/dist/codegen/hof-generators.d.ts +39 -0
  145. package/dist/codegen/hof-generators.d.ts.map +1 -0
  146. package/dist/codegen/hof-generators.js +336 -0
  147. package/dist/codegen/hof-generators.js.map +1 -0
  148. package/dist/codegen/host-adapter.d.ts +44 -0
  149. package/dist/codegen/host-adapter.d.ts.map +1 -0
  150. package/dist/codegen/host-adapter.js +9 -0
  151. package/dist/codegen/host-adapter.js.map +1 -0
  152. package/dist/codegen/imports.d.ts +15 -0
  153. package/dist/codegen/imports.d.ts.map +1 -0
  154. package/dist/codegen/imports.js +165 -0
  155. package/dist/codegen/imports.js.map +1 -0
  156. package/dist/codegen/node-host-adapter.d.ts +35 -0
  157. package/dist/codegen/node-host-adapter.d.ts.map +1 -0
  158. package/dist/codegen/node-host-adapter.js +155 -0
  159. package/dist/codegen/node-host-adapter.js.map +1 -0
  160. package/dist/codegen/runner.d.ts +36 -2
  161. package/dist/codegen/runner.d.ts.map +1 -1
  162. package/dist/codegen/runner.js +147 -271
  163. package/dist/codegen/runner.js.map +1 -1
  164. package/dist/codegen/types.d.ts +96 -0
  165. package/dist/codegen/types.d.ts.map +1 -0
  166. package/dist/codegen/types.js +63 -0
  167. package/dist/codegen/types.js.map +1 -0
  168. package/dist/compact/expand.d.ts +25 -0
  169. package/dist/compact/expand.d.ts.map +1 -0
  170. package/dist/compact/expand.js +199 -0
  171. package/dist/compact/expand.js.map +1 -0
  172. package/dist/compile.d.ts +2 -1
  173. package/dist/compile.d.ts.map +1 -1
  174. package/dist/compile.js +2 -2
  175. package/dist/compile.js.map +1 -1
  176. package/dist/contracts/translate.js.map +1 -1
  177. package/dist/contracts/verify.d.ts +10 -2
  178. package/dist/contracts/verify.d.ts.map +1 -1
  179. package/dist/contracts/verify.js +26 -21
  180. package/dist/contracts/verify.js.map +1 -1
  181. package/dist/effects/call-graph.d.ts.map +1 -1
  182. package/dist/effects/call-graph.js +27 -4
  183. package/dist/effects/call-graph.js.map +1 -1
  184. package/dist/effects/effect-check.d.ts +10 -2
  185. package/dist/effects/effect-check.d.ts.map +1 -1
  186. package/dist/effects/effect-check.js +12 -7
  187. package/dist/effects/effect-check.js.map +1 -1
  188. package/dist/errors/error-catalog.d.ts +1 -1
  189. package/dist/errors/error-catalog.d.ts.map +1 -1
  190. package/dist/errors/error-catalog.js +119 -0
  191. package/dist/errors/error-catalog.js.map +1 -1
  192. package/dist/errors/structured-errors.d.ts +28 -1
  193. package/dist/errors/structured-errors.d.ts.map +1 -1
  194. package/dist/errors/structured-errors.js +9 -0
  195. package/dist/errors/structured-errors.js.map +1 -1
  196. package/dist/index.d.ts +20 -9
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +26 -10
  199. package/dist/index.js.map +1 -1
  200. package/dist/lint/lint.d.ts +9 -0
  201. package/dist/lint/lint.d.ts.map +1 -0
  202. package/dist/lint/lint.js +354 -0
  203. package/dist/lint/lint.js.map +1 -0
  204. package/dist/lint/warnings.d.ts +54 -0
  205. package/dist/lint/warnings.d.ts.map +1 -0
  206. package/dist/lint/warnings.js +39 -0
  207. package/dist/lint/warnings.js.map +1 -0
  208. package/dist/mcp/create-server.d.ts.map +1 -1
  209. package/dist/mcp/create-server.js +66 -5
  210. package/dist/mcp/create-server.js.map +1 -1
  211. package/dist/mcp/handlers.d.ts +21 -5
  212. package/dist/mcp/handlers.d.ts.map +1 -1
  213. package/dist/mcp/handlers.js +65 -15
  214. package/dist/mcp/handlers.js.map +1 -1
  215. package/dist/mcp/prompts.d.ts +17 -0
  216. package/dist/mcp/prompts.d.ts.map +1 -0
  217. package/dist/mcp/prompts.js +181 -0
  218. package/dist/mcp/prompts.js.map +1 -0
  219. package/dist/mcp/server.js +1 -4
  220. package/dist/mcp/server.js.map +1 -1
  221. package/dist/resolver/resolve.d.ts.map +1 -1
  222. package/dist/resolver/resolve.js +62 -16
  223. package/dist/resolver/resolve.js.map +1 -1
  224. package/dist/validator/node-validators.d.ts.map +1 -1
  225. package/dist/validator/node-validators.js +60 -5
  226. package/dist/validator/node-validators.js.map +1 -1
  227. package/package.json +4 -2
@@ -0,0 +1,127 @@
1
+ // =============================================================================
2
+ // Host Helpers — shared WASM memory utilities for builtin domain factories
3
+ // =============================================================================
4
+ // Extracted from host-functions.ts. These helpers are used by domain factory
5
+ // functions to interact with WASM linear memory (read/write strings, arrays,
6
+ // Result values, allocate heap space).
7
+ /** Typed error thrown when a host-side heap allocation exceeds WASM memory bounds. */
8
+ export class EdictOomError extends Error {
9
+ heapUsed;
10
+ heapLimit;
11
+ constructor(heapUsed, heapLimit) {
12
+ super("edict_oom: heap exhausted");
13
+ this.heapUsed = heapUsed;
14
+ this.heapLimit = heapLimit;
15
+ }
16
+ }
17
+ // =============================================================================
18
+ // Memory helpers
19
+ // =============================================================================
20
+ export function getMemoryBuffer(state) {
21
+ return state.instance.exports.memory.buffer;
22
+ }
23
+ /**
24
+ * Centralized heap allocator with bounds checking.
25
+ * Allocates `size` bytes (8-byte aligned) from the bump allocator,
26
+ * throwing EdictOomError if the allocation would exceed WASM memory.
27
+ */
28
+ export function allocateHeap(state, size) {
29
+ const getHeapPtr = state.instance.exports.__get_heap_ptr;
30
+ const setHeapPtr = state.instance.exports.__set_heap_ptr;
31
+ const ptr = getHeapPtr();
32
+ const aligned = Math.ceil(size / 8) * 8;
33
+ const newPtr = ptr + aligned;
34
+ const memorySize = getMemoryBuffer(state).byteLength;
35
+ if (newPtr > memorySize) {
36
+ throw new EdictOomError(ptr, memorySize);
37
+ }
38
+ setHeapPtr(newPtr);
39
+ return ptr;
40
+ }
41
+ /**
42
+ * Write a string result into WASM memory at __heap_ptr,
43
+ * advance __heap_ptr (8-byte aligned), set __str_ret_len, and return ptr.
44
+ */
45
+ export function writeStringResult(state, str, encoder) {
46
+ const encoded = encoder.encode(str);
47
+ const resultPtr = allocateHeap(state, encoded.length);
48
+ const dest = new Uint8Array(getMemoryBuffer(state), resultPtr, encoded.length);
49
+ dest.set(encoded);
50
+ const setStrRetLen = state.instance.exports.__set_str_ret_len;
51
+ setStrRetLen(encoded.length);
52
+ return resultPtr;
53
+ }
54
+ /**
55
+ * Allocate a new array on the WASM heap: [length: i32][elem0: i32]...
56
+ * Advances __heap_ptr (8-byte aligned) and returns the new array pointer.
57
+ */
58
+ export function writeArrayResult(state, elements) {
59
+ const totalSize = 4 + elements.length * 4; // header + elements
60
+ const resultPtr = allocateHeap(state, totalSize);
61
+ const view = new DataView(getMemoryBuffer(state));
62
+ view.setInt32(resultPtr, elements.length, true); // write length
63
+ for (let i = 0; i < elements.length; i++) {
64
+ view.setInt32(resultPtr + 4 + i * 4, elements[i], true);
65
+ }
66
+ return resultPtr;
67
+ }
68
+ /**
69
+ * Allocate a Result value on the WASM heap: [tag: i32][pad(4)][value: i32][pad(4)]
70
+ * tag=0 means Ok, tag=1 means Err. Total size = 16 bytes (matches enum layout).
71
+ * Returns the pointer to the Result pair.
72
+ */
73
+ export function writeResultValue(state, tag, value) {
74
+ const ptr = allocateHeap(state, 16);
75
+ const view = new DataView(getMemoryBuffer(state));
76
+ view.setInt32(ptr, tag, true); // tag at offset 0
77
+ view.setInt32(ptr + 8, value, true); // value at offset 8 (matches EnumVariantLayout)
78
+ return ptr;
79
+ }
80
+ /**
81
+ * Format a Date using strftime-style tokens.
82
+ * Supported: %Y (year), %m (month 01-12), %d (day 01-31),
83
+ * %H (hour 00-23), %M (min 00-59), %S (sec 00-59), %% (literal %)
84
+ */
85
+ export function formatDateString(date, fmt) {
86
+ const pad2 = (n) => String(n).padStart(2, "0");
87
+ let result = "";
88
+ let i = 0;
89
+ while (i < fmt.length) {
90
+ if (fmt[i] === "%" && i + 1 < fmt.length) {
91
+ const token = fmt[i + 1];
92
+ switch (token) {
93
+ case "Y":
94
+ result += String(date.getUTCFullYear());
95
+ break;
96
+ case "m":
97
+ result += pad2(date.getUTCMonth() + 1);
98
+ break;
99
+ case "d":
100
+ result += pad2(date.getUTCDate());
101
+ break;
102
+ case "H":
103
+ result += pad2(date.getUTCHours());
104
+ break;
105
+ case "M":
106
+ result += pad2(date.getUTCMinutes());
107
+ break;
108
+ case "S":
109
+ result += pad2(date.getUTCSeconds());
110
+ break;
111
+ case "%":
112
+ result += "%";
113
+ break;
114
+ default:
115
+ result += "%" + token;
116
+ break; // unknown token → pass through
117
+ }
118
+ i += 2;
119
+ }
120
+ else {
121
+ result += fmt[i];
122
+ i++;
123
+ }
124
+ }
125
+ return result;
126
+ }
127
+ //# sourceMappingURL=host-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-helpers.js","sourceRoot":"","sources":["../../src/builtins/host-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { FunctionType } from "../ast/types.js";
2
+ import type { EdictHostAdapter } from "../codegen/host-adapter.js";
3
+ import type { RuntimeState } from "./host-helpers.js";
4
+ import type binaryen from "binaryen";
5
+ export type { BuiltinDef, BuiltinImpl } from "./builtin-types.js";
6
+ import type { BuiltinDef } from "./builtin-types.js";
7
+ /**
8
+ * Backward-compatible builtin interface — same shape as the old BuiltinFunction.
9
+ * Used by resolver, checker, codegen, etc.
10
+ */
11
+ export interface BuiltinFunction {
12
+ /** Edict-level function type signature (includes effects, params, returnType) */
13
+ type: FunctionType;
14
+ /** WASM import: [module, base] names */
15
+ wasmImport: [string, string];
16
+ }
17
+ /** All builtins from all domains, composed in one flat array. */
18
+ export declare const ALL_BUILTINS: readonly BuiltinDef[];
19
+ /**
20
+ * Backward-compatible builtin function map — derived from the registry.
21
+ * Same API as the old BUILTIN_FUNCTIONS in builtins.ts.
22
+ */
23
+ export declare const BUILTIN_FUNCTIONS: ReadonlyMap<string, BuiltinFunction>;
24
+ /**
25
+ * Check if a name refers to a built-in function.
26
+ */
27
+ export declare function isBuiltin(name: string): boolean;
28
+ /**
29
+ * Get the built-in function definition, or undefined.
30
+ */
31
+ export declare function getBuiltin(name: string): BuiltinFunction | undefined;
32
+ /**
33
+ * Create the complete host import object for WASM instantiation.
34
+ * Iterates all host-kind builtins in the registry and builds a single
35
+ * flat { host: { ... } } object.
36
+ *
37
+ * @param state — mutable runtime state shared across all host functions.
38
+ * `state.instance` must be set after `WebAssembly.instantiate()`
39
+ * but before calling any exported WASM function.
40
+ * @param adapter — optional platform-specific adapter. Defaults to NodeHostAdapter.
41
+ */
42
+ export declare function createHostImports(state: RuntimeState, adapter?: EdictHostAdapter): Record<string, Record<string, unknown>>;
43
+ /**
44
+ * Generate all WASM-native builtin functions (HOFs) from the registry.
45
+ * Called by codegen.ts after compiling user functions.
46
+ */
47
+ export declare function generateWasmBuiltins(mod: binaryen.Module): void;
48
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/builtins/registry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBrD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,iFAAiF;IACjF,IAAI,EAAE,YAAY,CAAC;IACnB,wCAAwC;IACxC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAMD,iEAAiE;AACjE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAgB7C,CAAC;AAaF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAElE,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEpE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,gBAAgB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBzC;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAM/D"}
@@ -0,0 +1,118 @@
1
+ // =============================================================================
2
+ // Builtin Registry — single source of truth for all Edict builtins
3
+ // =============================================================================
4
+ // Each builtin's type signature and implementation are co-located in domain
5
+ // files under src/builtins/domains/. This registry composes all domains and
6
+ // derives the BUILTIN_FUNCTIONS map, host imports, and WASM generators.
7
+ //
8
+ // Adding a new builtin:
9
+ // 1. Add a BuiltinDef entry to the appropriate domain file
10
+ // 2. That's it — registry derives everything else automatically
11
+ import { NodeHostAdapter } from "../codegen/node-host-adapter.js";
12
+ // ── Domain imports ──────────────────────────────────────────────────────────
13
+ import { CORE_BUILTINS } from "./domains/core.js";
14
+ import { STRING_BUILTINS } from "./domains/string.js";
15
+ import { MATH_BUILTINS } from "./domains/math.js";
16
+ import { TYPE_CONVERSION_BUILTINS } from "./domains/type-conversion.js";
17
+ import { INT64_BUILTINS } from "./domains/int64.js";
18
+ import { ARRAY_BUILTINS } from "./domains/array.js";
19
+ import { OPTION_BUILTINS } from "./domains/option.js";
20
+ import { RESULT_BUILTINS } from "./domains/result.js";
21
+ import { JSON_BUILTINS } from "./domains/json.js";
22
+ import { RANDOM_BUILTINS } from "./domains/random.js";
23
+ import { DATETIME_BUILTINS } from "./domains/datetime.js";
24
+ import { REGEX_BUILTINS } from "./domains/regex.js";
25
+ import { CRYPTO_BUILTINS } from "./domains/crypto.js";
26
+ import { HTTP_BUILTINS } from "./domains/http.js";
27
+ import { IO_BUILTINS } from "./domains/io.js";
28
+ // =============================================================================
29
+ // Registry composition
30
+ // =============================================================================
31
+ /** All builtins from all domains, composed in one flat array. */
32
+ export const ALL_BUILTINS = [
33
+ ...CORE_BUILTINS,
34
+ ...STRING_BUILTINS,
35
+ ...MATH_BUILTINS,
36
+ ...TYPE_CONVERSION_BUILTINS,
37
+ ...INT64_BUILTINS,
38
+ ...ARRAY_BUILTINS,
39
+ ...OPTION_BUILTINS,
40
+ ...RESULT_BUILTINS,
41
+ ...JSON_BUILTINS,
42
+ ...RANDOM_BUILTINS,
43
+ ...DATETIME_BUILTINS,
44
+ ...REGEX_BUILTINS,
45
+ ...CRYPTO_BUILTINS,
46
+ ...HTTP_BUILTINS,
47
+ ...IO_BUILTINS,
48
+ ];
49
+ // =============================================================================
50
+ // Derived maps
51
+ // =============================================================================
52
+ /** Derive the WASM import path from the implementation kind. */
53
+ function deriveWasmImport(def) {
54
+ return def.impl.kind === "host"
55
+ ? ["host", def.name]
56
+ : ["__wasm", def.name];
57
+ }
58
+ /**
59
+ * Backward-compatible builtin function map — derived from the registry.
60
+ * Same API as the old BUILTIN_FUNCTIONS in builtins.ts.
61
+ */
62
+ export const BUILTIN_FUNCTIONS = new Map(ALL_BUILTINS.map(b => [b.name, { type: b.type, wasmImport: deriveWasmImport(b) }]));
63
+ /**
64
+ * Check if a name refers to a built-in function.
65
+ */
66
+ export function isBuiltin(name) {
67
+ return BUILTIN_FUNCTIONS.has(name);
68
+ }
69
+ /**
70
+ * Get the built-in function definition, or undefined.
71
+ */
72
+ export function getBuiltin(name) {
73
+ return BUILTIN_FUNCTIONS.get(name);
74
+ }
75
+ // =============================================================================
76
+ // Host import factory — derives host imports from registry
77
+ // =============================================================================
78
+ /**
79
+ * Create the complete host import object for WASM instantiation.
80
+ * Iterates all host-kind builtins in the registry and builds a single
81
+ * flat { host: { ... } } object.
82
+ *
83
+ * @param state — mutable runtime state shared across all host functions.
84
+ * `state.instance` must be set after `WebAssembly.instantiate()`
85
+ * but before calling any exported WASM function.
86
+ * @param adapter — optional platform-specific adapter. Defaults to NodeHostAdapter.
87
+ */
88
+ export function createHostImports(state, adapter) {
89
+ const hostAdapter = adapter ?? new NodeHostAdapter(state.sandboxDir);
90
+ const ctx = {
91
+ state,
92
+ adapter: hostAdapter,
93
+ encoder: new TextEncoder(),
94
+ decoder: new TextDecoder(),
95
+ };
96
+ const hostFunctions = {};
97
+ for (const def of ALL_BUILTINS) {
98
+ if (def.impl.kind === "host") {
99
+ hostFunctions[def.name] = def.impl.factory(ctx);
100
+ }
101
+ }
102
+ return { host: hostFunctions };
103
+ }
104
+ // =============================================================================
105
+ // WASM builtin generator — runs all WASM-native generators from registry
106
+ // =============================================================================
107
+ /**
108
+ * Generate all WASM-native builtin functions (HOFs) from the registry.
109
+ * Called by codegen.ts after compiling user functions.
110
+ */
111
+ export function generateWasmBuiltins(mod) {
112
+ for (const def of ALL_BUILTINS) {
113
+ if (def.impl.kind === "wasm") {
114
+ def.impl.generator(mod);
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/builtins/registry.ts"],"names":[],"mappings":"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"}
package/dist/check.d.ts CHANGED
@@ -1,10 +1,17 @@
1
- import type { StructuredError } from "./errors/structured-errors.js";
1
+ import type { StructuredError, AnalysisDiagnostic, VerificationCoverage } from "./errors/structured-errors.js";
2
+ import { type TypedModuleInfo } from "./checker/check.js";
2
3
  import type { EdictModule } from "./ast/nodes.js";
3
4
  export interface CheckResult {
4
5
  ok: boolean;
5
6
  errors: StructuredError[];
6
7
  /** The validated module AST (only present when ok === true) */
7
8
  module?: EdictModule;
9
+ /** Side-table of inferred types (only present when ok === true) */
10
+ typeInfo?: TypedModuleInfo;
11
+ /** INFO-level diagnostics about skipped analyses (present even when ok === true) */
12
+ diagnostics?: AnalysisDiagnostic[];
13
+ /** Summary of what was verified vs. skipped */
14
+ coverage?: VerificationCoverage;
8
15
  }
9
16
  /**
10
17
  * Full pipeline: validate → resolve → typeCheck → effectCheck → contractVerify.
@@ -13,7 +20,7 @@ export interface CheckResult {
13
20
  * If resolution fails, returns resolution errors (later phases skipped).
14
21
  * If type checking fails, returns type errors (effect checking skipped).
15
22
  * If effect checking fails, returns effect errors (contract verification skipped).
16
- * If all passes succeed, returns `{ ok: true, errors: [] }`.
23
+ * If all passes succeed, returns `{ ok: true, errors: [] }` with diagnostics and coverage.
17
24
  */
18
25
  export declare function check(ast: unknown): Promise<CheckResult>;
19
26
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAiC9D"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAG/G,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,oFAAoF;IACpF,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAgE9D"}
package/dist/check.js CHANGED
@@ -15,7 +15,7 @@ import { contractVerify } from "./contracts/verify.js";
15
15
  * If resolution fails, returns resolution errors (later phases skipped).
16
16
  * If type checking fails, returns type errors (effect checking skipped).
17
17
  * If effect checking fails, returns effect errors (contract verification skipped).
18
- * If all passes succeed, returns `{ ok: true, errors: [] }`.
18
+ * If all passes succeed, returns `{ ok: true, errors: [] }` with diagnostics and coverage.
19
19
  */
20
20
  export async function check(ast) {
21
21
  // Phase 1 — Structural validation
@@ -30,20 +30,41 @@ export async function check(ast) {
30
30
  return { ok: false, errors: resolveErrors };
31
31
  }
32
32
  // Phase 2b — Type checking
33
- const typeErrors = typeCheck(module);
33
+ const { errors: typeErrors, typeInfo } = typeCheck(module);
34
34
  if (typeErrors.length > 0) {
35
35
  return { ok: false, errors: typeErrors };
36
36
  }
37
37
  // Phase 3 — Effect checking
38
- const effectErrors = effectCheck(module);
39
- if (effectErrors.length > 0) {
40
- return { ok: false, errors: effectErrors };
38
+ const effectResult = effectCheck(module);
39
+ if (effectResult.errors.length > 0) {
40
+ return { ok: false, errors: effectResult.errors, diagnostics: effectResult.diagnostics };
41
41
  }
42
42
  // Phase 4 — Contract verification
43
- const contractErrors = await contractVerify(module);
44
- if (contractErrors.length > 0) {
45
- return { ok: false, errors: contractErrors };
43
+ const contractResult = await contractVerify(module);
44
+ if (contractResult.errors.length > 0) {
45
+ return { ok: false, errors: contractResult.errors, diagnostics: [...effectResult.diagnostics, ...contractResult.diagnostics] };
46
46
  }
47
- return { ok: true, errors: [], module };
47
+ // Combine all diagnostics
48
+ const diagnostics = [...effectResult.diagnostics, ...contractResult.diagnostics];
49
+ // Compute verification coverage
50
+ const fnCount = module.definitions.filter(d => d.kind === "fn").length;
51
+ const effectSkipped = new Set(effectResult.diagnostics.map(d => d.functionName)).size;
52
+ const contractSkipped = new Set(contractResult.diagnostics
53
+ .filter(d => d.diagnostic === "contract_skipped_unsupported_params")
54
+ .map(d => d.functionName)).size;
55
+ const fnsWithContracts = module.definitions.filter(d => d.kind === "fn" && d.contracts.length > 0).length;
56
+ const coverage = {
57
+ effects: {
58
+ checked: fnCount - effectSkipped,
59
+ skipped: effectSkipped,
60
+ total: fnCount,
61
+ },
62
+ contracts: {
63
+ proven: fnsWithContracts - contractSkipped,
64
+ skipped: contractSkipped,
65
+ total: fnsWithContracts,
66
+ },
67
+ };
68
+ return { ok: true, errors: [], module, typeInfo, diagnostics, coverage };
48
69
  }
49
70
  //# sourceMappingURL=check.js.map
package/dist/check.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qDAAqD;AACrD,gFAAgF;AAChF,wFAAwF;AACxF,yCAAyC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAUvD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY;IACpC,kCAAkC;IAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,GAAkB,CAAC;IAElC,6BAA6B;IAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAChD,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,4BAA4B;IAC5B,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC/C,CAAC;IAED,kCAAkC;IAClC,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,24 @@
1
1
  import type { EdictModule } from "../ast/nodes.js";
2
+ import type { TypeExpr } from "../ast/types.js";
2
3
  import type { StructuredError } from "../errors/structured-errors.js";
4
+ /**
5
+ * Side-table of inferred types produced by the type checker.
6
+ * Replaces AST mutation — downstream stages read from this instead.
7
+ */
8
+ export interface TypedModuleInfo {
9
+ /** fnId → inferred return type (only for functions without explicit returnType) */
10
+ inferredReturnTypes: Map<string, TypeExpr>;
11
+ /** letExprId → inferred type (only for lets without explicit type annotation) */
12
+ inferredLetTypes: Map<string, TypeExpr>;
13
+ /** lambdaParamId → inferred type from call-site context */
14
+ inferredLambdaParamTypes: Map<string, TypeExpr>;
15
+ }
16
+ export interface TypeCheckResult {
17
+ errors: StructuredError[];
18
+ typeInfo: TypedModuleInfo;
19
+ }
3
20
  /**
4
21
  * Entry point: type-check a validated + resolved Edict module.
5
22
  */
6
- export declare function typeCheck(module: EdictModule): StructuredError[];
23
+ export declare function typeCheck(module: EdictModule): TypeCheckResult;
7
24
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/checker/check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,WAAW,EAOd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAuBtE;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,EAAE,CAwChE"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/checker/check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,WAAW,EAOd,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAkBtE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,mFAAmF;IACnF,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,iFAAiF;IACjF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,2DAA2D;IAC3D,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;CAC7B;AAGD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAmD9D"}