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
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { SemanticGraph, SemanticNode } from "./semantic-graph.js";
|
|
2
|
-
export declare class TopologyManager {
|
|
3
|
-
private graph;
|
|
4
|
-
constructor(graph: SemanticGraph);
|
|
5
|
-
/**
|
|
6
|
-
* Processes a set of new/updated nodes for a file and updates the graph.
|
|
7
|
-
* Implements a Soft-Delete (Tombstone) strategy for resilient parsing.
|
|
8
|
-
*/
|
|
9
|
-
updateFile(fileId: string, newNodes: SemanticNode[], parseSuccess?: boolean): Set<string>;
|
|
10
|
-
/**
|
|
11
|
-
* Transitively marks all nodes that depend on the given nodeId.
|
|
12
|
-
*/
|
|
13
|
-
private markAffectedDependents;
|
|
14
|
-
/**
|
|
15
|
-
* Detects orphaned nodes (dead code) using Tarjan's algorithm for SCC-aware detection.
|
|
16
|
-
* This treats circular dependency cycles as a single unit.
|
|
17
|
-
*/
|
|
18
|
-
detectDeadCode(): SemanticNode[];
|
|
19
|
-
/**
|
|
20
|
-
* Tarjan's algorithm for finding Strongly Connected Components.
|
|
21
|
-
*/
|
|
22
|
-
private findSCCs;
|
|
23
|
-
}
|
package/dist/topology-manager.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
export class TopologyManager {
|
|
2
|
-
graph;
|
|
3
|
-
constructor(graph) {
|
|
4
|
-
this.graph = graph;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Processes a set of new/updated nodes for a file and updates the graph.
|
|
8
|
-
* Implements a Soft-Delete (Tombstone) strategy for resilient parsing.
|
|
9
|
-
*/
|
|
10
|
-
updateFile(fileId, newNodes, parseSuccess = true) {
|
|
11
|
-
const affectedNodeIds = new Set();
|
|
12
|
-
const existingNodes = this.graph.getNodesInFile(fileId);
|
|
13
|
-
const existingNodeMap = new Map(existingNodes.map(n => [n.id, n]));
|
|
14
|
-
const newNodeMap = new Map(newNodes.map(n => [n.id, n]));
|
|
15
|
-
if (!parseSuccess) {
|
|
16
|
-
// If parse failed, mark all existing nodes as stale but don't purge them
|
|
17
|
-
for (const oldNode of existingNodes) {
|
|
18
|
-
oldNode.isStale = true;
|
|
19
|
-
}
|
|
20
|
-
return affectedNodeIds;
|
|
21
|
-
}
|
|
22
|
-
// 1. Identify removed nodes or nodes that changed content
|
|
23
|
-
for (const oldNode of existingNodes) {
|
|
24
|
-
const newNode = newNodeMap.get(oldNode.id);
|
|
25
|
-
if (!newNode) {
|
|
26
|
-
// Node was completely removed
|
|
27
|
-
this.markAffectedDependents(oldNode.id, affectedNodeIds);
|
|
28
|
-
this.graph.removeNode(oldNode.id);
|
|
29
|
-
}
|
|
30
|
-
else if (oldNode.contentHash !== newNode.contentHash) {
|
|
31
|
-
// Content changed, mark as affected but keep LEI
|
|
32
|
-
affectedNodeIds.add(oldNode.id);
|
|
33
|
-
oldNode.contentHash = newNode.contentHash;
|
|
34
|
-
oldNode.isStale = false;
|
|
35
|
-
// In a real implementation, we would re-extract references for the updated node
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
// Node is still there and unchanged
|
|
39
|
-
oldNode.isStale = false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// 2. Add new nodes
|
|
43
|
-
for (const newNode of newNodes) {
|
|
44
|
-
if (!existingNodeMap.has(newNode.id)) {
|
|
45
|
-
this.graph.addNode(newNode);
|
|
46
|
-
affectedNodeIds.add(newNode.id);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return affectedNodeIds;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Transitively marks all nodes that depend on the given nodeId.
|
|
53
|
-
*/
|
|
54
|
-
markAffectedDependents(nodeId, affected) {
|
|
55
|
-
const node = this.graph.getNode(nodeId);
|
|
56
|
-
if (!node || affected.has(nodeId))
|
|
57
|
-
return;
|
|
58
|
-
affected.add(nodeId);
|
|
59
|
-
for (const ref of node.incomingReferences) {
|
|
60
|
-
this.markAffectedDependents(ref.sourceNodeId, affected);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Detects orphaned nodes (dead code) using Tarjan's algorithm for SCC-aware detection.
|
|
65
|
-
* This treats circular dependency cycles as a single unit.
|
|
66
|
-
*/
|
|
67
|
-
detectDeadCode() {
|
|
68
|
-
const allNodes = this.graph.getAllNodes();
|
|
69
|
-
const deadNodes = [];
|
|
70
|
-
// 1. Find all SCCs in the graph
|
|
71
|
-
const sccs = this.findSCCs(allNodes);
|
|
72
|
-
// 2. For each SCC, check if it has any incoming references from outside the SCC
|
|
73
|
-
for (const scc of sccs) {
|
|
74
|
-
const sccNodeIds = new Set(scc.map(n => n.id));
|
|
75
|
-
let hasExternalInflow = false;
|
|
76
|
-
for (const node of scc) {
|
|
77
|
-
// Files are considered entry points for now
|
|
78
|
-
if (node.type === 'File') {
|
|
79
|
-
hasExternalInflow = true;
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
for (const ref of node.incomingReferences) {
|
|
83
|
-
if (!sccNodeIds.has(ref.sourceNodeId)) {
|
|
84
|
-
hasExternalInflow = true;
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (hasExternalInflow)
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
if (!hasExternalInflow) {
|
|
92
|
-
deadNodes.push(...scc);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return deadNodes;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Tarjan's algorithm for finding Strongly Connected Components.
|
|
99
|
-
*/
|
|
100
|
-
findSCCs(nodes) {
|
|
101
|
-
let index = 0;
|
|
102
|
-
const stack = [];
|
|
103
|
-
const indices = new Map();
|
|
104
|
-
const lowlink = new Map();
|
|
105
|
-
const onStack = new Set();
|
|
106
|
-
const sccs = [];
|
|
107
|
-
const strongconnect = (v) => {
|
|
108
|
-
indices.set(v.id, index);
|
|
109
|
-
lowlink.set(v.id, index);
|
|
110
|
-
index++;
|
|
111
|
-
stack.push(v);
|
|
112
|
-
onStack.add(v.id);
|
|
113
|
-
for (const ref of v.outgoingReferences) {
|
|
114
|
-
const w = this.graph.getNode(ref.targetNodeId);
|
|
115
|
-
if (!w)
|
|
116
|
-
continue;
|
|
117
|
-
if (!indices.has(w.id)) {
|
|
118
|
-
strongconnect(w);
|
|
119
|
-
lowlink.set(v.id, Math.min(lowlink.get(v.id), lowlink.get(w.id)));
|
|
120
|
-
}
|
|
121
|
-
else if (onStack.has(w.id)) {
|
|
122
|
-
lowlink.set(v.id, Math.min(lowlink.get(v.id), indices.get(w.id)));
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
if (lowlink.get(v.id) === indices.get(v.id)) {
|
|
126
|
-
const scc = [];
|
|
127
|
-
let w;
|
|
128
|
-
do {
|
|
129
|
-
w = stack.pop();
|
|
130
|
-
onStack.delete(w.id);
|
|
131
|
-
scc.push(w);
|
|
132
|
-
} while (w.id !== v.id);
|
|
133
|
-
sccs.push(scc);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
for (const node of nodes) {
|
|
137
|
-
if (!indices.has(node.id)) {
|
|
138
|
-
strongconnect(node);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return sccs;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=topology-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"topology-manager.js","sourceRoot":"","sources":["../src/topology-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
export type Confidence = "high" | "medium" | "low" | "info";
|
|
2
|
-
export type FailOn = Confidence | "none";
|
|
3
|
-
export type Severity = "error" | "warning" | "info";
|
|
4
|
-
export type ParseStatus = "parsed" | "recovered" | "fallback";
|
|
5
|
-
export type EdgeKind = "import" | "export-from" | "export-all" | "require" | "dynamic-literal" | "dynamic-pattern" | "unknown-dynamic";
|
|
6
|
-
export interface Position {
|
|
7
|
-
line: number;
|
|
8
|
-
column: number;
|
|
9
|
-
}
|
|
10
|
-
export interface Range {
|
|
11
|
-
start: Position;
|
|
12
|
-
end: Position;
|
|
13
|
-
}
|
|
14
|
-
export interface ParseDiagnostic {
|
|
15
|
-
message: string;
|
|
16
|
-
file: string;
|
|
17
|
-
location?: Range;
|
|
18
|
-
recovered: boolean;
|
|
19
|
-
}
|
|
20
|
-
export interface ExportMember {
|
|
21
|
-
name: string;
|
|
22
|
-
location?: Range;
|
|
23
|
-
}
|
|
24
|
-
export interface ExportRecord {
|
|
25
|
-
name: string;
|
|
26
|
-
exportedAs: string;
|
|
27
|
-
location?: Range;
|
|
28
|
-
isDefault: boolean;
|
|
29
|
-
isReExport: boolean;
|
|
30
|
-
isWildcard: boolean;
|
|
31
|
-
isTypeOnly?: boolean;
|
|
32
|
-
isExternalContract?: boolean;
|
|
33
|
-
localReferences?: string[];
|
|
34
|
-
members?: ExportMember[];
|
|
35
|
-
}
|
|
36
|
-
export interface DependencyEdge {
|
|
37
|
-
source: string;
|
|
38
|
-
rawSpecifier: string;
|
|
39
|
-
kind: EdgeKind;
|
|
40
|
-
target?: string;
|
|
41
|
-
location?: Range;
|
|
42
|
-
importedNames: string[];
|
|
43
|
-
dynamicPattern?: DynamicPattern;
|
|
44
|
-
dynamicExpression?: string | undefined;
|
|
45
|
-
resolution: "resolved" | "unresolved" | "external" | "unknown";
|
|
46
|
-
isTypeOnly?: boolean;
|
|
47
|
-
}
|
|
48
|
-
export interface DynamicPattern {
|
|
49
|
-
prefix: string;
|
|
50
|
-
suffix: string;
|
|
51
|
-
baseDirectory: string;
|
|
52
|
-
candidates: string[];
|
|
53
|
-
}
|
|
54
|
-
export interface ModuleRecord {
|
|
55
|
-
id: string;
|
|
56
|
-
relativePath: string;
|
|
57
|
-
parseStatus: ParseStatus;
|
|
58
|
-
parseDiagnostics: ParseDiagnostic[];
|
|
59
|
-
ast?: unknown;
|
|
60
|
-
sourceText: string;
|
|
61
|
-
exports: ExportRecord[];
|
|
62
|
-
edges: DependencyEdge[];
|
|
63
|
-
hasUnknownDynamicBoundary: boolean;
|
|
64
|
-
hasParseError: boolean;
|
|
65
|
-
hasUnresolvedCommonJsExports: boolean;
|
|
66
|
-
scannedDirectories: string[];
|
|
67
|
-
dynamicImportCandidates: DynamicImportCandidate[];
|
|
68
|
-
localSymbolMap?: Record<string, string[]>;
|
|
69
|
-
localTypeMap?: Record<string, string>;
|
|
70
|
-
localReferences?: string[];
|
|
71
|
-
}
|
|
72
|
-
export interface WorkspacePackage {
|
|
73
|
-
name: string;
|
|
74
|
-
location: string;
|
|
75
|
-
relativePath: string;
|
|
76
|
-
manifestPath: string;
|
|
77
|
-
dependencies: Set<string>;
|
|
78
|
-
allDependencies: Set<string>;
|
|
79
|
-
}
|
|
80
|
-
export interface MonorepoGraph {
|
|
81
|
-
rootPath: string;
|
|
82
|
-
packageMap: Map<string, WorkspacePackage>;
|
|
83
|
-
topologicalOrder: string[];
|
|
84
|
-
}
|
|
85
|
-
export interface StronglyConnectedComponent {
|
|
86
|
-
id: number;
|
|
87
|
-
modules: string[];
|
|
88
|
-
isCycle: boolean;
|
|
89
|
-
isReachable?: boolean;
|
|
90
|
-
isMaybeReachable?: boolean;
|
|
91
|
-
}
|
|
92
|
-
export interface ConcolicVerificationResult {
|
|
93
|
-
pathReached: boolean;
|
|
94
|
-
executionTimeMs: number;
|
|
95
|
-
logs: string[];
|
|
96
|
-
}
|
|
97
|
-
export interface CandidateBranch {
|
|
98
|
-
file: string;
|
|
99
|
-
line: number;
|
|
100
|
-
instrumentedCode: string;
|
|
101
|
-
seedInput: Record<string, any>;
|
|
102
|
-
}
|
|
103
|
-
export interface DynamicImportCandidate {
|
|
104
|
-
file: string;
|
|
105
|
-
line: number;
|
|
106
|
-
column: number;
|
|
107
|
-
expression: string;
|
|
108
|
-
contextCode: string;
|
|
109
|
-
}
|
|
110
|
-
export interface Finding {
|
|
111
|
-
rule: "unreachable-file" | "unused-export" | "unused-member" | "unreachable-statement" | "constant-condition" | "contradictory-guard" | "schema-impossible-guard" | "parse-recovery" | "unresolved-import" | "unknown-dynamic-import" | "no-entry-points" | "unreachable-dynamic-path" | "protected-contract";
|
|
112
|
-
severity: Severity;
|
|
113
|
-
confidence: Confidence;
|
|
114
|
-
message: string;
|
|
115
|
-
file: string;
|
|
116
|
-
location?: Range | undefined;
|
|
117
|
-
evidence: Record<string, unknown>;
|
|
118
|
-
}
|
|
119
|
-
export interface AnalyzerOptions {
|
|
120
|
-
rootDir?: string;
|
|
121
|
-
entry?: string[];
|
|
122
|
-
extensions?: string[];
|
|
123
|
-
ignore?: string[];
|
|
124
|
-
reportUnusedExports?: boolean;
|
|
125
|
-
schemaEnums?: Record<string, string[]>;
|
|
126
|
-
externalContracts?: string[];
|
|
127
|
-
failOn?: FailOn;
|
|
128
|
-
json?: boolean;
|
|
129
|
-
includeConventionalEntries?: boolean;
|
|
130
|
-
skip3?: boolean;
|
|
131
|
-
skip4?: boolean;
|
|
132
|
-
verbose?: boolean;
|
|
133
|
-
}
|
|
134
|
-
export type RuleSeverity = "error" | "warning" | "off";
|
|
135
|
-
export interface Config {
|
|
136
|
-
rootDir?: string;
|
|
137
|
-
entry?: string[];
|
|
138
|
-
extensions?: string[];
|
|
139
|
-
ignore?: string[];
|
|
140
|
-
externalContracts?: string[];
|
|
141
|
-
reportUnusedExports?: boolean;
|
|
142
|
-
includeConventionalEntries?: boolean;
|
|
143
|
-
failOn?: FailOn;
|
|
144
|
-
json?: boolean;
|
|
145
|
-
verbose?: boolean;
|
|
146
|
-
layers?: {
|
|
147
|
-
smtTimeoutMs?: number;
|
|
148
|
-
isolateMemoryLimitMb?: number;
|
|
149
|
-
enableConcolicProof?: boolean;
|
|
150
|
-
skip3?: boolean;
|
|
151
|
-
skip4?: boolean;
|
|
152
|
-
};
|
|
153
|
-
rules?: Record<string, RuleSeverity>;
|
|
154
|
-
}
|
|
155
|
-
export interface ResolvedOptions {
|
|
156
|
-
rootDir: string;
|
|
157
|
-
entry: string[];
|
|
158
|
-
extensions: string[];
|
|
159
|
-
ignore: string[];
|
|
160
|
-
reportUnusedExports: boolean;
|
|
161
|
-
schemaEnums: Record<string, string[]>;
|
|
162
|
-
failOn: FailOn;
|
|
163
|
-
json: boolean;
|
|
164
|
-
includeConventionalEntries: boolean;
|
|
165
|
-
monorepo?: MonorepoGraph;
|
|
166
|
-
pathAliases: Map<string, string[]>;
|
|
167
|
-
baseUrl?: string;
|
|
168
|
-
externalContracts: string[];
|
|
169
|
-
verbose: boolean;
|
|
170
|
-
layers: {
|
|
171
|
-
smtTimeoutMs: number;
|
|
172
|
-
isolateMemoryLimitMb: number;
|
|
173
|
-
enableConcolicProof: boolean;
|
|
174
|
-
skip3: boolean;
|
|
175
|
-
skip4: boolean;
|
|
176
|
-
};
|
|
177
|
-
rules: Record<string, RuleSeverity>;
|
|
178
|
-
}
|
|
179
|
-
export interface AnalysisSummary {
|
|
180
|
-
filesDiscovered: number;
|
|
181
|
-
filesParsed: number;
|
|
182
|
-
filesRecovered: number;
|
|
183
|
-
filesFallback: number;
|
|
184
|
-
edges: number;
|
|
185
|
-
entryPoints: number;
|
|
186
|
-
stronglyConnectedComponents: number;
|
|
187
|
-
cycles: number;
|
|
188
|
-
findings: number;
|
|
189
|
-
errors: number;
|
|
190
|
-
warnings: number;
|
|
191
|
-
}
|
|
192
|
-
export interface AnalysisReport {
|
|
193
|
-
version: string;
|
|
194
|
-
rootDir: string;
|
|
195
|
-
entryPoints: string[];
|
|
196
|
-
summary: AnalysisSummary;
|
|
197
|
-
findings: Finding[];
|
|
198
|
-
modules: Array<{
|
|
199
|
-
path: string;
|
|
200
|
-
parseStatus: ParseStatus;
|
|
201
|
-
exports: Array<{
|
|
202
|
-
name: string;
|
|
203
|
-
exportedAs: string;
|
|
204
|
-
isDefault: boolean;
|
|
205
|
-
isReExport: boolean;
|
|
206
|
-
isWildcard: boolean;
|
|
207
|
-
isTypeOnly?: boolean;
|
|
208
|
-
isExternalContract?: boolean;
|
|
209
|
-
}>;
|
|
210
|
-
edges: Array<{
|
|
211
|
-
kind: EdgeKind;
|
|
212
|
-
specifier: string;
|
|
213
|
-
target?: string;
|
|
214
|
-
resolution: DependencyEdge["resolution"];
|
|
215
|
-
}>;
|
|
216
|
-
}>;
|
|
217
|
-
components: Array<{
|
|
218
|
-
id: number;
|
|
219
|
-
modules: string[];
|
|
220
|
-
isCycle: boolean;
|
|
221
|
-
}>;
|
|
222
|
-
}
|
|
223
|
-
export interface AnalysisContext {
|
|
224
|
-
options: ResolvedOptions;
|
|
225
|
-
modules: Map<string, ModuleRecord>;
|
|
226
|
-
entryPoints: Set<string>;
|
|
227
|
-
reachable: Set<string>;
|
|
228
|
-
maybeReachable: Set<string>;
|
|
229
|
-
hasReachableUnknownDynamicBoundary: boolean;
|
|
230
|
-
components: StronglyConnectedComponent[];
|
|
231
|
-
usedExports: Set<string>;
|
|
232
|
-
usedMembers: Set<string>;
|
|
233
|
-
candidateBranches: CandidateBranch[];
|
|
234
|
-
dynamicImportCandidates: DynamicImportCandidate[];
|
|
235
|
-
monorepo?: MonorepoGraph;
|
|
236
|
-
semanticGraph?: any;
|
|
237
|
-
symbolicContracts?: Map<string, any>;
|
|
238
|
-
}
|
|
239
|
-
export interface PluginAdapter {
|
|
240
|
-
getAst(fileId: string): any;
|
|
241
|
-
getSymbol(name: string, fileId: string): any;
|
|
242
|
-
getType(node: any): string | undefined;
|
|
243
|
-
getDependencies(fileId: string): string[];
|
|
244
|
-
getConfig(): ResolvedOptions;
|
|
245
|
-
readFile(filename: string): Promise<string | null>;
|
|
246
|
-
readJson(filename: string): Promise<any | null>;
|
|
247
|
-
emitFinding(finding: Omit<Finding, "rule">): void;
|
|
248
|
-
markAsUsed(fileId: string, symbol?: string): void;
|
|
249
|
-
attachMetadata(node: any, key: string, value: any): void;
|
|
250
|
-
}
|
|
251
|
-
export interface PluginLifecycle {
|
|
252
|
-
onProjectInit?(adapter: PluginAdapter): void | Promise<void>;
|
|
253
|
-
onFileStart?(fileId: string, adapter: PluginAdapter): void | Promise<void>;
|
|
254
|
-
onASTNode?(node: any, fileId: string, adapter: PluginAdapter): void;
|
|
255
|
-
onAnalysisComplete?(adapter: PluginAdapter): void | Promise<void>;
|
|
256
|
-
}
|
|
257
|
-
export interface AnalyzerPlugin {
|
|
258
|
-
name: string;
|
|
259
|
-
version: string;
|
|
260
|
-
enabled?: boolean;
|
|
261
|
-
detect?(adapter: PluginAdapter): Promise<boolean>;
|
|
262
|
-
lifecycle: PluginLifecycle;
|
|
263
|
-
}
|
|
264
|
-
export declare const CONFIDENCE_RANK: Record<FailOn, number>;
|
|
265
|
-
export declare function defineConfig(config: Config): Config;
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwTA,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.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { MonorepoGraph } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Resolves all sub-packages in a Monorepo workspace.
|
|
4
|
-
* Uses POSIX-style path logic for internal calculations to support Windows.
|
|
5
|
-
*/
|
|
6
|
-
export declare function buildMonorepoTopology(rootPath: string): Promise<MonorepoGraph>;
|
package/dist/workspace.js
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import path from 'pathe';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import fg from 'fast-glob';
|
|
4
|
-
import * as yaml from 'js-yaml';
|
|
5
|
-
import { normalizeAbsolute, readJsonFile } from './fs-utils.js';
|
|
6
|
-
/**
|
|
7
|
-
* Resolves all sub-packages in a Monorepo workspace.
|
|
8
|
-
* Uses POSIX-style path logic for internal calculations to support Windows.
|
|
9
|
-
*/
|
|
10
|
-
export async function buildMonorepoTopology(rootPath) {
|
|
11
|
-
const absoluteRoot = normalizeAbsolute(rootPath);
|
|
12
|
-
const packageMap = new Map();
|
|
13
|
-
const packageGlobs = [];
|
|
14
|
-
// 1. Detect pnpm-workspace.yaml
|
|
15
|
-
const pnpmWorkspacePath = path.join(absoluteRoot, 'pnpm-workspace.yaml');
|
|
16
|
-
if (fs.existsSync(pnpmWorkspacePath)) {
|
|
17
|
-
try {
|
|
18
|
-
const content = fs.readFileSync(pnpmWorkspacePath, 'utf-8');
|
|
19
|
-
const doc = yaml.load(content);
|
|
20
|
-
if (doc?.packages && Array.isArray(doc.packages)) {
|
|
21
|
-
packageGlobs.push(...doc.packages);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
catch (e) {
|
|
25
|
-
// Ignore parse warnings on malformed workspace configs
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// 2. Detect Yarn/NPM workspaces in package.json
|
|
29
|
-
const rootPackageJsonPath = path.join(absoluteRoot, 'package.json');
|
|
30
|
-
if (fs.existsSync(rootPackageJsonPath)) {
|
|
31
|
-
const rootManifest = await readJsonFile(rootPackageJsonPath);
|
|
32
|
-
if (rootManifest) {
|
|
33
|
-
if (Array.isArray(rootManifest.workspaces)) {
|
|
34
|
-
packageGlobs.push(...rootManifest.workspaces);
|
|
35
|
-
}
|
|
36
|
-
else if (rootManifest.workspaces?.packages && Array.isArray(rootManifest.workspaces.packages)) {
|
|
37
|
-
packageGlobs.push(...rootManifest.workspaces.packages);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// Default to common patterns if nothing found
|
|
42
|
-
if (packageGlobs.length === 0) {
|
|
43
|
-
packageGlobs.push('packages/*', 'apps/*');
|
|
44
|
-
}
|
|
45
|
-
// 3. Find all package.json files matching the globs
|
|
46
|
-
const manifestFiles = await fg(packageGlobs.map(g => path.posix.join(g, 'package.json')), { cwd: absoluteRoot, absolute: true, ignore: ['**/node_modules/**'] });
|
|
47
|
-
for (const manifestPath of manifestFiles) {
|
|
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
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// 4. Resolve internal workspace dependencies
|
|
68
|
-
const internalPackageNames = new Set(packageMap.keys());
|
|
69
|
-
for (const pkg of packageMap.values()) {
|
|
70
|
-
for (const depName of pkg.allDependencies) {
|
|
71
|
-
if (internalPackageNames.has(depName)) {
|
|
72
|
-
pkg.dependencies.add(depName);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// 5. Topological Sort
|
|
77
|
-
const topologicalOrder = [];
|
|
78
|
-
const visited = new Set();
|
|
79
|
-
const visiting = new Set();
|
|
80
|
-
function visit(name) {
|
|
81
|
-
if (visiting.has(name))
|
|
82
|
-
return;
|
|
83
|
-
if (visited.has(name))
|
|
84
|
-
return;
|
|
85
|
-
visiting.add(name);
|
|
86
|
-
const pkg = packageMap.get(name);
|
|
87
|
-
if (pkg) {
|
|
88
|
-
for (const dep of pkg.dependencies) {
|
|
89
|
-
visit(dep);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
visiting.delete(name);
|
|
93
|
-
visited.add(name);
|
|
94
|
-
topologicalOrder.push(name);
|
|
95
|
-
}
|
|
96
|
-
for (const name of packageMap.keys()) {
|
|
97
|
-
visit(name);
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
rootPath: absoluteRoot,
|
|
101
|
-
packageMap,
|
|
102
|
-
topologicalOrder,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=workspace.js.map
|
package/dist/workspace.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|