@mathonsunday/dead-code-toolkit 0.1.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.
Files changed (94) hide show
  1. package/README.md +356 -0
  2. package/dist/analyzer.d.ts +23 -0
  3. package/dist/analyzer.d.ts.map +1 -0
  4. package/dist/analyzer.js +173 -0
  5. package/dist/analyzer.js.map +1 -0
  6. package/dist/checkers/knipChecker.d.ts +11 -0
  7. package/dist/checkers/knipChecker.d.ts.map +1 -0
  8. package/dist/checkers/knipChecker.js +226 -0
  9. package/dist/checkers/knipChecker.js.map +1 -0
  10. package/dist/checkers/typescriptChecker.d.ts +10 -0
  11. package/dist/checkers/typescriptChecker.d.ts.map +1 -0
  12. package/dist/checkers/typescriptChecker.js +174 -0
  13. package/dist/checkers/typescriptChecker.js.map +1 -0
  14. package/dist/cli/index.d.ts +7 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +204 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/config/detectors.d.ts +29 -0
  19. package/dist/config/detectors.d.ts.map +1 -0
  20. package/dist/config/detectors.js +159 -0
  21. package/dist/config/detectors.js.map +1 -0
  22. package/dist/config/templates.d.ts +76 -0
  23. package/dist/config/templates.d.ts.map +1 -0
  24. package/dist/config/templates.js +191 -0
  25. package/dist/config/templates.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +17 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/reporters/jsonReporter.d.ts +68 -0
  31. package/dist/reporters/jsonReporter.d.ts.map +1 -0
  32. package/dist/reporters/jsonReporter.js +161 -0
  33. package/dist/reporters/jsonReporter.js.map +1 -0
  34. package/dist/setup/hookInstaller.d.ts +36 -0
  35. package/dist/setup/hookInstaller.d.ts.map +1 -0
  36. package/dist/setup/hookInstaller.js +196 -0
  37. package/dist/setup/hookInstaller.js.map +1 -0
  38. package/dist/setup/installer.d.ts +10 -0
  39. package/dist/setup/installer.d.ts.map +1 -0
  40. package/dist/setup/installer.js +156 -0
  41. package/dist/setup/installer.js.map +1 -0
  42. package/dist/setup/packageJsonUpdater.d.ts +54 -0
  43. package/dist/setup/packageJsonUpdater.d.ts.map +1 -0
  44. package/dist/setup/packageJsonUpdater.js +129 -0
  45. package/dist/setup/packageJsonUpdater.js.map +1 -0
  46. package/dist/src/analyzer.d.ts +23 -0
  47. package/dist/src/analyzer.d.ts.map +1 -0
  48. package/dist/src/analyzer.js +173 -0
  49. package/dist/src/analyzer.js.map +1 -0
  50. package/dist/src/checkers/knipChecker.d.ts +11 -0
  51. package/dist/src/checkers/knipChecker.d.ts.map +1 -0
  52. package/dist/src/checkers/knipChecker.js +226 -0
  53. package/dist/src/checkers/knipChecker.js.map +1 -0
  54. package/dist/src/checkers/typescriptChecker.d.ts +10 -0
  55. package/dist/src/checkers/typescriptChecker.d.ts.map +1 -0
  56. package/dist/src/checkers/typescriptChecker.js +174 -0
  57. package/dist/src/checkers/typescriptChecker.js.map +1 -0
  58. package/dist/src/config/detectors.d.ts +29 -0
  59. package/dist/src/config/detectors.d.ts.map +1 -0
  60. package/dist/src/config/detectors.js +159 -0
  61. package/dist/src/config/detectors.js.map +1 -0
  62. package/dist/src/config/templates.d.ts +76 -0
  63. package/dist/src/config/templates.d.ts.map +1 -0
  64. package/dist/src/config/templates.js +191 -0
  65. package/dist/src/config/templates.js.map +1 -0
  66. package/dist/src/index.d.ts +13 -0
  67. package/dist/src/index.d.ts.map +1 -0
  68. package/dist/src/index.js +17 -0
  69. package/dist/src/index.js.map +1 -0
  70. package/dist/src/reporters/jsonReporter.d.ts +68 -0
  71. package/dist/src/reporters/jsonReporter.d.ts.map +1 -0
  72. package/dist/src/reporters/jsonReporter.js +161 -0
  73. package/dist/src/reporters/jsonReporter.js.map +1 -0
  74. package/dist/src/setup/hookInstaller.d.ts +36 -0
  75. package/dist/src/setup/hookInstaller.d.ts.map +1 -0
  76. package/dist/src/setup/hookInstaller.js +196 -0
  77. package/dist/src/setup/hookInstaller.js.map +1 -0
  78. package/dist/src/setup/installer.d.ts +10 -0
  79. package/dist/src/setup/installer.d.ts.map +1 -0
  80. package/dist/src/setup/installer.js +156 -0
  81. package/dist/src/setup/installer.js.map +1 -0
  82. package/dist/src/setup/packageJsonUpdater.d.ts +54 -0
  83. package/dist/src/setup/packageJsonUpdater.d.ts.map +1 -0
  84. package/dist/src/setup/packageJsonUpdater.js +129 -0
  85. package/dist/src/setup/packageJsonUpdater.js.map +1 -0
  86. package/dist/src/types.d.ts +177 -0
  87. package/dist/src/types.d.ts.map +1 -0
  88. package/dist/src/types.js +5 -0
  89. package/dist/src/types.js.map +1 -0
  90. package/dist/types.d.ts +177 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +5 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +84 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Project structure detection
3
+ * Auto-detects project type and configuration
4
+ */
5
+ import type { ProjectConfig } from '../types.js';
6
+ /**
7
+ * Detect project configuration and type
8
+ */
9
+ export declare function detectProjectConfig(projectRoot: string): ProjectConfig;
10
+ /**
11
+ * Get entry points for a project based on its type
12
+ */
13
+ export declare function getEntryPoints(config: ProjectConfig): string[];
14
+ /**
15
+ * Get project source patterns for Knip
16
+ */
17
+ export declare function getProjectPatterns(config: ProjectConfig): string[];
18
+ /**
19
+ * Get ignore patterns for Knip
20
+ */
21
+ export declare function getIgnorePatterns(): string[];
22
+ /**
23
+ * Get ESLint paths configuration
24
+ */
25
+ export declare function getESLintPaths(config: ProjectConfig): {
26
+ include: string[];
27
+ exclude: string[];
28
+ };
29
+ //# sourceMappingURL=detectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../src/config/detectors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA8EtE;AASD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAiC9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAqBlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAY5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAK9F"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Project structure detection
3
+ * Auto-detects project type and configuration
4
+ */
5
+ import { existsSync, readFileSync } from 'fs';
6
+ import { resolve } from 'path';
7
+ /**
8
+ * Detect project configuration and type
9
+ */
10
+ export function detectProjectConfig(projectRoot) {
11
+ const config = {
12
+ root: projectRoot,
13
+ hasPackageJson: false,
14
+ hasTypeScript: false,
15
+ type: 'unknown',
16
+ existingConfigs: {},
17
+ };
18
+ // Check for package.json
19
+ const packageJsonPath = resolve(projectRoot, 'package.json');
20
+ if (existsSync(packageJsonPath)) {
21
+ config.hasPackageJson = true;
22
+ try {
23
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
24
+ // Check for React
25
+ if (packageJson.dependencies?.react || packageJson.devDependencies?.react) {
26
+ config.type = 'react';
27
+ }
28
+ // Check for Node.js frameworks
29
+ else if (packageJson.dependencies?.express ||
30
+ packageJson.dependencies?.fastify ||
31
+ packageJson.dependencies?.['next.js'] ||
32
+ packageJson.dependencies?.nest ||
33
+ packageJson.devDependencies?.['@nestjs/core']) {
34
+ config.type = 'node';
35
+ }
36
+ // Default to Node for backend-only projects
37
+ else if (packageJson.type === 'module' && !packageJson.dependencies?.react) {
38
+ config.type = 'node';
39
+ }
40
+ // Check if it's a monorepo
41
+ if (packageJson.workspaces) {
42
+ config.type = 'fullstack';
43
+ }
44
+ }
45
+ catch (_error) {
46
+ // Ignore parsing errors
47
+ }
48
+ }
49
+ // Check for TypeScript
50
+ const tsconfigPath = resolve(projectRoot, 'tsconfig.json');
51
+ if (existsSync(tsconfigPath)) {
52
+ config.hasTypeScript = true;
53
+ config.tsconfigPath = tsconfigPath;
54
+ }
55
+ // Detect existing configs
56
+ const configFiles = [
57
+ { key: 'eslint', names: ['.eslintrc.js', '.eslintrc.json', 'eslint.config.js'] },
58
+ { key: 'prettier', names: ['.prettierrc', '.prettierrc.js', 'prettier.config.js'] },
59
+ { key: 'knip', names: ['knip.json'] },
60
+ { key: 'husky', names: ['.husky'] },
61
+ ];
62
+ for (const { key, names } of configFiles) {
63
+ for (const name of names) {
64
+ const path = resolve(projectRoot, name);
65
+ if (existsSync(path)) {
66
+ config.existingConfigs[key] = path;
67
+ break;
68
+ }
69
+ }
70
+ }
71
+ // If no type detected, infer from structure
72
+ if (config.type === 'unknown') {
73
+ if (hasSrcDirectory(projectRoot)) {
74
+ config.type = config.hasPackageJson ? 'node' : 'unknown';
75
+ }
76
+ }
77
+ return config;
78
+ }
79
+ /**
80
+ * Check if project has a src directory
81
+ */
82
+ function hasSrcDirectory(projectRoot) {
83
+ return existsSync(resolve(projectRoot, 'src'));
84
+ }
85
+ /**
86
+ * Get entry points for a project based on its type
87
+ */
88
+ export function getEntryPoints(config) {
89
+ const entry = [];
90
+ const root = config.root;
91
+ switch (config.type) {
92
+ case 'react':
93
+ entry.push('src/main.ts', 'src/main.tsx', 'src/index.ts', 'src/index.tsx');
94
+ break;
95
+ case 'node':
96
+ // Common Node.js entry points
97
+ entry.push('src/index.ts', 'src/main.ts', 'dist/index.js', 'index.ts', 'api/index.ts');
98
+ break;
99
+ case 'fullstack':
100
+ // Monorepo: pick sensible defaults
101
+ entry.push('src/main.ts', 'src/index.ts', 'api/index.ts', 'backend/src/index.ts');
102
+ break;
103
+ default:
104
+ // Fallback
105
+ entry.push('src/index.ts', 'index.ts');
106
+ }
107
+ // Filter to entries that exist
108
+ const existingEntries = entry.filter((e) => existsSync(resolve(root, e)));
109
+ // If nothing found, add default globs
110
+ if (existingEntries.length === 0) {
111
+ existingEntries.push('src/index.ts');
112
+ }
113
+ return existingEntries;
114
+ }
115
+ /**
116
+ * Get project source patterns for Knip
117
+ */
118
+ export function getProjectPatterns(config) {
119
+ const patterns = [];
120
+ switch (config.type) {
121
+ case 'react':
122
+ patterns.push('src/**/*.{ts,tsx}');
123
+ break;
124
+ case 'node':
125
+ patterns.push('src/**/*.ts', 'api/**/*.ts', 'lib/**/*.ts');
126
+ break;
127
+ case 'fullstack':
128
+ patterns.push('src/**/*.{ts,tsx}', 'api/**/*.ts', 'backend/**/*.ts');
129
+ break;
130
+ default:
131
+ patterns.push('**/*.ts', '**/*.tsx');
132
+ }
133
+ return patterns;
134
+ }
135
+ /**
136
+ * Get ignore patterns for Knip
137
+ */
138
+ export function getIgnorePatterns() {
139
+ return [
140
+ 'dist/**',
141
+ 'build/**',
142
+ 'node_modules/**',
143
+ '**/*.d.ts',
144
+ '**/node_modules/**',
145
+ '.next/**',
146
+ 'out/**',
147
+ 'coverage/**',
148
+ '.git/**',
149
+ ];
150
+ }
151
+ /**
152
+ * Get ESLint paths configuration
153
+ */
154
+ export function getESLintPaths(config) {
155
+ const include = getProjectPatterns(config);
156
+ const exclude = getIgnorePatterns();
157
+ return { include, exclude };
158
+ }
159
+ //# sourceMappingURL=detectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/config/detectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Configuration file templates
3
+ * Generates default configs for Knip, ESLint, etc.
4
+ */
5
+ import type { ProjectConfig } from '../types.js';
6
+ /**
7
+ * Generate knip.json configuration
8
+ */
9
+ export declare function generateKnipConfig(config: ProjectConfig): Record<string, unknown>;
10
+ /**
11
+ * Generate knip.json as JSON string
12
+ */
13
+ export declare function generateKnipConfigJSON(config: ProjectConfig): string;
14
+ /**
15
+ * Generate ESLint configuration partial (rules to add)
16
+ */
17
+ export declare function generateESLintRules(): Record<string, unknown>;
18
+ /**
19
+ * Generate ESLint configuration as JavaScript code
20
+ */
21
+ export declare function generateESLintConfigCode(): string;
22
+ /**
23
+ * Generate typecoveragerc.json configuration
24
+ */
25
+ export declare function generateTypeCoverageConfig(config: ProjectConfig): Record<string, unknown>;
26
+ /**
27
+ * Generate typecoveragerc.json as JSON string
28
+ */
29
+ export declare function generateTypeCoverageConfigJSON(config: ProjectConfig): string;
30
+ /**
31
+ * Generate .lintstagedrc.json configuration
32
+ */
33
+ export declare function generateLintStagedConfig(): Record<string, unknown>;
34
+ /**
35
+ * Generate .lintstagedrc.json as JSON string
36
+ */
37
+ export declare function generateLintStagedConfigJSON(): string;
38
+ /**
39
+ * Generate pre-commit hook script
40
+ */
41
+ export declare function generatePreCommitHook(): string;
42
+ /**
43
+ * Generate package.json scripts to add
44
+ */
45
+ export declare function generatePackageJsonScripts(): Record<string, string>;
46
+ /**
47
+ * Configuration templates metadata
48
+ */
49
+ export declare const CONFIG_TEMPLATES: {
50
+ readonly knip: {
51
+ readonly filename: "knip.json";
52
+ readonly description: "Knip configuration for dead code detection";
53
+ readonly generator: typeof generateKnipConfigJSON;
54
+ };
55
+ readonly eslint: {
56
+ readonly filename: "eslint.config.js (partial - add to existing config)";
57
+ readonly description: "ESLint rules for dead code detection";
58
+ readonly generator: typeof generateESLintConfigCode;
59
+ };
60
+ readonly typeCoverage: {
61
+ readonly filename: "typecoveragerc.json";
62
+ readonly description: "Type coverage measurement configuration";
63
+ readonly generator: typeof generateTypeCoverageConfigJSON;
64
+ };
65
+ readonly lintStaged: {
66
+ readonly filename: ".lintstagedrc.json";
67
+ readonly description: "Lint-staged configuration for staged files";
68
+ readonly generator: typeof generateLintStagedConfigJSON;
69
+ };
70
+ readonly preCommit: {
71
+ readonly filename: ".husky/pre-commit";
72
+ readonly description: "Pre-commit hook script";
73
+ readonly generator: typeof generatePreCommitHook;
74
+ };
75
+ };
76
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/config/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAY7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAmBjD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKlE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAuC9C;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASnE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnB,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Configuration file templates
3
+ * Generates default configs for Knip, ESLint, etc.
4
+ */
5
+ import { getEntryPoints, getProjectPatterns, getIgnorePatterns } from './detectors.js';
6
+ /**
7
+ * Generate knip.json configuration
8
+ */
9
+ export function generateKnipConfig(config) {
10
+ const entryPoints = getEntryPoints(config);
11
+ const patterns = getProjectPatterns(config);
12
+ const ignorePatterns = getIgnorePatterns();
13
+ return {
14
+ entry: entryPoints,
15
+ project: patterns,
16
+ ignore: ignorePatterns,
17
+ ignoreDependencies: [
18
+ '@types/node', // Type definitions are not "used"
19
+ 'typescript', // Compiler is not "used" in code
20
+ ],
21
+ };
22
+ }
23
+ /**
24
+ * Generate knip.json as JSON string
25
+ */
26
+ export function generateKnipConfigJSON(config) {
27
+ return JSON.stringify(generateKnipConfig(config), null, 2);
28
+ }
29
+ /**
30
+ * Generate ESLint configuration partial (rules to add)
31
+ */
32
+ export function generateESLintRules() {
33
+ return {
34
+ '@typescript-eslint/no-redundant-type-constituents': 'warn',
35
+ '@typescript-eslint/no-unused-vars': [
36
+ 'warn',
37
+ {
38
+ argsIgnorePattern: '^_',
39
+ varsIgnorePattern: '^_',
40
+ caughtErrorsIgnorePattern: '^_',
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ /**
46
+ * Generate ESLint configuration as JavaScript code
47
+ */
48
+ export function generateESLintConfigCode() {
49
+ return `// Add to eslint.config.js or update your existing config
50
+ export default [
51
+ // ... existing configs ...
52
+ {
53
+ files: ['src/**/*.{ts,tsx}', 'api/**/*.ts'],
54
+ rules: {
55
+ '@typescript-eslint/no-redundant-type-constituents': 'warn',
56
+ '@typescript-eslint/no-unused-vars': [
57
+ 'warn',
58
+ {
59
+ argsIgnorePattern: '^_',
60
+ varsIgnorePattern: '^_',
61
+ caughtErrorsIgnorePattern: '^_',
62
+ },
63
+ ],
64
+ },
65
+ },
66
+ ];`;
67
+ }
68
+ /**
69
+ * Generate typecoveragerc.json configuration
70
+ */
71
+ export function generateTypeCoverageConfig(config) {
72
+ const patterns = getProjectPatterns(config);
73
+ return {
74
+ files: patterns,
75
+ ignore: getIgnorePatterns(),
76
+ ignoreFiles: ['**/*.d.ts', '**/node_modules/**'],
77
+ ignoreCatch: true,
78
+ skipLibCheck: true,
79
+ checkPropertyAccess: true,
80
+ strict: true,
81
+ suppressError: false,
82
+ };
83
+ }
84
+ /**
85
+ * Generate typecoveragerc.json as JSON string
86
+ */
87
+ export function generateTypeCoverageConfigJSON(config) {
88
+ return JSON.stringify(generateTypeCoverageConfig(config), null, 2);
89
+ }
90
+ /**
91
+ * Generate .lintstagedrc.json configuration
92
+ */
93
+ export function generateLintStagedConfig() {
94
+ return {
95
+ '*.{ts,tsx}': ['eslint --fix'],
96
+ '*.{json,md}': ['prettier --write'],
97
+ };
98
+ }
99
+ /**
100
+ * Generate .lintstagedrc.json as JSON string
101
+ */
102
+ export function generateLintStagedConfigJSON() {
103
+ return JSON.stringify(generateLintStagedConfig(), null, 2);
104
+ }
105
+ /**
106
+ * Generate pre-commit hook script
107
+ */
108
+ export function generatePreCommitHook() {
109
+ return `#!/bin/sh
110
+ # Pre-commit hook for dead code and quality checks
111
+ # Generated by @mathonsunday/dead-code-toolkit
112
+
113
+ set -e
114
+
115
+ echo "[Dead Code Toolkit] Running pre-commit checks..."
116
+
117
+ # Stage 1: lint-staged (on staged files only)
118
+ echo "[Stage 1/4] Running lint-staged (ESLint + Prettier)..."
119
+ npx lint-staged || {
120
+ echo "❌ Lint-staged failed"
121
+ exit 1
122
+ }
123
+
124
+ # Stage 2: Full type check
125
+ echo "[Stage 2/4] Running TypeScript type check..."
126
+ npm run type-check || {
127
+ echo "❌ Type check failed"
128
+ exit 1
129
+ }
130
+
131
+ # Stage 3: Dead code detection (optional - doesn't block on failure)
132
+ echo "[Stage 3/4] Checking for dead code..."
133
+ npm run dead-code || {
134
+ echo "⚠️ Dead code detected. Consider running: npm run dead-code:fix"
135
+ # Don't exit - just warn
136
+ }
137
+
138
+ # Stage 4: Run tests
139
+ echo "[Stage 4/4] Running tests..."
140
+ npm test -- --run || {
141
+ echo "❌ Tests failed"
142
+ exit 1
143
+ }
144
+
145
+ echo "✅ All pre-commit checks passed!"
146
+ exit 0`;
147
+ }
148
+ /**
149
+ * Generate package.json scripts to add
150
+ */
151
+ export function generatePackageJsonScripts() {
152
+ return {
153
+ 'dead-code': 'knip',
154
+ 'dead-code:fix': 'knip --fix',
155
+ 'dead-code:analyze': 'dead-code-toolkit analyze',
156
+ 'type:coverage': 'type-coverage --detail --strict',
157
+ 'type:report': 'typescript-coverage-report',
158
+ verify: 'npm run type-check && npm run lint && npm run dead-code && npm test',
159
+ };
160
+ }
161
+ /**
162
+ * Configuration templates metadata
163
+ */
164
+ export const CONFIG_TEMPLATES = {
165
+ knip: {
166
+ filename: 'knip.json',
167
+ description: 'Knip configuration for dead code detection',
168
+ generator: generateKnipConfigJSON,
169
+ },
170
+ eslint: {
171
+ filename: 'eslint.config.js (partial - add to existing config)',
172
+ description: 'ESLint rules for dead code detection',
173
+ generator: generateESLintConfigCode,
174
+ },
175
+ typeCoverage: {
176
+ filename: 'typecoveragerc.json',
177
+ description: 'Type coverage measurement configuration',
178
+ generator: generateTypeCoverageConfigJSON,
179
+ },
180
+ lintStaged: {
181
+ filename: '.lintstagedrc.json',
182
+ description: 'Lint-staged configuration for staged files',
183
+ generator: generateLintStagedConfigJSON,
184
+ },
185
+ preCommit: {
186
+ filename: '.husky/pre-commit',
187
+ description: 'Pre-commit hook script',
188
+ generator: generatePreCommitHook,
189
+ },
190
+ };
191
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/config/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Main entry point for dead code toolkit
3
+ * Exports public API for programmatic usage
4
+ */
5
+ export { analyzeDeadCode, fixFindings } from './analyzer.js';
6
+ export type { AnalysisOptions, AnalysisResult, AnalysisSummary, CheckResult, CheckType, Finding, FixResult, FixDetail, SetupOptions, SetupResult, ProjectConfig, } from './types.js';
7
+ export { createJSONReport, formatJSONReport, formatJSONReportCompact, createLLMSummary, type JSONReport, type JSONFinding, type LLMSummaryReport, } from './reporters/jsonReporter.js';
8
+ export { runKnipCheck } from './checkers/knipChecker.js';
9
+ export { runTypeScriptCheck } from './checkers/typescriptChecker.js';
10
+ export { setupProject } from './setup/installer.js';
11
+ export { detectProjectConfig, getEntryPoints, getProjectPatterns } from './config/detectors.js';
12
+ export { generateKnipConfig, generateESLintRules, generateTypeCoverageConfig, generateLintStagedConfig, generatePackageJsonScripts, } from './config/templates.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,SAAS,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Main entry point for dead code toolkit
3
+ * Exports public API for programmatic usage
4
+ */
5
+ // Core functions
6
+ export { analyzeDeadCode, fixFindings } from './analyzer.js';
7
+ // Reporters
8
+ export { createJSONReport, formatJSONReport, formatJSONReportCompact, createLLMSummary, } from './reporters/jsonReporter.js';
9
+ // Checkers (for advanced usage)
10
+ export { runKnipCheck } from './checkers/knipChecker.js';
11
+ export { runTypeScriptCheck } from './checkers/typescriptChecker.js';
12
+ // Setup functions
13
+ export { setupProject } from './setup/installer.js';
14
+ // Config utilities (for advanced usage)
15
+ export { detectProjectConfig, getEntryPoints, getProjectPatterns } from './config/detectors.js';
16
+ export { generateKnipConfig, generateESLintRules, generateTypeCoverageConfig, generateLintStagedConfig, generatePackageJsonScripts, } from './config/templates.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiB7D,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,GAIjB,MAAM,6BAA6B,CAAC;AAErC,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wCAAwC;AACxC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * JSON reporter - formats analysis results as JSON for programmatic consumption
3
+ * Optimized for LLM interpretation
4
+ */
5
+ import type { AnalysisResult } from '../types.js';
6
+ export interface JSONReport {
7
+ version: '1.0';
8
+ timestamp: string;
9
+ status: AnalysisResult['status'];
10
+ summary: {
11
+ totalIssues: number;
12
+ fixableIssues: number;
13
+ byCategory: Record<string, number>;
14
+ bySeverity: {
15
+ errors: number;
16
+ warnings: number;
17
+ info: number;
18
+ };
19
+ executionTimeMs: number;
20
+ };
21
+ findings: JSONFinding[];
22
+ recommendations: string[];
23
+ checksRun: string[];
24
+ }
25
+ export interface JSONFinding {
26
+ id: string;
27
+ category: string;
28
+ severity: string;
29
+ file: string;
30
+ location?: {
31
+ line?: number;
32
+ column?: number;
33
+ };
34
+ message: string;
35
+ fixable: boolean;
36
+ suggestion?: string;
37
+ source: string;
38
+ rule?: string;
39
+ }
40
+ /**
41
+ * Convert analysis result to JSON report
42
+ */
43
+ export declare function createJSONReport(result: AnalysisResult): JSONReport;
44
+ /**
45
+ * Format JSON report as indented string for display
46
+ */
47
+ export declare function formatJSONReport(report: JSONReport): string;
48
+ /**
49
+ * Format JSON report as compact string for logging
50
+ */
51
+ export declare function formatJSONReportCompact(report: JSONReport): string;
52
+ /**
53
+ * Create a summary report for LLM consumption
54
+ */
55
+ export interface LLMSummaryReport {
56
+ status: 'success' | 'failure' | 'partial' | 'clean';
57
+ totalIssues: number;
58
+ summary: string;
59
+ topIssues: Array<{
60
+ count: number;
61
+ type: string;
62
+ severity: string;
63
+ fixable: number;
64
+ }>;
65
+ actionItems: string[];
66
+ }
67
+ export declare function createLLMSummary(result: AnalysisResult): LLMSummaryReport;
68
+ //# sourceMappingURL=jsonReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonReporter.d.ts","sourceRoot":"","sources":["../../src/reporters/jsonReporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,EAAE;YACV,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAoBnE;AAoFD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA6CzE"}