optiprune 1.6.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/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/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
|
@@ -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":"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"}
|
|
@@ -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":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,gBAAgB;IACtB,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,SAAS,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YACrF,IAAI,MAAM;gBAAE,OAAO,IAAI,CAAC;QAC1B,CAAC;QAED,2CAA2C;QAC3C,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC5C,MAAM,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC5C,MAAM,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,aAAa,CAAC;IACzB,CAAC;IACD,SAAS,EAAE;QACT,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAC/B,4CAA4C;YAC5C,MAAM,kBAAkB,GAAG;gBACzB,mBAAmB;gBACnB,oBAAoB;gBACpB,mBAAmB;gBACnB,oBAAoB;aACrB,CAAC;YAEF,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACjE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,2CAA2C;YAC3C,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/F,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACnC,+EAA+E;YAC/E,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,6CAA6C;gBAC7C,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtC,MAAM,GAAG,GAAI,IAAI,CAAC,MAAc,CAAC,MAAM,CAAC;oBACxC,MAAM,IAAI,GAAI,IAAI,CAAC,MAAc,CAAC,QAAQ,CAAC;oBAC3C,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,MAAM,cAAc,GAAG;4BACrB,OAAO;4BACP,WAAW;4BACX,WAAW;4BACX,eAAe;4BACf,OAAO;4BACP,iBAAiB;4BACjB,gBAAgB;4BAChB,YAAY;yBACb,CAAC;wBACF,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;4BACvC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,gCAAgC;gBAChC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACrF,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBACtD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAI,IAAY,CAAC,GAAG,CAAC;gBAC9B,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxF,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAI,IAAY,CAAC,UAAU,CAAC;gBAC5C,MAAM,iBAAiB,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;gBAErP,MAAM,gBAAgB,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;oBACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;oBAC3B,OAAO,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;gBAEH,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAI,IAAY,CAAC,UAAU,CAAC;gBAC5C,MAAM,gBAAgB,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;oBACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;oBAC3B,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;gBAEH,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;KACF;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -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,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",
|