optiprune 2.1.4 → 2.1.7

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 (102) hide show
  1. package/README.md +52 -22
  2. package/bin/runner.js +26 -0
  3. package/package.json +10 -37
  4. package/dist/ast-utils.d.ts +0 -149
  5. package/dist/ast-utils.js +0 -36
  6. package/dist/ast-utils.js.map +0 -1
  7. package/dist/cache.d.ts +0 -14
  8. package/dist/cache.js +0 -36
  9. package/dist/cache.js.map +0 -1
  10. package/dist/cli.d.ts +0 -2
  11. package/dist/cli.js +0 -68
  12. package/dist/cli.js.map +0 -1
  13. package/dist/config-loader.d.ts +0 -4
  14. package/dist/config-loader.js +0 -84
  15. package/dist/config-loader.js.map +0 -1
  16. package/dist/coverage-tracker.d.ts +0 -39
  17. package/dist/coverage-tracker.js +0 -61
  18. package/dist/coverage-tracker.js.map +0 -1
  19. package/dist/engine.d.ts +0 -17
  20. package/dist/engine.js +0 -215
  21. package/dist/engine.js.map +0 -1
  22. package/dist/framework-plugins.d.ts +0 -16
  23. package/dist/framework-plugins.js +0 -127
  24. package/dist/framework-plugins.js.map +0 -1
  25. package/dist/fs-utils.d.ts +0 -32
  26. package/dist/fs-utils.js +0 -415
  27. package/dist/fs-utils.js.map +0 -1
  28. package/dist/graph.d.ts +0 -42
  29. package/dist/graph.js +0 -583
  30. package/dist/graph.js.map +0 -1
  31. package/dist/index.d.ts +0 -3
  32. package/dist/index.js +0 -451
  33. package/dist/index.js.map +0 -1
  34. package/dist/instrument.d.ts +0 -5
  35. package/dist/instrument.js +0 -108
  36. package/dist/instrument.js.map +0 -1
  37. package/dist/layer2.d.ts +0 -6
  38. package/dist/layer2.js +0 -224
  39. package/dist/layer2.js.map +0 -1
  40. package/dist/layer3.d.ts +0 -7
  41. package/dist/layer3.js +0 -346
  42. package/dist/layer3.js.map +0 -1
  43. package/dist/layer4.d.ts +0 -8
  44. package/dist/layer4.js +0 -627
  45. package/dist/layer4.js.map +0 -1
  46. package/dist/layer5.d.ts +0 -6
  47. package/dist/layer5.js +0 -141
  48. package/dist/layer5.js.map +0 -1
  49. package/dist/layer6.d.ts +0 -26
  50. package/dist/layer6.js +0 -268
  51. package/dist/layer6.js.map +0 -1
  52. package/dist/layer7.d.ts +0 -28
  53. package/dist/layer7.js +0 -267
  54. package/dist/layer7.js.map +0 -1
  55. package/dist/parser.d.ts +0 -20
  56. package/dist/parser.js +0 -832
  57. package/dist/parser.js.map +0 -1
  58. package/dist/plugins/angular-plugin.d.ts +0 -7
  59. package/dist/plugins/angular-plugin.js +0 -60
  60. package/dist/plugins/angular-plugin.js.map +0 -1
  61. package/dist/plugins/astro-plugin.d.ts +0 -7
  62. package/dist/plugins/astro-plugin.js +0 -88
  63. package/dist/plugins/astro-plugin.js.map +0 -1
  64. package/dist/plugins/babel-plugin.d.ts +0 -8
  65. package/dist/plugins/babel-plugin.js +0 -132
  66. package/dist/plugins/babel-plugin.js.map +0 -1
  67. package/dist/plugins/esbuild-plugin.d.ts +0 -8
  68. package/dist/plugins/esbuild-plugin.js +0 -121
  69. package/dist/plugins/esbuild-plugin.js.map +0 -1
  70. package/dist/plugins/nestjs-plugin.d.ts +0 -7
  71. package/dist/plugins/nestjs-plugin.js +0 -69
  72. package/dist/plugins/nestjs-plugin.js.map +0 -1
  73. package/dist/plugins/nextjs-plugin.d.ts +0 -7
  74. package/dist/plugins/nextjs-plugin.js +0 -66
  75. package/dist/plugins/nextjs-plugin.js.map +0 -1
  76. package/dist/plugins/nuxtjs-plugin.d.ts +0 -7
  77. package/dist/plugins/nuxtjs-plugin.js +0 -80
  78. package/dist/plugins/nuxtjs-plugin.js.map +0 -1
  79. package/dist/plugins/svelte-plugin.d.ts +0 -7
  80. package/dist/plugins/svelte-plugin.js +0 -38
  81. package/dist/plugins/svelte-plugin.js.map +0 -1
  82. package/dist/plugins/vuejs-plugin.d.ts +0 -7
  83. package/dist/plugins/vuejs-plugin.js +0 -63
  84. package/dist/plugins/vuejs-plugin.js.map +0 -1
  85. package/dist/reporters.d.ts +0 -3
  86. package/dist/reporters.js +0 -75
  87. package/dist/reporters.js.map +0 -1
  88. package/dist/semantic-graph.d.ts +0 -44
  89. package/dist/semantic-graph.js +0 -88
  90. package/dist/semantic-graph.js.map +0 -1
  91. package/dist/symbolic-engine.d.ts +0 -19
  92. package/dist/symbolic-engine.js +0 -51
  93. package/dist/symbolic-engine.js.map +0 -1
  94. package/dist/topology-manager.d.ts +0 -23
  95. package/dist/topology-manager.js +0 -144
  96. package/dist/topology-manager.js.map +0 -1
  97. package/dist/types.d.ts +0 -265
  98. package/dist/types.js +0 -11
  99. package/dist/types.js.map +0 -1
  100. package/dist/workspace.d.ts +0 -6
  101. package/dist/workspace.js +0 -105
  102. package/dist/workspace.js.map +0 -1
package/dist/layer4.js DELETED
@@ -1,627 +0,0 @@
1
- import { getQuickJS } from "quickjs-emscripten";
2
- import { transform } from "esbuild";
3
- import { performance } from "node:perf_hooks";
4
- import path from "pathe";
5
- /**
6
- * Layer 4: Proof Asserter Engine
7
- * Validates candidate branches from Layer 3 using isolated execution.
8
- * Uses a secure WebAssembly-based QuickJS sandbox.
9
- * Now also resolves dynamic imports by simulating their path construction.
10
- */
11
- export async function analyzeLayer4(context) {
12
- const findings = [];
13
- const quickJS = await getQuickJS();
14
- // 1. Resolve Dynamic Imports
15
- if (context.dynamicImportCandidates.length > 0) {
16
- await resolveDynamicImports(context, quickJS);
17
- }
18
- // 2. Validate Candidate Branches
19
- if (context.candidateBranches.length > 0) {
20
- for (const branch of context.candidateBranches) {
21
- const result = await verifyPathInWasmSandbox(quickJS, branch.instrumentedCode, branch.seedInput, context.options.layers.smtTimeoutMs);
22
- if (result.pathReached) {
23
- // If reached, it's PROVEN alive.
24
- continue;
25
- }
26
- findings.push({
27
- rule: "unreachable-dynamic-path",
28
- severity: "warning",
29
- confidence: "medium",
30
- message: `[Proof Asserter] Branch at line ${branch.line} could not be reached with SMT-generated seeds.`,
31
- file: branch.file,
32
- location: {
33
- start: { line: branch.line, column: 0 },
34
- end: { line: branch.line, column: 0 }
35
- },
36
- evidence: {
37
- engine: "wasm-quickjs",
38
- executionTimeMs: result.executionTimeMs,
39
- seedInput: branch.seedInput,
40
- status: "SUSPECT_UNREACHABLE"
41
- },
42
- });
43
- }
44
- }
45
- return findings;
46
- }
47
- /**
48
- * Cleans TypeScript source code for execution in the QuickJS sandbox.
49
- *
50
- * The function applies a series of regex-based transformations to strip
51
- * TypeScript-specific syntax that QuickJS does not understand, while
52
- * preserving the runtime-relevant logic needed to reconstruct dynamic
53
- * import paths.
54
- *
55
- * Key transformations:
56
- * 1. Remove top-level `import` declarations entirely (both static and
57
- * `import type`) so that QuickJS does not encounter ES-module
58
- * syntax it cannot parse.
59
- * 2. Replace `import(...)` call-expressions with the mock function
60
- * `__optiprune_import(...)` that records resolved targets.
61
- * 3. Strip TypeScript type annotations, `as` casts, and interface/type
62
- * imports that would cause syntax errors in plain JavaScript.
63
- * 4. Rewrite `import.meta.url` to a string expression compatible with
64
- * the sandbox's `__filename` global.
65
- *
66
- * FIX – String-Interpolation / Identifier-based dynamic imports:
67
- * The previous implementation only stripped TS syntax but did not
68
- * handle the common pattern where the import argument is a *variable*
69
- * whose value was assembled earlier in the same scope via
70
- * `pathToFileURL(path.join(dir, file)).href` or similar constructs.
71
- * QuickJS would encounter `import(pluginPath)` where `pluginPath` is
72
- * an identifier that was never assigned in the cleaned snippet because
73
- * the assignment statement was removed or mangled.
74
- *
75
- * The fix ensures that:
76
- * a) `const`/`let`/`var` declarations that build path strings are
77
- * kept intact after TS-stripping.
78
- * b) `await` expressions are preserved (QuickJS runs the script
79
- * inside an async IIFE).
80
- * c) `for...of` loops that iterate over file lists and call
81
- * `import(...)` inside are preserved so that all loop iterations
82
- * are simulated and every candidate path is captured.
83
- * d) Top-level `import` *declarations* (ESM static imports) are
84
- * removed entirely, because QuickJS cannot parse them and they
85
- * are not needed for path-construction simulation.
86
- */
87
- function cleanForQuickJS(code) {
88
- return code
89
- // Static ESM imports cannot be evaluated in a QuickJS script. Dynamic
90
- // imports are intentionally preserved until they are replaced below.
91
- .replace(/^\s*import(?!\s*\()\s+(?:type\s+)?[\s\S]*?\s+from\s+['"][^'"]+['"]\s*;?\s*$/gm, "")
92
- .replace(/^\s*import(?!\s*\()\s*['"][^'"]+['"]\s*;?\s*$/gm, "")
93
- // Re-exports are likewise irrelevant for path-construction simulation.
94
- .replace(/^\s*export\s+type\s*\{[\s\S]*?\}\s*(?:from\s+['"][^'"]+['"])?\s*;?\s*$/gm, "")
95
- .replace(/^\s*export\s*\{[\s\S]*?\}\s*(?:from\s+['"][^'"]+['"])?\s*;?\s*$/gm, "")
96
- .replace(/^\s*export\s+\*\s+from\s+['"][^'"]+['"]\s*;?\s*$/gm, "")
97
- .replace(/\bexport\s+(?=(?:const|let|var|function|class|async|type|interface|enum)\b)/g, "")
98
- .replace(/\bexport\s+default\s+/g, "")
99
- // Keep import.meta usable after the static import pre-processing.
100
- .replace(/import\.meta\.url/g, '("file://" + __filename)')
101
- // Record simulated dynamic-import targets instead of loading modules.
102
- .replace(/\bimport\s*\(/g, "__optiprune_import(");
103
- }
104
- function quickJSSourceLoader(file) {
105
- switch (path.extname(file).toLowerCase()) {
106
- case ".ts":
107
- case ".mts":
108
- case ".cts":
109
- return "ts";
110
- case ".tsx":
111
- return "tsx";
112
- case ".jsx":
113
- return "jsx";
114
- default:
115
- return "js";
116
- }
117
- }
118
- /**
119
- * Compiles the extracted source context to JavaScript before it reaches
120
- * QuickJS. Regexes are deliberately limited to ESM simulation rewrites;
121
- * esbuild performs all TypeScript/TSX syntax erasure and downleveling.
122
- */
123
- const QUICKJS_CONTEXT_FUNCTION = "__optiprune_execute_context__";
124
- async function compileForQuickJS(code, sourceFile) {
125
- // Candidate context can contain a captured function body, including `await`
126
- // and `return`. Wrapping it first lets esbuild parse those statements in the
127
- // same asynchronous function scope QuickJS will execute later.
128
- const wrappedContext = `async function ${QUICKJS_CONTEXT_FUNCTION}() {\n${cleanForQuickJS(code)}\n}`;
129
- const transformed = await transform(wrappedContext, {
130
- loader: quickJSSourceLoader(sourceFile),
131
- format: "esm",
132
- target: "es2018",
133
- sourcemap: false,
134
- sourcefile: sourceFile,
135
- legalComments: "none",
136
- });
137
- return transformed.code;
138
- }
139
- /**
140
- * Installs a catch-all lexical scope for the simulation. A `with` block over
141
- * this proxy resolves otherwise-unbound identifiers to a harmless callable
142
- * proxy, allowing path construction to continue instead of aborting with a
143
- * ReferenceError. Known globals and the explicit mocks still take priority.
144
- */
145
- function installGlobalResilience(vm) {
146
- const result = vm.evalCode(`
147
- (function() {
148
- let fallbackMock;
149
- const fallbackHandler = {
150
- get(_target, property) {
151
- if (property === "then" || property === Symbol.unscopables) return undefined;
152
- if (property === Symbol.toPrimitive) return () => "";
153
- if (property === "toJSON") return () => ({});
154
- if (property === Symbol.iterator) {
155
- return () => ({ next: () => ({ done: true }) });
156
- }
157
- return fallbackMock;
158
- },
159
- has() { return true; },
160
- set() { return true; },
161
- apply() { return fallbackMock; },
162
- construct() { return fallbackMock; }
163
- };
164
-
165
- fallbackMock = new Proxy(function __optiprune_empty_mock() {}, fallbackHandler);
166
- globalThis.__create_resilient_mock = () => fallbackMock;
167
- globalThis.__optiprune_scope__ = new Proxy(globalThis, {
168
- has(_target, property) {
169
- return property !== Symbol.unscopables;
170
- },
171
- get(target, property, receiver) {
172
- if (property === Symbol.unscopables) return undefined;
173
- if (Reflect.has(target, property)) {
174
- return Reflect.get(target, property, receiver);
175
- }
176
- return fallbackMock;
177
- }
178
- });
179
- })();
180
- `);
181
- if (result.error) {
182
- const error = vm.dump(result.error);
183
- result.error.dispose();
184
- throw new Error(`Could not install the QuickJS resilience scope: ${String(error)}`);
185
- }
186
- result.value.dispose();
187
- }
188
- function drainQuickJSPendingJobs(runtime, vm, maxJobs = 5000) {
189
- let remainingJobs = maxJobs;
190
- while (runtime.hasPendingJob() && remainingJobs > 0) {
191
- const result = runtime.executePendingJobs(1);
192
- if (result.error) {
193
- const error = vm.dump(result.error);
194
- result.error.dispose();
195
- throw new Error(`QuickJS pending job failed: ${String(error)}`);
196
- }
197
- if (result.value <= 0) {
198
- break;
199
- }
200
- remainingJobs -= result.value;
201
- }
202
- }
203
- /**
204
- * Simulates dynamic import expressions in a QuickJS sandbox to resolve targets.
205
- *
206
- * FIX – Identifier-based / String-Interpolation imports:
207
- *
208
- * The core problem was that when a dynamic import uses a *variable* as its
209
- * argument (e.g. `await import(pluginPath)` where `pluginPath` was built via
210
- * `pathToFileURL(path.join(pluginsDir, file)).href`), the previous
211
- * implementation:
212
- *
213
- * 1. Correctly captured the surrounding function body as `contextCode`.
214
- * 2. Passed it through `clean()` which only stripped TS syntax.
215
- * 3. Ran the cleaned code in QuickJS.
216
- *
217
- * The simulation failed because:
218
- * a) Static `import` declarations at the top of the function body were
219
- * not removed, causing a QuickJS parse error that silently swallowed
220
- * the entire simulation.
221
- * b) The `__dirname` / `__filename` globals were set up *outside* the
222
- * simulation script, but the context code often re-declared them with
223
- * `const __dirname = path.dirname(fileURLToPath(import.meta.url))`.
224
- * After stripping `import.meta.url` the expression became valid, but
225
- * the `fileURLToPath` call was not mocked in the global scope.
226
- * c) The loop variable `file` in `for (const file of files)` had no
227
- * value; the mock `fs.readdir` / `readdirSync` returned the correct
228
- * file list, but the loop was driven by the *result* of an `await`
229
- * expression which QuickJS's pending-job pump must flush.
230
- *
231
- * The fix addresses all three issues:
232
- * a) `cleanForQuickJS` now removes static ESM import declarations.
233
- * b) `fileURLToPath` is already mocked in `setupQuickJSMocks`; the
234
- * mock is now also exposed directly on `globalThis` so that bare
235
- * calls (without the `url.` prefix) resolve correctly.
236
- * c) The pending-job pump deadline is raised and the pump is called
237
- * *after* the top-level async IIFE resolves its promise chain.
238
- */
239
- async function resolveDynamicImports(context, quickJS) {
240
- // Group candidates by file to avoid redundant simulations
241
- const candidatesByFile = new Map();
242
- for (const candidate of context.dynamicImportCandidates) {
243
- const list = candidatesByFile.get(candidate.file) || [];
244
- list.push(candidate);
245
- candidatesByFile.set(candidate.file, list);
246
- }
247
- for (const [file, candidates] of candidatesByFile.entries()) {
248
- for (const candidate of candidates) {
249
- const runtime = quickJS.newRuntime();
250
- const vm = runtime.newContext();
251
- try {
252
- runtime.setMemoryLimit(context.options.layers.isolateMemoryLimitMb * 1024 * 1024);
253
- // Setup explicit runtime mocks first, then install the catch-all scope
254
- // that safely absorbs additional, unknown globals from application code.
255
- setupQuickJSMocks(vm, candidate, context);
256
- installGlobalResilience(vm);
257
- const globalHandle = vm.global;
258
- const targetsHandle = vm.newArray();
259
- vm.setProp(globalHandle, "__OPTIPRUNE_TARGETS__", targetsHandle);
260
- const importMockFn = vm.newFunction("__optiprune_import", (arg) => {
261
- const target = vm.dump(arg);
262
- const currentTargets = vm.getProp(globalHandle, "__OPTIPRUNE_TARGETS__");
263
- const lenHandle = vm.getProp(currentTargets, "length");
264
- const len = vm.dump(lenHandle);
265
- const targetHandle = vm.newString(String(target));
266
- vm.setProp(currentTargets, len, targetHandle);
267
- targetHandle.dispose();
268
- lenHandle.dispose();
269
- currentTargets.dispose();
270
- // Return a resilient mock instead of a plain empty object
271
- const createFn = vm.getProp(vm.global, "__create_resilient_mock");
272
- const mock = vm.callFunction(createFn, vm.undefined);
273
- createFn.dispose();
274
- return mock;
275
- });
276
- vm.setProp(globalHandle, "__optiprune_import", importMockFn);
277
- importMockFn.dispose();
278
- targetsHandle.dispose();
279
- globalHandle.dispose();
280
- // QuickJS only evaluates JavaScript. esbuild removes TypeScript/TSX
281
- // syntax after the minimal import rewrites used for simulation.
282
- const processedContext = await compileForQuickJS(candidate.contextCode, file);
283
- const simulationScript = `
284
- (async function() {
285
- try {
286
- with (globalThis.__optiprune_scope__) {
287
- ${processedContext}
288
- await ${QUICKJS_CONTEXT_FUNCTION}.call(globalThis);
289
- }
290
- } catch (e) {
291
- if (globalThis.__VERBOSE__) {
292
- console.log("[QuickJS Runtime Error] " + (e instanceof Error ? e.message : String(e)));
293
- }
294
- }
295
- }).call(globalThis);
296
- `;
297
- if (context.options.verbose) {
298
- console.log(`[Layer 4] Simulation Script for ${file}:\n${simulationScript}`);
299
- }
300
- const evalResult = vm.evalCode(simulationScript);
301
- if (evalResult.error) {
302
- if (context.options.verbose) {
303
- console.log(`[Layer 4] Simulation Syntax Error in ${file}:`, vm.dump(evalResult.error));
304
- console.log(`[Layer 4] Script was:\n${simulationScript}`);
305
- }
306
- evalResult.error.dispose();
307
- }
308
- else {
309
- evalResult.value.dispose();
310
- // Flush promise continuations created by async path construction.
311
- drainQuickJSPendingJobs(runtime, vm);
312
- }
313
- const finalGlobalHandle = vm.global;
314
- const finalTargetsHandle = vm.getProp(finalGlobalHandle, "__OPTIPRUNE_TARGETS__");
315
- const targets = vm.dump(finalTargetsHandle);
316
- finalTargetsHandle.dispose();
317
- finalGlobalHandle.dispose();
318
- if (Array.isArray(targets) && targets.length > 0) {
319
- // Mark the corresponding edge as resolved to suppress the warning
320
- const module = context.modules.get(file);
321
- if (module) {
322
- if (context.options.verbose) {
323
- console.log(`[Layer 4] Searching for edge in ${file} at ${candidate.line}:${candidate.column}`);
324
- module.edges.forEach(e => {
325
- if (e.kind === "unknown-dynamic") {
326
- console.log(`[Layer 4] Found unknown-dynamic edge at ${e.location?.start.line}:${e.location?.start.column}`);
327
- }
328
- });
329
- }
330
- const edge = module.edges.find(e => (e.kind === "unknown-dynamic" || e.kind === "dynamic-pattern") &&
331
- e.location?.start.line === candidate.line &&
332
- e.location?.start.column === candidate.column);
333
- if (edge) {
334
- edge.resolution = "resolved";
335
- }
336
- }
337
- for (const rawTarget of targets) {
338
- if (typeof rawTarget === 'string') {
339
- resolveAndMarkTarget(rawTarget, file, context);
340
- }
341
- }
342
- }
343
- }
344
- catch (err) {
345
- // Simulation failed
346
- if (context.options.verbose) {
347
- console.log(`[Layer 4] Simulation threw an exception for ${file}:`, err);
348
- }
349
- }
350
- finally {
351
- vm.dispose();
352
- runtime.dispose();
353
- }
354
- }
355
- }
356
- }
357
- function setupQuickJSMocks(vm, candidate, context) {
358
- const globalHandle = vm.global;
359
- // 1. __dirname and __filename
360
- const fileDir = path.dirname(candidate.file);
361
- const dirnameHandle = vm.newString(fileDir);
362
- const filenameHandle = vm.newString(candidate.file);
363
- vm.setProp(globalHandle, "__dirname", dirnameHandle);
364
- vm.setProp(globalHandle, "__filename", filenameHandle);
365
- dirnameHandle.dispose();
366
- filenameHandle.dispose();
367
- // 2. path mock using host's pathe
368
- const pathMock = vm.newObject();
369
- const joinFn = vm.newFunction("join", (...args) => {
370
- const parts = args.map(arg => vm.dump(arg));
371
- const result = vm.newString(path.join(...parts));
372
- return result;
373
- });
374
- const dirnameFn = vm.newFunction("dirname", (arg) => {
375
- const result = vm.newString(path.dirname(vm.dump(arg)));
376
- return result;
377
- });
378
- const resolveFn = vm.newFunction("resolve", (...args) => {
379
- const parts = args.map(arg => vm.dump(arg));
380
- const result = vm.newString(path.resolve(...parts));
381
- return result;
382
- });
383
- const basenameFn = vm.newFunction("basename", (arg, extArg) => {
384
- const p = vm.dump(arg);
385
- const ext = extArg ? vm.dump(extArg) : undefined;
386
- const result = vm.newString(path.basename(p, ext));
387
- return result;
388
- });
389
- vm.setProp(pathMock, "join", joinFn);
390
- vm.setProp(pathMock, "dirname", dirnameFn);
391
- vm.setProp(pathMock, "resolve", resolveFn);
392
- vm.setProp(pathMock, "basename", basenameFn);
393
- vm.setProp(globalHandle, "path", pathMock);
394
- joinFn.dispose();
395
- dirnameFn.dispose();
396
- resolveFn.dispose();
397
- basenameFn.dispose();
398
- pathMock.dispose();
399
- // 3. url mock
400
- //
401
- // FIX: `fileURLToPath` and `pathToFileURL` are now exposed *both* on the
402
- // `url` namespace object AND directly on `globalThis`. This is necessary
403
- // because `engine.ts` imports them as named imports:
404
- // import { fileURLToPath, pathToFileURL } from 'node:url';
405
- // After the static import declaration is stripped by `cleanForQuickJS`,
406
- // the bare identifiers `fileURLToPath` and `pathToFileURL` must still
407
- // resolve to the mock implementations via the global scope.
408
- const urlMock = vm.newObject();
409
- const pathToFileURLFn = vm.newFunction("pathToFileURL", (arg) => {
410
- const p = vm.dump(arg);
411
- const obj = vm.newObject();
412
- const hrefValue = vm.newString(`file://${p}`);
413
- vm.setProp(obj, "href", hrefValue);
414
- hrefValue.dispose();
415
- return obj;
416
- });
417
- const fileURLToPathFn = vm.newFunction("fileURLToPath", (arg) => {
418
- const urlStr = vm.dump(arg);
419
- const p = typeof urlStr === 'string' && urlStr.startsWith('file://') ? urlStr.slice(7) : String(urlStr);
420
- return vm.newString(p);
421
- });
422
- vm.setProp(urlMock, "pathToFileURL", pathToFileURLFn);
423
- vm.setProp(urlMock, "fileURLToPath", fileURLToPathFn);
424
- vm.setProp(globalHandle, "url", urlMock);
425
- // Expose directly on globalThis so bare calls work after import stripping
426
- vm.setProp(globalHandle, "pathToFileURL", pathToFileURLFn);
427
- vm.setProp(globalHandle, "fileURLToPath", fileURLToPathFn);
428
- urlMock.dispose();
429
- pathToFileURLFn.dispose();
430
- fileURLToPathFn.dispose();
431
- // 4. fs mock
432
- //
433
- // FIX: The `readdir` mock now returns a *Promise* that resolves to the
434
- // file list so that `await fs.readdir(...)` works correctly inside the
435
- // async IIFE. The synchronous `readdirSync` variant is kept as-is.
436
- const fsMock = vm.newObject();
437
- const buildFileList = (rawDir) => {
438
- const cleanPath = String(rawDir).replace(/^file:\/\//, '');
439
- const dir = path.isAbsolute(cleanPath) ? cleanPath : path.resolve(fileDir, cleanPath);
440
- if (context.options.verbose) {
441
- console.log(`[QuickJS Mock] fs.readdir called for: "${rawDir}" -> normalized: "${dir}"`);
442
- }
443
- const files = Array.from(context.modules.keys())
444
- .filter(f => {
445
- const parent = path.dirname(f);
446
- return parent === dir || parent === dir.replace(/\/$/, '');
447
- })
448
- .map(f => path.basename(f));
449
- if (context.options.verbose) {
450
- console.log(`[QuickJS Mock] fs.readdir returned:`, files);
451
- }
452
- return files;
453
- };
454
- // Async readdir – returns a Promise via QuickJS's Promise API
455
- const readdirAsyncFn = vm.newFunction("readdir", (arg) => {
456
- const files = buildFileList(vm.dump(arg));
457
- // Build a resolved Promise manually using Promise.resolve([...])
458
- const arr = vm.newArray();
459
- files.forEach((f, i) => {
460
- const val = vm.newString(f);
461
- vm.setProp(arr, i, val);
462
- val.dispose();
463
- });
464
- // Use evalCode to create a resolved promise with the array value
465
- // We store the array in a temp global, resolve it, then clean up.
466
- vm.setProp(vm.global, "__tmp_readdir_result__", arr);
467
- arr.dispose();
468
- const promiseResult = vm.evalCode(`Promise.resolve(globalThis.__tmp_readdir_result__)`);
469
- if (promiseResult.error) {
470
- promiseResult.error.dispose();
471
- // Fallback: return empty resolved promise
472
- const fallback = vm.evalCode(`Promise.resolve([])`);
473
- if (fallback.error) {
474
- fallback.error.dispose();
475
- return vm.newArray();
476
- }
477
- const val = fallback.value;
478
- fallback.value; // keep alive
479
- return val;
480
- }
481
- const promiseHandle = promiseResult.value;
482
- return promiseHandle;
483
- });
484
- // Sync readdirSync
485
- const readdirSyncFn = vm.newFunction("readdirSync", (arg) => {
486
- const files = buildFileList(vm.dump(arg));
487
- const arr = vm.newArray();
488
- files.forEach((f, i) => {
489
- const val = vm.newString(f);
490
- vm.setProp(arr, i, val);
491
- val.dispose();
492
- });
493
- return arr;
494
- });
495
- const existsSyncFn = vm.newFunction("existsSync", (arg) => {
496
- const rawP = vm.dump(arg);
497
- const cleanPath = String(rawP).replace(/^file:\/\//, '');
498
- const p = path.isAbsolute(cleanPath) ? cleanPath : path.resolve(fileDir, cleanPath);
499
- const exists = context.modules.has(p);
500
- if (context.options.verbose) {
501
- console.log(`[QuickJS Mock] fs.existsSync("${rawP}") -> ${exists}`);
502
- }
503
- return exists ? vm.true : vm.false;
504
- });
505
- vm.setProp(fsMock, "readdir", readdirAsyncFn);
506
- vm.setProp(fsMock, "readdirSync", readdirSyncFn);
507
- vm.setProp(fsMock, "existsSync", existsSyncFn);
508
- // Also expose a `promises` sub-object with `readdir`
509
- const fsPromisesMock = vm.newObject();
510
- vm.setProp(fsPromisesMock, "readdir", readdirAsyncFn);
511
- vm.setProp(fsMock, "promises", fsPromisesMock);
512
- fsPromisesMock.dispose();
513
- vm.setProp(globalHandle, "fs", fsMock);
514
- fsMock.dispose();
515
- readdirAsyncFn.dispose();
516
- readdirSyncFn.dispose();
517
- existsSyncFn.dispose();
518
- // 5. console mock
519
- const consoleMock = vm.newObject();
520
- const logFn = vm.newFunction("log", (...args) => {
521
- if (context.options.verbose) {
522
- console.log(`[QuickJS Console]`, ...args.map(a => vm.dump(a)));
523
- }
524
- return vm.undefined;
525
- });
526
- const warnFn = vm.newFunction("warn", (...args) => {
527
- if (context.options.verbose) {
528
- console.warn(`[QuickJS Console]`, ...args.map(a => vm.dump(a)));
529
- }
530
- return vm.undefined;
531
- });
532
- const errorFn = vm.newFunction("error", (...args) => {
533
- console.error(`[QuickJS Console Error]`, ...args.map(a => vm.dump(a)));
534
- return vm.undefined;
535
- });
536
- vm.setProp(consoleMock, "log", logFn);
537
- vm.setProp(consoleMock, "warn", warnFn);
538
- vm.setProp(consoleMock, "error", errorFn);
539
- vm.setProp(globalHandle, "console", consoleMock);
540
- if (context.options.verbose) {
541
- vm.setProp(globalHandle, "__VERBOSE__", vm.true);
542
- }
543
- consoleMock.dispose();
544
- logFn.dispose();
545
- warnFn.dispose();
546
- errorFn.dispose();
547
- globalHandle.dispose();
548
- }
549
- function resolveAndMarkTarget(specifier, sourceFile, context) {
550
- let cleanSpecifier = specifier;
551
- if (specifier.startsWith('file://')) {
552
- cleanSpecifier = specifier.slice(7);
553
- }
554
- const sourceDir = path.dirname(sourceFile);
555
- const absolutePath = path.isAbsolute(cleanSpecifier)
556
- ? cleanSpecifier
557
- : path.resolve(sourceDir, cleanSpecifier);
558
- let targetModule = context.modules.get(absolutePath);
559
- if (!targetModule) {
560
- for (const ext of context.options.extensions) {
561
- const withExt = absolutePath + ext;
562
- targetModule = context.modules.get(withExt);
563
- if (targetModule)
564
- break;
565
- }
566
- }
567
- if (targetModule) {
568
- if (context.options.verbose) {
569
- console.log(`[Layer 4] Marking reachable: ${targetModule.id}`);
570
- }
571
- context.reachable.add(targetModule.id);
572
- for (const exp of targetModule.exports) {
573
- context.usedExports.add(`${targetModule.id}:${exp.exportedAs}`);
574
- }
575
- }
576
- else {
577
- if (context.options.verbose) {
578
- console.log(`[Layer 4] Could not resolve target: ${absolutePath}`);
579
- }
580
- }
581
- }
582
- async function verifyPathInWasmSandbox(quickJS, instrumentedCode, seedInput, timeoutMs = 50) {
583
- const startTime = performance.now();
584
- const runtime = quickJS.newRuntime();
585
- const context = runtime.newContext();
586
- try {
587
- runtime.setMemoryLimit(16 * 1024 * 1024);
588
- const setupScript = `
589
- globalThis.__PROVE_REACHED__ = false;
590
- globalThis.__coverage__ = {
591
- traceBranch: (f, l, hit) => { if (hit) globalThis.__PROVE_REACHED__ = true; },
592
- traceFunction: () => {},
593
- traceCall: () => {},
594
- init: () => {}
595
- };
596
- const seeds = ${JSON.stringify(seedInput)};
597
- Object.assign(globalThis, seeds);
598
- `;
599
- const setupResult = context.evalCode(setupScript);
600
- setupResult.dispose();
601
- const wrappedCode = `try { ${instrumentedCode} } catch (e) {}`;
602
- const evalResult = context.evalCode(wrappedCode);
603
- evalResult.dispose();
604
- const globalHandle = context.global;
605
- const reachedHandle = context.getProp(globalHandle, "__PROVE_REACHED__");
606
- const pathReached = context.dump(reachedHandle);
607
- reachedHandle.dispose();
608
- globalHandle.dispose();
609
- return {
610
- pathReached: Boolean(pathReached),
611
- executionTimeMs: performance.now() - startTime,
612
- logs: []
613
- };
614
- }
615
- catch (err) {
616
- return {
617
- pathReached: false,
618
- executionTimeMs: performance.now() - startTime,
619
- logs: [err.message]
620
- };
621
- }
622
- finally {
623
- context.dispose();
624
- runtime.dispose();
625
- }
626
- }
627
- //# sourceMappingURL=layer4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layer4.js","sourceRoot":"","sources":["../src/layer4.ts"],"names":[],"mappings":"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"}
package/dist/layer5.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import type { AnalysisContext, Finding } from "./types.js";
2
- /**
3
- * Layer 5: Schema Alignment
4
- * Protects public interfaces and contracts (Zod, Prisma, GraphQL, OpenAPI) from being falsely marked as dead code.
5
- */
6
- export declare function analyzeLayer5(context: AnalysisContext): Promise<Finding[]>;