optiprune 1.5.0 → 1.7.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/dist/engine.d.ts +5 -0
- package/dist/engine.js +87 -15
- package/dist/engine.js.map +1 -1
- package/dist/plugins/angular-plugin.d.ts +7 -0
- package/dist/plugins/angular-plugin.js +60 -0
- package/dist/plugins/angular-plugin.js.map +1 -0
- package/dist/plugins/astro-plugin.d.ts +7 -0
- package/dist/plugins/astro-plugin.js +88 -0
- package/dist/plugins/astro-plugin.js.map +1 -0
- package/dist/plugins/babel-plugin.d.ts +8 -0
- package/dist/plugins/babel-plugin.js +132 -0
- package/dist/plugins/babel-plugin.js.map +1 -0
- package/dist/plugins/esbuild-plugin.d.ts +8 -0
- package/dist/plugins/esbuild-plugin.js +121 -0
- package/dist/plugins/esbuild-plugin.js.map +1 -0
- package/dist/plugins/nestjs-plugin.d.ts +7 -0
- package/dist/plugins/nestjs-plugin.js +69 -0
- package/dist/plugins/nestjs-plugin.js.map +1 -0
- package/dist/plugins/nextjs-plugin.d.ts +7 -0
- package/dist/plugins/nextjs-plugin.js +66 -0
- package/dist/plugins/nextjs-plugin.js.map +1 -0
- package/dist/plugins/nuxtjs-plugin.d.ts +7 -0
- package/dist/plugins/nuxtjs-plugin.js +80 -0
- package/dist/plugins/nuxtjs-plugin.js.map +1 -0
- package/dist/plugins/svelte-plugin.d.ts +7 -0
- package/dist/plugins/svelte-plugin.js +38 -0
- package/dist/plugins/svelte-plugin.js.map +1 -0
- package/dist/plugins/vuejs-plugin.d.ts +7 -0
- package/dist/plugins/vuejs-plugin.js +63 -0
- package/dist/plugins/vuejs-plugin.js.map +1 -0
- package/package.json +2 -1
package/dist/engine.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ export declare class PluginEngine {
|
|
|
3
3
|
private plugins;
|
|
4
4
|
private findings;
|
|
5
5
|
register(plugin: AnalyzerPlugin): void;
|
|
6
|
+
/**
|
|
7
|
+
* Dynamically loads all plugins from the src/plugins directory.
|
|
8
|
+
* Handles errors gracefully to ensure the core analysis continues.
|
|
9
|
+
*/
|
|
10
|
+
loadDynamicPlugins(): Promise<void>;
|
|
6
11
|
run(context: AnalysisContext): Promise<Finding[]>;
|
|
7
12
|
private createAdapter;
|
|
8
13
|
}
|
package/dist/engine.js
CHANGED
|
@@ -2,55 +2,127 @@ import traverse from "@babel/traverse";
|
|
|
2
2
|
import * as t from "@babel/types";
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "pathe";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
6
|
export class PluginEngine {
|
|
6
7
|
plugins = [];
|
|
7
8
|
findings = [];
|
|
8
9
|
register(plugin) {
|
|
9
10
|
this.plugins.push(plugin);
|
|
10
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Dynamically loads all plugins from the src/plugins directory.
|
|
14
|
+
* Handles errors gracefully to ensure the core analysis continues.
|
|
15
|
+
*/
|
|
16
|
+
async loadDynamicPlugins() {
|
|
17
|
+
try {
|
|
18
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const pluginsDir = path.join(__dirname, "plugins");
|
|
20
|
+
let files = [];
|
|
21
|
+
try {
|
|
22
|
+
files = await fs.readdir(pluginsDir);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
// Directory might not exist or be inaccessible
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
for (const file of files) {
|
|
29
|
+
if ((file.endsWith(".ts") || file.endsWith(".js")) && !file.endsWith(".d.ts")) {
|
|
30
|
+
try {
|
|
31
|
+
const pluginPath = pathToFileURL(path.join(pluginsDir, file)).href;
|
|
32
|
+
const module = await import(pluginPath);
|
|
33
|
+
const keys = Object.keys(module);
|
|
34
|
+
const firstKey = keys[0];
|
|
35
|
+
const plugin = module.default || (firstKey ? module[firstKey] : null);
|
|
36
|
+
if (plugin && typeof plugin === "object" && plugin.name && plugin.lifecycle) {
|
|
37
|
+
this.register(plugin);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.warn(`[Plugin Engine] Failed to load plugin ${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.warn(`[Plugin Engine] Error during dynamic plugin loading: ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
11
50
|
async run(context) {
|
|
12
51
|
const adapter = this.createAdapter(context);
|
|
52
|
+
// 0. Dynamic Loading
|
|
53
|
+
await this.loadDynamicPlugins();
|
|
13
54
|
// 1. Detection Phase
|
|
14
55
|
for (const plugin of this.plugins) {
|
|
15
|
-
|
|
16
|
-
|
|
56
|
+
try {
|
|
57
|
+
if (plugin.detect) {
|
|
58
|
+
plugin.enabled = await plugin.detect(adapter);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
plugin.enabled = true; // Enabled by default if no detect method
|
|
62
|
+
}
|
|
17
63
|
}
|
|
18
|
-
|
|
19
|
-
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error(`[Plugin Engine] Error in detect phase for ${plugin.name}:`, err);
|
|
66
|
+
plugin.enabled = false;
|
|
20
67
|
}
|
|
21
68
|
}
|
|
22
69
|
// 2. onProjectInit
|
|
23
70
|
for (const plugin of this.plugins) {
|
|
24
71
|
if (plugin.enabled && plugin.lifecycle.onProjectInit) {
|
|
25
|
-
|
|
72
|
+
try {
|
|
73
|
+
await plugin.lifecycle.onProjectInit(adapter);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error(`[Plugin Engine] Error in onProjectInit for ${plugin.name}:`, err);
|
|
77
|
+
}
|
|
26
78
|
}
|
|
27
79
|
}
|
|
28
|
-
//
|
|
80
|
+
// 3. File-level processing
|
|
29
81
|
for (const module of context.modules.values()) {
|
|
30
82
|
if (!module.ast)
|
|
31
83
|
continue;
|
|
32
84
|
// onFileStart
|
|
33
85
|
for (const plugin of this.plugins) {
|
|
34
86
|
if (plugin.enabled && plugin.lifecycle.onFileStart) {
|
|
35
|
-
|
|
87
|
+
try {
|
|
88
|
+
await plugin.lifecycle.onFileStart(module.id, adapter);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
console.error(`[Plugin Engine] Error in onFileStart for ${plugin.name} on ${module.id}:`, err);
|
|
92
|
+
}
|
|
36
93
|
}
|
|
37
94
|
}
|
|
38
95
|
// onASTNode (Traversal)
|
|
39
96
|
const traverseFn = traverse.default || traverse;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
plugin.lifecycle.onASTNode
|
|
97
|
+
try {
|
|
98
|
+
traverseFn(module.ast, {
|
|
99
|
+
enter: (path) => {
|
|
100
|
+
for (const plugin of this.plugins) {
|
|
101
|
+
if (plugin.enabled && plugin.lifecycle.onASTNode) {
|
|
102
|
+
try {
|
|
103
|
+
plugin.lifecycle.onASTNode(path.node, module.id, adapter);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
// Suppress per-node errors to avoid flooding logs, but ensure isolation
|
|
107
|
+
}
|
|
108
|
+
}
|
|
45
109
|
}
|
|
46
110
|
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error(`[Plugin Engine] Error during AST traversal for ${module.id}:`, err);
|
|
115
|
+
}
|
|
49
116
|
}
|
|
50
117
|
// 4. onAnalysisComplete
|
|
51
118
|
for (const plugin of this.plugins) {
|
|
52
119
|
if (plugin.enabled && plugin.lifecycle.onAnalysisComplete) {
|
|
53
|
-
|
|
120
|
+
try {
|
|
121
|
+
await plugin.lifecycle.onAnalysisComplete(adapter);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.error(`[Plugin Engine] Error in onAnalysisComplete for ${plugin.name}:`, err);
|
|
125
|
+
}
|
|
54
126
|
}
|
|
55
127
|
}
|
|
56
128
|
return this.findings;
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Angular Plugin
|
|
4
|
+
* Handles Angular-specific decorators and patterns.
|
|
5
|
+
*/
|
|
6
|
+
export const AngularPlugin = {
|
|
7
|
+
name: "angular-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['@angular/core'] || pkg.devDependencies?.['@angular/core']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see Angular-like files, enable it
|
|
17
|
+
const angularJson = await adapter.readFile('angular.json');
|
|
18
|
+
return !!angularJson;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
if (fileId.endsWith('component.ts') || fileId.endsWith('module.ts') || fileId.endsWith('service.ts')) {
|
|
23
|
+
adapter.markAsUsed(fileId);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
onASTNode: (node, fileId, adapter) => {
|
|
27
|
+
// Angular Decorators (Babel parser might put them in 'decorators' or 'modifiers')
|
|
28
|
+
const decorators = node.decorators || node.modifiers?.filter((m) => m.type === 'Decorator');
|
|
29
|
+
if ((t.isClassDeclaration(node) || t.isClassExpression(node)) && decorators) {
|
|
30
|
+
const hasAngularDecorator = decorators.some((dec) => {
|
|
31
|
+
const expr = dec.expression;
|
|
32
|
+
const callee = t.isCallExpression(expr) ? expr.callee : expr;
|
|
33
|
+
const name = t.isIdentifier(callee) ? callee.name : (t.isMemberExpression(callee) && t.isIdentifier(callee.property) ? callee.property.name : null);
|
|
34
|
+
return name && ['Component', 'Directive', 'Injectable', 'NgModule', 'Pipe'].includes(name);
|
|
35
|
+
});
|
|
36
|
+
if (hasAngularDecorator) {
|
|
37
|
+
adapter.markAsUsed(fileId, node.id?.name);
|
|
38
|
+
adapter.markAsUsed(fileId); // Mark the whole file as reachable
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Input/Output Decorators
|
|
42
|
+
if ((t.isClassProperty(node) || t.isClassMethod(node) || t.isPropertyDefinition?.(node)) && decorators) {
|
|
43
|
+
const isAngularIo = decorators.some((dec) => {
|
|
44
|
+
const expr = dec.expression;
|
|
45
|
+
const callee = t.isCallExpression(expr) ? expr.callee : expr;
|
|
46
|
+
const name = t.isIdentifier(callee) ? callee.name : (t.isMemberExpression(callee) && t.isIdentifier(callee.property) ? callee.property.name : null);
|
|
47
|
+
return name && ['Input', 'Output', 'ViewChild', 'ContentChild', 'HostListener', 'HostBinding'].includes(name);
|
|
48
|
+
});
|
|
49
|
+
if (isAngularIo) {
|
|
50
|
+
const key = node.key || node.id;
|
|
51
|
+
if (t.isIdentifier(key)) {
|
|
52
|
+
adapter.markAsUsed(fileId, key.name);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export default AngularPlugin;
|
|
60
|
+
//# sourceMappingURL=angular-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-plugin.js","sourceRoot":"","sources":["../../src/plugins/angular-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Astro Plugin
|
|
4
|
+
* Handles Astro-specific patterns: .astro components, API routes, layouts, etc.
|
|
5
|
+
*/
|
|
6
|
+
export const AstroPlugin = {
|
|
7
|
+
name: "astro-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['astro'] || pkg.devDependencies?.['astro']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see astro.config.mjs, enable it
|
|
17
|
+
const astroConfig = await adapter.readFile('astro.config.mjs');
|
|
18
|
+
return !!astroConfig;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
// Mark Astro conventional files as entry points
|
|
23
|
+
const astroPatterns = [
|
|
24
|
+
'.astro',
|
|
25
|
+
'pages/', 'layouts/', 'components/', 'api/'
|
|
26
|
+
];
|
|
27
|
+
if (astroPatterns.some(pattern => fileId.includes(pattern) || fileId.endsWith(pattern))) {
|
|
28
|
+
adapter.markAsUsed(fileId);
|
|
29
|
+
}
|
|
30
|
+
// Mark .astro files
|
|
31
|
+
if (fileId.endsWith('.astro')) {
|
|
32
|
+
adapter.markAsUsed(fileId);
|
|
33
|
+
}
|
|
34
|
+
// Mark API route files
|
|
35
|
+
if (fileId.includes('pages/api/') || fileId.includes('api/')) {
|
|
36
|
+
adapter.markAsUsed(fileId);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
onASTNode: (node, fileId, adapter) => {
|
|
40
|
+
// Astro API exports (GET, POST, PUT, DELETE, PATCH, etc.)
|
|
41
|
+
if (t.isExportNamedDeclaration(node)) {
|
|
42
|
+
if (t.isFunctionDeclaration(node.declaration) || t.isFunctionExpression(node.declaration)) {
|
|
43
|
+
const funcName = node.declaration.id?.name;
|
|
44
|
+
if (funcName && ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(funcName)) {
|
|
45
|
+
adapter.markAsUsed(fileId, funcName);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Astro getStaticPaths
|
|
50
|
+
if (t.isExportNamedDeclaration(node)) {
|
|
51
|
+
if (t.isFunctionDeclaration(node.declaration) || t.isFunctionExpression(node.declaration)) {
|
|
52
|
+
const funcName = node.declaration.id?.name;
|
|
53
|
+
if (funcName === 'getStaticPaths') {
|
|
54
|
+
adapter.markAsUsed(fileId, funcName);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Astro.props, Astro.redirect, Astro.response
|
|
59
|
+
if (t.isIdentifier(node) && node.name === 'Astro') {
|
|
60
|
+
adapter.markAsUsed(fileId);
|
|
61
|
+
}
|
|
62
|
+
// Astro client-side directives (client:load, client:idle, etc.)
|
|
63
|
+
if (t.isJSXAttribute(node)) {
|
|
64
|
+
const attrName = node.name.name;
|
|
65
|
+
if (attrName && attrName.startsWith('client:')) {
|
|
66
|
+
adapter.markAsUsed(fileId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Astro slots
|
|
70
|
+
if (t.isJSXElement(node) && t.isJSXIdentifier(node.openingElement.name)) {
|
|
71
|
+
const tagName = node.openingElement.name.name;
|
|
72
|
+
if (tagName === 'slot') {
|
|
73
|
+
adapter.markAsUsed(fileId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Astro.glob() for dynamic imports
|
|
77
|
+
if (t.isCallExpression(node) && t.isMemberExpression(node.callee)) {
|
|
78
|
+
const obj = node.callee.object;
|
|
79
|
+
const prop = node.callee.property;
|
|
80
|
+
if (t.isIdentifier(obj) && obj.name === 'Astro' && t.isIdentifier(prop) && prop.name === 'glob') {
|
|
81
|
+
adapter.markAsUsed(fileId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
export default AstroPlugin;
|
|
88
|
+
//# sourceMappingURL=astro-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro-plugin.js","sourceRoot":"","sources":["../../src/plugins/astro-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YACjF,IAAI,MAAM;gBAAE,OAAO,IAAI,CAAC;QAC1B,CAAC;QACD,kDAAkD;QAClD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,WAAW,CAAC;IACvB,CAAC;IACD,SAAS,EAAE;QACT,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAC/B,gDAAgD;YAChD,MAAM,aAAa,GAAG;gBACpB,QAAQ;gBACR,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM;aAC5C,CAAC;YAEF,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACxF,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,oBAAoB;YACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,uBAAuB;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACnC,0DAA0D;YAC1D,IAAI,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1F,MAAM,QAAQ,GAAI,IAAI,CAAC,WAAmB,CAAC,EAAE,EAAE,IAAI,CAAC;oBACpD,IAAI,QAAQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAChG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,IAAI,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1F,MAAM,QAAQ,GAAI,IAAI,CAAC,WAAmB,CAAC,EAAE,EAAE,IAAI,CAAC;oBACpD,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;wBAClC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,gEAAgE;YAChE,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAI,IAAI,CAAC,IAAY,CAAC,IAAI,CAAC;gBACzC,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/C,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,cAAc;YACd,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxE,MAAM,OAAO,GAAI,IAAI,CAAC,cAAc,CAAC,IAAY,CAAC,IAAI,CAAC;gBACvD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;oBACvB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClE,MAAM,GAAG,GAAI,IAAI,CAAC,MAAc,CAAC,MAAM,CAAC;gBACxC,MAAM,IAAI,GAAI,IAAI,CAAC,MAAc,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAChG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;KACF;CACF,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnalyzerPlugin } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Babel Plugin
|
|
4
|
+
* Handles Babel-specific patterns: babel.config.js, .babelrc, CLI usage, and preset/plugin references
|
|
5
|
+
* This plugin detects Babel packages used via configuration files and build scripts
|
|
6
|
+
*/
|
|
7
|
+
export declare const BabelPlugin: AnalyzerPlugin;
|
|
8
|
+
export default BabelPlugin;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Babel Plugin
|
|
4
|
+
* Handles Babel-specific patterns: babel.config.js, .babelrc, CLI usage, and preset/plugin references
|
|
5
|
+
* This plugin detects Babel packages used via configuration files and build scripts
|
|
6
|
+
*/
|
|
7
|
+
export const BabelPlugin = {
|
|
8
|
+
name: "babel-plugin",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
detect: async (adapter) => {
|
|
11
|
+
const pkg = await adapter.readJson('package.json');
|
|
12
|
+
if (pkg) {
|
|
13
|
+
const hasDep = !!(pkg.dependencies?.['@babel/core'] ||
|
|
14
|
+
pkg.dependencies?.['@babel/cli'] ||
|
|
15
|
+
pkg.devDependencies?.['@babel/core'] ||
|
|
16
|
+
pkg.devDependencies?.['@babel/cli']);
|
|
17
|
+
if (hasDep)
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
// Fallback: Check for Babel config files
|
|
21
|
+
const babelConfig = await adapter.readFile('babel.config.js') ||
|
|
22
|
+
await adapter.readFile('babel.config.cjs') ||
|
|
23
|
+
await adapter.readFile('.babelrc') ||
|
|
24
|
+
await adapter.readFile('.babelrc.js') ||
|
|
25
|
+
await adapter.readFile('.babelrc.cjs');
|
|
26
|
+
return !!babelConfig;
|
|
27
|
+
},
|
|
28
|
+
lifecycle: {
|
|
29
|
+
onFileStart: (fileId, adapter) => {
|
|
30
|
+
// Mark Babel config files as entry points
|
|
31
|
+
const babelConfigFiles = [
|
|
32
|
+
'babel.config.js',
|
|
33
|
+
'babel.config.cjs',
|
|
34
|
+
'babel.config.mjs',
|
|
35
|
+
'.babelrc',
|
|
36
|
+
'.babelrc.js',
|
|
37
|
+
'.babelrc.cjs',
|
|
38
|
+
'.babelrc.json'
|
|
39
|
+
];
|
|
40
|
+
if (babelConfigFiles.some(pattern => fileId.endsWith(pattern))) {
|
|
41
|
+
adapter.markAsUsed(fileId);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
onASTNode: (node, fileId, adapter) => {
|
|
45
|
+
// Detect Babel preset/plugin usage in config files
|
|
46
|
+
if (fileId.includes('babel.config') || fileId.includes('.babelrc')) {
|
|
47
|
+
// Mark @babel/preset-* and @babel/plugin-* as used
|
|
48
|
+
if (t.isStringLiteral(node)) {
|
|
49
|
+
const value = node.value;
|
|
50
|
+
if (value.includes('@babel/preset-') || value.includes('@babel/plugin-')) {
|
|
51
|
+
adapter.markAsUsed(fileId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Detect preset/plugin object references
|
|
55
|
+
if (t.isObjectProperty(node) || t.isObjectMethod(node)) {
|
|
56
|
+
const key = node.key;
|
|
57
|
+
if (t.isIdentifier(key) && ['presets', 'plugins'].includes(key.name)) {
|
|
58
|
+
adapter.markAsUsed(fileId);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Detect Babel API usage in source files
|
|
63
|
+
if (t.isCallExpression(node)) {
|
|
64
|
+
// @babel/core API: transformFileSync, transformSync, parseSync, etc.
|
|
65
|
+
if (t.isMemberExpression(node.callee)) {
|
|
66
|
+
const obj = node.callee.object;
|
|
67
|
+
const prop = node.callee.property;
|
|
68
|
+
if (t.isIdentifier(obj) && t.isIdentifier(prop)) {
|
|
69
|
+
const babelMethods = [
|
|
70
|
+
'transformFileSync',
|
|
71
|
+
'transformSync',
|
|
72
|
+
'parseSync',
|
|
73
|
+
'transformFile',
|
|
74
|
+
'transform',
|
|
75
|
+
'parse'
|
|
76
|
+
];
|
|
77
|
+
if (babelMethods.includes(prop.name)) {
|
|
78
|
+
adapter.markAsUsed(fileId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Direct Babel function calls
|
|
83
|
+
if (t.isIdentifier(node.callee)) {
|
|
84
|
+
const funcName = node.callee.name;
|
|
85
|
+
if (['transformFileSync', 'transformSync', 'parseSync', 'transform', 'parse'].includes(funcName)) {
|
|
86
|
+
adapter.markAsUsed(fileId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Detect @babel/traverse usage
|
|
91
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
92
|
+
if (node.callee.name === 'traverse') {
|
|
93
|
+
adapter.markAsUsed(fileId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Detect @babel/types usage (t.isXxx, t.createXxx patterns)
|
|
97
|
+
if (t.isMemberExpression(node)) {
|
|
98
|
+
const obj = node.object;
|
|
99
|
+
const prop = node.property;
|
|
100
|
+
if (t.isIdentifier(obj) && obj.name === 't' && t.isIdentifier(prop)) {
|
|
101
|
+
const typeMethods = ['is', 'create', 'clone', 'removeProperties', 'removePropertiesDeep'];
|
|
102
|
+
if (typeMethods.some(method => prop.name.startsWith(method))) {
|
|
103
|
+
adapter.markAsUsed(fileId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Detect @babel/helper-* usage
|
|
108
|
+
if (t.isImportDeclaration(node)) {
|
|
109
|
+
const source = node.source.value;
|
|
110
|
+
if (source.includes('@babel/helper-')) {
|
|
111
|
+
adapter.markAsUsed(fileId);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Detect @babel/plugin-proposal-* and @babel/plugin-transform-* usage
|
|
115
|
+
if (t.isImportDeclaration(node)) {
|
|
116
|
+
const source = node.source.value;
|
|
117
|
+
if (source.includes('@babel/plugin-')) {
|
|
118
|
+
adapter.markAsUsed(fileId);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Detect @babel/preset-* usage
|
|
122
|
+
if (t.isImportDeclaration(node)) {
|
|
123
|
+
const source = node.source.value;
|
|
124
|
+
if (source.includes('@babel/preset-')) {
|
|
125
|
+
adapter.markAsUsed(fileId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
export default BabelPlugin;
|
|
132
|
+
//# sourceMappingURL=babel-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babel-plugin.js","sourceRoot":"","sources":["../../src/plugins/babel-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnalyzerPlugin } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* ESBuild Plugin
|
|
4
|
+
* Handles ESBuild-specific patterns: esbuild.config.js, CLI usage, and build script references
|
|
5
|
+
* This plugin detects esbuild packages used via configuration files and build scripts
|
|
6
|
+
*/
|
|
7
|
+
export declare const ESBuildPlugin: AnalyzerPlugin;
|
|
8
|
+
export default ESBuildPlugin;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* ESBuild Plugin
|
|
4
|
+
* Handles ESBuild-specific patterns: esbuild.config.js, CLI usage, and build script references
|
|
5
|
+
* This plugin detects esbuild packages used via configuration files and build scripts
|
|
6
|
+
*/
|
|
7
|
+
export const ESBuildPlugin = {
|
|
8
|
+
name: "esbuild-plugin",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
detect: async (adapter) => {
|
|
11
|
+
const pkg = await adapter.readJson('package.json');
|
|
12
|
+
if (pkg) {
|
|
13
|
+
const hasDep = !!(pkg.dependencies?.['esbuild'] || pkg.devDependencies?.['esbuild']);
|
|
14
|
+
if (hasDep)
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
// Fallback: Check for esbuild config files
|
|
18
|
+
const esbuildConfig = await adapter.readFile('esbuild.config.js') ||
|
|
19
|
+
await adapter.readFile('esbuild.config.mjs') ||
|
|
20
|
+
await adapter.readFile('esbuild.config.ts');
|
|
21
|
+
return !!esbuildConfig;
|
|
22
|
+
},
|
|
23
|
+
lifecycle: {
|
|
24
|
+
onFileStart: (fileId, adapter) => {
|
|
25
|
+
// Mark esbuild config files as entry points
|
|
26
|
+
const esbuildConfigFiles = [
|
|
27
|
+
'esbuild.config.js',
|
|
28
|
+
'esbuild.config.mjs',
|
|
29
|
+
'esbuild.config.ts',
|
|
30
|
+
'esbuild.config.cjs'
|
|
31
|
+
];
|
|
32
|
+
if (esbuildConfigFiles.some(pattern => fileId.endsWith(pattern))) {
|
|
33
|
+
adapter.markAsUsed(fileId);
|
|
34
|
+
}
|
|
35
|
+
// Mark build script files that use esbuild
|
|
36
|
+
if (fileId.endsWith('build.js') || fileId.endsWith('build.ts') || fileId.endsWith('build.mjs')) {
|
|
37
|
+
adapter.markAsUsed(fileId);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
onASTNode: (node, fileId, adapter) => {
|
|
41
|
+
// Detect esbuild API usage: build(), buildSync(), transform(), transformSync()
|
|
42
|
+
if (t.isCallExpression(node)) {
|
|
43
|
+
// esbuild.build(), esbuild.buildSync(), etc.
|
|
44
|
+
if (t.isMemberExpression(node.callee)) {
|
|
45
|
+
const obj = node.callee.object;
|
|
46
|
+
const prop = node.callee.property;
|
|
47
|
+
if (t.isIdentifier(obj) && t.isIdentifier(prop)) {
|
|
48
|
+
const esbuildMethods = [
|
|
49
|
+
'build',
|
|
50
|
+
'buildSync',
|
|
51
|
+
'transform',
|
|
52
|
+
'transformSync',
|
|
53
|
+
'serve',
|
|
54
|
+
'analyzeMetafile',
|
|
55
|
+
'formatMessages',
|
|
56
|
+
'initialize'
|
|
57
|
+
];
|
|
58
|
+
if (esbuildMethods.includes(prop.name)) {
|
|
59
|
+
adapter.markAsUsed(fileId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Direct esbuild function calls
|
|
64
|
+
if (t.isIdentifier(node.callee)) {
|
|
65
|
+
const funcName = node.callee.name;
|
|
66
|
+
if (['build', 'buildSync', 'transform', 'transformSync', 'serve'].includes(funcName)) {
|
|
67
|
+
adapter.markAsUsed(fileId);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Detect esbuild import statements
|
|
72
|
+
if (t.isImportDeclaration(node)) {
|
|
73
|
+
const source = node.source.value;
|
|
74
|
+
if (source === 'esbuild') {
|
|
75
|
+
adapter.markAsUsed(fileId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Detect esbuild require statements
|
|
79
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
80
|
+
if (node.callee.name === 'require') {
|
|
81
|
+
const arg = node.arguments[0];
|
|
82
|
+
if (t.isStringLiteral(arg) && arg.value === 'esbuild') {
|
|
83
|
+
adapter.markAsUsed(fileId);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Detect esbuild plugin definitions
|
|
88
|
+
if (t.isObjectProperty(node)) {
|
|
89
|
+
const key = node.key;
|
|
90
|
+
if (t.isIdentifier(key) && ['plugins', 'loader', 'format', 'target'].includes(key.name)) {
|
|
91
|
+
adapter.markAsUsed(fileId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Detect esbuild configuration object
|
|
95
|
+
if (t.isObjectExpression(node)) {
|
|
96
|
+
const properties = node.properties;
|
|
97
|
+
const esbuildConfigKeys = ['entryPoints', 'outfile', 'outdir', 'bundle', 'minify', 'sourcemap', 'target', 'format', 'loader', 'plugins', 'external', 'define', 'inject', 'banner', 'footer', 'globalName', 'assetNames', 'chunkNames', 'entryNames'];
|
|
98
|
+
const hasEsbuildConfig = properties?.some((prop) => {
|
|
99
|
+
const key = prop.key?.name;
|
|
100
|
+
return esbuildConfigKeys.includes(key);
|
|
101
|
+
});
|
|
102
|
+
if (hasEsbuildConfig) {
|
|
103
|
+
adapter.markAsUsed(fileId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Detect esbuild plugin object pattern
|
|
107
|
+
if (t.isObjectExpression(node)) {
|
|
108
|
+
const properties = node.properties;
|
|
109
|
+
const hasPluginPattern = properties?.some((prop) => {
|
|
110
|
+
const key = prop.key?.name;
|
|
111
|
+
return ['setup', 'name'].includes(key);
|
|
112
|
+
});
|
|
113
|
+
if (hasPluginPattern) {
|
|
114
|
+
adapter.markAsUsed(fileId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
export default ESBuildPlugin;
|
|
121
|
+
//# sourceMappingURL=esbuild-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esbuild-plugin.js","sourceRoot":"","sources":["../../src/plugins/esbuild-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* NestJS Plugin
|
|
4
|
+
* Handles NestJS-specific decorators: @Controller, @Injectable, @Module, @Guard, @Interceptor, etc.
|
|
5
|
+
*/
|
|
6
|
+
export const NestJsPlugin = {
|
|
7
|
+
name: "nestjs-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['@nestjs/core'] || pkg.devDependencies?.['@nestjs/core']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see nest-cli.json, enable it
|
|
17
|
+
const nestCli = await adapter.readFile('nest-cli.json');
|
|
18
|
+
return !!nestCli;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
// Mark NestJS module files as entry points
|
|
23
|
+
if (fileId.endsWith('.module.ts') || fileId.endsWith('.controller.ts') || fileId.endsWith('.service.ts')) {
|
|
24
|
+
adapter.markAsUsed(fileId);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
onASTNode: (node, fileId, adapter) => {
|
|
28
|
+
// NestJS Decorators (Babel parser might put them in 'decorators' or 'modifiers')
|
|
29
|
+
const decorators = node.decorators || node.modifiers?.filter((m) => m.type === 'Decorator');
|
|
30
|
+
if ((t.isClassDeclaration(node) || t.isClassExpression(node)) && decorators) {
|
|
31
|
+
const hasNestJsDecorator = decorators.some((dec) => {
|
|
32
|
+
const expr = dec.expression;
|
|
33
|
+
const callee = t.isCallExpression(expr) ? expr.callee : expr;
|
|
34
|
+
const name = t.isIdentifier(callee) ? callee.name : (t.isMemberExpression(callee) && t.isIdentifier(callee.property) ? callee.property.name : null);
|
|
35
|
+
return name && ['Controller', 'Injectable', 'Module', 'Guard', 'Interceptor', 'Pipe', 'Filter', 'Middleware'].includes(name);
|
|
36
|
+
});
|
|
37
|
+
if (hasNestJsDecorator) {
|
|
38
|
+
adapter.markAsUsed(fileId, node.id?.name);
|
|
39
|
+
adapter.markAsUsed(fileId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// NestJS method decorators (@Get, @Post, @Put, @Delete, @Patch, etc.)
|
|
43
|
+
if (t.isClassMethod(node) && decorators) {
|
|
44
|
+
const hasRouteDecorator = decorators.some((dec) => {
|
|
45
|
+
const expr = dec.expression;
|
|
46
|
+
const callee = t.isCallExpression(expr) ? expr.callee : expr;
|
|
47
|
+
const name = t.isIdentifier(callee) ? callee.name : null;
|
|
48
|
+
return name && ['Get', 'Post', 'Put', 'Delete', 'Patch', 'Options', 'Head'].includes(name);
|
|
49
|
+
});
|
|
50
|
+
if (hasRouteDecorator) {
|
|
51
|
+
adapter.markAsUsed(fileId, node.key?.name);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// NestJS dependency injection via @Inject decorator
|
|
55
|
+
if (t.isClassProperty(node) && decorators) {
|
|
56
|
+
const hasInjectDecorator = decorators.some((dec) => {
|
|
57
|
+
const expr = dec.expression;
|
|
58
|
+
const name = t.isIdentifier(expr) ? expr.name : (t.isCallExpression(expr) && t.isIdentifier(expr.callee) ? expr.callee.name : null);
|
|
59
|
+
return name === 'Inject';
|
|
60
|
+
});
|
|
61
|
+
if (hasInjectDecorator) {
|
|
62
|
+
adapter.markAsUsed(fileId, node.key?.name);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
export default NestJsPlugin;
|
|
69
|
+
//# sourceMappingURL=nestjs-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs-plugin.js","sourceRoot":"","sources":["../../src/plugins/nestjs-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Next.js Plugin
|
|
4
|
+
* Handles Next.js-specific patterns: page.tsx, route.ts, layout.tsx, middleware, API routes, etc.
|
|
5
|
+
*/
|
|
6
|
+
export const NextJsPlugin = {
|
|
7
|
+
name: "nextjs-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['next'] || pkg.devDependencies?.['next']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see next.config.js, enable it
|
|
17
|
+
const nextConfig = await adapter.readFile('next.config.js');
|
|
18
|
+
return !!nextConfig;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
// Mark Next.js conventional files as entry points
|
|
23
|
+
const nextJsPatterns = [
|
|
24
|
+
'page.tsx', 'page.ts', 'page.jsx', 'page.js',
|
|
25
|
+
'route.ts', 'route.js',
|
|
26
|
+
'layout.tsx', 'layout.ts', 'layout.jsx', 'layout.js',
|
|
27
|
+
'middleware.ts', 'middleware.js',
|
|
28
|
+
'error.tsx', 'error.ts',
|
|
29
|
+
'loading.tsx', 'loading.ts',
|
|
30
|
+
'not-found.tsx', 'not-found.ts',
|
|
31
|
+
'template.tsx', 'template.ts',
|
|
32
|
+
'default.tsx', 'default.ts'
|
|
33
|
+
];
|
|
34
|
+
if (nextJsPatterns.some(pattern => fileId.endsWith(pattern))) {
|
|
35
|
+
adapter.markAsUsed(fileId);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
onASTNode: (node, fileId, adapter) => {
|
|
39
|
+
// Detect Next.js data fetching functions
|
|
40
|
+
if (t.isExportNamedDeclaration(node) || t.isExportDefaultDeclaration(node)) {
|
|
41
|
+
if (t.isFunctionDeclaration(node.declaration) || t.isFunctionExpression(node.declaration)) {
|
|
42
|
+
const funcName = node.declaration.id?.name;
|
|
43
|
+
if (funcName && ['getServerSideProps', 'getStaticProps', 'getStaticPaths', 'generateStaticParams', 'generateMetadata'].includes(funcName)) {
|
|
44
|
+
adapter.markAsUsed(fileId, funcName);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Detect Next.js hooks usage (useRouter, usePathname, useSearchParams, etc.)
|
|
49
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
50
|
+
const hookName = node.callee.name;
|
|
51
|
+
if (['useRouter', 'usePathname', 'useSearchParams', 'useParams', 'useServerInsertedHTML'].includes(hookName)) {
|
|
52
|
+
adapter.markAsUsed(fileId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Mark files using Image component
|
|
56
|
+
if (t.isJSXElement(node) && t.isJSXIdentifier(node.openingElement.name)) {
|
|
57
|
+
const tagName = node.openingElement.name.name;
|
|
58
|
+
if (tagName === 'Image') {
|
|
59
|
+
adapter.markAsUsed(fileId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
export default NextJsPlugin;
|
|
66
|
+
//# sourceMappingURL=nextjs-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-plugin.js","sourceRoot":"","sources":["../../src/plugins/nextjs-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Nuxt Plugin
|
|
4
|
+
* Handles Nuxt-specific patterns: pages, layouts, middleware, composables, auto-imports, etc.
|
|
5
|
+
*/
|
|
6
|
+
export const NuxtPlugin = {
|
|
7
|
+
name: "nuxt-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['nuxt'] || pkg.devDependencies?.['nuxt']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see nuxt.config.ts, enable it
|
|
17
|
+
const nuxtConfig = await adapter.readFile('nuxt.config.ts');
|
|
18
|
+
return !!nuxtConfig;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
// Mark Nuxt conventional directories as entry points
|
|
23
|
+
const nuxtPatterns = [
|
|
24
|
+
'pages/', 'layouts/', 'middleware/', 'composables/', 'components/', 'plugins/', 'app.vue'
|
|
25
|
+
];
|
|
26
|
+
if (nuxtPatterns.some(pattern => fileId.includes(pattern))) {
|
|
27
|
+
adapter.markAsUsed(fileId);
|
|
28
|
+
}
|
|
29
|
+
// Mark .vue files in these directories
|
|
30
|
+
if ((fileId.includes('pages/') || fileId.includes('layouts/') || fileId.includes('components/')) && fileId.endsWith('.vue')) {
|
|
31
|
+
adapter.markAsUsed(fileId);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
onASTNode: (node, fileId, adapter) => {
|
|
35
|
+
// Nuxt composables (useRouter, useFetch, useAsyncData, etc.)
|
|
36
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
37
|
+
const composableName = node.callee.name;
|
|
38
|
+
if (['useRouter', 'useRoute', 'useFetch', 'useAsyncData', 'useLazyFetch', 'useLazyAsyncData', 'useHead', 'useState', 'useError', 'useNuxtData', 'useRequestHeaders', 'useCookie', 'useDirectives'].includes(composableName)) {
|
|
39
|
+
adapter.markAsUsed(fileId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Nuxt definePageMeta
|
|
43
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
44
|
+
if (node.callee.name === 'definePageMeta') {
|
|
45
|
+
adapter.markAsUsed(fileId);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Nuxt defineRouteRules
|
|
49
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
50
|
+
if (node.callee.name === 'defineRouteRules') {
|
|
51
|
+
adapter.markAsUsed(fileId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Nuxt middleware definitions
|
|
55
|
+
if (t.isExportDefaultDeclaration(node)) {
|
|
56
|
+
if (t.isFunctionDeclaration(node.declaration) || t.isFunctionExpression(node.declaration)) {
|
|
57
|
+
if (fileId.includes('middleware/')) {
|
|
58
|
+
adapter.markAsUsed(fileId);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Nuxt plugin definitions
|
|
63
|
+
if (t.isExportDefaultDeclaration(node)) {
|
|
64
|
+
if (t.isCallExpression(node.declaration) && t.isIdentifier(node.declaration.callee)) {
|
|
65
|
+
if (node.declaration.callee.name === 'defineNuxtPlugin') {
|
|
66
|
+
adapter.markAsUsed(fileId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Nuxt auto-imported composables (starting with 'use')
|
|
71
|
+
if (t.isIdentifier(node) && node.name.startsWith('use')) {
|
|
72
|
+
if (fileId.includes('composables/')) {
|
|
73
|
+
adapter.markAsUsed(fileId, node.name);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
export default NuxtPlugin;
|
|
80
|
+
//# sourceMappingURL=nuxtjs-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuxtjs-plugin.js","sourceRoot":"","sources":["../../src/plugins/nuxtjs-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Svelte Plugin
|
|
4
|
+
* Handles Svelte-specific patterns and lifecycle methods.
|
|
5
|
+
*/
|
|
6
|
+
export const SveltePlugin = {
|
|
7
|
+
name: "svelte-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (!pkg)
|
|
12
|
+
return false;
|
|
13
|
+
return !!(pkg.dependencies?.['svelte'] || pkg.devDependencies?.['svelte']);
|
|
14
|
+
},
|
|
15
|
+
lifecycle: {
|
|
16
|
+
onFileStart: (fileId, adapter) => {
|
|
17
|
+
// Svelte components are entry points by nature
|
|
18
|
+
if (fileId.endsWith('.svelte')) {
|
|
19
|
+
adapter.markAsUsed(fileId);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
onASTNode: (node, fileId, adapter) => {
|
|
23
|
+
// Svelte lifecycle methods
|
|
24
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
25
|
+
if (['onMount', 'onDestroy', 'beforeUpdate', 'afterUpdate', 'tick', 'createEventDispatcher', 'setContext', 'getContext'].includes(node.callee.name)) {
|
|
26
|
+
adapter.markAsUsed(fileId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Svelte stores ($ prefix)
|
|
30
|
+
if (t.isIdentifier(node) && node.name.startsWith('$')) {
|
|
31
|
+
const storeName = node.name.slice(1);
|
|
32
|
+
adapter.markAsUsed(fileId, storeName);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export default SveltePlugin;
|
|
38
|
+
//# sourceMappingURL=svelte-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte-plugin.js","sourceRoot":"","sources":["../../src/plugins/svelte-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,SAAS,EAAE;QACT,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAC/B,+CAA+C;YAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACnC,2BAA2B;YAC3B,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpJ,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;KACF;CACF,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
/**
|
|
3
|
+
* Vue.js Plugin
|
|
4
|
+
* Handles Vue.js-specific patterns: .vue components, composition API, lifecycle hooks, etc.
|
|
5
|
+
*/
|
|
6
|
+
export const VueJsPlugin = {
|
|
7
|
+
name: "vuejs-plugin",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
detect: async (adapter) => {
|
|
10
|
+
const pkg = await adapter.readJson('package.json');
|
|
11
|
+
if (pkg) {
|
|
12
|
+
const hasDep = !!(pkg.dependencies?.['vue'] || pkg.devDependencies?.['vue']);
|
|
13
|
+
if (hasDep)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Fallback: If we see .vue files, enable it
|
|
17
|
+
const vueConfig = await adapter.readFile('vite.config.ts');
|
|
18
|
+
return !!vueConfig;
|
|
19
|
+
},
|
|
20
|
+
lifecycle: {
|
|
21
|
+
onFileStart: (fileId, adapter) => {
|
|
22
|
+
// Vue components are entry points by nature
|
|
23
|
+
if (fileId.endsWith('.vue')) {
|
|
24
|
+
adapter.markAsUsed(fileId);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
onASTNode: (node, fileId, adapter) => {
|
|
28
|
+
// Vue Composition API lifecycle hooks
|
|
29
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
30
|
+
const hookName = node.callee.name;
|
|
31
|
+
if (['onMounted', 'onUpdated', 'onUnmounted', 'onBeforeMount', 'onBeforeUpdate', 'onBeforeUnmount', 'onActivated', 'onDeactivated', 'onErrorCaptured', 'onRenderTracked', 'onRenderTriggered'].includes(hookName)) {
|
|
32
|
+
adapter.markAsUsed(fileId);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Vue reactive/ref declarations
|
|
36
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
37
|
+
const apiName = node.callee.name;
|
|
38
|
+
if (['ref', 'reactive', 'computed', 'watch', 'watchEffect', 'provide', 'inject'].includes(apiName)) {
|
|
39
|
+
adapter.markAsUsed(fileId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Vue defineComponent
|
|
43
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
44
|
+
if (node.callee.name === 'defineComponent') {
|
|
45
|
+
adapter.markAsUsed(fileId);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Vue defineProps, defineEmits, defineExpose
|
|
49
|
+
if (t.isCallExpression(node) && t.isIdentifier(node.callee)) {
|
|
50
|
+
const defineName = node.callee.name;
|
|
51
|
+
if (['defineProps', 'defineEmits', 'defineExpose', 'defineOptions', 'defineSlots'].includes(defineName)) {
|
|
52
|
+
adapter.markAsUsed(fileId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Vue template refs ($refs)
|
|
56
|
+
if (t.isIdentifier(node) && node.name === '$refs') {
|
|
57
|
+
adapter.markAsUsed(fileId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
export default VueJsPlugin;
|
|
63
|
+
//# sourceMappingURL=vuejs-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vuejs-plugin.js","sourceRoot":"","sources":["../../src/plugins/vuejs-plugin.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.7.0",
|
|
4
4
|
"description": "Resilient static dead-code analyzer for TypeScript and JavaScript workspaces.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -96,6 +96,7 @@
|
|
|
96
96
|
"z3-solver": "^5.0.0"
|
|
97
97
|
},
|
|
98
98
|
"devDependencies": {
|
|
99
|
+
"@types/markdown-it": "^14.1.2",
|
|
99
100
|
"@types/node": "^22.15.3",
|
|
100
101
|
"typescript": "^5.8.3",
|
|
101
102
|
"vitepress": "^1.6.4",
|