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.
- package/README.md +52 -22
- package/bin/runner.js +26 -0
- package/package.json +10 -37
- package/dist/ast-utils.d.ts +0 -149
- package/dist/ast-utils.js +0 -36
- package/dist/ast-utils.js.map +0 -1
- package/dist/cache.d.ts +0 -14
- package/dist/cache.js +0 -36
- package/dist/cache.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -68
- package/dist/cli.js.map +0 -1
- package/dist/config-loader.d.ts +0 -4
- package/dist/config-loader.js +0 -84
- package/dist/config-loader.js.map +0 -1
- package/dist/coverage-tracker.d.ts +0 -39
- package/dist/coverage-tracker.js +0 -61
- package/dist/coverage-tracker.js.map +0 -1
- package/dist/engine.d.ts +0 -17
- package/dist/engine.js +0 -215
- package/dist/engine.js.map +0 -1
- package/dist/framework-plugins.d.ts +0 -16
- package/dist/framework-plugins.js +0 -127
- package/dist/framework-plugins.js.map +0 -1
- package/dist/fs-utils.d.ts +0 -32
- package/dist/fs-utils.js +0 -415
- package/dist/fs-utils.js.map +0 -1
- package/dist/graph.d.ts +0 -42
- package/dist/graph.js +0 -583
- package/dist/graph.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -451
- package/dist/index.js.map +0 -1
- package/dist/instrument.d.ts +0 -5
- package/dist/instrument.js +0 -108
- package/dist/instrument.js.map +0 -1
- package/dist/layer2.d.ts +0 -6
- package/dist/layer2.js +0 -224
- package/dist/layer2.js.map +0 -1
- package/dist/layer3.d.ts +0 -7
- package/dist/layer3.js +0 -346
- package/dist/layer3.js.map +0 -1
- package/dist/layer4.d.ts +0 -8
- package/dist/layer4.js +0 -627
- package/dist/layer4.js.map +0 -1
- package/dist/layer5.d.ts +0 -6
- package/dist/layer5.js +0 -141
- package/dist/layer5.js.map +0 -1
- package/dist/layer6.d.ts +0 -26
- package/dist/layer6.js +0 -268
- package/dist/layer6.js.map +0 -1
- package/dist/layer7.d.ts +0 -28
- package/dist/layer7.js +0 -267
- package/dist/layer7.js.map +0 -1
- package/dist/parser.d.ts +0 -20
- package/dist/parser.js +0 -832
- package/dist/parser.js.map +0 -1
- package/dist/plugins/angular-plugin.d.ts +0 -7
- package/dist/plugins/angular-plugin.js +0 -60
- package/dist/plugins/angular-plugin.js.map +0 -1
- package/dist/plugins/astro-plugin.d.ts +0 -7
- package/dist/plugins/astro-plugin.js +0 -88
- package/dist/plugins/astro-plugin.js.map +0 -1
- package/dist/plugins/babel-plugin.d.ts +0 -8
- package/dist/plugins/babel-plugin.js +0 -132
- package/dist/plugins/babel-plugin.js.map +0 -1
- package/dist/plugins/esbuild-plugin.d.ts +0 -8
- package/dist/plugins/esbuild-plugin.js +0 -121
- package/dist/plugins/esbuild-plugin.js.map +0 -1
- package/dist/plugins/nestjs-plugin.d.ts +0 -7
- package/dist/plugins/nestjs-plugin.js +0 -69
- package/dist/plugins/nestjs-plugin.js.map +0 -1
- package/dist/plugins/nextjs-plugin.d.ts +0 -7
- package/dist/plugins/nextjs-plugin.js +0 -66
- package/dist/plugins/nextjs-plugin.js.map +0 -1
- package/dist/plugins/nuxtjs-plugin.d.ts +0 -7
- package/dist/plugins/nuxtjs-plugin.js +0 -80
- package/dist/plugins/nuxtjs-plugin.js.map +0 -1
- package/dist/plugins/svelte-plugin.d.ts +0 -7
- package/dist/plugins/svelte-plugin.js +0 -38
- package/dist/plugins/svelte-plugin.js.map +0 -1
- package/dist/plugins/vuejs-plugin.d.ts +0 -7
- package/dist/plugins/vuejs-plugin.js +0 -63
- package/dist/plugins/vuejs-plugin.js.map +0 -1
- package/dist/reporters.d.ts +0 -3
- package/dist/reporters.js +0 -75
- package/dist/reporters.js.map +0 -1
- package/dist/semantic-graph.d.ts +0 -44
- package/dist/semantic-graph.js +0 -88
- package/dist/semantic-graph.js.map +0 -1
- package/dist/symbolic-engine.d.ts +0 -19
- package/dist/symbolic-engine.js +0 -51
- package/dist/symbolic-engine.js.map +0 -1
- package/dist/topology-manager.d.ts +0 -23
- package/dist/topology-manager.js +0 -144
- package/dist/topology-manager.js.map +0 -1
- package/dist/types.d.ts +0 -265
- package/dist/types.js +0 -11
- package/dist/types.js.map +0 -1
- package/dist/workspace.d.ts +0 -6
- package/dist/workspace.js +0 -105
- 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
|
package/dist/layer4.js.map
DELETED
|
@@ -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[]>;
|