optiprune 1.0.0
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/LICENSE +7 -0
- package/README.md +49 -0
- package/dist/cache.d.ts +14 -0
- package/dist/cache.js +36 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-loader.d.ts +4 -0
- package/dist/config-loader.js +68 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/coverage-tracker.d.ts +39 -0
- package/dist/coverage-tracker.js +61 -0
- package/dist/coverage-tracker.js.map +1 -0
- package/dist/fs-utils.d.ts +33 -0
- package/dist/fs-utils.js +334 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/graph.d.ts +28 -0
- package/dist/graph.js +331 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +313 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +1 -0
- package/dist/instrument.js +20 -0
- package/dist/instrument.js.map +1 -0
- package/dist/instrumentation-plugin.d.ts +6 -0
- package/dist/instrumentation-plugin.js +84 -0
- package/dist/instrumentation-plugin.js.map +1 -0
- package/dist/layer2.d.ts +6 -0
- package/dist/layer2.js +227 -0
- package/dist/layer2.js.map +1 -0
- package/dist/layer3.d.ts +7 -0
- package/dist/layer3.js +244 -0
- package/dist/layer3.js.map +1 -0
- package/dist/layer4.d.ts +7 -0
- package/dist/layer4.js +90 -0
- package/dist/layer4.js.map +1 -0
- package/dist/layer5.d.ts +6 -0
- package/dist/layer5.js +141 -0
- package/dist/layer5.js.map +1 -0
- package/dist/layer6.d.ts +25 -0
- package/dist/layer6.js +183 -0
- package/dist/layer6.js.map +1 -0
- package/dist/parser.d.ts +24 -0
- package/dist/parser.js +481 -0
- package/dist/parser.js.map +1 -0
- package/dist/reporters.d.ts +3 -0
- package/dist/reporters.js +75 -0
- package/dist/reporters.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +6 -0
- package/dist/workspace.js +114 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer3.js","sourceRoot":"","sources":["../src/layer3.ts"],"names":[],"mappings":"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"}
|
package/dist/layer4.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AnalysisContext, Finding } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 4: Proof Asserter Engine
|
|
4
|
+
* Validates candidate branches from Layer 3 using isolated execution.
|
|
5
|
+
* Uses a secure WebAssembly-based QuickJS sandbox.
|
|
6
|
+
*/
|
|
7
|
+
export declare function analyzeLayer4(context: AnalysisContext): Promise<Finding[]>;
|
package/dist/layer4.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { getQuickJS } from "quickjs-emscripten";
|
|
2
|
+
import { performance } from "node:perf_hooks";
|
|
3
|
+
/**
|
|
4
|
+
* Layer 4: Proof Asserter Engine
|
|
5
|
+
* Validates candidate branches from Layer 3 using isolated execution.
|
|
6
|
+
* Uses a secure WebAssembly-based QuickJS sandbox.
|
|
7
|
+
*/
|
|
8
|
+
export async function analyzeLayer4(context) {
|
|
9
|
+
if (context.candidateBranches.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const findings = [];
|
|
13
|
+
const quickJS = await getQuickJS();
|
|
14
|
+
for (const branch of context.candidateBranches) {
|
|
15
|
+
const result = await verifyPathInWasmSandbox(quickJS, branch.instrumentedCode, branch.seedInput, context.options.layers.smtTimeoutMs);
|
|
16
|
+
if (result.pathReached) {
|
|
17
|
+
// If reached, it's PROVEN alive.
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
findings.push({
|
|
21
|
+
rule: "unreachable-dynamic-path",
|
|
22
|
+
severity: "warning",
|
|
23
|
+
confidence: "medium",
|
|
24
|
+
message: `[Proof Asserter] Branch at line ${branch.line} could not be reached with SMT-generated seeds.`,
|
|
25
|
+
file: branch.file,
|
|
26
|
+
location: {
|
|
27
|
+
start: { line: branch.line, column: 0 },
|
|
28
|
+
end: { line: branch.line, column: 0 }
|
|
29
|
+
},
|
|
30
|
+
evidence: {
|
|
31
|
+
engine: "wasm-quickjs",
|
|
32
|
+
executionTimeMs: result.executionTimeMs,
|
|
33
|
+
seedInput: branch.seedInput,
|
|
34
|
+
status: "SUSPECT_UNREACHABLE"
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return findings;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executes instrumented code paths in a secure Wasm-based QuickJS sandbox.
|
|
42
|
+
*/
|
|
43
|
+
async function verifyPathInWasmSandbox(quickJS, instrumentedCode, seedInput, timeoutMs = 50) {
|
|
44
|
+
const startTime = performance.now();
|
|
45
|
+
const runtime = quickJS.newRuntime();
|
|
46
|
+
const context = runtime.newContext();
|
|
47
|
+
try {
|
|
48
|
+
// Set a memory limit (e.g., 16MB)
|
|
49
|
+
runtime.setMemoryLimit(16 * 1024 * 1024);
|
|
50
|
+
// Setup the sandbox environment
|
|
51
|
+
const setupScript = `
|
|
52
|
+
globalThis.__PROVE_REACHED__ = false;
|
|
53
|
+
globalThis.__coverage__ = {
|
|
54
|
+
traceBranch: (f, l, hit) => { if (hit) globalThis.__PROVE_REACHED__ = true; },
|
|
55
|
+
traceFunction: () => {},
|
|
56
|
+
traceCall: () => {},
|
|
57
|
+
init: () => {}
|
|
58
|
+
};
|
|
59
|
+
// Inject seed inputs
|
|
60
|
+
const seeds = ${JSON.stringify(seedInput)};
|
|
61
|
+
Object.assign(globalThis, seeds);
|
|
62
|
+
`;
|
|
63
|
+
context.evalCode(setupScript);
|
|
64
|
+
// Execute the instrumented code
|
|
65
|
+
// We wrap it in a try-catch to prevent VM crashes from throwing in the host
|
|
66
|
+
const wrappedCode = `try { ${instrumentedCode} } catch (e) {}`;
|
|
67
|
+
// QuickJS-emscripten evalCode is synchronous but we can enforce a timeout
|
|
68
|
+
// In a more complex setup we'd use a worker, but for concolic execution snippets,
|
|
69
|
+
// we rely on the host's performance.now() and runtime limits.
|
|
70
|
+
context.evalCode(wrappedCode);
|
|
71
|
+
const pathReached = context.dump(context.getProp(context.global, "__PROVE_REACHED__"));
|
|
72
|
+
return {
|
|
73
|
+
pathReached: Boolean(pathReached),
|
|
74
|
+
executionTimeMs: performance.now() - startTime,
|
|
75
|
+
logs: []
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return {
|
|
80
|
+
pathReached: false,
|
|
81
|
+
executionTimeMs: performance.now() - startTime,
|
|
82
|
+
logs: [err.message]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
context.dispose();
|
|
87
|
+
runtime.dispose();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=layer4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer4.js","sourceRoot":"","sources":["../src/layer4.ts"],"names":[],"mappings":"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"}
|
package/dist/layer5.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
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[]>;
|
package/dist/layer5.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { walkAst } from "./parser.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 async function analyzeLayer5(context) {
|
|
7
|
+
const findings = [];
|
|
8
|
+
const externallyDefinedContracts = new Set(context.options.externalContracts || []);
|
|
9
|
+
const PROTECTED_DECORATORS = new Set([
|
|
10
|
+
'Controller', 'Injectable', 'Module', 'Resolver', 'Directive',
|
|
11
|
+
'ObjectType', 'InputType', 'Field', 'Query', 'Mutation', 'Subscription',
|
|
12
|
+
'Entity', 'Table', 'Column', 'PrimaryGeneratedColumn', 'OneToMany', 'ManyToOne', 'ManyToMany', 'JoinColumn',
|
|
13
|
+
'Get', 'Post', 'Put', 'Delete', 'Patch', 'Options', 'Head', 'All'
|
|
14
|
+
]);
|
|
15
|
+
// Phase 1: Identify symbols explicitly provided as external contracts via options
|
|
16
|
+
// These are already added to `externallyDefinedContracts` at initialization.
|
|
17
|
+
// Phase 2: Decorator & Framework Metadata Reader
|
|
18
|
+
for (const module of context.modules.values()) {
|
|
19
|
+
if (!module.ast)
|
|
20
|
+
continue;
|
|
21
|
+
walkAst(module.ast, (rawNode) => {
|
|
22
|
+
const node = rawNode;
|
|
23
|
+
// 1. Framework Decorators (NestJS, TypeORM, MikroORM, TypeGraphQL)
|
|
24
|
+
const decorators = [
|
|
25
|
+
...(Array.isArray(node.decorators) ? node.decorators : []),
|
|
26
|
+
...(Array.isArray(node.modifiers)
|
|
27
|
+
? node.modifiers.filter((m) => m.type === 'Decorator')
|
|
28
|
+
: []),
|
|
29
|
+
];
|
|
30
|
+
if (decorators.length > 0) {
|
|
31
|
+
for (const decorator of decorators) {
|
|
32
|
+
let decoratorName = "";
|
|
33
|
+
const expr = decorator.expression;
|
|
34
|
+
if (expr?.type === 'CallExpression' && expr.callee?.type === 'Identifier') {
|
|
35
|
+
decoratorName = expr.callee.name;
|
|
36
|
+
}
|
|
37
|
+
else if (expr?.type === 'Identifier') {
|
|
38
|
+
decoratorName = expr.name;
|
|
39
|
+
}
|
|
40
|
+
if (PROTECTED_DECORATORS.has(decoratorName)) {
|
|
41
|
+
let targetNode = node;
|
|
42
|
+
if ((node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration') && node.declaration) {
|
|
43
|
+
targetNode = node.declaration;
|
|
44
|
+
}
|
|
45
|
+
if ((targetNode.type === 'ClassDeclaration' || targetNode.type === 'FunctionDeclaration') && targetNode.id?.name) {
|
|
46
|
+
externallyDefinedContracts.add(targetNode.id.name);
|
|
47
|
+
}
|
|
48
|
+
else if ((targetNode.type === 'ClassMethod' || targetNode.type === 'ClassProperty') && targetNode.key?.type === 'Identifier') {
|
|
49
|
+
externallyDefinedContracts.add(targetNode.key.name);
|
|
50
|
+
}
|
|
51
|
+
else if (targetNode.type === 'VariableDeclaration') {
|
|
52
|
+
targetNode.declarations.forEach((decl) => {
|
|
53
|
+
if (decl.id?.type === 'Identifier')
|
|
54
|
+
externallyDefinedContracts.add(decl.id.name);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 2. JSDoc Annotations (@public, @used, optiprune-ignore)
|
|
61
|
+
if (Array.isArray(node.leadingComments)) {
|
|
62
|
+
const isPublic = node.leadingComments.some((comment) => comment.value.includes("@public") ||
|
|
63
|
+
comment.value.includes("@used") ||
|
|
64
|
+
comment.value.includes("optiprune-ignore"));
|
|
65
|
+
if (isPublic) {
|
|
66
|
+
if (node.type === 'VariableDeclaration') {
|
|
67
|
+
node.declarations.forEach((decl) => {
|
|
68
|
+
if (decl.id?.type === 'Identifier')
|
|
69
|
+
externallyDefinedContracts.add(decl.id.name);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else if ((node.type === 'FunctionDeclaration' || node.type === 'ClassDeclaration') &&
|
|
73
|
+
node.id?.name) {
|
|
74
|
+
externallyDefinedContracts.add(node.id.name);
|
|
75
|
+
}
|
|
76
|
+
else if (node.type === 'ExportNamedDeclaration' && node.declaration) {
|
|
77
|
+
const decl = node.declaration;
|
|
78
|
+
if (decl.type === 'VariableDeclaration') {
|
|
79
|
+
decl.declarations.forEach((d) => {
|
|
80
|
+
if (d.id?.type === 'Identifier')
|
|
81
|
+
externallyDefinedContracts.add(d.id.name);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if ((decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') &&
|
|
85
|
+
decl.id?.name) {
|
|
86
|
+
externallyDefinedContracts.add(decl.id.name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 3. Schema & Validation Framework Naming Pattern Matching
|
|
92
|
+
let varDeclarations = [];
|
|
93
|
+
if (node.type === 'VariableDeclaration') {
|
|
94
|
+
varDeclarations = node.declarations || [];
|
|
95
|
+
}
|
|
96
|
+
else if (node.type === 'ExportNamedDeclaration' && node.declaration?.type === 'VariableDeclaration') {
|
|
97
|
+
varDeclarations = node.declaration.declarations || [];
|
|
98
|
+
}
|
|
99
|
+
for (const decl of varDeclarations) {
|
|
100
|
+
if (decl.id?.type === 'Identifier') {
|
|
101
|
+
const varName = decl.id.name;
|
|
102
|
+
const init = decl.init;
|
|
103
|
+
const isZodCall = init?.type === 'CallExpression' &&
|
|
104
|
+
((init.callee?.type === 'MemberExpression' &&
|
|
105
|
+
(init.callee.object?.name === 'z' || init.callee.object?.name === 'zod')) ||
|
|
106
|
+
(init.callee?.type === 'Identifier' &&
|
|
107
|
+
(init.callee.name === 'z' || init.callee.name.startsWith('zod'))));
|
|
108
|
+
if (isZodCall || varName.endsWith('Schema')) {
|
|
109
|
+
externallyDefinedContracts.add(varName);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Check class and function declarations ending in Schema (e.g., export class UserSchema)
|
|
114
|
+
let targetNameNode = null;
|
|
115
|
+
if (node.type === 'ClassDeclaration' || node.type === 'FunctionDeclaration') {
|
|
116
|
+
targetNameNode = node;
|
|
117
|
+
}
|
|
118
|
+
else if (node.type === 'ExportNamedDeclaration' &&
|
|
119
|
+
node.declaration &&
|
|
120
|
+
(node.declaration.type === 'ClassDeclaration' || node.declaration.type === 'FunctionDeclaration')) {
|
|
121
|
+
targetNameNode = node.declaration;
|
|
122
|
+
}
|
|
123
|
+
if (targetNameNode?.id?.name && targetNameNode.id.name.endsWith('Schema')) {
|
|
124
|
+
externallyDefinedContracts.add(targetNameNode.id.name);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Phase 3: Apply Contract Guard Marking to ExportRecords
|
|
129
|
+
for (const module of context.modules.values()) {
|
|
130
|
+
if (module.exports) {
|
|
131
|
+
for (const exportRecord of module.exports) {
|
|
132
|
+
if ((exportRecord.name && externallyDefinedContracts.has(exportRecord.name)) ||
|
|
133
|
+
(exportRecord.exportedAs && externallyDefinedContracts.has(exportRecord.exportedAs))) {
|
|
134
|
+
exportRecord.isExternalContract = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return findings;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=layer5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer5.js","sourceRoot":"","sources":["../src/layer5.ts"],"names":[],"mappings":"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"}
|
package/dist/layer6.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AnalysisContext, Finding } from './types.js';
|
|
2
|
+
export interface DtsExportGraph {
|
|
3
|
+
filePath: string;
|
|
4
|
+
exportedTypes: Set<string>;
|
|
5
|
+
hasModuleAugmentation: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DependencyNode {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
dependencies: Set<string>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parses a library's entry point `.d.ts` file using SWC.
|
|
14
|
+
* Handles Windows & POSIX paths natively.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseDtsWithSwc(entryPointRelative: string): Promise<DtsExportGraph>;
|
|
17
|
+
/**
|
|
18
|
+
* Fast-path topology extraction from lockfiles.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildLockfileGraph(projectRoot: string): Map<string, DependencyNode>;
|
|
21
|
+
/**
|
|
22
|
+
* Layer 6: Dependency & Boundary Engine
|
|
23
|
+
* Audits package usage and refines Layer 5 protections.
|
|
24
|
+
*/
|
|
25
|
+
export declare function analyzeLayer6(context: AnalysisContext): Promise<Finding[]>;
|
package/dist/layer6.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'pathe';
|
|
3
|
+
import { parseFile } from '@swc/core';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
/**
|
|
6
|
+
* Parses a library's entry point `.d.ts` file using SWC.
|
|
7
|
+
* Handles Windows & POSIX paths natively.
|
|
8
|
+
*/
|
|
9
|
+
export async function parseDtsWithSwc(entryPointRelative) {
|
|
10
|
+
const absolutePath = path.resolve(entryPointRelative);
|
|
11
|
+
if (!fs.existsSync(absolutePath)) {
|
|
12
|
+
return { filePath: absolutePath, exportedTypes: new Set(), hasModuleAugmentation: false };
|
|
13
|
+
}
|
|
14
|
+
// SWC parses TypeScript declarations directly with native performance
|
|
15
|
+
const moduleAst = await parseFile(absolutePath, {
|
|
16
|
+
syntax: 'typescript',
|
|
17
|
+
dts: true,
|
|
18
|
+
});
|
|
19
|
+
const exportedTypes = new Set();
|
|
20
|
+
let hasModuleAugmentation = false;
|
|
21
|
+
for (const item of moduleAst.body) {
|
|
22
|
+
// 1. Capture exported interfaces/types/classes
|
|
23
|
+
if (item.type === 'ExportDeclaration') {
|
|
24
|
+
if (item.declaration && 'identifier' in item.declaration) {
|
|
25
|
+
exportedTypes.add(item.declaration.identifier.value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (item.type === 'ExportNamedDeclaration') {
|
|
29
|
+
for (const spec of item.specifiers) {
|
|
30
|
+
if (spec.type === 'ExportSpecifier') {
|
|
31
|
+
exportedTypes.add(spec.exported?.value || spec.orig.value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 2. Track ambient module augmentations (e.g., declare module 'express')
|
|
36
|
+
if (item.type === 'TsModuleDeclaration') {
|
|
37
|
+
hasModuleAugmentation = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
filePath: absolutePath,
|
|
42
|
+
exportedTypes,
|
|
43
|
+
hasModuleAugmentation,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fast-path topology extraction from lockfiles.
|
|
48
|
+
*/
|
|
49
|
+
export function buildLockfileGraph(projectRoot) {
|
|
50
|
+
const graph = new Map();
|
|
51
|
+
const pnpmLockPath = path.join(projectRoot, 'pnpm-lock.yaml');
|
|
52
|
+
const packageLockPath = path.join(projectRoot, 'package-lock.json');
|
|
53
|
+
if (fs.existsSync(packageLockPath)) {
|
|
54
|
+
try {
|
|
55
|
+
const raw = fs.readFileSync(packageLockPath, 'utf-8');
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
const packages = parsed.packages || {};
|
|
58
|
+
for (const [pkgPath, meta] of Object.entries(packages)) {
|
|
59
|
+
if (!pkgPath)
|
|
60
|
+
continue;
|
|
61
|
+
const cleanName = pkgPath.replace(/^node_modules\//, '');
|
|
62
|
+
const deps = new Set(Object.keys(meta.dependencies || {}).concat(Object.keys(meta.peerDependencies || {})));
|
|
63
|
+
graph.set(cleanName, {
|
|
64
|
+
name: cleanName,
|
|
65
|
+
version: meta.version || 'unknown',
|
|
66
|
+
dependencies: deps,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
console.error(`[Layer 6] Error parsing package-lock.json: ${e}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (fs.existsSync(pnpmLockPath)) {
|
|
75
|
+
try {
|
|
76
|
+
const raw = fs.readFileSync(pnpmLockPath, 'utf-8');
|
|
77
|
+
const parsed = yaml.load(raw);
|
|
78
|
+
const snapshots = parsed.snapshots || {};
|
|
79
|
+
for (const [pkgId, meta] of Object.entries(snapshots)) {
|
|
80
|
+
// pnpm lock v6/v9 format: /pkg-name@version
|
|
81
|
+
const nameMatch = pkgId.match(/^\/(@?[^@]+)/);
|
|
82
|
+
const cleanName = (nameMatch ? nameMatch[1] : pkgId);
|
|
83
|
+
const deps = new Set(Object.keys(meta.dependencies || {}).concat(Object.keys(meta.peerDependencies || {})));
|
|
84
|
+
graph.set(cleanName, {
|
|
85
|
+
name: cleanName,
|
|
86
|
+
version: 'pnpm-managed',
|
|
87
|
+
dependencies: deps,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
console.error(`[Layer 6] Error parsing pnpm-lock.yaml: ${e}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return graph;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Layer 6: Dependency & Boundary Engine
|
|
99
|
+
* Audits package usage and refines Layer 5 protections.
|
|
100
|
+
*/
|
|
101
|
+
export async function analyzeLayer6(context) {
|
|
102
|
+
const findings = [];
|
|
103
|
+
const projectRoot = context.options.rootDir;
|
|
104
|
+
// 1. Audit declared dependencies vs imported ones
|
|
105
|
+
const lockfileGraph = buildLockfileGraph(projectRoot);
|
|
106
|
+
const importedPackages = new Set();
|
|
107
|
+
for (const module of context.modules.values()) {
|
|
108
|
+
for (const edge of module.edges) {
|
|
109
|
+
if (edge.resolution === 'external') {
|
|
110
|
+
// Extract package name (e.g., '@scope/pkg/path' -> '@scope/pkg')
|
|
111
|
+
const parts = edge.rawSpecifier.split('/');
|
|
112
|
+
const pkgName = edge.rawSpecifier.startsWith('@') ? `${parts[0] ?? ''}/${parts[1] ?? ''}` : (parts[0] ?? '');
|
|
113
|
+
importedPackages.add(pkgName);
|
|
114
|
+
}
|
|
115
|
+
else if (edge.resolution === 'resolved' && edge.target && context.options.monorepo) {
|
|
116
|
+
// Check if the target is inside a workspace package
|
|
117
|
+
for (const [pkgName, pkg] of context.options.monorepo.packageMap.entries()) {
|
|
118
|
+
if (edge.target.startsWith(pkg.location + '/') || edge.target === pkg.location) {
|
|
119
|
+
importedPackages.add(pkgName);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Find unused direct dependencies from all package.json files
|
|
127
|
+
const manifestPaths = [path.join(projectRoot, 'package.json')];
|
|
128
|
+
if (context.options.monorepo) {
|
|
129
|
+
for (const pkg of context.options.monorepo.packageMap.values()) {
|
|
130
|
+
manifestPaths.push(pkg.manifestPath);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const manifestPath of manifestPaths) {
|
|
134
|
+
if (fs.existsSync(manifestPath)) {
|
|
135
|
+
try {
|
|
136
|
+
const pkg = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
137
|
+
const declaredDeps = Object.keys(pkg.dependencies || {});
|
|
138
|
+
const relativeManifest = path.posix.relative(projectRoot, manifestPath);
|
|
139
|
+
for (const dep of declaredDeps) {
|
|
140
|
+
if (!importedPackages.has(dep)) {
|
|
141
|
+
findings.push({
|
|
142
|
+
rule: 'unused-export',
|
|
143
|
+
severity: 'warning',
|
|
144
|
+
confidence: 'high',
|
|
145
|
+
message: `Package '${dep}' is declared in ${relativeManifest} but never imported in /src.`,
|
|
146
|
+
file: relativeManifest,
|
|
147
|
+
evidence: { package: dep }
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
console.error(`[Layer 6] Error auditing ${manifestPath}: ${e}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// 2. Refine Layer 5 Protection
|
|
158
|
+
// In a real scenario, we'd scan for framework registrations.
|
|
159
|
+
// For this implementation, we look for symbols in SCCs that are not reachable.
|
|
160
|
+
// If a Layer 5 protected symbol is in a module that is unreachable, we revoked it.
|
|
161
|
+
for (const module of context.modules.values()) {
|
|
162
|
+
const isReachable = context.reachable.has(module.id) || context.maybeReachable.has(module.id);
|
|
163
|
+
if (!isReachable) {
|
|
164
|
+
for (const exp of module.exports) {
|
|
165
|
+
if (exp.isExternalContract) {
|
|
166
|
+
// Revoke protection because the entire file is abandoned
|
|
167
|
+
findings.push({
|
|
168
|
+
rule: 'protected-contract',
|
|
169
|
+
severity: 'info',
|
|
170
|
+
confidence: 'high',
|
|
171
|
+
message: `[Layer 6] Revoked protection for unreferenced contract: ${exp.exportedAs} (File is unreachable).`,
|
|
172
|
+
file: module.relativePath,
|
|
173
|
+
...(exp.location !== undefined && { location: exp.location }),
|
|
174
|
+
evidence: { symbol: exp.exportedAs, reason: 'unreachable-file' }
|
|
175
|
+
});
|
|
176
|
+
exp.isExternalContract = false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return findings;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=layer6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer6.js","sourceRoot":"","sources":["../src/layer6.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ModuleRecord, Position, Range } from "./types.js";
|
|
2
|
+
interface AstNode {
|
|
3
|
+
type?: string;
|
|
4
|
+
start?: number;
|
|
5
|
+
end?: number;
|
|
6
|
+
loc?: {
|
|
7
|
+
start?: Position;
|
|
8
|
+
end?: Position;
|
|
9
|
+
};
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse a module without executing it. Recoverable Babel diagnostics retain AST analysis;
|
|
14
|
+
* unrecoverable input uses a lexical fallback so a bad file cannot sever graph traversal.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseModule(sourceText: string, file: string): ModuleRecord;
|
|
17
|
+
export declare function getNodeRange(node: unknown): Range | undefined;
|
|
18
|
+
export declare function getNodeType(node: unknown): string | undefined;
|
|
19
|
+
export declare function getNodeProperty(node: unknown, property: string): unknown;
|
|
20
|
+
export declare function getStringLiteral(node: unknown): string | undefined;
|
|
21
|
+
export declare function getIdentifier(node: unknown): string | undefined;
|
|
22
|
+
export declare function isAstNode(node: unknown): boolean;
|
|
23
|
+
export declare function walkAst(node: unknown, visitor: (node: AstNode) => void): void;
|
|
24
|
+
export type { AstNode };
|