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 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
- if (plugin.detect) {
16
- plugin.enabled = await plugin.detect(adapter);
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
- else {
19
- plugin.enabled = true; // Enabled by default if no detect method
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
- await plugin.lifecycle.onProjectInit(adapter);
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
- // 2. File-level processing
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
- await plugin.lifecycle.onFileStart(module.id, adapter);
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
- traverseFn(module.ast, {
41
- enter: (path) => {
42
- for (const plugin of this.plugins) {
43
- if (plugin.enabled && plugin.lifecycle.onASTNode) {
44
- plugin.lifecycle.onASTNode(path.node, module.id, adapter);
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
- await plugin.lifecycle.onAnalysisComplete(adapter);
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;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Angular Plugin
4
+ * Handles Angular-specific decorators and patterns.
5
+ */
6
+ export declare const AngularPlugin: AnalyzerPlugin;
7
+ export default AngularPlugin;
@@ -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,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Astro Plugin
4
+ * Handles Astro-specific patterns: .astro components, API routes, layouts, etc.
5
+ */
6
+ export declare const AstroPlugin: AnalyzerPlugin;
7
+ export default AstroPlugin;
@@ -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":"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"}
@@ -0,0 +1,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * NestJS Plugin
4
+ * Handles NestJS-specific decorators: @Controller, @Injectable, @Module, @Guard, @Interceptor, etc.
5
+ */
6
+ export declare const NestJsPlugin: AnalyzerPlugin;
7
+ export default NestJsPlugin;
@@ -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,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Next.js Plugin
4
+ * Handles Next.js-specific patterns: page.tsx, route.ts, layout.tsx, middleware, API routes, etc.
5
+ */
6
+ export declare const NextJsPlugin: AnalyzerPlugin;
7
+ export default NextJsPlugin;
@@ -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,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Nuxt Plugin
4
+ * Handles Nuxt-specific patterns: pages, layouts, middleware, composables, auto-imports, etc.
5
+ */
6
+ export declare const NuxtPlugin: AnalyzerPlugin;
7
+ export default NuxtPlugin;
@@ -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,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Svelte Plugin
4
+ * Handles Svelte-specific patterns and lifecycle methods.
5
+ */
6
+ export declare const SveltePlugin: AnalyzerPlugin;
7
+ export default SveltePlugin;
@@ -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,7 @@
1
+ import { AnalyzerPlugin } from "../types.js";
2
+ /**
3
+ * Vue.js Plugin
4
+ * Handles Vue.js-specific patterns: .vue components, composition API, lifecycle hooks, etc.
5
+ */
6
+ export declare const VueJsPlugin: AnalyzerPlugin;
7
+ export default VueJsPlugin;
@@ -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.5.0",
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",