@scriptc/compiler 0.0.32 → 0.0.34

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 (120) hide show
  1. package/dist/backend/cc-cache.test.js +430 -1
  2. package/dist/backend/cc-cache.test.js.map +1 -1
  3. package/dist/backend/cc.d.ts +25 -0
  4. package/dist/backend/cc.js +818 -88
  5. package/dist/backend/cc.js.map +1 -1
  6. package/dist/backend/emission/emit-exprs.js +79 -3
  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 +23 -7
  11. package/dist/backend/emission/emitter.js +171 -27
  12. package/dist/backend/emission/emitter.js.map +1 -1
  13. package/dist/backend/emission/may-throw.js +7 -4
  14. package/dist/backend/emission/may-throw.js.map +1 -1
  15. package/dist/backend/ffi-callbacks.d.ts +38 -1
  16. package/dist/backend/ffi-callbacks.js +76 -3
  17. package/dist/backend/ffi-callbacks.js.map +1 -1
  18. package/dist/backend/library-identity.d.ts +22 -0
  19. package/dist/backend/library-identity.js +103 -0
  20. package/dist/backend/library-identity.js.map +1 -0
  21. package/dist/backend/llvm/emitter.d.ts +3 -0
  22. package/dist/backend/llvm/emitter.js +278 -17
  23. package/dist/backend/llvm/emitter.js.map +1 -1
  24. package/dist/backend/llvm/shapes.d.ts +1 -0
  25. package/dist/backend/llvm/shapes.js +25 -1
  26. package/dist/backend/llvm/shapes.js.map +1 -1
  27. package/dist/backend/mangle.d.ts +1 -0
  28. package/dist/backend/mangle.js +3 -0
  29. package/dist/backend/mangle.js.map +1 -1
  30. package/dist/backend/object-localize.d.ts +5 -5
  31. package/dist/backend/object-localize.js +19 -16
  32. package/dist/backend/object-localize.js.map +1 -1
  33. package/dist/backend/object-localize.test.js +37 -13
  34. package/dist/backend/object-localize.test.js.map +1 -1
  35. package/dist/diagnostics/diagnostic.js +2 -0
  36. package/dist/diagnostics/diagnostic.js.map +1 -1
  37. package/dist/ffi/profile.d.ts +17 -5
  38. package/dist/ffi/profile.js +169 -22
  39. package/dist/ffi/profile.js.map +1 -1
  40. package/dist/frontend/input-tracker.d.ts +82 -0
  41. package/dist/frontend/input-tracker.js +380 -0
  42. package/dist/frontend/input-tracker.js.map +1 -0
  43. package/dist/frontend/input-tracker.test.d.ts +1 -0
  44. package/dist/frontend/input-tracker.test.js +137 -0
  45. package/dist/frontend/input-tracker.test.js.map +1 -0
  46. package/dist/frontend/lowering/lower-builtins.js +2 -8
  47. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  48. package/dist/frontend/lowering/lower-calls.d.ts +1 -0
  49. package/dist/frontend/lowering/lower-calls.js +244 -163
  50. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  51. package/dist/frontend/lowering/lower-classes.js +3 -0
  52. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  53. package/dist/frontend/lowering/lower-containers.js +113 -28
  54. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  55. package/dist/frontend/lowering/lower-exprs.js +67 -1
  56. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  57. package/dist/frontend/lowering/lower-inspect.js +45 -26
  58. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  59. package/dist/frontend/lowering/lower-modules.js +1 -1
  60. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  61. package/dist/frontend/lowering/lower-stmts.js +48 -3
  62. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  63. package/dist/frontend/lowering/lowerer.d.ts +79 -29
  64. package/dist/frontend/lowering/lowerer.js +429 -87
  65. package/dist/frontend/lowering/lowerer.js.map +1 -1
  66. package/dist/frontend/npm-static-rewrite.js +25 -26
  67. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  68. package/dist/frontend/npm-static.js +29 -30
  69. package/dist/frontend/npm-static.js.map +1 -1
  70. package/dist/frontend/npm-static.test.d.ts +1 -0
  71. package/dist/frontend/npm-static.test.js +15 -0
  72. package/dist/frontend/npm-static.test.js.map +1 -0
  73. package/dist/frontend/npm.js +5 -17
  74. package/dist/frontend/npm.js.map +1 -1
  75. package/dist/frontend/program.js +2 -6
  76. package/dist/frontend/program.js.map +1 -1
  77. package/dist/frontend/resolve.js +8 -29
  78. package/dist/frontend/resolve.js.map +1 -1
  79. package/dist/frontend/ts7/checker.d.ts +2 -0
  80. package/dist/frontend/ts7/checker.js +20 -3
  81. package/dist/frontend/ts7/checker.js.map +1 -1
  82. package/dist/frontend/ts7/program.js +17 -18
  83. package/dist/frontend/ts7/program.js.map +1 -1
  84. package/dist/frontend/types.d.ts +41 -0
  85. package/dist/frontend/types.js +147 -8
  86. package/dist/frontend/types.js.map +1 -1
  87. package/dist/index.d.ts +1 -1
  88. package/dist/index.js +275 -41
  89. package/dist/index.js.map +1 -1
  90. package/dist/ir/nodes.d.ts +42 -12
  91. package/dist/ir/nodes.js +7 -1
  92. package/dist/ir/nodes.js.map +1 -1
  93. package/dist/ir/serialize.d.ts +1 -1
  94. package/dist/ir/serialize.js +1 -1
  95. package/dist/ir/validate.js +104 -1
  96. package/dist/ir/validate.js.map +1 -1
  97. package/dist/library/early-cache.d.ts +65 -0
  98. package/dist/library/early-cache.js +380 -0
  99. package/dist/library/early-cache.js.map +1 -0
  100. package/dist/library/early-cache.test.d.ts +1 -0
  101. package/dist/library/early-cache.test.js +528 -0
  102. package/dist/library/early-cache.test.js.map +1 -0
  103. package/dist/library/int-infer.js +14 -0
  104. package/dist/library/int-infer.js.map +1 -1
  105. package/dist/library/int-infer.test.js +21 -4
  106. package/dist/library/int-infer.test.js.map +1 -1
  107. package/dist/library/profile.d.ts +3 -0
  108. package/dist/library/profile.js +9 -1
  109. package/dist/library/profile.js.map +1 -1
  110. package/dist/library/semantic-source.d.ts +13 -0
  111. package/dist/library/semantic-source.js +257 -0
  112. package/dist/library/semantic-source.js.map +1 -0
  113. package/dist/library/semantic-source.test.d.ts +1 -0
  114. package/dist/library/semantic-source.test.js +113 -0
  115. package/dist/library/semantic-source.test.js.map +1 -0
  116. package/dist/library/sidecar.d.ts +6 -0
  117. package/dist/library/sidecar.js +11 -0
  118. package/dist/library/sidecar.js.map +1 -1
  119. package/package.json +2 -2
  120. package/surface-manifest.json +1 -1
@@ -0,0 +1,380 @@
1
+ import { createHash } from "node:crypto";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ import { readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
4
+ import { basename, dirname, resolve } from "node:path";
5
+ export function frontendSourceDigest(text) {
6
+ return createHash("sha256").update(text).digest("hex");
7
+ }
8
+ function pathKind(path) {
9
+ try {
10
+ const info = statSync(path);
11
+ return info.isFile()
12
+ ? "file"
13
+ : info.isDirectory()
14
+ ? "directory"
15
+ : "other";
16
+ }
17
+ catch {
18
+ return "missing";
19
+ }
20
+ }
21
+ const activeTracker = new AsyncLocalStorage();
22
+ export class FrontendInputTracker {
23
+ probes = new Map();
24
+ stable = true;
25
+ run(fn) {
26
+ const parent = activeTracker.getStore();
27
+ if (parent === undefined || parent === this)
28
+ return activeTracker.run(this, fn);
29
+ return activeTracker.run(this, () => {
30
+ const result = fn();
31
+ for (const probe of this.probes.values())
32
+ parent.record(probe);
33
+ return result;
34
+ });
35
+ }
36
+ record(probe) {
37
+ const key = `${probe.op}\0${probe.path}`;
38
+ const previous = this.probes.get(key);
39
+ if (previous !== undefined && JSON.stringify(previous) !== JSON.stringify(probe)) {
40
+ // An input changed while this frontend was running. The build may
41
+ // still finish normally, but it is not safe to publish as a cache key.
42
+ this.stable = false;
43
+ }
44
+ this.probes.set(key, probe);
45
+ if (probe.op === "file") {
46
+ // A successful content read supersedes earlier existence probes for the
47
+ // same path only when they also observed a file. A missing/non-file
48
+ // answer followed by a successful read means the input changed during
49
+ // the frontend and the mixed observation must never be published.
50
+ const previousKind = this.probes.get(`kind\0${probe.path}`);
51
+ if (previousKind?.op === "kind" && previousKind.kind !== "file")
52
+ this.stable = false;
53
+ this.probes.delete(`kind\0${probe.path}`);
54
+ const failedRead = this.probes.get(`read-error\0${probe.path}`);
55
+ if (failedRead !== undefined)
56
+ this.stable = false;
57
+ this.probes.delete(`read-error\0${probe.path}`);
58
+ }
59
+ else if (probe.op === "read-error") {
60
+ // A path can remain a regular file while its readability changes.
61
+ // Keep the failed operation itself, rather than reducing it to a kind
62
+ // probe, so a permission/ACL repair invalidates the cached frontend.
63
+ const successfulRead = this.probes.get(`file\0${probe.path}`);
64
+ if (successfulRead !== undefined)
65
+ this.stable = false;
66
+ this.probes.delete(`file\0${probe.path}`);
67
+ }
68
+ }
69
+ snapshot() {
70
+ return {
71
+ version: 1,
72
+ probes: [...this.probes.values()].sort((a, b) => a.path === b.path ? a.op.localeCompare(b.op) : a.path.localeCompare(b.path)),
73
+ stable: this.stable,
74
+ };
75
+ }
76
+ }
77
+ export function frontendInputTrackingActive() {
78
+ return activeTracker.getStore() !== undefined;
79
+ }
80
+ function record(probe) {
81
+ activeTracker.getStore()?.record(probe);
82
+ }
83
+ export function trackedReadFile(path) {
84
+ path = resolve(path);
85
+ try {
86
+ const text = readFileSync(path, "utf8");
87
+ record({ op: "file", path, digest: frontendSourceDigest(text) });
88
+ return text;
89
+ }
90
+ catch {
91
+ record({ op: "read-error", path });
92
+ return null;
93
+ }
94
+ }
95
+ export function trackedFileExists(path) {
96
+ path = resolve(path);
97
+ const kind = pathKind(path);
98
+ record({ op: "kind", path, kind });
99
+ return kind === "file";
100
+ }
101
+ export function trackedDirectoryExists(path) {
102
+ path = resolve(path);
103
+ const kind = pathKind(path);
104
+ record({ op: "kind", path, kind });
105
+ return kind === "directory";
106
+ }
107
+ export function trackedExists(path) {
108
+ path = resolve(path);
109
+ const kind = pathKind(path);
110
+ record({ op: "kind", path, kind });
111
+ return kind !== "missing";
112
+ }
113
+ export function trackedRealpath(path) {
114
+ path = resolve(path);
115
+ try {
116
+ const target = realpathSync(path);
117
+ record({ op: "realpath", path, target });
118
+ return target;
119
+ }
120
+ catch {
121
+ record({ op: "realpath", path, target: null });
122
+ return null;
123
+ }
124
+ }
125
+ export function trackedAccessibleEntries(path) {
126
+ path = resolve(path);
127
+ try {
128
+ const files = [];
129
+ const directories = [];
130
+ for (const entry of readdirSync(path, { withFileTypes: true })) {
131
+ const kind = entry.isSymbolicLink() ? pathKind(resolve(path, entry.name)) : null;
132
+ if (entry.isFile() || kind === "file")
133
+ files.push(entry.name);
134
+ if (entry.isDirectory() || kind === "directory")
135
+ directories.push(entry.name);
136
+ }
137
+ files.sort();
138
+ directories.sort();
139
+ const answer = { files, directories };
140
+ record({ op: "entries", path, ...answer });
141
+ return answer;
142
+ }
143
+ catch {
144
+ // Enumeration can fail even while the path remains a directory. Preserve
145
+ // the failed operation itself so a permission/ACL repair invalidates the
146
+ // cached frontend rather than replaying only the unchanged path kind.
147
+ record({ op: "entries-error", path });
148
+ return null;
149
+ }
150
+ }
151
+ /** Re-run every recorded probe against the current filesystem. */
152
+ export function frontendInputsStillMatch(snapshot, exclusions = {}) {
153
+ if (snapshot.version !== 1 || snapshot.stable !== true || !Array.isArray(snapshot.probes)) {
154
+ return false;
155
+ }
156
+ const outputPaths = new Set([...(exclusions.outputPaths ?? [])].map((path) => resolve(path)));
157
+ const outputDirectories = new Set([...(exclusions.outputDirectories ?? [])].map((path) => resolve(path)));
158
+ const generatedOnlyDirectory = (directory) => {
159
+ const allowedFiles = new Set();
160
+ for (const output of outputPaths) {
161
+ if (dirname(output) === directory)
162
+ allowedFiles.add(basename(output));
163
+ }
164
+ const allowedDirectories = new Map();
165
+ for (const outputDir of outputDirectories) {
166
+ if (outputDir !== directory && dirname(outputDir) === directory) {
167
+ allowedDirectories.set(basename(outputDir), outputDir);
168
+ }
169
+ }
170
+ try {
171
+ return readdirSync(directory).every((name) => {
172
+ if (allowedFiles.has(name))
173
+ return true;
174
+ const child = allowedDirectories.get(name);
175
+ return child !== undefined && generatedOnlyDirectory(child);
176
+ });
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ };
182
+ return snapshot.probes.every((probe) => {
183
+ if (outputPaths.has(probe.path))
184
+ return true;
185
+ if (outputDirectories.has(probe.path)) {
186
+ // A fresh output directory can be absent while the frontend runs and
187
+ // created only when emission starts. Admit it only while its current
188
+ // contents are exactly the named compiler artifacts; a user file that
189
+ // appears there still invalidates module resolution.
190
+ if (probe.op === "kind" && probe.kind === "missing") {
191
+ return pathKind(probe.path) === "missing" || generatedOnlyDirectory(probe.path);
192
+ }
193
+ if (probe.op === "entries-error") {
194
+ try {
195
+ readdirSync(probe.path);
196
+ return generatedOnlyDirectory(probe.path);
197
+ }
198
+ catch {
199
+ return true;
200
+ }
201
+ }
202
+ if (probe.op === "realpath" && probe.target === null) {
203
+ try {
204
+ realpathSync(probe.path);
205
+ return generatedOnlyDirectory(probe.path);
206
+ }
207
+ catch {
208
+ return true;
209
+ }
210
+ }
211
+ }
212
+ switch (probe.op) {
213
+ case "file": {
214
+ try {
215
+ return frontendSourceDigest(readFileSync(probe.path, "utf8")) === probe.digest;
216
+ }
217
+ catch {
218
+ return false;
219
+ }
220
+ }
221
+ case "read-error": {
222
+ try {
223
+ readFileSync(probe.path, "utf8");
224
+ return false;
225
+ }
226
+ catch {
227
+ return true;
228
+ }
229
+ }
230
+ case "kind":
231
+ return pathKind(probe.path) === probe.kind;
232
+ case "entries": {
233
+ try {
234
+ const ignored = new Set();
235
+ for (const output of outputPaths) {
236
+ if (dirname(output) === probe.path)
237
+ ignored.add(basename(output));
238
+ }
239
+ for (const outputDir of outputDirectories) {
240
+ if (dirname(outputDir) !== probe.path)
241
+ continue;
242
+ const name = basename(outputDir);
243
+ // If the directory existed during the frontend, keep tracking its
244
+ // presence. Only suppress a directory introduced by this build.
245
+ if (!probe.files.includes(name) &&
246
+ !probe.directories.includes(name) &&
247
+ generatedOnlyDirectory(outputDir)) {
248
+ ignored.add(name);
249
+ }
250
+ }
251
+ const files = [];
252
+ const directories = [];
253
+ for (const entry of readdirSync(probe.path, { withFileTypes: true })) {
254
+ const kind = entry.isSymbolicLink() ? pathKind(resolve(probe.path, entry.name)) : null;
255
+ if (entry.isFile() || kind === "file")
256
+ files.push(entry.name);
257
+ if (entry.isDirectory() || kind === "directory")
258
+ directories.push(entry.name);
259
+ }
260
+ files.sort();
261
+ directories.sort();
262
+ return JSON.stringify(files.filter((name) => !ignored.has(name))) ===
263
+ JSON.stringify(probe.files.filter((name) => !ignored.has(name))) &&
264
+ JSON.stringify(directories.filter((name) => !ignored.has(name))) ===
265
+ JSON.stringify(probe.directories.filter((name) => !ignored.has(name)));
266
+ }
267
+ catch {
268
+ return false;
269
+ }
270
+ }
271
+ case "entries-error": {
272
+ try {
273
+ readdirSync(probe.path, { withFileTypes: true });
274
+ return false;
275
+ }
276
+ catch {
277
+ return true;
278
+ }
279
+ }
280
+ case "realpath": {
281
+ try {
282
+ return realpathSync(probe.path) === probe.target;
283
+ }
284
+ catch {
285
+ return probe.target === null;
286
+ }
287
+ }
288
+ }
289
+ });
290
+ }
291
+ /**
292
+ * Validate all non-source frontend probes exactly while allowing only
293
+ * caller-approved semantic-equivalent file edits. The old source text is a
294
+ * cache payload; every unchanged input remains content-hash checked.
295
+ */
296
+ export function frontendInputsSemanticallyMatch(snapshot, previousSources, isSemanticEquivalent, exclusions = {}) {
297
+ if (!validFrontendInputSnapshot(snapshot))
298
+ return null;
299
+ const sourceProbes = new Map(snapshot.probes
300
+ .filter((probe) => probe.op === "file")
301
+ .map((probe) => [probe.path, probe]));
302
+ for (const [path, previous] of previousSources) {
303
+ if (sourceProbes.get(path)?.digest !== frontendSourceDigest(previous))
304
+ return null;
305
+ }
306
+ const changed = [];
307
+ const currentSources = new Map();
308
+ const adjusted = {
309
+ ...snapshot,
310
+ probes: snapshot.probes.map((probe) => {
311
+ if (probe.op !== "file")
312
+ return probe;
313
+ let current;
314
+ try {
315
+ current = readFileSync(probe.path, "utf8");
316
+ }
317
+ catch {
318
+ return probe;
319
+ }
320
+ const previous = previousSources.get(probe.path);
321
+ const currentDigest = frontendSourceDigest(current);
322
+ if (previous === undefined || frontendSourceDigest(previous) !== probe.digest)
323
+ return probe;
324
+ currentSources.set(probe.path, current);
325
+ if (currentDigest === probe.digest)
326
+ return probe;
327
+ if (!isSemanticEquivalent(probe.path, previous, current))
328
+ return probe;
329
+ changed.push({ path: probe.path, previous, current });
330
+ return { ...probe, digest: currentDigest };
331
+ }),
332
+ };
333
+ if (!frontendInputsStillMatch(adjusted, exclusions))
334
+ return null;
335
+ for (const [path, previous] of previousSources) {
336
+ if (!currentSources.has(path)) {
337
+ try {
338
+ currentSources.set(path, readFileSync(path, "utf8"));
339
+ }
340
+ catch {
341
+ currentSources.set(path, previous);
342
+ }
343
+ }
344
+ }
345
+ return { changed, currentSources, snapshot: adjusted };
346
+ }
347
+ /** Pure validator used by the persistent-cache reader before any path probes. */
348
+ export function validFrontendInputSnapshot(snapshot) {
349
+ if (snapshot === null || typeof snapshot !== "object")
350
+ return false;
351
+ const candidate = snapshot;
352
+ if (candidate.version !== 1 || candidate.stable !== true || !Array.isArray(candidate.probes))
353
+ return false;
354
+ return candidate.probes.every((probe) => {
355
+ if (probe === null || typeof probe !== "object")
356
+ return false;
357
+ const value = probe;
358
+ if (typeof value.path !== "string" || typeof value.op !== "string")
359
+ return false;
360
+ switch (value.op) {
361
+ case "file":
362
+ return typeof value.digest === "string" && /^[0-9a-f]{64}$/.test(value.digest);
363
+ case "read-error":
364
+ return true;
365
+ case "kind":
366
+ return value.kind === "file" || value.kind === "directory" || value.kind === "other" ||
367
+ value.kind === "missing";
368
+ case "entries":
369
+ return Array.isArray(value.files) && value.files.every((entry) => typeof entry === "string") &&
370
+ Array.isArray(value.directories) && value.directories.every((entry) => typeof entry === "string");
371
+ case "entries-error":
372
+ return true;
373
+ case "realpath":
374
+ return value.target === null || typeof value.target === "string";
375
+ default:
376
+ return false;
377
+ }
378
+ });
379
+ }
380
+ //# sourceMappingURL=input-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-tracker.js","sourceRoot":"","sources":["../../src/frontend/input-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,137 @@
1
+ import { chmod, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, expect, test } from "vitest";
5
+ import { FrontendInputTracker, frontendInputsStillMatch, trackedAccessibleEntries, trackedDirectoryExists, trackedFileExists, trackedReadFile, validFrontendInputSnapshot, } from "./input-tracker.js";
6
+ const scratch = [];
7
+ afterEach(async () => {
8
+ await Promise.all(scratch.splice(0).map((path) => rm(path, { recursive: true, force: true })));
9
+ });
10
+ test("tracked frontend reads invalidate on byte edits", async () => {
11
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
12
+ scratch.push(dir);
13
+ const file = join(dir, "entry.ts");
14
+ await writeFile(file, "export const answer = 1;\n");
15
+ const tracker = new FrontendInputTracker();
16
+ tracker.run(() => expect(trackedReadFile(file)).toContain("answer"));
17
+ const snapshot = tracker.snapshot();
18
+ expect(validFrontendInputSnapshot(snapshot)).toBe(true);
19
+ expect(frontendInputsStillMatch(snapshot)).toBe(true);
20
+ await writeFile(file, "export const answer = 2;\n");
21
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
22
+ });
23
+ test("failed frontend reads invalidate when the same file becomes readable", async () => {
24
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
25
+ scratch.push(dir);
26
+ const file = join(dir, "unreadable.ts");
27
+ await writeFile(file, "export const repaired = true;\n");
28
+ await chmod(file, 0o000);
29
+ const tracker = new FrontendInputTracker();
30
+ const result = tracker.run(() => trackedReadFile(file));
31
+ if (result !== null) {
32
+ // Windows and privileged test users may not enforce POSIX mode bits.
33
+ await chmod(file, 0o600);
34
+ return;
35
+ }
36
+ const snapshot = tracker.snapshot();
37
+ expect(snapshot.probes).toContainEqual({ op: "read-error", path: file });
38
+ expect(frontendInputsStillMatch(snapshot)).toBe(true);
39
+ await chmod(file, 0o600);
40
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
41
+ });
42
+ test("failed resolution candidates invalidate when a file appears", async () => {
43
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
44
+ scratch.push(dir);
45
+ const candidate = join(dir, "dependency.ts");
46
+ const tracker = new FrontendInputTracker();
47
+ tracker.run(() => expect(trackedFileExists(candidate)).toBe(false));
48
+ const snapshot = tracker.snapshot();
49
+ expect(frontendInputsStillMatch(snapshot)).toBe(true);
50
+ await writeFile(candidate, "export const loaded = true;\n");
51
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
52
+ });
53
+ test("a candidate appearing during the frontend prevents cache publication", async () => {
54
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
55
+ scratch.push(dir);
56
+ const candidate = join(dir, "dependency.ts");
57
+ const tracker = new FrontendInputTracker();
58
+ tracker.run(() => expect(trackedFileExists(candidate)).toBe(false));
59
+ await writeFile(candidate, "export const loaded = true;\n");
60
+ tracker.run(() => expect(trackedReadFile(candidate)).toContain("loaded"));
61
+ const snapshot = tracker.snapshot();
62
+ expect(snapshot.stable).toBe(false);
63
+ expect(validFrontendInputSnapshot(snapshot)).toBe(false);
64
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
65
+ });
66
+ test("directory enumeration invalidates workspace discovery", async () => {
67
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
68
+ scratch.push(dir);
69
+ const packages = join(dir, "packages");
70
+ await mkdir(packages);
71
+ const tracker = new FrontendInputTracker();
72
+ tracker.run(() => expect(trackedAccessibleEntries(packages)?.directories).toEqual([]));
73
+ const snapshot = tracker.snapshot();
74
+ await mkdir(join(packages, "new-member"));
75
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
76
+ });
77
+ test("compiler outputs do not invalidate a fresh output directory", async () => {
78
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
79
+ scratch.push(dir);
80
+ const generatedRoot = join(dir, "generated");
81
+ const outDir = join(generatedRoot, "nested");
82
+ const generated = join(outDir, "entry.lib.c");
83
+ const tracker = new FrontendInputTracker();
84
+ tracker.run(() => {
85
+ expect(trackedAccessibleEntries(dir)?.directories).toEqual([]);
86
+ expect(trackedDirectoryExists(generatedRoot)).toBe(false);
87
+ expect(trackedDirectoryExists(outDir)).toBe(false);
88
+ expect(trackedAccessibleEntries(outDir)).toBeNull();
89
+ });
90
+ const snapshot = tracker.snapshot();
91
+ const exclusions = {
92
+ outputPaths: [generated],
93
+ outputDirectories: [dir, generatedRoot, outDir],
94
+ };
95
+ await mkdir(outDir, { recursive: true });
96
+ await writeFile(generated, "/* generated */\n");
97
+ expect(frontendInputsStillMatch(snapshot, exclusions)).toBe(true);
98
+ await writeFile(join(outDir, "new-source.ts"), "export const appeared = true;\n");
99
+ expect(frontendInputsStillMatch(snapshot, exclusions)).toBe(false);
100
+ });
101
+ test("failed directory enumeration invalidates when the operation starts succeeding", async () => {
102
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
103
+ scratch.push(dir);
104
+ const packages = join(dir, "packages");
105
+ await writeFile(packages, "not a directory\n");
106
+ const tracker = new FrontendInputTracker();
107
+ tracker.run(() => expect(trackedAccessibleEntries(packages)).toBeNull());
108
+ const snapshot = tracker.snapshot();
109
+ expect(snapshot.probes).toContainEqual({ op: "entries-error", path: packages });
110
+ expect(frontendInputsStillMatch(snapshot)).toBe(true);
111
+ await rm(packages);
112
+ await mkdir(packages);
113
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
114
+ });
115
+ test("failed directory enumeration invalidates when access is restored", async () => {
116
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inputs-"));
117
+ scratch.push(dir);
118
+ const packages = join(dir, "packages");
119
+ await mkdir(packages);
120
+ await writeFile(join(packages, "member.ts"), "export const member = true;\n");
121
+ await chmod(packages, 0o000);
122
+ try {
123
+ const tracker = new FrontendInputTracker();
124
+ const result = tracker.run(() => trackedAccessibleEntries(packages));
125
+ if (result !== null)
126
+ return; // Windows and privileged users may ignore POSIX mode bits.
127
+ const snapshot = tracker.snapshot();
128
+ expect(snapshot.probes).toContainEqual({ op: "entries-error", path: packages });
129
+ expect(frontendInputsStillMatch(snapshot)).toBe(true);
130
+ await chmod(packages, 0o700);
131
+ expect(frontendInputsStillMatch(snapshot)).toBe(false);
132
+ }
133
+ finally {
134
+ await chmod(packages, 0o700);
135
+ }
136
+ });
137
+ //# sourceMappingURL=input-tracker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-tracker.test.js","sourceRoot":"","sources":["../../src/frontend/input-tracker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,GAAa,EAAE,CAAC;AAE7B,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,SAAS,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IACpD,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACtF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,qEAAqE;QACrE,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,SAAS,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;IAC5D,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACtF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG;QACjB,WAAW,EAAE,CAAC,SAAS,CAAC;QACxB,iBAAiB,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC;KAChD,CAAC;IAEF,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChD,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAClF,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnB,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtB,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IAClF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAC9E,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,CAAC,2DAA2D;QAExF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtD,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -2,7 +2,6 @@
2
2
  * crypto, child_process spawn/spawnSync and child/stats/spawn-result
3
3
  * methods), JSON.parse/stringify, process properties/methods and
4
4
  * process.env access, and console.log detection. */
5
- import { readFileSync } from "node:fs";
6
5
  import { builtinModules } from "node:module";
7
6
  import { dirname, resolve } from "node:path";
8
7
  import * as ts from "../ts7/adapter.js";
@@ -11,6 +10,7 @@ import { canonicalBuiltinModule, isJsSourceFile, locOf, requireSpecOf } from "..
11
10
  import { isRelativeSpecifier } from "../shared.js";
12
11
  import { probeNodeRequireRefusal } from "../npm.js";
13
12
  import { isNpmStaticPackage } from "../npm-static.js";
13
+ import { trackedReadFile } from "../input-tracker.js";
14
14
  import { invalidJsonModuleDiag, requiresDynamicImportDiag } from "../../diagnostics/diagnostic.js";
15
15
  import { builtinModuleFnOf, FS_READDIR_DOCUMENTED_OPTIONS, FS_WATCH_DOCUMENTED_OPTIONS, FS_WRITE_FILE_DOCUMENTED_OPTIONS, QS_PARSE_DOCUMENTED_OPTIONS, QS_STRINGIFY_DOCUMENTED_OPTIONS, READLINE_DOCUMENTED_OPTIONS, builtinConstLit, fenceOrDropOptionKey, isChildSurfaceMember, } from "./surfaces.js";
16
16
  import { conditionalSpreadOf, droppableStatic, lowerDynObjectLiteral } from "./lower-exprs.js";
@@ -370,13 +370,7 @@ export function lowerCreateRequireCall(L, call, loc) {
370
370
  const abs = spec.startsWith("/")
371
371
  ? spec
372
372
  : resolve(dirname(cr.baseFile.fileName), spec);
373
- let text = null;
374
- try {
375
- text = readFileSync(abs, "utf8");
376
- }
377
- catch {
378
- /* the fence below speaks */
379
- }
373
+ const text = trackedReadFile(abs);
380
374
  if (text === null) {
381
375
  L.noLowering(`createRequire's require of '${spec}' (no file at ${abs})`, call, "the required document resolves at build time — check the path against the requiring file");
382
376
  }