@scriptc/compiler 0.0.33 → 0.0.35

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 (133) hide show
  1. package/dist/backend/cc-cache.test.js +1091 -7
  2. package/dist/backend/cc-cache.test.js.map +1 -1
  3. package/dist/backend/cc.d.ts +109 -18
  4. package/dist/backend/cc.js +1057 -289
  5. package/dist/backend/cc.js.map +1 -1
  6. package/dist/backend/emission/emit-exprs.js +26 -1
  7. package/dist/backend/emission/emit-exprs.js.map +1 -1
  8. package/dist/backend/emission/emit-shapes.js +37 -4
  9. package/dist/backend/emission/emit-shapes.js.map +1 -1
  10. package/dist/backend/emission/emitter.d.ts +11 -2
  11. package/dist/backend/emission/emitter.js +11 -5
  12. package/dist/backend/emission/emitter.js.map +1 -1
  13. package/dist/backend/library-identity.d.ts +22 -0
  14. package/dist/backend/library-identity.js +103 -0
  15. package/dist/backend/library-identity.js.map +1 -0
  16. package/dist/backend/llvm/emitter.d.ts +3 -0
  17. package/dist/backend/llvm/emitter.js +35 -5
  18. package/dist/backend/llvm/emitter.js.map +1 -1
  19. package/dist/backend/llvm/shapes.d.ts +1 -0
  20. package/dist/backend/llvm/shapes.js +25 -1
  21. package/dist/backend/llvm/shapes.js.map +1 -1
  22. package/dist/backend/llvm/split.d.ts +43 -0
  23. package/dist/backend/llvm/split.js +227 -0
  24. package/dist/backend/llvm/split.js.map +1 -0
  25. package/dist/backend/llvm/split.test.d.ts +1 -0
  26. package/dist/backend/llvm/split.test.js +102 -0
  27. package/dist/backend/llvm/split.test.js.map +1 -0
  28. package/dist/backend/mangle.d.ts +1 -0
  29. package/dist/backend/mangle.js +3 -0
  30. package/dist/backend/mangle.js.map +1 -1
  31. package/dist/backend/object-localize.d.ts +5 -5
  32. package/dist/backend/object-localize.js +19 -16
  33. package/dist/backend/object-localize.js.map +1 -1
  34. package/dist/backend/object-localize.test.js +57 -13
  35. package/dist/backend/object-localize.test.js.map +1 -1
  36. package/dist/executable/early-cache.d.ts +86 -0
  37. package/dist/executable/early-cache.js +460 -0
  38. package/dist/executable/early-cache.js.map +1 -0
  39. package/dist/executable/early-cache.test.d.ts +1 -0
  40. package/dist/executable/early-cache.test.js +300 -0
  41. package/dist/executable/early-cache.test.js.map +1 -0
  42. package/dist/ffi/profile.d.ts +7 -2
  43. package/dist/ffi/profile.js +1 -0
  44. package/dist/ffi/profile.js.map +1 -1
  45. package/dist/frontend/input-tracker.d.ts +82 -0
  46. package/dist/frontend/input-tracker.js +380 -0
  47. package/dist/frontend/input-tracker.js.map +1 -0
  48. package/dist/frontend/input-tracker.test.d.ts +1 -0
  49. package/dist/frontend/input-tracker.test.js +137 -0
  50. package/dist/frontend/input-tracker.test.js.map +1 -0
  51. package/dist/frontend/lowering/lower-builtins.js +4 -10
  52. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  53. package/dist/frontend/lowering/lower-calls.js +169 -144
  54. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  55. package/dist/frontend/lowering/lower-classes.js +3 -0
  56. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  57. package/dist/frontend/lowering/lower-containers.js +66 -32
  58. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  59. package/dist/frontend/lowering/lower-exprs.js +89 -11
  60. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  61. package/dist/frontend/lowering/lower-inspect.js +45 -26
  62. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  63. package/dist/frontend/lowering/lower-island.js +3 -3
  64. package/dist/frontend/lowering/lower-island.js.map +1 -1
  65. package/dist/frontend/lowering/lower-mixins.js +1 -1
  66. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  67. package/dist/frontend/lowering/lower-modules.js +1 -1
  68. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  69. package/dist/frontend/lowering/lower-stmts.js +49 -4
  70. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  71. package/dist/frontend/lowering/lowerer.d.ts +73 -29
  72. package/dist/frontend/lowering/lowerer.js +588 -116
  73. package/dist/frontend/lowering/lowerer.js.map +1 -1
  74. package/dist/frontend/lowering/surfaces.js +1 -1
  75. package/dist/frontend/lowering/surfaces.js.map +1 -1
  76. package/dist/frontend/npm-static-rewrite.js +25 -26
  77. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  78. package/dist/frontend/npm-static.js +29 -30
  79. package/dist/frontend/npm-static.js.map +1 -1
  80. package/dist/frontend/npm-static.test.d.ts +1 -0
  81. package/dist/frontend/npm-static.test.js +15 -0
  82. package/dist/frontend/npm-static.test.js.map +1 -0
  83. package/dist/frontend/npm.js +5 -17
  84. package/dist/frontend/npm.js.map +1 -1
  85. package/dist/frontend/program.js +44 -19
  86. package/dist/frontend/program.js.map +1 -1
  87. package/dist/frontend/resolve.js +8 -29
  88. package/dist/frontend/resolve.js.map +1 -1
  89. package/dist/frontend/ts7/checker.d.ts +40 -2
  90. package/dist/frontend/ts7/checker.js +194 -32
  91. package/dist/frontend/ts7/checker.js.map +1 -1
  92. package/dist/frontend/ts7/program.js +17 -18
  93. package/dist/frontend/ts7/program.js.map +1 -1
  94. package/dist/frontend/types.d.ts +33 -0
  95. package/dist/frontend/types.js +134 -45
  96. package/dist/frontend/types.js.map +1 -1
  97. package/dist/index.d.ts +5 -2
  98. package/dist/index.js +458 -141
  99. package/dist/index.js.map +1 -1
  100. package/dist/ir/nodes.d.ts +27 -4
  101. package/dist/ir/nodes.js +28 -0
  102. package/dist/ir/nodes.js.map +1 -1
  103. package/dist/ir/serialize.d.ts +1 -1
  104. package/dist/ir/serialize.js +1 -1
  105. package/dist/ir/validate.js +37 -1
  106. package/dist/ir/validate.js.map +1 -1
  107. package/dist/library/early-cache.d.ts +65 -0
  108. package/dist/library/early-cache.js +361 -0
  109. package/dist/library/early-cache.js.map +1 -0
  110. package/dist/library/early-cache.test.d.ts +1 -0
  111. package/dist/library/early-cache.test.js +528 -0
  112. package/dist/library/early-cache.test.js.map +1 -0
  113. package/dist/library/implementation-identity.d.ts +23 -0
  114. package/dist/library/implementation-identity.js +84 -0
  115. package/dist/library/implementation-identity.js.map +1 -0
  116. package/dist/library/int-infer.js +14 -0
  117. package/dist/library/int-infer.js.map +1 -1
  118. package/dist/library/int-infer.test.js +21 -4
  119. package/dist/library/int-infer.test.js.map +1 -1
  120. package/dist/library/semantic-source.d.ts +13 -0
  121. package/dist/library/semantic-source.js +257 -0
  122. package/dist/library/semantic-source.js.map +1 -0
  123. package/dist/library/semantic-source.test.d.ts +1 -0
  124. package/dist/library/semantic-source.test.js +113 -0
  125. package/dist/library/semantic-source.test.js.map +1 -0
  126. package/dist/library/sidecar.d.ts +6 -0
  127. package/dist/library/sidecar.js +11 -0
  128. package/dist/library/sidecar.js.map +1 -1
  129. package/dist/startup-cache.d.ts +6 -0
  130. package/dist/startup-cache.js +6 -0
  131. package/dist/startup-cache.js.map +1 -0
  132. package/package.json +3 -2
  133. package/surface-manifest.json +1 -1
@@ -0,0 +1,528 @@
1
+ import { mkdir, mkdtemp, readFile, readdir, rm, stat, utimes, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { afterEach, expect, test } from "vitest";
5
+ import { FrontendInputTracker, trackedAccessibleEntries, trackedDirectoryExists, trackedFileExists, trackedReadFile } from "../frontend/input-tracker.js";
6
+ import { publishEarlyLibraryCache, readEarlyLibraryCache, readSemanticLibraryCache, } from "./early-cache.js";
7
+ const scratch = [];
8
+ afterEach(async () => {
9
+ await Promise.all(scratch.splice(0).map((path) => rm(path, { recursive: true, force: true })));
10
+ });
11
+ async function fixture() {
12
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-early-cache-"));
13
+ scratch.push(dir);
14
+ const source = join(dir, "entry.ts");
15
+ const profilePath = join(dir, "profile.json");
16
+ const cPath = join(dir, "entry.lib.ll");
17
+ const irPath = join(dir, "entry.lib.ir.json");
18
+ const sidecarPath = join(dir, "entry.lib.a.contract.json");
19
+ await Promise.all([
20
+ writeFile(source, "export function value(): number { return 1; }\n"),
21
+ writeFile(profilePath, "{}\n"),
22
+ writeFile(cPath, "; generated llvm\n"),
23
+ writeFile(irPath, "{\"irVersion\":6}\n"),
24
+ writeFile(sidecarPath, "{\"contract\":true}\n"),
25
+ ]);
26
+ return {
27
+ root: join(dir, "cache"),
28
+ source,
29
+ missing: join(dir, "missing.ts"),
30
+ cPath,
31
+ irPath,
32
+ sidecarPath,
33
+ options: {
34
+ profilePath,
35
+ profileBytes: new TextEncoder().encode("{}\n"),
36
+ entryPath: source,
37
+ outDir: dir,
38
+ emitIr: true,
39
+ sanitize: false,
40
+ target: "test",
41
+ compiler: ["clang"],
42
+ nodeVersion: "v24-test",
43
+ implementation: "test-implementation",
44
+ },
45
+ };
46
+ }
47
+ test("early library cache restores generated artifacts and metadata", async () => {
48
+ const f = await fixture();
49
+ const tracker = new FrontendInputTracker();
50
+ tracker.run(() => {
51
+ trackedReadFile(f.source);
52
+ trackedFileExists(f.missing);
53
+ });
54
+ const native = {
55
+ backend: "llvm",
56
+ regex: false,
57
+ assert: true,
58
+ inspect: false,
59
+ symbol: false,
60
+ searchParams: false,
61
+ emitter: false,
62
+ zlib: false,
63
+ copying: false,
64
+ textDecoderLegacy: false,
65
+ };
66
+ await publishEarlyLibraryCache(f.root, f.options, {
67
+ cPath: f.cPath,
68
+ irPath: f.irPath,
69
+ sidecarPath: f.sidecarPath,
70
+ native,
71
+ frontend: tracker.snapshot(),
72
+ });
73
+ await Promise.all([rm(f.cPath), rm(f.irPath), rm(f.sidecarPath)]);
74
+ const staleCPath = join(f.options.outDir, "entry.lib.c");
75
+ await writeFile(staleCPath, "/* stale c backend */\n");
76
+ const hit = await readEarlyLibraryCache(f.root, f.options, null);
77
+ expect(hit).not.toBeNull();
78
+ expect(hit?.native).toEqual(native);
79
+ expect(await readFile(f.cPath, "utf8")).toBe("; generated llvm\n");
80
+ expect(await readFile(f.irPath, "utf8")).toContain("irVersion");
81
+ expect(await readFile(f.sidecarPath, "utf8")).toContain("contract");
82
+ await expect(readFile(staleCPath, "utf8")).rejects.toMatchObject({ code: "ENOENT" });
83
+ });
84
+ test("early library cache publishes after creating a fresh output directory", async () => {
85
+ const f = await fixture();
86
+ const cacheRoot = await mkdtemp(join(tmpdir(), "scriptc-early-cache-root-"));
87
+ scratch.push(cacheRoot);
88
+ const outDir = join(f.options.outDir, "fresh-out");
89
+ const cPath = join(outDir, "entry.lib.ll");
90
+ const options = { ...f.options, outDir, emitIr: false };
91
+ const tracker = new FrontendInputTracker();
92
+ tracker.run(() => {
93
+ trackedAccessibleEntries(f.options.outDir);
94
+ trackedDirectoryExists(outDir);
95
+ trackedAccessibleEntries(outDir);
96
+ trackedReadFile(f.source);
97
+ });
98
+ await mkdir(outDir);
99
+ await writeFile(cPath, "; generated llvm in fresh output\n");
100
+ await publishEarlyLibraryCache(cacheRoot, options, {
101
+ cPath,
102
+ native: {
103
+ backend: "llvm",
104
+ regex: false,
105
+ assert: false,
106
+ inspect: false,
107
+ symbol: false,
108
+ searchParams: false,
109
+ emitter: false,
110
+ zlib: false,
111
+ copying: false,
112
+ textDecoderLegacy: false,
113
+ },
114
+ frontend: tracker.snapshot(),
115
+ });
116
+ await rm(cPath);
117
+ expect((await readEarlyLibraryCache(cacheRoot, options, undefined))?.cPath).toBe(cPath);
118
+ expect(await readFile(cPath, "utf8")).toContain("fresh output");
119
+ });
120
+ test("early library cache hits refresh every payload's LRU time", async () => {
121
+ const f = await fixture();
122
+ const tracker = new FrontendInputTracker();
123
+ tracker.run(() => trackedReadFile(f.source));
124
+ await publishEarlyLibraryCache(f.root, f.options, {
125
+ cPath: f.cPath,
126
+ irPath: f.irPath,
127
+ sidecarPath: f.sidecarPath,
128
+ native: {
129
+ backend: "llvm",
130
+ regex: false,
131
+ assert: false,
132
+ inspect: false,
133
+ symbol: false,
134
+ searchParams: false,
135
+ emitter: false,
136
+ zlib: false,
137
+ copying: false,
138
+ textDecoderLegacy: false,
139
+ },
140
+ frontend: tracker.snapshot(),
141
+ });
142
+ const earlyRoot = join(f.root, "early-lib");
143
+ const [key] = await readdir(earlyRoot);
144
+ const entry = join(earlyRoot, key);
145
+ const cachePaths = [
146
+ join(entry, "stamp.json"),
147
+ join(entry, "program.tu"),
148
+ join(entry, "program.ir.json"),
149
+ join(entry, "contract.json"),
150
+ ];
151
+ const old = new Date("2000-01-01T00:00:00.000Z");
152
+ await Promise.all(cachePaths.map((path) => utimes(path, old, old)));
153
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).not.toBeNull();
154
+ for (const path of cachePaths) {
155
+ expect((await stat(path)).mtimeMs).toBeGreaterThan(old.getTime());
156
+ }
157
+ });
158
+ test("early library cache misses on source edits and newly-resolved candidates", async () => {
159
+ const f = await fixture();
160
+ const tracker = new FrontendInputTracker();
161
+ tracker.run(() => {
162
+ trackedReadFile(f.source);
163
+ trackedFileExists(f.missing);
164
+ });
165
+ await publishEarlyLibraryCache(f.root, f.options, {
166
+ cPath: f.cPath,
167
+ irPath: f.irPath,
168
+ sidecarPath: f.sidecarPath,
169
+ native: {
170
+ backend: "llvm",
171
+ regex: false,
172
+ assert: false,
173
+ inspect: false,
174
+ symbol: false,
175
+ searchParams: false,
176
+ emitter: false,
177
+ zlib: false,
178
+ copying: false,
179
+ textDecoderLegacy: false,
180
+ },
181
+ frontend: tracker.snapshot(),
182
+ });
183
+ await writeFile(f.source, "export function value(): number { return 2; }\n");
184
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).toBeNull();
185
+ await writeFile(f.cPath, "; generated llvm v2\n");
186
+ const editedTracker = new FrontendInputTracker();
187
+ editedTracker.run(() => {
188
+ trackedReadFile(f.source);
189
+ trackedFileExists(f.missing);
190
+ });
191
+ await publishEarlyLibraryCache(f.root, f.options, {
192
+ cPath: f.cPath,
193
+ irPath: f.irPath,
194
+ sidecarPath: f.sidecarPath,
195
+ native: {
196
+ backend: "llvm",
197
+ regex: false,
198
+ assert: false,
199
+ inspect: false,
200
+ symbol: false,
201
+ searchParams: false,
202
+ emitter: false,
203
+ zlib: false,
204
+ copying: false,
205
+ textDecoderLegacy: false,
206
+ },
207
+ frontend: editedTracker.snapshot(),
208
+ });
209
+ expect((await readEarlyLibraryCache(f.root, f.options, null))?.cPath).toBe(f.cPath);
210
+ expect(await readFile(f.cPath, "utf8")).toBe("; generated llvm v2\n");
211
+ await writeFile(f.source, "export function value(): number { return 1; }\n");
212
+ await writeFile(f.missing, "export const appeared = true;\n");
213
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).toBeNull();
214
+ });
215
+ test("semantic library cache restores and rebases IR after a comment-only edit", async () => {
216
+ const f = await fixture();
217
+ const sourceBefore = await readFile(f.source, "utf8");
218
+ const returnStart = sourceBefore.indexOf("return");
219
+ const semanticMod = {
220
+ irVersion: 6,
221
+ sourceFile: f.source,
222
+ functions: [{
223
+ name: "__main",
224
+ params: [],
225
+ returnType: { kind: "void" },
226
+ locals: [],
227
+ body: [],
228
+ loc: { file: f.source, start: returnStart, end: returnStart + 6 },
229
+ }],
230
+ entry: "__main",
231
+ };
232
+ const tracker = new FrontendInputTracker();
233
+ tracker.run(() => trackedReadFile(f.source));
234
+ await publishEarlyLibraryCache(f.root, f.options, {
235
+ cPath: f.cPath,
236
+ irPath: f.irPath,
237
+ sidecarPath: f.sidecarPath,
238
+ native: {
239
+ backend: "llvm",
240
+ regex: false,
241
+ assert: false,
242
+ inspect: false,
243
+ symbol: false,
244
+ searchParams: false,
245
+ emitter: false,
246
+ zlib: false,
247
+ copying: false,
248
+ textDecoderLegacy: false,
249
+ },
250
+ frontend: tracker.snapshot(),
251
+ semantic: { mod: semanticMod, sources: new Map([[f.source, sourceBefore]]) },
252
+ });
253
+ const sourceAfter = `// inserted comment\n${sourceBefore}`;
254
+ await writeFile(f.source, sourceAfter);
255
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).toBeNull();
256
+ const hit = await readSemanticLibraryCache(f.root, f.options, null);
257
+ expect(hit).not.toBeNull();
258
+ expect(hit?.changedSources).toEqual([f.source]);
259
+ expect(hit?.translationUnit).toBe("; generated llvm\n");
260
+ expect(hit?.mod.functions[0].loc.start).toBe(sourceAfter.indexOf("return"));
261
+ expect(hit?.frontend.probes).toContainEqual(expect.objectContaining({
262
+ op: "file",
263
+ path: f.source,
264
+ }));
265
+ const earlyRoot = join(f.root, "early-lib");
266
+ const [key] = await readdir(earlyRoot);
267
+ await writeFile(join(earlyRoot, key, "program.tu"), "corrupt\n");
268
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
269
+ });
270
+ test("semantic library cache refuses token and directive edits", async () => {
271
+ const f = await fixture();
272
+ const sourceBefore = await readFile(f.source, "utf8");
273
+ const semanticMod = {
274
+ irVersion: 6,
275
+ sourceFile: f.source,
276
+ functions: [{
277
+ name: "__main",
278
+ params: [],
279
+ returnType: { kind: "void" },
280
+ locals: [],
281
+ body: [],
282
+ loc: { file: f.source, start: 0, end: sourceBefore.length },
283
+ }],
284
+ entry: "__main",
285
+ };
286
+ const tracker = new FrontendInputTracker();
287
+ tracker.run(() => trackedReadFile(f.source));
288
+ await publishEarlyLibraryCache(f.root, f.options, {
289
+ cPath: f.cPath,
290
+ irPath: f.irPath,
291
+ sidecarPath: f.sidecarPath,
292
+ native: {
293
+ backend: "llvm",
294
+ regex: false,
295
+ assert: false,
296
+ inspect: false,
297
+ symbol: false,
298
+ searchParams: false,
299
+ emitter: false,
300
+ zlib: false,
301
+ copying: false,
302
+ textDecoderLegacy: false,
303
+ },
304
+ frontend: tracker.snapshot(),
305
+ semantic: { mod: semanticMod, sources: new Map([[f.source, sourceBefore]]) },
306
+ });
307
+ await writeFile(f.source, sourceBefore.replace("return 1", "return 2"));
308
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
309
+ await writeFile(f.source, `// @ts-expect-error\n${sourceBefore}`);
310
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
311
+ });
312
+ test("semantic C cache accepts only line-preserving single-source edits", async () => {
313
+ const f = await fixture();
314
+ const sourceBefore = await readFile(f.source, "utf8");
315
+ const semanticMod = {
316
+ irVersion: 6,
317
+ sourceFile: f.source,
318
+ functions: [{
319
+ name: "__main",
320
+ params: [],
321
+ returnType: { kind: "void" },
322
+ locals: [],
323
+ body: [],
324
+ loc: { file: f.source, start: 0, end: sourceBefore.length },
325
+ }],
326
+ entry: "__main",
327
+ };
328
+ const tracker = new FrontendInputTracker();
329
+ tracker.run(() => trackedReadFile(f.source));
330
+ await publishEarlyLibraryCache(f.root, f.options, {
331
+ cPath: f.cPath,
332
+ irPath: f.irPath,
333
+ sidecarPath: f.sidecarPath,
334
+ native: {
335
+ backend: "c",
336
+ regex: false,
337
+ assert: false,
338
+ inspect: false,
339
+ symbol: false,
340
+ searchParams: false,
341
+ emitter: false,
342
+ zlib: false,
343
+ copying: false,
344
+ textDecoderLegacy: false,
345
+ },
346
+ frontend: tracker.snapshot(),
347
+ semantic: { mod: semanticMod, sources: new Map([[f.source, sourceBefore]]) },
348
+ });
349
+ await writeFile(f.source, `/* harmless */ ${sourceBefore}`);
350
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).not.toBeNull();
351
+ await writeFile(f.source, `// inserted line\n${sourceBefore}`);
352
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
353
+ });
354
+ test("semantic C cache refuses non-LF separator normalization", async () => {
355
+ const f = await fixture();
356
+ for (const separator of ["\r", "\u2028", "\u2029"]) {
357
+ const sourceBefore = [
358
+ "export function first(): number { return 1; }",
359
+ "export function value(): number { return 2; }\n",
360
+ ].join(separator);
361
+ await writeFile(f.source, sourceBefore);
362
+ const tracker = new FrontendInputTracker();
363
+ tracker.run(() => trackedReadFile(f.source));
364
+ await publishEarlyLibraryCache(f.root, f.options, {
365
+ cPath: f.cPath,
366
+ irPath: f.irPath,
367
+ sidecarPath: f.sidecarPath,
368
+ native: {
369
+ backend: "c",
370
+ regex: false,
371
+ assert: false,
372
+ inspect: false,
373
+ symbol: false,
374
+ searchParams: false,
375
+ emitter: false,
376
+ zlib: false,
377
+ copying: false,
378
+ textDecoderLegacy: false,
379
+ },
380
+ frontend: tracker.snapshot(),
381
+ semantic: {
382
+ mod: {
383
+ irVersion: 6,
384
+ sourceFile: f.source,
385
+ functions: [],
386
+ entry: "__main",
387
+ },
388
+ sources: new Map([[f.source, sourceBefore]]),
389
+ },
390
+ });
391
+ await writeFile(f.source, sourceBefore.replace(separator, "\n"));
392
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
393
+ }
394
+ });
395
+ test("semantic C cache refuses comment-only edits in multi-source graphs", async () => {
396
+ const f = await fixture();
397
+ const imported = join(dirname(f.source), "helper.ts");
398
+ const entrySource = await readFile(f.source, "utf8");
399
+ const importedSource = "export function helper(): number { return 1; }\n";
400
+ await writeFile(imported, importedSource);
401
+ const semanticMod = {
402
+ irVersion: 6,
403
+ sourceFile: f.source,
404
+ functions: [{
405
+ name: "__main",
406
+ params: [],
407
+ returnType: { kind: "void" },
408
+ locals: [],
409
+ body: [],
410
+ loc: { file: f.source, start: 0, end: entrySource.length },
411
+ }],
412
+ entry: "__main",
413
+ };
414
+ const tracker = new FrontendInputTracker();
415
+ tracker.run(() => {
416
+ trackedReadFile(f.source);
417
+ trackedReadFile(imported);
418
+ });
419
+ await publishEarlyLibraryCache(f.root, f.options, {
420
+ cPath: f.cPath,
421
+ irPath: f.irPath,
422
+ sidecarPath: f.sidecarPath,
423
+ native: {
424
+ backend: "c",
425
+ regex: false,
426
+ assert: false,
427
+ inspect: false,
428
+ symbol: false,
429
+ searchParams: false,
430
+ emitter: false,
431
+ zlib: false,
432
+ copying: false,
433
+ textDecoderLegacy: false,
434
+ },
435
+ frontend: tracker.snapshot(),
436
+ semantic: {
437
+ mod: semanticMod,
438
+ sources: new Map([[f.source, entrySource], [imported, importedSource]]),
439
+ },
440
+ });
441
+ await writeFile(f.source, `// inserted entry comment\n${entrySource}`);
442
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
443
+ await writeFile(f.source, entrySource);
444
+ await writeFile(imported, `// inserted imported comment\n${importedSource}`);
445
+ expect(await readSemanticLibraryCache(f.root, f.options, null)).toBeNull();
446
+ });
447
+ test("early library cache is separated by the host Node version", async () => {
448
+ const f = await fixture();
449
+ const tracker = new FrontendInputTracker();
450
+ tracker.run(() => trackedReadFile(f.source));
451
+ await publishEarlyLibraryCache(f.root, f.options, {
452
+ cPath: f.cPath,
453
+ irPath: f.irPath,
454
+ sidecarPath: f.sidecarPath,
455
+ native: {
456
+ backend: "llvm",
457
+ regex: false,
458
+ assert: false,
459
+ inspect: false,
460
+ symbol: false,
461
+ searchParams: false,
462
+ emitter: false,
463
+ zlib: false,
464
+ copying: false,
465
+ textDecoderLegacy: false,
466
+ },
467
+ frontend: tracker.snapshot(),
468
+ });
469
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).not.toBeNull();
470
+ expect(await readEarlyLibraryCache(f.root, { ...f.options, nodeVersion: "v25-test" }, null)).toBeNull();
471
+ });
472
+ test("early library cache rejects corrupted artifacts and metadata", async () => {
473
+ const f = await fixture();
474
+ const tracker = new FrontendInputTracker();
475
+ tracker.run(() => trackedReadFile(f.source));
476
+ await publishEarlyLibraryCache(f.root, f.options, {
477
+ cPath: f.cPath,
478
+ irPath: f.irPath,
479
+ sidecarPath: f.sidecarPath,
480
+ native: {
481
+ backend: "llvm",
482
+ regex: false,
483
+ assert: false,
484
+ inspect: false,
485
+ symbol: false,
486
+ searchParams: false,
487
+ emitter: false,
488
+ zlib: false,
489
+ copying: false,
490
+ textDecoderLegacy: false,
491
+ },
492
+ frontend: tracker.snapshot(),
493
+ });
494
+ const earlyRoot = join(f.root, "early-lib");
495
+ const [key] = await readdir(earlyRoot);
496
+ await writeFile(join(earlyRoot, key, "program.tu"), "corrupt\n");
497
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).toBeNull();
498
+ const stamp = join(earlyRoot, key, "stamp.json");
499
+ await writeFile(stamp, "{\"version\":1}\n");
500
+ expect(await readEarlyLibraryCache(f.root, f.options, null)).toBeNull();
501
+ });
502
+ test("disabled early library cache performs no reads or writes", async () => {
503
+ const f = await fixture();
504
+ const tracker = new FrontendInputTracker();
505
+ tracker.run(() => trackedReadFile(f.source));
506
+ const publish = {
507
+ cPath: f.cPath,
508
+ irPath: f.irPath,
509
+ sidecarPath: f.sidecarPath,
510
+ native: {
511
+ backend: "llvm",
512
+ regex: false,
513
+ assert: false,
514
+ inspect: false,
515
+ symbol: false,
516
+ searchParams: false,
517
+ emitter: false,
518
+ zlib: false,
519
+ copying: false,
520
+ textDecoderLegacy: false,
521
+ },
522
+ frontend: tracker.snapshot(),
523
+ };
524
+ await publishEarlyLibraryCache(null, f.options, publish);
525
+ await expect(readdir(f.root)).rejects.toThrow();
526
+ expect(await readEarlyLibraryCache(null, f.options, null)).toBeNull();
527
+ });
528
+ //# sourceMappingURL=early-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-cache.test.js","sourceRoot":"","sources":["../../src/library/early-cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface CompilerImplementationDependency {
2
+ path: string;
3
+ kind: "file" | "directory";
4
+ dev: number;
5
+ ino: number;
6
+ size: number;
7
+ mtimeMs: number;
8
+ ctimeMs: number;
9
+ }
10
+ export interface CompilerImplementationIdentity {
11
+ digest: string;
12
+ dependencies: CompilerImplementationDependency[];
13
+ }
14
+ /** The installed compiler package whose bytes define frontend identity. The
15
+ * startup route also uses this location to keep metadata proofs from two
16
+ * source checkouts sharing a cache root from standing in for one another. */
17
+ export declare function compilerImplementationRoot(): string;
18
+ /** Content identity plus a cheap replay proof for the compiler package that
19
+ * produced an early frontend artifact. Full compiles hash every byte before
20
+ * publication; the CLI fast path validates the captured inode/time/size
21
+ * metadata and loads the large compiler graph only when anything changed. */
22
+ export declare function compilerImplementationIdentity(captureDependencies?: boolean): Promise<CompilerImplementationIdentity>;
23
+ export declare function compilerImplementationDependenciesStillMatch(dependencies: readonly CompilerImplementationDependency[]): Promise<boolean>;
@@ -0,0 +1,84 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile, readdir } from "node:fs/promises";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ /** The installed compiler package whose bytes define frontend identity. The
6
+ * startup route also uses this location to keep metadata proofs from two
7
+ * source checkouts sharing a cache root from standing in for one another. */
8
+ export function compilerImplementationRoot() {
9
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
10
+ return resolve(moduleDir, "..", "..");
11
+ }
12
+ function dependency(path, info) {
13
+ const kind = info.isFile() ? "file" : info.isDirectory() ? "directory" : null;
14
+ return kind === null
15
+ ? null
16
+ : {
17
+ path,
18
+ kind,
19
+ dev: Number(info.dev),
20
+ ino: Number(info.ino),
21
+ size: Number(info.size),
22
+ mtimeMs: Number(info.mtimeMs),
23
+ ctimeMs: Number(info.ctimeMs),
24
+ };
25
+ }
26
+ /** Content identity plus a cheap replay proof for the compiler package that
27
+ * produced an early frontend artifact. Full compiles hash every byte before
28
+ * publication; the CLI fast path validates the captured inode/time/size
29
+ * metadata and loads the large compiler graph only when anything changed. */
30
+ export async function compilerImplementationIdentity(captureDependencies = true) {
31
+ const implementationRoot = compilerImplementationRoot();
32
+ const files = [];
33
+ const dependencies = [];
34
+ const walk = async (directory) => {
35
+ const directoryInfo = dependency(directory, await lstat(directory));
36
+ if (captureDependencies && directoryInfo !== null)
37
+ dependencies.push(directoryInfo);
38
+ const entries = await readdir(directory, { withFileTypes: true });
39
+ entries.sort((a, b) => a.name.localeCompare(b.name));
40
+ for (const entry of entries) {
41
+ const path = join(directory, entry.name);
42
+ if (entry.isDirectory()) {
43
+ await walk(path);
44
+ }
45
+ else if (entry.isFile()) {
46
+ files.push(path);
47
+ const fileInfo = dependency(path, await lstat(path));
48
+ if (captureDependencies && fileInfo !== null)
49
+ dependencies.push(fileInfo);
50
+ }
51
+ }
52
+ };
53
+ await walk(implementationRoot);
54
+ // Keep the v1 digest byte-identical: dependency metadata augments replay
55
+ // validation without invalidating every existing library/executable entry.
56
+ const hash = createHash("sha256").update("scriptc-frontend-implementation-v1\0");
57
+ for (const file of files) {
58
+ hash.update(relative(implementationRoot, file)).update("\0").update(await readFile(file)).update("\0");
59
+ }
60
+ return { digest: hash.digest("hex"), dependencies };
61
+ }
62
+ function validDependency(value) {
63
+ if (value === null || typeof value !== "object")
64
+ return false;
65
+ const item = value;
66
+ return typeof item.path === "string" &&
67
+ (item.kind === "file" || item.kind === "directory") &&
68
+ typeof item.dev === "number" && typeof item.ino === "number" &&
69
+ typeof item.size === "number" && typeof item.mtimeMs === "number" &&
70
+ typeof item.ctimeMs === "number";
71
+ }
72
+ export async function compilerImplementationDependenciesStillMatch(dependencies) {
73
+ if (!Array.isArray(dependencies) || !dependencies.every(validDependency))
74
+ return false;
75
+ const current = await Promise.all(dependencies.map(async (expected) => {
76
+ const info = await lstat(expected.path).catch(() => null);
77
+ if (info === null)
78
+ return false;
79
+ const observed = dependency(expected.path, info);
80
+ return observed !== null && JSON.stringify(observed) === JSON.stringify(expected);
81
+ }));
82
+ return current.every(Boolean);
83
+ }
84
+ //# sourceMappingURL=implementation-identity.js.map