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/layer5.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
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
|
package/dist/layer5.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer5.js","sourceRoot":"","sources":["../src/layer5.ts"],"names":[],"mappings":"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"}
|
package/dist/layer6.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
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 yuku-parser.
|
|
14
|
-
* Handles Windows & POSIX paths natively.
|
|
15
|
-
* Replaces the previous SWC-based implementation.
|
|
16
|
-
*/
|
|
17
|
-
export declare function parseDtsWithSwc(entryPointRelative: string): Promise<DtsExportGraph>;
|
|
18
|
-
/**
|
|
19
|
-
* Fast-path topology extraction from lockfiles.
|
|
20
|
-
*/
|
|
21
|
-
export declare function buildLockfileGraph(projectRoot: string): Map<string, DependencyNode>;
|
|
22
|
-
/**
|
|
23
|
-
* Layer 6: Dependency & Boundary Engine
|
|
24
|
-
* Audits package usage and refines Layer 5 protections.
|
|
25
|
-
*/
|
|
26
|
-
export declare function analyzeLayer6(context: AnalysisContext): Promise<Finding[]>;
|
package/dist/layer6.js
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'pathe';
|
|
3
|
-
import { parse as yukuParse } from 'yuku-parser';
|
|
4
|
-
import * as yaml from 'js-yaml';
|
|
5
|
-
import { readJsonFile } from './fs-utils.js';
|
|
6
|
-
/**
|
|
7
|
-
* Parses a library's entry point `.d.ts` file using yuku-parser.
|
|
8
|
-
* Handles Windows & POSIX paths natively.
|
|
9
|
-
* Replaces the previous SWC-based implementation.
|
|
10
|
-
*/
|
|
11
|
-
export async function parseDtsWithSwc(entryPointRelative) {
|
|
12
|
-
const absolutePath = path.resolve(entryPointRelative);
|
|
13
|
-
if (!fs.existsSync(absolutePath)) {
|
|
14
|
-
return { filePath: absolutePath, exportedTypes: new Set(), hasModuleAugmentation: false };
|
|
15
|
-
}
|
|
16
|
-
const source = fs.readFileSync(absolutePath, 'utf-8');
|
|
17
|
-
// yuku-parser: use 'dts' lang for declaration files
|
|
18
|
-
const result = yukuParse(source, { lang: 'dts', sourceType: 'module' });
|
|
19
|
-
const program = result.program;
|
|
20
|
-
const exportedTypes = new Set();
|
|
21
|
-
let hasModuleAugmentation = false;
|
|
22
|
-
for (const item of (program.body ?? [])) {
|
|
23
|
-
// yuku-parser emits ESTree-compatible nodes (ExportNamedDeclaration, ExportDefaultDeclaration)
|
|
24
|
-
if (item.type === 'ExportNamedDeclaration') {
|
|
25
|
-
// Inline declaration: export interface Foo {}, export type Bar = ...
|
|
26
|
-
if (item.declaration) {
|
|
27
|
-
const decl = item.declaration;
|
|
28
|
-
if (decl.id?.name) {
|
|
29
|
-
exportedTypes.add(decl.id.name);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// Re-export specifiers: export { Foo, Bar }
|
|
33
|
-
for (const spec of (item.specifiers ?? [])) {
|
|
34
|
-
if (spec.type === 'ExportSpecifier') {
|
|
35
|
-
const name = spec.exported?.name ?? spec.local?.name;
|
|
36
|
-
if (name)
|
|
37
|
-
exportedTypes.add(name);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
else if (item.type === 'ExportDefaultDeclaration') {
|
|
42
|
-
exportedTypes.add('default');
|
|
43
|
-
}
|
|
44
|
-
// Detect ambient module augmentation: declare module "..."
|
|
45
|
-
if (item.type === 'TSModuleDeclaration' ||
|
|
46
|
-
(item.type === 'ExportNamedDeclaration' && item.declaration?.type === 'TSModuleDeclaration')) {
|
|
47
|
-
hasModuleAugmentation = true;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
filePath: absolutePath,
|
|
52
|
-
exportedTypes,
|
|
53
|
-
hasModuleAugmentation,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Fast-path topology extraction from lockfiles.
|
|
58
|
-
*/
|
|
59
|
-
export function buildLockfileGraph(projectRoot) {
|
|
60
|
-
const graph = new Map();
|
|
61
|
-
const pnpmLockPath = path.join(projectRoot, 'pnpm-lock.yaml');
|
|
62
|
-
const packageLockPath = path.join(projectRoot, 'package-lock.json');
|
|
63
|
-
if (fs.existsSync(packageLockPath)) {
|
|
64
|
-
try {
|
|
65
|
-
const raw = fs.readFileSync(packageLockPath, 'utf-8');
|
|
66
|
-
const cleanRaw = raw.charCodeAt(0) === 0xFEFF ? raw.slice(1) : raw;
|
|
67
|
-
const parsed = JSON.parse(cleanRaw);
|
|
68
|
-
const packages = parsed.packages || {};
|
|
69
|
-
for (const [pkgPath, meta] of Object.entries(packages)) {
|
|
70
|
-
if (!pkgPath)
|
|
71
|
-
continue;
|
|
72
|
-
const cleanName = pkgPath.replace(/^node_modules\//, '');
|
|
73
|
-
const deps = new Set(Object.keys(meta.dependencies || {}).concat(Object.keys(meta.peerDependencies || {})));
|
|
74
|
-
graph.set(cleanName, {
|
|
75
|
-
name: cleanName,
|
|
76
|
-
version: meta.version || 'unknown',
|
|
77
|
-
dependencies: deps,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch (e) {
|
|
82
|
-
// Ignore lockfile parse errors
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else if (fs.existsSync(pnpmLockPath)) {
|
|
86
|
-
try {
|
|
87
|
-
const raw = fs.readFileSync(pnpmLockPath, 'utf-8');
|
|
88
|
-
const parsed = yaml.load(raw);
|
|
89
|
-
const snapshots = parsed.snapshots || {};
|
|
90
|
-
for (const [pkgId, meta] of Object.entries(snapshots)) {
|
|
91
|
-
const nameMatch = pkgId.match(/^\/(@?[^@]+)/);
|
|
92
|
-
const cleanName = (nameMatch ? nameMatch[1] : pkgId);
|
|
93
|
-
const deps = new Set(Object.keys(meta.dependencies || {}).concat(Object.keys(meta.peerDependencies || {})));
|
|
94
|
-
graph.set(cleanName, {
|
|
95
|
-
name: cleanName,
|
|
96
|
-
version: 'pnpm-managed',
|
|
97
|
-
dependencies: deps,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
catch (e) {
|
|
102
|
-
// Ignore lockfile parse errors
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return graph;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Layer 6: Dependency & Boundary Engine
|
|
109
|
-
* Audits package usage and refines Layer 5 protections.
|
|
110
|
-
*/
|
|
111
|
-
export async function analyzeLayer6(context) {
|
|
112
|
-
const findings = [];
|
|
113
|
-
const projectRoot = context.options.rootDir;
|
|
114
|
-
// 1. Audit declared dependencies vs imported ones
|
|
115
|
-
const lockfileGraph = buildLockfileGraph(projectRoot);
|
|
116
|
-
// Track imports per-package for monorepos, or globally for simple repos
|
|
117
|
-
const packageImportMap = new Map();
|
|
118
|
-
const globalImports = new Set();
|
|
119
|
-
for (const module of context.modules.values()) {
|
|
120
|
-
// Determine which workspace this module belongs to
|
|
121
|
-
let ownerPackage = 'root';
|
|
122
|
-
if (context.options.monorepo) {
|
|
123
|
-
for (const [name, pkg] of context.options.monorepo.packageMap.entries()) {
|
|
124
|
-
if (module.id.startsWith(pkg.location + path.sep) || module.id === pkg.location) {
|
|
125
|
-
ownerPackage = name;
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const pkgImports = packageImportMap.get(ownerPackage) || new Set();
|
|
131
|
-
if (!packageImportMap.has(ownerPackage))
|
|
132
|
-
packageImportMap.set(ownerPackage, pkgImports);
|
|
133
|
-
for (const edge of module.edges) {
|
|
134
|
-
if (edge.resolution === 'external') {
|
|
135
|
-
const parts = edge.rawSpecifier.split('/');
|
|
136
|
-
const pkgName = edge.rawSpecifier.startsWith('@') ? `${parts[0] ?? ''}/${parts[1] ?? ''}` : (parts[0] ?? '');
|
|
137
|
-
pkgImports.add(pkgName);
|
|
138
|
-
globalImports.add(pkgName);
|
|
139
|
-
}
|
|
140
|
-
else if (edge.resolution === 'resolved' && edge.target && context.options.monorepo) {
|
|
141
|
-
for (const [pkgName, pkg] of context.options.monorepo.packageMap.entries()) {
|
|
142
|
-
if (edge.target.startsWith(pkg.location + path.sep) || edge.target === pkg.location) {
|
|
143
|
-
pkgImports.add(pkgName);
|
|
144
|
-
globalImports.add(pkgName);
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Find unused direct dependencies from all package.json files
|
|
152
|
-
const manifestPaths = new Map();
|
|
153
|
-
manifestPaths.set('root', path.join(projectRoot, 'package.json'));
|
|
154
|
-
if (context.options.monorepo) {
|
|
155
|
-
for (const [name, pkg] of context.options.monorepo.packageMap.entries()) {
|
|
156
|
-
manifestPaths.set(name, pkg.manifestPath);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
for (const [pkgName, manifestPath] of manifestPaths.entries()) {
|
|
160
|
-
if (fs.existsSync(manifestPath)) {
|
|
161
|
-
const pkg = await readJsonFile(manifestPath);
|
|
162
|
-
if (!pkg)
|
|
163
|
-
continue;
|
|
164
|
-
const dependencies = pkg.dependencies || {};
|
|
165
|
-
const devDependencies = pkg.devDependencies || {};
|
|
166
|
-
const scripts = pkg.scripts || {};
|
|
167
|
-
const relativeManifest = path.posix.relative(projectRoot, manifestPath);
|
|
168
|
-
const importedInThisPackage = packageImportMap.get(pkgName) || new Set();
|
|
169
|
-
// 1. Collect binary usages from scripts
|
|
170
|
-
const scriptUsages = new Set();
|
|
171
|
-
for (const script of Object.values(scripts)) {
|
|
172
|
-
// Better heuristic: find all potential binaries
|
|
173
|
-
const words = script.split(/[\s|&;><!]/).filter(w => w.length > 0 && !w.startsWith('-'));
|
|
174
|
-
for (const word of words) {
|
|
175
|
-
scriptUsages.add(word);
|
|
176
|
-
}
|
|
177
|
-
// Specifically check for npx/pnpm/yarn/npm exec patterns
|
|
178
|
-
const execMatches = script.matchAll(/(?:npx|pnpm|yarn|npm)\s+([@\w\-/]+)/g);
|
|
179
|
-
for (const match of execMatches) {
|
|
180
|
-
if (match[1])
|
|
181
|
-
scriptUsages.add(match[1]);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// 2. Audit Dependencies
|
|
185
|
-
for (const dep of Object.keys(dependencies)) {
|
|
186
|
-
// In monorepo, we check if it's used in this package OR if it's a workspace package used elsewhere
|
|
187
|
-
const isUsed = importedInThisPackage.has(dep) || scriptUsages.has(dep);
|
|
188
|
-
if (!isUsed) {
|
|
189
|
-
findings.push({
|
|
190
|
-
rule: 'unused-export',
|
|
191
|
-
severity: 'warning',
|
|
192
|
-
confidence: 'high',
|
|
193
|
-
message: `Package '${dep}' is declared as a dependency in ${relativeManifest} but never imported or used in scripts.`,
|
|
194
|
-
file: relativeManifest,
|
|
195
|
-
evidence: { package: dep, type: 'dependency' }
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
// 3. Audit DevDependencies
|
|
200
|
-
for (const dep of Object.keys(devDependencies)) {
|
|
201
|
-
// Prevent self-reporting (ignore the package's own name if listed in devDeps)
|
|
202
|
-
if (pkg.name && dep === pkg.name) {
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
// Special handling for @types/
|
|
206
|
-
if (dep.startsWith('@types/')) {
|
|
207
|
-
const basePkg = dep.slice(7).replace('__', '/');
|
|
208
|
-
if (importedInThisPackage.has(basePkg) || globalImports.has(basePkg) || dependencies[basePkg] || devDependencies[basePkg]) {
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
// Refined Whitelist for config/tooling packages
|
|
213
|
-
// We only whitelist very core tools that are almost always implicitly used
|
|
214
|
-
const CORE_TOOLING = [
|
|
215
|
-
'optiprune', 'typescript', 'ts-node', 'tsx', 'babel', 'swc',
|
|
216
|
-
'eslint', 'prettier', 'husky', 'lint-staged',
|
|
217
|
-
'vitest', 'jest', 'cypress', 'playwright',
|
|
218
|
-
'@types/node', '@types/react', '@types/react-dom', '@types/jest'
|
|
219
|
-
];
|
|
220
|
-
const isCoreTool = CORE_TOOLING.some(p => dep.includes(p));
|
|
221
|
-
// Heuristic: Check for common config files in root
|
|
222
|
-
const commonConfigs = [
|
|
223
|
-
'.eslintrc', '.prettierrc', 'vitest.config', 'jest.config', 'webpack.config', 'vite.config', 'rollup.config',
|
|
224
|
-
'postcss.config', 'tailwind.config', 'tsconfig.json', 'babel.config', 'swc.config', 'lerna.json', 'turbo.json',
|
|
225
|
-
'nx.json', '.env', 'svelte.config', 'vue.config', 'astro.config', 'package.json'
|
|
226
|
-
];
|
|
227
|
-
const hasRelatedConfig = commonConfigs.some(cfg => {
|
|
228
|
-
const depBase = dep.split('/')[0]?.replace(/^@/, '').replace(/-config$/, '').replace(/config-/, '');
|
|
229
|
-
// If the dependency name (or part of it) is found in a config file name, it's likely used
|
|
230
|
-
return cfg.includes(depBase || '___never___');
|
|
231
|
-
});
|
|
232
|
-
const isUsed = importedInThisPackage.has(dep) || scriptUsages.has(dep) || isCoreTool || hasRelatedConfig;
|
|
233
|
-
if (!isUsed) {
|
|
234
|
-
findings.push({
|
|
235
|
-
rule: 'unused-export',
|
|
236
|
-
severity: 'info', // devDeps are usually less critical
|
|
237
|
-
confidence: 'medium',
|
|
238
|
-
message: `DevDependency '${dep}' in ${relativeManifest} appears unused.`,
|
|
239
|
-
file: relativeManifest,
|
|
240
|
-
evidence: { package: dep, type: 'devDependency' }
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// 2. Refine Layer 5 Protection
|
|
247
|
-
for (const module of context.modules.values()) {
|
|
248
|
-
const isReachable = context.reachable.has(module.id) || context.maybeReachable.has(module.id);
|
|
249
|
-
if (!isReachable) {
|
|
250
|
-
for (const exp of module.exports) {
|
|
251
|
-
if (exp.isExternalContract) {
|
|
252
|
-
findings.push({
|
|
253
|
-
rule: 'protected-contract',
|
|
254
|
-
severity: 'info',
|
|
255
|
-
confidence: 'high',
|
|
256
|
-
message: `[Layer 6] Revoked protection for unreferenced contract: ${exp.exportedAs} (File is unreachable).`,
|
|
257
|
-
file: module.relativePath,
|
|
258
|
-
...(exp.location !== undefined && { location: exp.location }),
|
|
259
|
-
evidence: { symbol: exp.exportedAs, reason: 'unreachable-file' }
|
|
260
|
-
});
|
|
261
|
-
exp.isExternalContract = false;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return findings;
|
|
267
|
-
}
|
|
268
|
-
//# sourceMappingURL=layer6.js.map
|
package/dist/layer6.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer6.js","sourceRoot":"","sources":["../src/layer6.ts"],"names":[],"mappings":"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"}
|
package/dist/layer7.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { AnalysisContext, Finding } from "./types.js";
|
|
2
|
-
export interface Layer7Result {
|
|
3
|
-
layer: 7;
|
|
4
|
-
implicitEdges: ImplicitEdge[];
|
|
5
|
-
resolvedDynamicImports: ResolvedDynamicImport[];
|
|
6
|
-
}
|
|
7
|
-
export interface ImplicitEdge {
|
|
8
|
-
id: string;
|
|
9
|
-
type: 'DI_INJECTION' | 'EVENT_CONTRACT';
|
|
10
|
-
provider?: {
|
|
11
|
-
file: string;
|
|
12
|
-
symbol: string;
|
|
13
|
-
token: string;
|
|
14
|
-
};
|
|
15
|
-
consumer: {
|
|
16
|
-
file: string;
|
|
17
|
-
symbol: string;
|
|
18
|
-
handler?: string;
|
|
19
|
-
};
|
|
20
|
-
topic?: string;
|
|
21
|
-
status: 'ACTIVE' | 'DEAD_ORPHANED_CONSUMER';
|
|
22
|
-
}
|
|
23
|
-
export interface ResolvedDynamicImport {
|
|
24
|
-
sourceFile: string;
|
|
25
|
-
template: string;
|
|
26
|
-
resolvedFiles: string[];
|
|
27
|
-
}
|
|
28
|
-
export declare function analyzeLayer7(context: AnalysisContext): Promise<Finding[]>;
|