mcp-react-toolkit 1.0.1 → 1.3.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/README.md +194 -44
- package/bin/cli.mjs +59 -0
- package/node_modules/@mcp-showcase/shared/build/McpServerBase.d.ts +18 -0
- package/node_modules/@mcp-showcase/shared/build/McpServerBase.d.ts.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/McpServerBase.js +74 -0
- package/node_modules/@mcp-showcase/shared/build/McpServerBase.js.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/ToolRegistry.d.ts +9 -0
- package/node_modules/@mcp-showcase/shared/build/ToolRegistry.d.ts.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/ToolRegistry.js +22 -0
- package/node_modules/@mcp-showcase/shared/build/ToolRegistry.js.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/fs.d.ts +8 -0
- package/node_modules/@mcp-showcase/shared/build/fs.d.ts.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/fs.js +45 -0
- package/node_modules/@mcp-showcase/shared/build/fs.js.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/index.d.ts +5 -0
- package/node_modules/@mcp-showcase/shared/build/index.d.ts.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/index.js +5 -0
- package/node_modules/@mcp-showcase/shared/build/index.js.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/types.d.ts +36 -0
- package/node_modules/@mcp-showcase/shared/build/types.d.ts.map +1 -0
- package/node_modules/@mcp-showcase/shared/build/types.js +5 -0
- package/node_modules/@mcp-showcase/shared/build/types.js.map +1 -0
- package/node_modules/@mcp-showcase/shared/package.json +24 -0
- package/node_modules/@mcp-showcase/shared/src/McpServerBase.ts +100 -0
- package/node_modules/@mcp-showcase/shared/src/ToolRegistry.ts +38 -0
- package/node_modules/@mcp-showcase/shared/src/fs.ts +49 -0
- package/node_modules/@mcp-showcase/shared/src/index.ts +12 -0
- package/node_modules/@mcp-showcase/shared/src/types.ts +44 -0
- package/node_modules/@mcp-showcase/shared/tsconfig.json +8 -0
- package/package.json +38 -4
- package/tools/accessibility-checker/build/index.js +9 -5
- package/tools/accessibility-checker/build/index.js.map +1 -1
- package/tools/accessibility-checker/build/rules.d.ts.map +1 -1
- package/tools/accessibility-checker/build/rules.js +325 -94
- package/tools/accessibility-checker/build/rules.js.map +1 -1
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.d.ts.map +1 -1
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.js +65 -50
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.js.map +1 -1
- package/tools/code-modernizer/build/types.d.ts +1 -0
- package/tools/code-modernizer/build/types.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/ast-parser.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/ast-parser.js +30 -14
- package/tools/code-modernizer/build/utils/ast-parser.js.map +1 -1
- package/tools/code-modernizer/build/utils/type-generator.d.ts +1 -1
- package/tools/code-modernizer/build/utils/type-generator.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/type-generator.js +72 -23
- package/tools/code-modernizer/build/utils/type-generator.js.map +1 -1
- package/tools/component-factory/build/index.js +59 -7
- package/tools/component-factory/build/index.js.map +1 -1
- package/tools/component-fixer/README.md +44 -0
- package/tools/component-fixer/build/index.d.ts +3 -0
- package/tools/component-fixer/build/index.d.ts.map +1 -0
- package/tools/component-fixer/build/index.js +647 -0
- package/tools/component-fixer/build/index.js.map +1 -0
- package/tools/component-fixer/package.json +20 -0
- package/tools/component-reviewer/README.md +54 -0
- package/tools/component-reviewer/build/index.d.ts +39 -0
- package/tools/component-reviewer/build/index.d.ts.map +1 -0
- package/tools/component-reviewer/build/index.js +946 -0
- package/tools/component-reviewer/build/index.js.map +1 -0
- package/tools/component-reviewer/package.json +20 -0
- package/tools/dep-auditor/build/index.d.ts +1 -0
- package/tools/dep-auditor/build/index.d.ts.map +1 -1
- package/tools/dep-auditor/build/index.js +71 -16
- package/tools/dep-auditor/build/index.js.map +1 -1
- package/tools/generate-tests/build/analyzer.d.ts +14 -0
- package/tools/generate-tests/build/analyzer.d.ts.map +1 -1
- package/tools/generate-tests/build/analyzer.js +96 -42
- package/tools/generate-tests/build/analyzer.js.map +1 -1
- package/tools/generate-tests/build/generators.d.ts.map +1 -1
- package/tools/generate-tests/build/generators.js +304 -79
- package/tools/generate-tests/build/generators.js.map +1 -1
- package/tools/generate-tests/build/index.js +29 -10
- package/tools/generate-tests/build/index.js.map +1 -1
- package/tools/json-viewer/build/index.js +29 -6
- package/tools/json-viewer/build/index.js.map +1 -1
- package/tools/legacy-analyzer/README.md +66 -0
- package/tools/legacy-analyzer/build/index.d.ts +3 -0
- package/tools/legacy-analyzer/build/index.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/index.js +209 -0
- package/tools/legacy-analyzer/build/index.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js +115 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js +85 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.js +87 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js +133 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js +160 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.js +150 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.js +131 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.js +85 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js +329 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.js +192 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js +232 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js +247 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.js +141 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.js +76 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js +70 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.js +26 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js +108 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js +137 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js +160 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js +162 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js +108 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js +98 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/types.d.ts +413 -0
- package/tools/legacy-analyzer/build/types.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/types.js +12 -0
- package/tools/legacy-analyzer/build/types.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.d.ts +34 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.js +394 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.d.ts +51 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.js +174 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.d.ts +38 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.js +194 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts +88 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.js +538 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.js.map +1 -0
- package/tools/legacy-analyzer/package.json +20 -0
- package/tools/lighthouse-runner/README.md +45 -0
- package/tools/lighthouse-runner/build/index.d.ts +6 -0
- package/tools/lighthouse-runner/build/index.d.ts.map +1 -0
- package/tools/lighthouse-runner/build/index.js +295 -0
- package/tools/lighthouse-runner/build/index.js.map +1 -0
- package/tools/lighthouse-runner/package.json +20 -0
- package/tools/monorepo-manager/build/utils.d.ts.map +1 -1
- package/tools/monorepo-manager/build/utils.js +12 -9
- package/tools/monorepo-manager/build/utils.js.map +1 -1
- package/tools/performance-audit/README.md +37 -0
- package/tools/performance-audit/build/index.d.ts +13 -0
- package/tools/performance-audit/build/index.d.ts.map +1 -0
- package/tools/performance-audit/build/index.js +311 -0
- package/tools/performance-audit/build/index.js.map +1 -0
- package/tools/performance-audit/package.json +20 -0
- package/tools/quality-pipeline/build/index.js +55 -15
- package/tools/quality-pipeline/build/index.js.map +1 -1
- package/tools/render-analyzer/README.md +43 -0
- package/tools/render-analyzer/build/index.d.ts +25 -0
- package/tools/render-analyzer/build/index.d.ts.map +1 -0
- package/tools/render-analyzer/build/index.js +342 -0
- package/tools/render-analyzer/build/index.js.map +1 -0
- package/tools/render-analyzer/package.json +20 -0
- package/tools/shared/build/fs.d.ts +8 -0
- package/tools/shared/build/fs.d.ts.map +1 -0
- package/tools/shared/build/fs.js +45 -0
- package/tools/shared/build/fs.js.map +1 -0
- package/tools/shared/build/index.d.ts +1 -0
- package/tools/shared/build/index.d.ts.map +1 -1
- package/tools/shared/build/index.js +1 -0
- package/tools/shared/build/index.js.map +1 -1
- package/tools/shared/package.json +2 -1
- package/tools/storybook-generator/README.md +39 -0
- package/tools/storybook-generator/build/index.d.ts +13 -0
- package/tools/storybook-generator/build/index.d.ts.map +1 -0
- package/tools/storybook-generator/build/index.js +478 -0
- package/tools/storybook-generator/build/index.js.map +1 -0
- package/tools/storybook-generator/package.json +20 -0
- package/tools/test-gap-analyzer/README.md +41 -0
- package/tools/test-gap-analyzer/build/index.d.ts +20 -0
- package/tools/test-gap-analyzer/build/index.d.ts.map +1 -0
- package/tools/test-gap-analyzer/build/index.js +371 -0
- package/tools/test-gap-analyzer/build/index.js.map +1 -0
- package/tools/test-gap-analyzer/package.json +20 -0
- package/tools/typescript-enforcer/build/scanner.d.ts.map +1 -1
- package/tools/typescript-enforcer/build/scanner.js +13 -1
- package/tools/typescript-enforcer/build/scanner.js.map +1 -1
- package/tools/typescript-enforcer/build/types.d.ts +1 -0
- package/tools/typescript-enforcer/build/types.d.ts.map +1 -1
- package/CONTRIBUTING.md +0 -157
- package/demo/legacy-app/src/App.jsx +0 -12
- package/demo/legacy-app/src/components/Dashboard.jsx +0 -51
- package/demo/legacy-app/src/components/UserCard.jsx +0 -32
- package/demo/legacy-app/src/hooks/useUsers.js +0 -38
- package/demo/legacy-app/src/utils/api.js +0 -30
- package/glama.json +0 -4
- package/mcp-publisher +0 -0
- package/server.json +0 -20
- package/tools/accessibility-checker/build/rules.test.d.ts +0 -2
- package/tools/accessibility-checker/build/rules.test.d.ts.map +0 -1
- package/tools/accessibility-checker/build/rules.test.js.map +0 -1
- package/tools/code-modernizer/build/utils/file-ops.test.d.ts +0 -2
- package/tools/code-modernizer/build/utils/file-ops.test.d.ts.map +0 -1
- package/tools/code-modernizer/build/utils/file-ops.test.js.map +0 -1
- package/tools/component-factory/build/utils.test.d.ts +0 -2
- package/tools/component-factory/build/utils.test.d.ts.map +0 -1
- package/tools/component-factory/build/utils.test.js.map +0 -1
- package/tools/dep-auditor/build/index.test.d.ts +0 -2
- package/tools/dep-auditor/build/index.test.d.ts.map +0 -1
- package/tools/dep-auditor/build/index.test.js.map +0 -1
- package/tools/generate-tests/build/analyzer.test.d.ts +0 -2
- package/tools/generate-tests/build/analyzer.test.d.ts.map +0 -1
- package/tools/generate-tests/build/analyzer.test.js.map +0 -1
- package/tools/json-viewer/build/utils.test.d.ts +0 -2
- package/tools/json-viewer/build/utils.test.d.ts.map +0 -1
- package/tools/json-viewer/build/utils.test.js.map +0 -1
- package/tools/monorepo-manager/build/utils.test.d.ts +0 -2
- package/tools/monorepo-manager/build/utils.test.d.ts.map +0 -1
- package/tools/monorepo-manager/build/utils.test.js.map +0 -1
- package/tools/quality-pipeline/build/utils.test.d.ts +0 -2
- package/tools/quality-pipeline/build/utils.test.d.ts.map +0 -1
- package/tools/quality-pipeline/build/utils.test.js.map +0 -1
- package/tools/typescript-enforcer/build/scanner.test.d.ts +0 -2
- package/tools/typescript-enforcer/build/scanner.test.d.ts.map +0 -1
- package/tools/typescript-enforcer/build/scanner.test.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// FILE SCANNER - File discovery utilities using glob patterns
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the best source directory for a given app root.
|
|
9
|
+
* Handles CRA/Vite (src/), Next.js app router (app/), Next.js pages router (pages/),
|
|
10
|
+
* and apps where source is at root level.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveSourceDir(appPath) {
|
|
13
|
+
// Priority: src/ > app/ (Next.js app router) > pages/ > root
|
|
14
|
+
for (const candidate of ['src', 'app', 'pages']) {
|
|
15
|
+
const dir = path.join(appPath, candidate);
|
|
16
|
+
if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) {
|
|
17
|
+
// Sanity check: must have at least one source file
|
|
18
|
+
const entries = fs.readdirSync(dir);
|
|
19
|
+
if (entries.some((e) => /\.(tsx?|jsx?)$/.test(e) || fs.statSync(path.join(dir, e)).isDirectory())) {
|
|
20
|
+
return dir;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Fallback to src even if doesn't exist (will be empty)
|
|
25
|
+
return path.join(appPath, 'src');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Find all JS/JSX/TS/TSX files in a directory
|
|
29
|
+
*/
|
|
30
|
+
export async function findSourceFiles(rootDir) {
|
|
31
|
+
const patterns = ['**/*.{js,jsx,ts,tsx}'];
|
|
32
|
+
const ignore = [
|
|
33
|
+
'**/node_modules/**',
|
|
34
|
+
'**/build/**',
|
|
35
|
+
'**/dist/**',
|
|
36
|
+
'**/.git/**',
|
|
37
|
+
'**/coverage/**',
|
|
38
|
+
'**/*.test.{js,jsx,ts,tsx}',
|
|
39
|
+
'**/*.spec.{js,jsx,ts,tsx}',
|
|
40
|
+
'**/*.stories.{js,jsx,ts,tsx}',
|
|
41
|
+
'**/*.d.ts',
|
|
42
|
+
];
|
|
43
|
+
const files = await glob(patterns, {
|
|
44
|
+
cwd: rootDir,
|
|
45
|
+
ignore,
|
|
46
|
+
absolute: true,
|
|
47
|
+
});
|
|
48
|
+
return files.sort();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find component files (files that likely export React components)
|
|
52
|
+
*/
|
|
53
|
+
export async function findComponentFiles(rootDir) {
|
|
54
|
+
const allFiles = await findSourceFiles(rootDir);
|
|
55
|
+
return allFiles.filter((f) => {
|
|
56
|
+
const basename = path.basename(f, path.extname(f));
|
|
57
|
+
// Components typically start with uppercase
|
|
58
|
+
return /^[A-Z]/.test(basename);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find CSS/SCSS/Less/style files
|
|
63
|
+
*/
|
|
64
|
+
export async function findStyleFiles(rootDir) {
|
|
65
|
+
const patterns = ['**/*.{css,scss,less,sass,module.css,module.scss}'];
|
|
66
|
+
const ignore = ['**/node_modules/**', '**/build/**', '**/dist/**'];
|
|
67
|
+
return glob(patterns, {
|
|
68
|
+
cwd: rootDir,
|
|
69
|
+
ignore,
|
|
70
|
+
absolute: true,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find asset files (images, videos, fonts)
|
|
75
|
+
*/
|
|
76
|
+
export async function findAssetFiles(rootDir) {
|
|
77
|
+
const patterns = [
|
|
78
|
+
'**/*.{png,jpg,jpeg,gif,svg,webp,ico,bmp}',
|
|
79
|
+
'**/*.{mp4,webm,ogg,avi,mov}',
|
|
80
|
+
'**/*.{woff,woff2,ttf,eot,otf}',
|
|
81
|
+
];
|
|
82
|
+
const ignore = ['**/node_modules/**', '**/build/**', '**/dist/**'];
|
|
83
|
+
return glob(patterns, {
|
|
84
|
+
cwd: rootDir,
|
|
85
|
+
ignore,
|
|
86
|
+
absolute: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get file size in bytes
|
|
91
|
+
*/
|
|
92
|
+
export function getFileSize(filePath) {
|
|
93
|
+
try {
|
|
94
|
+
const stats = fs.statSync(filePath);
|
|
95
|
+
return stats.size;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Read file content safely
|
|
103
|
+
*/
|
|
104
|
+
export function readFileContent(filePath) {
|
|
105
|
+
try {
|
|
106
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a file exists
|
|
114
|
+
*/
|
|
115
|
+
export function fileExists(filePath) {
|
|
116
|
+
return fs.existsSync(filePath);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get all directories at a specific depth from root
|
|
120
|
+
*/
|
|
121
|
+
export function getDirectoriesAtDepth(rootDir, maxDepth = 10) {
|
|
122
|
+
const dirs = [];
|
|
123
|
+
function walk(currentDir, depth) {
|
|
124
|
+
if (depth > maxDepth)
|
|
125
|
+
return;
|
|
126
|
+
try {
|
|
127
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
if (entry.isDirectory() && entry.name !== 'node_modules' && entry.name !== '.git') {
|
|
130
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
131
|
+
const relativePath = path.relative(rootDir, fullPath);
|
|
132
|
+
dirs.push(relativePath);
|
|
133
|
+
walk(fullPath, depth + 1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Skip unreadable directories
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
walk(rootDir, 1);
|
|
142
|
+
return dirs;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Calculate directory nesting depth
|
|
146
|
+
*/
|
|
147
|
+
export function calculateMaxDepth(rootDir) {
|
|
148
|
+
const dirs = getDirectoriesAtDepth(rootDir, 20);
|
|
149
|
+
if (dirs.length === 0)
|
|
150
|
+
return 0;
|
|
151
|
+
return Math.max(...dirs.map((d) => d.split(path.sep).length));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Read package.json from a directory
|
|
155
|
+
*/
|
|
156
|
+
export function readPackageJson(rootDir) {
|
|
157
|
+
const pkgPath = path.join(rootDir, 'package.json');
|
|
158
|
+
const content = readFileContent(pkgPath);
|
|
159
|
+
if (!content)
|
|
160
|
+
return null;
|
|
161
|
+
try {
|
|
162
|
+
return JSON.parse(content);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if directory contains specific config files
|
|
170
|
+
*/
|
|
171
|
+
export function hasConfigFile(rootDir, filenames) {
|
|
172
|
+
return filenames.some((f) => fileExists(path.join(rootDir, f)));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=file-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/utils/file-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ImportGraph, ImportInfo } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a complete import graph for all source files in a directory
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildImportGraph(rootDir: string): Promise<ImportGraph>;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve an import specifier to an actual file path
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveImportPath(fromFile: string, specifier: string, rootDir: string, allFiles: string[]): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Detect circular dependencies in the import graph
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectCircularDependencies(graph: ImportGraph): string[][];
|
|
14
|
+
/**
|
|
15
|
+
* Find deep imports (../../../ pattern)
|
|
16
|
+
*/
|
|
17
|
+
export declare function findDeepImports(graph: ImportGraph): {
|
|
18
|
+
file: string;
|
|
19
|
+
import: string;
|
|
20
|
+
depth: number;
|
|
21
|
+
}[];
|
|
22
|
+
/**
|
|
23
|
+
* Detect cross-feature imports (importing from sibling feature folders)
|
|
24
|
+
*/
|
|
25
|
+
export declare function findCrossFeatureImports(graph: ImportGraph, rootDir: string, srcDir?: string): {
|
|
26
|
+
from: string;
|
|
27
|
+
to: string;
|
|
28
|
+
importPath: string;
|
|
29
|
+
}[];
|
|
30
|
+
/**
|
|
31
|
+
* Find unused imports in a file
|
|
32
|
+
*/
|
|
33
|
+
export declare function findUnusedImports(content: string, imports: ImportInfo[]): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Calculate coupling between two files (how much A depends on B)
|
|
36
|
+
*/
|
|
37
|
+
export declare function calculateCoupling(graph: ImportGraph, fileA: string, fileB: string): number;
|
|
38
|
+
//# sourceMappingURL=import-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/import-tracker.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA6B5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,IAAI,CAgCf;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,EAAE,CAwCzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAerG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAc,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAgCpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAgBlF;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB1F"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// IMPORT TRACKER - Build import dependency graph across codebase
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { findSourceFiles } from './file-scanner.js';
|
|
6
|
+
import { parseFile, extractImports } from './ast-parser.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build a complete import graph for all source files in a directory
|
|
9
|
+
*/
|
|
10
|
+
export async function buildImportGraph(rootDir) {
|
|
11
|
+
const files = await findSourceFiles(rootDir);
|
|
12
|
+
const graph = {};
|
|
13
|
+
// Initialize graph entries
|
|
14
|
+
for (const file of files) {
|
|
15
|
+
graph[file] = { imports: [], importedBy: [] };
|
|
16
|
+
}
|
|
17
|
+
// Parse each file and extract imports
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
const parsed = parseFile(file);
|
|
20
|
+
if (!parsed)
|
|
21
|
+
continue;
|
|
22
|
+
const imports = extractImports(parsed.ast);
|
|
23
|
+
graph[file].imports = imports;
|
|
24
|
+
// Resolve import paths and build reverse mapping
|
|
25
|
+
for (const imp of imports) {
|
|
26
|
+
const resolved = resolveImportPath(file, imp.source, rootDir, files);
|
|
27
|
+
if (resolved && graph[resolved]) {
|
|
28
|
+
if (!graph[resolved].importedBy.includes(file)) {
|
|
29
|
+
graph[resolved].importedBy.push(file);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return graph;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve an import specifier to an actual file path
|
|
38
|
+
*/
|
|
39
|
+
export function resolveImportPath(fromFile, specifier, rootDir, allFiles) {
|
|
40
|
+
// Skip node_modules imports
|
|
41
|
+
if (!specifier.startsWith('.') && !specifier.startsWith('/')) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const fromDir = path.dirname(fromFile);
|
|
45
|
+
let resolved;
|
|
46
|
+
if (specifier.startsWith('.')) {
|
|
47
|
+
// Relative import
|
|
48
|
+
resolved = path.resolve(fromDir, specifier);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Absolute import (from root)
|
|
52
|
+
resolved = path.resolve(rootDir, specifier.startsWith('/') ? specifier.slice(1) : specifier);
|
|
53
|
+
}
|
|
54
|
+
// Try with extensions
|
|
55
|
+
const extensions = ['.js', '.jsx', '.ts', '.tsx', '/index.js', '/index.jsx', '/index.ts', '/index.tsx'];
|
|
56
|
+
for (const ext of extensions) {
|
|
57
|
+
const candidate = resolved + ext;
|
|
58
|
+
if (allFiles.includes(candidate)) {
|
|
59
|
+
return candidate;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Try exact match
|
|
63
|
+
if (allFiles.includes(resolved)) {
|
|
64
|
+
return resolved;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Detect circular dependencies in the import graph
|
|
70
|
+
*/
|
|
71
|
+
export function detectCircularDependencies(graph) {
|
|
72
|
+
const cycles = [];
|
|
73
|
+
const visited = new Set();
|
|
74
|
+
const recursionStack = new Set();
|
|
75
|
+
function dfs(file, currentPath) {
|
|
76
|
+
if (recursionStack.has(file)) {
|
|
77
|
+
// Found a cycle
|
|
78
|
+
const cycleStart = currentPath.indexOf(file);
|
|
79
|
+
if (cycleStart !== -1) {
|
|
80
|
+
cycles.push(currentPath.slice(cycleStart));
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (visited.has(file))
|
|
85
|
+
return;
|
|
86
|
+
visited.add(file);
|
|
87
|
+
recursionStack.add(file);
|
|
88
|
+
currentPath.push(file);
|
|
89
|
+
for (const imp of graph[file]?.imports || []) {
|
|
90
|
+
for (const [filePath, data] of Object.entries(graph)) {
|
|
91
|
+
if (data.importedBy.includes(file) || filePath === imp.source) {
|
|
92
|
+
dfs(filePath, [...currentPath]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
currentPath.pop();
|
|
97
|
+
recursionStack.delete(file);
|
|
98
|
+
}
|
|
99
|
+
for (const file of Object.keys(graph)) {
|
|
100
|
+
if (!visited.has(file)) {
|
|
101
|
+
dfs(file, []);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return cycles;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Find deep imports (../../../ pattern)
|
|
108
|
+
*/
|
|
109
|
+
export function findDeepImports(graph) {
|
|
110
|
+
const deepImports = [];
|
|
111
|
+
for (const [file, data] of Object.entries(graph)) {
|
|
112
|
+
for (const imp of data.imports) {
|
|
113
|
+
if (imp.source.startsWith('.')) {
|
|
114
|
+
const depth = (imp.source.match(/\.\.\//g) || []).length;
|
|
115
|
+
if (depth >= 2) {
|
|
116
|
+
deepImports.push({ file, import: imp.source, depth });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return deepImports.sort((a, b) => b.depth - a.depth);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Detect cross-feature imports (importing from sibling feature folders)
|
|
125
|
+
*/
|
|
126
|
+
export function findCrossFeatureImports(graph, rootDir, srcDir = 'src') {
|
|
127
|
+
const crossFeature = [];
|
|
128
|
+
const srcPath = path.join(rootDir, srcDir);
|
|
129
|
+
for (const [file, data] of Object.entries(graph)) {
|
|
130
|
+
const relFile = path.relative(srcPath, file);
|
|
131
|
+
const fileParts = relFile.split(path.sep);
|
|
132
|
+
if (fileParts.length < 2)
|
|
133
|
+
continue;
|
|
134
|
+
for (const imp of data.imports) {
|
|
135
|
+
if (!imp.source.startsWith('.'))
|
|
136
|
+
continue;
|
|
137
|
+
const resolved = resolveImportPath(file, imp.source, rootDir, Object.keys(graph));
|
|
138
|
+
if (!resolved)
|
|
139
|
+
continue;
|
|
140
|
+
const relResolved = path.relative(srcPath, resolved);
|
|
141
|
+
const resolvedParts = relResolved.split(path.sep);
|
|
142
|
+
if (resolvedParts.length < 2)
|
|
143
|
+
continue;
|
|
144
|
+
if (fileParts[0] !== resolvedParts[0] && !resolvedParts[0].startsWith('components') && !resolvedParts[0].startsWith('utils')) {
|
|
145
|
+
crossFeature.push({
|
|
146
|
+
from: file,
|
|
147
|
+
to: resolved,
|
|
148
|
+
importPath: imp.source,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return crossFeature;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Find unused imports in a file
|
|
157
|
+
*/
|
|
158
|
+
export function findUnusedImports(content, imports) {
|
|
159
|
+
const unused = [];
|
|
160
|
+
for (const imp of imports) {
|
|
161
|
+
for (const spec of imp.specifiers) {
|
|
162
|
+
const cleanName = spec.replace('* as ', '');
|
|
163
|
+
const regex = new RegExp(`\\b${escapeRegex(cleanName)}\\b`, 'g');
|
|
164
|
+
const matches = content.match(regex);
|
|
165
|
+
if (!matches || matches.length <= 1) {
|
|
166
|
+
unused.push(`${spec} from '${imp.source}'`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return unused;
|
|
171
|
+
}
|
|
172
|
+
function escapeRegex(str) {
|
|
173
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Calculate coupling between two files (how much A depends on B)
|
|
177
|
+
*/
|
|
178
|
+
export function calculateCoupling(graph, fileA, fileB) {
|
|
179
|
+
const importsFromA = graph[fileA]?.imports || [];
|
|
180
|
+
const importsFromB = graph[fileB]?.imports || [];
|
|
181
|
+
let score = 0;
|
|
182
|
+
for (const imp of importsFromA) {
|
|
183
|
+
if (imp.source.includes(path.basename(fileB, path.extname(fileB)))) {
|
|
184
|
+
score += 1;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const imp of importsFromB) {
|
|
188
|
+
if (imp.source.includes(path.basename(fileA, path.extname(fileA)))) {
|
|
189
|
+
score += 1;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return score;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=import-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-tracker.js","sourceRoot":"","sources":["../../src/utils/import-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { ImportGraph } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect feature name from a file path
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectFeatureFromPath(filePath: string, rootDir: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Detect feature from route path
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectFeatureFromRoute(routePath: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Cluster files by their import relationships to detect features
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectFeaturesByImportClustering(rootDir: string): Promise<Record<string, string[]>>;
|
|
14
|
+
/**
|
|
15
|
+
* Extract route paths from routing files
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractRoutePaths(rootDir: string): Promise<{
|
|
18
|
+
path: string;
|
|
19
|
+
component: string;
|
|
20
|
+
}[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Classify a file type based on its path and content
|
|
23
|
+
*/
|
|
24
|
+
export declare function classifyFileType(filePath: string, rootDir: string): 'feature' | 'shared' | 'utility' | 'config';
|
|
25
|
+
/**
|
|
26
|
+
* Standard subdirectories for each feature
|
|
27
|
+
*/
|
|
28
|
+
export declare const FEATURE_SUBDIRS: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Standard shared layer directories
|
|
31
|
+
*/
|
|
32
|
+
export declare const SHARED_DIRS: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Standard app-level directories
|
|
35
|
+
*/
|
|
36
|
+
export declare const APP_DIRS: string[];
|
|
37
|
+
/**
|
|
38
|
+
* Generate target path for a file based on its classification
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateTargetPath(filePath: string, rootDir: string, features: string[], featureMap: Record<string, string[]>): string;
|
|
41
|
+
/**
|
|
42
|
+
* Convert string to kebab-case
|
|
43
|
+
*/
|
|
44
|
+
export declare function toKebabCase(str: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Convert string to PascalCase
|
|
47
|
+
*/
|
|
48
|
+
export declare function toPascalCase(str: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Convert string to camelCase
|
|
51
|
+
*/
|
|
52
|
+
export declare function toCamelCase(str: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Detect current naming convention of a file
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectNamingConvention(filePath: string): 'kebab-case' | 'camelCase' | 'PascalCase' | 'SCREAMING_SNAKE' | 'snake_case';
|
|
57
|
+
/**
|
|
58
|
+
* Suggest better name for a file based on its content and context
|
|
59
|
+
*/
|
|
60
|
+
export declare function suggestFileName(filePath: string, content: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Get the feature a file belongs to based on its path
|
|
63
|
+
*/
|
|
64
|
+
export declare function getFileFeature(filePath: string, rootDir: string): string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Check if an import crosses feature boundaries
|
|
67
|
+
*/
|
|
68
|
+
export declare function isCrossFeatureImport(fromFile: string, importSource: string, rootDir: string, allFiles: string[]): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Calculate import depth (number of ../ traversals)
|
|
71
|
+
*/
|
|
72
|
+
export declare function getImportDepth(importSource: string): number;
|
|
73
|
+
/**
|
|
74
|
+
* Check if files are tightly coupled (mutual imports with many connections)
|
|
75
|
+
*/
|
|
76
|
+
export declare function areTightlyCoupled(graph: ImportGraph, fileA: string, fileB: string, threshold?: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Detect if a file is a "kitchen sink" utility file
|
|
79
|
+
*/
|
|
80
|
+
export declare function isKitchenSinkFile(filePath: string): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Suggest splits for a utility file based on exported functions
|
|
83
|
+
*/
|
|
84
|
+
export declare function suggestUtilitySplits(filePath: string, content: string): {
|
|
85
|
+
category: string;
|
|
86
|
+
functions: string[];
|
|
87
|
+
}[];
|
|
88
|
+
//# sourceMappingURL=refactor-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refactor-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/refactor-helpers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,aAAa,CAAC;AA4I3D;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBtF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUvE;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAsCnC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA6BvG;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAmD7C;AAMD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,EAA8D,CAAC;AAEnG;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,EAA+D,CAAC;AAEhG;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,EAAqC,CAAC;AAEnE;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACnC,MAAM,CA+BR;AA6BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,YAAY,CAUrI;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAuBf;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAU,GACpB,OAAO,CAgBT;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CA6C7C"}
|