optiprune 1.3.0 → 1.4.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/README.md +35 -4
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/config-loader.js +2 -0
- package/dist/config-loader.js.map +1 -1
- package/dist/engine.d.ts +5 -4
- package/dist/engine.js +113 -53
- package/dist/engine.js.map +1 -1
- package/dist/framework-plugins.d.ts +16 -0
- package/dist/framework-plugins.js +108 -0
- package/dist/framework-plugins.js.map +1 -0
- package/dist/fs-utils.d.ts +1 -1
- package/dist/fs-utils.js +52 -39
- package/dist/fs-utils.js.map +1 -1
- package/dist/index.js +28 -8
- package/dist/index.js.map +1 -1
- package/dist/layer3.js +10 -3
- package/dist/layer3.js.map +1 -1
- package/dist/layer6.js +56 -30
- package/dist/layer6.js.map +1 -1
- package/dist/layer7.d.ts +28 -0
- package/dist/layer7.js +250 -0
- package/dist/layer7.js.map +1 -0
- package/dist/parser.js +17 -1
- package/dist/parser.js.map +1 -1
- package/dist/types.d.ts +27 -6
- package/dist/types.js.map +1 -1
- package/dist/workspace.js +22 -31
- package/dist/workspace.js.map +1 -1
- package/package.json +4 -3
package/dist/types.d.ts
CHANGED
|
@@ -105,6 +105,8 @@ export interface AnalyzerOptions {
|
|
|
105
105
|
failOn?: FailOn;
|
|
106
106
|
json?: boolean;
|
|
107
107
|
includeConventionalEntries?: boolean;
|
|
108
|
+
skip3?: boolean;
|
|
109
|
+
skip4?: boolean;
|
|
108
110
|
}
|
|
109
111
|
export type RuleSeverity = "error" | "warning" | "off";
|
|
110
112
|
export interface Config {
|
|
@@ -121,6 +123,8 @@ export interface Config {
|
|
|
121
123
|
smtTimeoutMs?: number;
|
|
122
124
|
isolateMemoryLimitMb?: number;
|
|
123
125
|
enableConcolicProof?: boolean;
|
|
126
|
+
skip3?: boolean;
|
|
127
|
+
skip4?: boolean;
|
|
124
128
|
};
|
|
125
129
|
rules?: Record<string, RuleSeverity>;
|
|
126
130
|
}
|
|
@@ -141,6 +145,8 @@ export interface ResolvedOptions {
|
|
|
141
145
|
smtTimeoutMs: number;
|
|
142
146
|
isolateMemoryLimitMb: number;
|
|
143
147
|
enableConcolicProof: boolean;
|
|
148
|
+
skip3: boolean;
|
|
149
|
+
skip4: boolean;
|
|
144
150
|
};
|
|
145
151
|
rules: Record<string, RuleSeverity>;
|
|
146
152
|
}
|
|
@@ -201,15 +207,30 @@ export interface AnalysisContext {
|
|
|
201
207
|
semanticGraph?: any;
|
|
202
208
|
symbolicContracts?: Map<string, any>;
|
|
203
209
|
}
|
|
204
|
-
export interface
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
210
|
+
export interface PluginAdapter {
|
|
211
|
+
getAst(fileId: string): any;
|
|
212
|
+
getSymbol(name: string, fileId: string): any;
|
|
213
|
+
getType(node: any): string | undefined;
|
|
214
|
+
getDependencies(fileId: string): string[];
|
|
215
|
+
getConfig(): ResolvedOptions;
|
|
216
|
+
readFile(filename: string): Promise<string | null>;
|
|
217
|
+
readJson(filename: string): Promise<any | null>;
|
|
218
|
+
emitFinding(finding: Omit<Finding, "rule">): void;
|
|
219
|
+
markAsUsed(fileId: string, symbol?: string): void;
|
|
220
|
+
attachMetadata(node: any, key: string, value: any): void;
|
|
221
|
+
}
|
|
222
|
+
export interface PluginLifecycle {
|
|
223
|
+
onProjectInit?(adapter: PluginAdapter): void | Promise<void>;
|
|
224
|
+
onFileStart?(fileId: string, adapter: PluginAdapter): void | Promise<void>;
|
|
225
|
+
onASTNode?(node: any, fileId: string, adapter: PluginAdapter): void;
|
|
226
|
+
onAnalysisComplete?(adapter: PluginAdapter): void | Promise<void>;
|
|
208
227
|
}
|
|
209
228
|
export interface AnalyzerPlugin {
|
|
210
229
|
name: string;
|
|
211
|
-
|
|
212
|
-
|
|
230
|
+
version: string;
|
|
231
|
+
enabled?: boolean;
|
|
232
|
+
detect?(adapter: PluginAdapter): Promise<boolean>;
|
|
233
|
+
lifecycle: PluginLifecycle;
|
|
213
234
|
}
|
|
214
235
|
export declare const CONFIDENCE_RANK: Record<FailOn, number>;
|
|
215
236
|
export declare function defineConfig(config: Config): Config;
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwRA,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,EAAE,yCAAyC;CACpD,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/workspace.js
CHANGED
|
@@ -2,7 +2,7 @@ import path from 'pathe';
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import fg from 'fast-glob';
|
|
4
4
|
import * as yaml from 'js-yaml';
|
|
5
|
-
import { normalizeAbsolute } from './fs-utils.js';
|
|
5
|
+
import { normalizeAbsolute, readJsonFile } from './fs-utils.js';
|
|
6
6
|
/**
|
|
7
7
|
* Resolves all sub-packages in a Monorepo workspace.
|
|
8
8
|
* Uses POSIX-style path logic for internal calculations to support Windows.
|
|
@@ -22,14 +22,14 @@ export async function buildMonorepoTopology(rootPath) {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
catch (e) {
|
|
25
|
-
|
|
25
|
+
// Ignore parse warnings on malformed workspace configs
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
// 2. Detect Yarn/NPM workspaces in package.json
|
|
29
29
|
const rootPackageJsonPath = path.join(absoluteRoot, 'package.json');
|
|
30
30
|
if (fs.existsSync(rootPackageJsonPath)) {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const rootManifest = await readJsonFile(rootPackageJsonPath);
|
|
32
|
+
if (rootManifest) {
|
|
33
33
|
if (Array.isArray(rootManifest.workspaces)) {
|
|
34
34
|
packageGlobs.push(...rootManifest.workspaces);
|
|
35
35
|
}
|
|
@@ -37,41 +37,32 @@ export async function buildMonorepoTopology(rootPath) {
|
|
|
37
37
|
packageGlobs.push(...rootManifest.workspaces.packages);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
console.error(`[Workspace] Error parsing root package.json: ${e}`);
|
|
42
|
-
}
|
|
43
40
|
}
|
|
44
41
|
// Default to common patterns if nothing found
|
|
45
42
|
if (packageGlobs.length === 0) {
|
|
46
43
|
packageGlobs.push('packages/*', 'apps/*');
|
|
47
44
|
}
|
|
48
45
|
// 3. Find all package.json files matching the globs
|
|
49
|
-
// Use path.posix for globs as fast-glob expects forward slashes
|
|
50
46
|
const manifestFiles = await fg(packageGlobs.map(g => path.posix.join(g, 'package.json')), { cwd: absoluteRoot, absolute: true, ignore: ['**/node_modules/**'] });
|
|
51
47
|
for (const manifestPath of manifestFiles) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
catch (e) {
|
|
73
|
-
console.error(`[Workspace] Error parsing package manifest at ${manifestPath}: ${e}`);
|
|
74
|
-
}
|
|
48
|
+
const manifest = await readJsonFile(manifestPath);
|
|
49
|
+
if (!manifest || !manifest.name)
|
|
50
|
+
continue;
|
|
51
|
+
const pkgName = manifest.name;
|
|
52
|
+
const location = normalizeAbsolute(path.dirname(manifestPath));
|
|
53
|
+
const allDeps = new Set([
|
|
54
|
+
...Object.keys(manifest.dependencies || {}),
|
|
55
|
+
...Object.keys(manifest.devDependencies || {}),
|
|
56
|
+
...Object.keys(manifest.peerDependencies || {}),
|
|
57
|
+
]);
|
|
58
|
+
packageMap.set(pkgName, {
|
|
59
|
+
name: pkgName,
|
|
60
|
+
location,
|
|
61
|
+
relativePath: path.posix.relative(absoluteRoot, location),
|
|
62
|
+
manifestPath: normalizeAbsolute(manifestPath),
|
|
63
|
+
dependencies: new Set(),
|
|
64
|
+
allDependencies: allDeps,
|
|
65
|
+
});
|
|
75
66
|
}
|
|
76
67
|
// 4. Resolve internal workspace dependencies
|
|
77
68
|
const internalPackageNames = new Set(packageMap.keys());
|
package/dist/workspace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,OAAO,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAA0B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "optiprune",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Resilient static dead-code analyzer for TypeScript and JavaScript workspaces.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"LICENSE"
|
|
65
65
|
],
|
|
66
66
|
"scripts": {
|
|
67
|
-
"build": "tsc -p tsconfig.json",
|
|
68
|
-
"check": "tsc -p tsconfig.json --noEmit",
|
|
67
|
+
"build": "npx tsc -p tsconfig.json",
|
|
68
|
+
"check": "npx tsc -p tsconfig.json --noEmit",
|
|
69
69
|
"test": "vitest run --no-file-parallelism",
|
|
70
70
|
"test:watch": "vitest",
|
|
71
71
|
"analyze": "node ./dist/cli.js",
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"esbuild": "^0.28.1",
|
|
91
91
|
"fast-glob": "^3.3.3",
|
|
92
92
|
"js-yaml": "^5.2.2",
|
|
93
|
+
"nodejs": "^0.0.0",
|
|
93
94
|
"pathe": "latest",
|
|
94
95
|
"quickjs-emscripten": "^0.32.0",
|
|
95
96
|
"z3-solver": "^5.0.0"
|