@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.
- package/dist/backend/cc-cache.test.js +1091 -7
- package/dist/backend/cc-cache.test.js.map +1 -1
- package/dist/backend/cc.d.ts +109 -18
- package/dist/backend/cc.js +1057 -289
- package/dist/backend/cc.js.map +1 -1
- package/dist/backend/emission/emit-exprs.js +26 -1
- package/dist/backend/emission/emit-exprs.js.map +1 -1
- package/dist/backend/emission/emit-shapes.js +37 -4
- package/dist/backend/emission/emit-shapes.js.map +1 -1
- package/dist/backend/emission/emitter.d.ts +11 -2
- package/dist/backend/emission/emitter.js +11 -5
- package/dist/backend/emission/emitter.js.map +1 -1
- package/dist/backend/library-identity.d.ts +22 -0
- package/dist/backend/library-identity.js +103 -0
- package/dist/backend/library-identity.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +3 -0
- package/dist/backend/llvm/emitter.js +35 -5
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +1 -0
- package/dist/backend/llvm/shapes.js +25 -1
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/split.d.ts +43 -0
- package/dist/backend/llvm/split.js +227 -0
- package/dist/backend/llvm/split.js.map +1 -0
- package/dist/backend/llvm/split.test.d.ts +1 -0
- package/dist/backend/llvm/split.test.js +102 -0
- package/dist/backend/llvm/split.test.js.map +1 -0
- package/dist/backend/mangle.d.ts +1 -0
- package/dist/backend/mangle.js +3 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/object-localize.d.ts +5 -5
- package/dist/backend/object-localize.js +19 -16
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +57 -13
- package/dist/backend/object-localize.test.js.map +1 -1
- package/dist/executable/early-cache.d.ts +86 -0
- package/dist/executable/early-cache.js +460 -0
- package/dist/executable/early-cache.js.map +1 -0
- package/dist/executable/early-cache.test.d.ts +1 -0
- package/dist/executable/early-cache.test.js +300 -0
- package/dist/executable/early-cache.test.js.map +1 -0
- package/dist/ffi/profile.d.ts +7 -2
- package/dist/ffi/profile.js +1 -0
- package/dist/ffi/profile.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +82 -0
- package/dist/frontend/input-tracker.js +380 -0
- package/dist/frontend/input-tracker.js.map +1 -0
- package/dist/frontend/input-tracker.test.d.ts +1 -0
- package/dist/frontend/input-tracker.test.js +137 -0
- package/dist/frontend/input-tracker.test.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.js +4 -10
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +169 -144
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +3 -0
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +66 -32
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +89 -11
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +45 -26
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +3 -3
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +1 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +1 -1
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +49 -4
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +73 -29
- package/dist/frontend/lowering/lowerer.js +588 -116
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.js +1 -1
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-rewrite.js +25 -26
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static.js +29 -30
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.d.ts +1 -0
- package/dist/frontend/npm-static.test.js +15 -0
- package/dist/frontend/npm-static.test.js.map +1 -0
- package/dist/frontend/npm.js +5 -17
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/program.js +44 -19
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.js +8 -29
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +40 -2
- package/dist/frontend/ts7/checker.js +194 -32
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/program.js +17 -18
- package/dist/frontend/ts7/program.js.map +1 -1
- package/dist/frontend/types.d.ts +33 -0
- package/dist/frontend/types.js +134 -45
- package/dist/frontend/types.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +458 -141
- package/dist/index.js.map +1 -1
- package/dist/ir/nodes.d.ts +27 -4
- package/dist/ir/nodes.js +28 -0
- package/dist/ir/nodes.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/validate.js +37 -1
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/early-cache.d.ts +65 -0
- package/dist/library/early-cache.js +361 -0
- package/dist/library/early-cache.js.map +1 -0
- package/dist/library/early-cache.test.d.ts +1 -0
- package/dist/library/early-cache.test.js +528 -0
- package/dist/library/early-cache.test.js.map +1 -0
- package/dist/library/implementation-identity.d.ts +23 -0
- package/dist/library/implementation-identity.js +84 -0
- package/dist/library/implementation-identity.js.map +1 -0
- package/dist/library/int-infer.js +14 -0
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +21 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/semantic-source.d.ts +13 -0
- package/dist/library/semantic-source.js +257 -0
- package/dist/library/semantic-source.js.map +1 -0
- package/dist/library/semantic-source.test.d.ts +1 -0
- package/dist/library/semantic-source.test.js +113 -0
- package/dist/library/semantic-source.test.js.map +1 -0
- package/dist/library/sidecar.d.ts +6 -0
- package/dist/library/sidecar.js +11 -0
- package/dist/library/sidecar.js.map +1 -1
- package/dist/startup-cache.d.ts +6 -0
- package/dist/startup-cache.js +6 -0
- package/dist/startup-cache.js.map +1 -0
- package/package.json +3 -2
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CvD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,EAAE;YAClB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBAClB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,OAAO,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAwB,CAAC;AAEpE,MAAM,OAAO,oBAAoB;IACd,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IACxD,MAAM,GAAG,IAAI,CAAC;IAEtB,GAAG,CAAI,EAAW;QAChB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChF,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,mEAAmE;YACnE,uEAAuE;YACvE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACxB,wEAAwE;YACxE,oEAAoE;YACpE,sEAAsE;YACtE,kEAAkE;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,YAAY,EAAE,EAAE,KAAK,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,KAAK,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;YACrC,kEAAkE;YAClE,sEAAsE;YACtE,qEAAqE;YACrE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,cAAc,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;YACL,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5E;YACD,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,MAAM,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,WAAW,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAY;IAEZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,WAAW;gBAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,wBAAwB,CACtC,QAA+B,EAC/B,aAAsC,EAAE;IAExC,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACvE,CAAC;IACF,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAW,EAAE;QAC5D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;gBAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACrD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC1C,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3C,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3C,OAAO,KAAK,KAAK,SAAS,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,qEAAqE;YACrE,qEAAqE;YACrE,sEAAsE;YACtE,qDAAqD;YACrD,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,KAAK,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,OAAO,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,EAAE,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzB,OAAO,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC;oBACH,OAAO,oBAAoB,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC;gBACjF,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC;oBACH,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACjC,OAAO,KAAK,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,KAAK,MAAM;gBACT,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;YAC7C,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;oBAClC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;wBACjC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI;4BAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBACpE,CAAC;oBACD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;wBAC1C,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,IAAI;4BAAE,SAAS;wBAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;wBACjC,kEAAkE;wBAClE,gEAAgE;wBAChE,IACE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAC3B,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACjC,sBAAsB,CAAC,SAAS,CAAC,EACjC,CAAC;4BACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;oBACD,MAAM,KAAK,GAAa,EAAE,CAAC;oBAC3B,MAAM,WAAW,GAAa,EAAE,CAAC;oBACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;wBACrE,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBACvF,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,MAAM;4BAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC9D,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,WAAW;4BAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChF,CAAC;oBACD,KAAK,CAAC,IAAI,EAAE,CAAC;oBACb,WAAW,CAAC,IAAI,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC7D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;wBAClE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;4BAC9D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC;oBACH,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjD,OAAO,KAAK,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC;oBACH,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAA+B,EAC/B,eAA4C,EAC5C,oBAAkF,EAClF,aAAsC,EAAE;IAExC,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,QAAQ,CAAC,MAAM;SACZ,MAAM,CAAC,CAAC,KAAK,EAAwD,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC;SAC5F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CACvC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC;QAC/C,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,oBAAoB,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IACrF,CAAC;IACD,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,MAAM,QAAQ,GAA0B;QACtC,GAAG,QAAQ;QACX,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC;YACtC,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAC5F,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,aAAa,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACjD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC7C,CAAC,CAAC;KACH,CAAC;IACF,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACzD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,0BAA0B,CAAC,QAAiB;IAC1D,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,SAAS,GAAG,QAA0C,CAAC;IAC7D,IAAI,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3G,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,KAAK,GAAG,KAAoC,CAAC;QACnD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjF,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,MAAM;gBACT,OAAO,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjF,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;oBAClF,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;YAC7B,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;oBAC1F,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;YACtG,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC;YACd,KAAK,UAAU;gBACb,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;YACnE;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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
|
-
|
|
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
|
}
|
|
@@ -1736,7 +1730,7 @@ export function lowerSpawnSyncCall(L, expr, loc) {
|
|
|
1736
1730
|
}
|
|
1737
1731
|
// A runtime string whose TYPE pins every possible value to the
|
|
1738
1732
|
// supported literals — the modes resolve at the call instead.
|
|
1739
|
-
const arms = t.isUnionType() ?
|
|
1733
|
+
const arms = t.isUnionType() ? ts.constituentTypes(t) : [t];
|
|
1740
1734
|
if (arms.length > 0 &&
|
|
1741
1735
|
arms.every((a) => a.isStringLiteralType() &&
|
|
1742
1736
|
(a.value === "pipe" || a.value === "ignore" || a.value === "inherit"))) {
|
|
@@ -4029,7 +4023,7 @@ export function lowerFileHandleMethodCall(L, call, access) {
|
|
|
4029
4023
|
if (!node)
|
|
4030
4024
|
return dflt;
|
|
4031
4025
|
const nodeType = L.typeOf(node);
|
|
4032
|
-
const parts = nodeType.isUnionType() ?
|
|
4026
|
+
const parts = nodeType.isUnionType() ? ts.constituentTypes(nodeType) : [nodeType];
|
|
4033
4027
|
const supported = parts.every((t) => (t.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Null)) !== 0 ||
|
|
4034
4028
|
(t.isStringLiteralType() && (t.value === "utf8" || t.value === "utf-8")));
|
|
4035
4029
|
if (!supported) {
|