depfixer 1.0.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 (54) hide show
  1. package/README.md +128 -0
  2. package/dist/commands/analyze.d.ts +18 -0
  3. package/dist/commands/analyze.d.ts.map +1 -0
  4. package/dist/commands/analyze.js +404 -0
  5. package/dist/commands/analyze.js.map +1 -0
  6. package/dist/commands/fix.d.ts +14 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +82 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/graph.d.ts +12 -0
  11. package/dist/commands/graph.d.ts.map +1 -0
  12. package/dist/commands/graph.js +58 -0
  13. package/dist/commands/graph.js.map +1 -0
  14. package/dist/commands/login.d.ts +11 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +109 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +7 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +22 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +108 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/services/api-client.d.ts +89 -0
  27. package/dist/services/api-client.d.ts.map +1 -0
  28. package/dist/services/api-client.js +162 -0
  29. package/dist/services/api-client.js.map +1 -0
  30. package/dist/services/auth-manager.d.ts +30 -0
  31. package/dist/services/auth-manager.d.ts.map +1 -0
  32. package/dist/services/auth-manager.js +82 -0
  33. package/dist/services/auth-manager.js.map +1 -0
  34. package/dist/services/cache-manager.d.ts +52 -0
  35. package/dist/services/cache-manager.d.ts.map +1 -0
  36. package/dist/services/cache-manager.js +87 -0
  37. package/dist/services/cache-manager.js.map +1 -0
  38. package/dist/services/gitignore.d.ts +19 -0
  39. package/dist/services/gitignore.d.ts.map +1 -0
  40. package/dist/services/gitignore.js +64 -0
  41. package/dist/services/gitignore.js.map +1 -0
  42. package/dist/services/package-json.d.ts +39 -0
  43. package/dist/services/package-json.d.ts.map +1 -0
  44. package/dist/services/package-json.js +106 -0
  45. package/dist/services/package-json.js.map +1 -0
  46. package/dist/utils/hash.d.ts +6 -0
  47. package/dist/utils/hash.d.ts.map +1 -0
  48. package/dist/utils/hash.js +9 -0
  49. package/dist/utils/hash.js.map +1 -0
  50. package/dist/utils/output.d.ts +91 -0
  51. package/dist/utils/output.d.ts.map +1 -0
  52. package/dist/utils/output.js +222 -0
  53. package/dist/utils/output.js.map +1 -0
  54. package/package.json +51 -0
@@ -0,0 +1,82 @@
1
+ import chalk from 'chalk';
2
+ import { PackageJsonService } from '../services/package-json.js';
3
+ import { CacheManager } from '../services/cache-manager.js';
4
+ import { createSpinner, printHeader, printSuccess, printError, printWarning, } from '../utils/output.js';
5
+ /**
6
+ * Fix command
7
+ *
8
+ * Applies cached fixes from a previous --full analysis
9
+ * Creates package.json.fixed (does not modify original)
10
+ *
11
+ * This command is FREE - uses locally cached solution
12
+ */
13
+ export async function fixCommand(options) {
14
+ const projectDir = options.path || process.cwd();
15
+ try {
16
+ const cacheManager = new CacheManager(projectDir);
17
+ const packageJsonService = new PackageJsonService();
18
+ // Check if cache exists
19
+ const cacheExists = await cacheManager.cacheExists();
20
+ if (!cacheExists) {
21
+ printError('No cached analysis found.');
22
+ console.log();
23
+ console.log('Run one of these commands first:');
24
+ console.log(` ${chalk.cyan('npx depfixer analyze --full')}`);
25
+ console.log(` ${chalk.cyan('npx depfixer analyze --migrate <version>')}`);
26
+ process.exit(1);
27
+ }
28
+ // Read current package.json
29
+ const spinner = createSpinner('Reading package.json...').start();
30
+ const { content, parsed } = await packageJsonService.read(projectDir);
31
+ spinner.succeed('Package.json loaded');
32
+ // Verify hash matches
33
+ const hashSpinner = createSpinner('Verifying package.json unchanged...').start();
34
+ const hashValid = await cacheManager.verifyHash(content);
35
+ if (!hashValid) {
36
+ hashSpinner.fail('Hash mismatch');
37
+ console.log();
38
+ printWarning('package.json has changed since your last analysis.');
39
+ console.log('The cached fix may be unsafe to apply.');
40
+ console.log();
41
+ console.log(`Run ${chalk.cyan('npx depfixer analyze --full')} to get updated recommendations.`);
42
+ process.exit(1);
43
+ }
44
+ hashSpinner.succeed('Package.json verified');
45
+ // Load cache
46
+ const cache = await cacheManager.loadCache();
47
+ if (!cache) {
48
+ printError('Failed to load cache');
49
+ process.exit(1);
50
+ }
51
+ // Calculate changes
52
+ const changes = packageJsonService.getChanges(parsed, cache.solution);
53
+ if (changes.length === 0) {
54
+ printSuccess('No changes to apply - package.json is already up to date!');
55
+ return;
56
+ }
57
+ // Show what will be changed
58
+ printHeader(`Applying ${changes.length} fixes`);
59
+ console.log();
60
+ for (const change of changes) {
61
+ console.log(` ${change.package}: ${chalk.red(change.from)} → ${chalk.green(change.to)}`);
62
+ }
63
+ console.log();
64
+ // Apply fixes
65
+ const applySpinner = createSpinner('Creating package.json.fixed...').start();
66
+ const fixedPath = await packageJsonService.applyFixes(projectDir, cache.solution);
67
+ applySpinner.succeed('Fixes applied');
68
+ // Success message
69
+ console.log();
70
+ printSuccess(`Created: ${chalk.cyan(fixedPath)}`);
71
+ console.log();
72
+ console.log('To apply changes:');
73
+ console.log(` 1. Review ${chalk.cyan('package.json.fixed')}`);
74
+ console.log(` 2. ${chalk.cyan('mv package.json.fixed package.json')} (or copy)`);
75
+ console.log(` 3. ${chalk.cyan('npm install')}`);
76
+ }
77
+ catch (error) {
78
+ printError(error.message);
79
+ process.exit(1);
80
+ }
81
+ }
82
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface GraphOptions {
2
+ path?: string;
3
+ }
4
+ /**
5
+ * Graph command
6
+ *
7
+ * Opens web visualization in browser
8
+ * Requires prior --full analysis (uses cached analysis ID)
9
+ */
10
+ export declare function graphCommand(options: GraphOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAUA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDvE"}
@@ -0,0 +1,58 @@
1
+ import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { CacheManager } from '../services/cache-manager.js';
4
+ import { AuthManager } from '../services/auth-manager.js';
5
+ import { printError, printInfo, printSuccess, } from '../utils/output.js';
6
+ /**
7
+ * Graph command
8
+ *
9
+ * Opens web visualization in browser
10
+ * Requires prior --full analysis (uses cached analysis ID)
11
+ */
12
+ export async function graphCommand(options) {
13
+ const projectDir = options.path || process.cwd();
14
+ const cacheManager = new CacheManager(projectDir);
15
+ const authManager = new AuthManager();
16
+ try {
17
+ // Check if logged in
18
+ if (!await authManager.isAuthenticated()) {
19
+ printError('Authentication required.');
20
+ console.log(`Run ${chalk.cyan('npx depfixer login')} first.`);
21
+ process.exit(1);
22
+ }
23
+ // Check if cache exists
24
+ const cacheExists = await cacheManager.cacheExists();
25
+ if (!cacheExists) {
26
+ printError('No cached analysis found.');
27
+ console.log();
28
+ console.log('Run a full analysis first:');
29
+ console.log(` ${chalk.cyan('npx depfixer analyze --full')}`);
30
+ process.exit(1);
31
+ }
32
+ // Load cache to get analysis info
33
+ const cache = await cacheManager.loadCache();
34
+ if (!cache) {
35
+ printError('Failed to load cache');
36
+ process.exit(1);
37
+ }
38
+ // Build graph URL
39
+ const baseUrl = process.env.DEPFIXER_WEB_URL || 'https://app.depfixer.com';
40
+ const graphUrl = `${baseUrl}/dashboard`;
41
+ printInfo('Opening dependency graph in browser...');
42
+ console.log(` ${chalk.blue(graphUrl)}`);
43
+ console.log();
44
+ try {
45
+ await open(graphUrl);
46
+ printSuccess('Browser opened!');
47
+ }
48
+ catch {
49
+ console.log(chalk.dim('(Could not open browser automatically)'));
50
+ console.log(`Please visit: ${chalk.blue(graphUrl)}`);
51
+ }
52
+ }
53
+ catch (error) {
54
+ printError(error.message);
55
+ process.exit(1);
56
+ }
57
+ }
58
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,GACb,MAAM,oBAAoB,CAAC;AAM5B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,qBAAqB;QACrB,IAAI,CAAC,MAAM,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;YACzC,UAAU,CAAC,0BAA0B,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,UAAU,CAAC,2BAA2B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kCAAkC;QAClC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,sBAAsB,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;QAC3E,MAAM,QAAQ,GAAG,GAAG,OAAO,YAAY,CAAC;QAExC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Login command
3
+ *
4
+ * Implements Vercel-style device authorization flow:
5
+ * 1. Generate device code + user code
6
+ * 2. Open browser for user to enter code
7
+ * 3. Poll until approved
8
+ * 4. Save tokens locally
9
+ */
10
+ export declare function loginCommand(): Promise<void>;
11
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAwGlD"}
@@ -0,0 +1,109 @@
1
+ import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { ApiClient } from '../services/api-client.js';
4
+ import { AuthManager } from '../services/auth-manager.js';
5
+ import { createSpinner, printSuccess, printError, printInfo, } from '../utils/output.js';
6
+ /**
7
+ * Login command
8
+ *
9
+ * Implements Vercel-style device authorization flow:
10
+ * 1. Generate device code + user code
11
+ * 2. Open browser for user to enter code
12
+ * 3. Poll until approved
13
+ * 4. Save tokens locally
14
+ */
15
+ export async function loginCommand() {
16
+ const apiClient = new ApiClient();
17
+ const authManager = new AuthManager();
18
+ // Check if already logged in
19
+ if (await authManager.isAuthenticated()) {
20
+ printInfo('You are already logged in.');
21
+ console.log(`Run ${chalk.cyan('npx depfixer logout')} to sign out.`);
22
+ return;
23
+ }
24
+ try {
25
+ // Step 1: Generate device code
26
+ const spinner = createSpinner('Generating login code...').start();
27
+ const response = await apiClient.createDeviceCode();
28
+ if (!response.success || !response.data) {
29
+ spinner.fail('Failed to generate login code');
30
+ throw new Error(response.error || 'Unknown error');
31
+ }
32
+ spinner.succeed('Login code generated');
33
+ const { deviceCode, userCode, verificationUrl, expiresIn, pollInterval } = response.data;
34
+ // Step 2: Show user code and open browser
35
+ console.log();
36
+ console.log(chalk.bold('Your login code:'));
37
+ console.log();
38
+ console.log(` ${chalk.cyan.bold.underline(userCode)}`);
39
+ console.log();
40
+ console.log('Enter this code at:');
41
+ console.log(` ${chalk.blue(verificationUrl)}`);
42
+ console.log();
43
+ // Open browser
44
+ printInfo('Opening browser...');
45
+ try {
46
+ await open(verificationUrl);
47
+ }
48
+ catch {
49
+ console.log(chalk.dim('(Could not open browser automatically)'));
50
+ }
51
+ // Step 3: Poll for approval
52
+ console.log();
53
+ const pollSpinner = createSpinner('Waiting for approval...').start();
54
+ const expiresAt = Date.now() + expiresIn * 1000;
55
+ while (Date.now() < expiresAt) {
56
+ // Wait for poll interval
57
+ await sleep(pollInterval * 1000);
58
+ try {
59
+ const pollResponse = await apiClient.pollDeviceCode(deviceCode);
60
+ if (!pollResponse.success) {
61
+ continue; // Keep polling
62
+ }
63
+ const status = pollResponse.data?.status;
64
+ if (status === 'approved') {
65
+ pollSpinner.succeed('Login approved!');
66
+ // Save tokens
67
+ const { accessToken, refreshToken, expiresIn: tokenExpiresIn } = pollResponse.data;
68
+ await authManager.saveTokens(accessToken, refreshToken, tokenExpiresIn);
69
+ console.log();
70
+ printSuccess('You are now logged in!');
71
+ console.log();
72
+ console.log('Try these commands:');
73
+ console.log(` ${chalk.cyan('npx depfixer analyze --full')} Full analysis with recommendations`);
74
+ console.log(` ${chalk.cyan('npx depfixer analyze --migrate 19')} Migration analysis`);
75
+ return;
76
+ }
77
+ if (status === 'expired') {
78
+ pollSpinner.fail('Login code expired');
79
+ throw new Error('Login code expired. Please try again.');
80
+ }
81
+ if (status === 'denied') {
82
+ pollSpinner.fail('Login denied');
83
+ throw new Error('Login was denied. Please try again.');
84
+ }
85
+ // status === 'pending', keep polling
86
+ }
87
+ catch (error) {
88
+ // Network error, keep polling
89
+ if (error.message.includes('expired') || error.message.includes('denied')) {
90
+ throw error;
91
+ }
92
+ }
93
+ }
94
+ // Timeout
95
+ pollSpinner.fail('Login timed out');
96
+ throw new Error('Login timed out. Please try again.');
97
+ }
98
+ catch (error) {
99
+ printError(error.message);
100
+ process.exit(1);
101
+ }
102
+ }
103
+ /**
104
+ * Sleep helper
105
+ */
106
+ function sleep(ms) {
107
+ return new Promise(resolve => setTimeout(resolve, ms));
108
+ }
109
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Logout command
3
+ *
4
+ * Clears stored credentials
5
+ */
6
+ export declare function logoutCommand(): Promise<void>;
7
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAenD"}
@@ -0,0 +1,22 @@
1
+ import chalk from 'chalk';
2
+ import { AuthManager } from '../services/auth-manager.js';
3
+ import { printSuccess, printInfo } from '../utils/output.js';
4
+ /**
5
+ * Logout command
6
+ *
7
+ * Clears stored credentials
8
+ */
9
+ export async function logoutCommand() {
10
+ const authManager = new AuthManager();
11
+ // Check if logged in
12
+ if (!await authManager.isAuthenticated()) {
13
+ printInfo('You are not logged in.');
14
+ return;
15
+ }
16
+ // Clear credentials
17
+ await authManager.clearCredentials();
18
+ printSuccess('Successfully logged out.');
19
+ console.log();
20
+ console.log(`Run ${chalk.cyan('npx depfixer login')} to sign in again.`);
21
+ }
22
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,qBAAqB;IACrB,IAAI,CAAC,MAAM,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;QACzC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;IAErC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { analyzeCommand } from './commands/analyze.js';
5
+ import { fixCommand } from './commands/fix.js';
6
+ import { loginCommand } from './commands/login.js';
7
+ import { logoutCommand } from './commands/logout.js';
8
+ import { graphCommand } from './commands/graph.js';
9
+ // Package info
10
+ const packageVersion = '1.0.0';
11
+ program
12
+ .name('depfixer')
13
+ .description('CLI tool for analyzing and fixing JavaScript/TypeScript dependency conflicts')
14
+ .version(packageVersion, '-v, --version', 'Display version number')
15
+ .helpOption('-h, --help', 'Display help information')
16
+ .addHelpText('after', `
17
+ ${chalk.bold('Examples:')}
18
+ ${chalk.cyan('npx depfixer analyze')} Free audit - shows issues (hides fixes)
19
+ ${chalk.cyan('npx depfixer analyze --full')} Full analysis with fix recommendations
20
+ ${chalk.cyan('npx depfixer analyze --migrate 19')} Migration analysis to Angular/React version
21
+ ${chalk.cyan('npx depfixer fix')} Apply cached fixes from last --full analysis
22
+ ${chalk.cyan('npx depfixer login')} Authenticate with your DepFixer account
23
+ ${chalk.cyan('npx depfixer graph')} Open dependency visualization in browser
24
+
25
+ ${chalk.bold('Pricing:')}
26
+ ${chalk.green('FREE')} analyze (audit mode) - See issues, severity, health score
27
+ ${chalk.yellow('1 credit')} analyze --full - Get specific version recommendations
28
+ ${chalk.yellow('1 credit')} analyze --migrate - Get migration plan to target version
29
+
30
+ ${chalk.bold('More info:')}
31
+ Website: ${chalk.blue('https://depfixer.com')}
32
+ `);
33
+ // Analyze command
34
+ program
35
+ .command('analyze')
36
+ .description('Analyze package.json for dependency conflicts')
37
+ .option('--full', 'Full analysis with recommendations (requires auth, costs 1 credit)')
38
+ .option('--migrate <version>', 'Migration analysis to target version (requires auth, costs 1 credit)')
39
+ .option('--json', 'Output results as JSON')
40
+ .option('--ci', 'CI mode - exit code 1 if critical issues found')
41
+ .option('--path <dir>', 'Path to project directory (default: current directory)')
42
+ .addHelpText('after', `
43
+ ${chalk.bold('Examples:')}
44
+ ${chalk.cyan('npx depfixer analyze')} Free audit of current directory
45
+ ${chalk.cyan('npx depfixer analyze --full')} Full analysis with recommendations
46
+ ${chalk.cyan('npx depfixer analyze --migrate 19')} Migrate to Angular 19 or React 19
47
+ ${chalk.cyan('npx depfixer analyze --path ./my-app')} Analyze specific directory
48
+ ${chalk.cyan('npx depfixer analyze --json --ci')} JSON output for CI pipelines
49
+ `)
50
+ .action(analyzeCommand);
51
+ // Fix command
52
+ program
53
+ .command('fix')
54
+ .description('Apply fixes from cached analysis (creates package.json.fixed)')
55
+ .option('--path <dir>', 'Path to project directory (default: current directory)')
56
+ .addHelpText('after', `
57
+ ${chalk.bold('Note:')}
58
+ Requires a prior ${chalk.cyan('analyze --full')} or ${chalk.cyan('analyze --migrate')} run.
59
+ Uses locally cached solution - no additional credits needed.
60
+
61
+ ${chalk.bold('Examples:')}
62
+ ${chalk.cyan('npx depfixer fix')} Apply fixes to current directory
63
+ ${chalk.cyan('npx depfixer fix --path ./app')} Apply fixes to specific directory
64
+ `)
65
+ .action(fixCommand);
66
+ // Login command
67
+ program
68
+ .command('login')
69
+ .description('Authenticate with DepFixer (device code flow)')
70
+ .addHelpText('after', `
71
+ ${chalk.bold('How it works:')}
72
+ 1. Generates a unique code
73
+ 2. Opens browser for you to enter the code
74
+ 3. Links your CLI to your DepFixer account
75
+
76
+ ${chalk.bold('Example:')}
77
+ ${chalk.cyan('npx depfixer login')}
78
+ `)
79
+ .action(loginCommand);
80
+ // Logout command
81
+ program
82
+ .command('logout')
83
+ .description('Sign out and clear stored credentials')
84
+ .addHelpText('after', `
85
+ ${chalk.bold('Example:')}
86
+ ${chalk.cyan('npx depfixer logout')}
87
+ `)
88
+ .action(logoutCommand);
89
+ // Graph command
90
+ program
91
+ .command('graph')
92
+ .description('Open dependency graph visualization in browser')
93
+ .option('--path <dir>', 'Path to project directory (default: current directory)')
94
+ .addHelpText('after', `
95
+ ${chalk.bold('Note:')}
96
+ Requires a prior ${chalk.cyan('analyze --full')} run to have analysis data.
97
+
98
+ ${chalk.bold('Example:')}
99
+ ${chalk.cyan('npx depfixer graph')}
100
+ `)
101
+ .action(graphCommand);
102
+ // Show help if no arguments provided
103
+ if (process.argv.length === 2) {
104
+ program.help();
105
+ }
106
+ // Parse arguments
107
+ program.parse();
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * API Client for communicating with DepFixer server
3
+ */
4
+ export declare class ApiClient {
5
+ private client;
6
+ private authManager;
7
+ constructor();
8
+ /**
9
+ * Audit analysis (FREE - no auth required)
10
+ */
11
+ analyzeAudit(packageJson: any, framework?: string): Promise<{
12
+ success: boolean;
13
+ data?: any;
14
+ error?: string;
15
+ rateLimit?: {
16
+ remaining: number;
17
+ resetIn: number;
18
+ };
19
+ }>;
20
+ /**
21
+ * Full analysis (PAID - auth required)
22
+ */
23
+ analyzeFull(packageJson: any, framework?: string): Promise<{
24
+ success: boolean;
25
+ data?: any;
26
+ error?: string;
27
+ }>;
28
+ /**
29
+ * Migration analysis (PAID - auth required)
30
+ */
31
+ analyzeMigrate(packageJson: any, targetVersion: string, framework?: string): Promise<{
32
+ success: boolean;
33
+ data?: any;
34
+ error?: string;
35
+ }>;
36
+ /**
37
+ * Generate device code for login
38
+ */
39
+ createDeviceCode(): Promise<{
40
+ success: boolean;
41
+ data?: {
42
+ deviceCode: string;
43
+ userCode: string;
44
+ verificationUrl: string;
45
+ expiresIn: number;
46
+ pollInterval: number;
47
+ };
48
+ error?: string;
49
+ }>;
50
+ /**
51
+ * Poll device code status
52
+ */
53
+ pollDeviceCode(deviceCode: string): Promise<{
54
+ success: boolean;
55
+ data?: {
56
+ status: 'pending' | 'approved' | 'expired' | 'denied';
57
+ accessToken?: string;
58
+ refreshToken?: string;
59
+ expiresIn?: number;
60
+ };
61
+ error?: string;
62
+ }>;
63
+ /**
64
+ * Poll prefetch status (uses existing analyze endpoint)
65
+ * CLI polls this until isComplete=true && reanalysisStatus='completed'
66
+ */
67
+ pollPrefetchStatus(prefetchId: string): Promise<{
68
+ status: string;
69
+ fetchedCount: number;
70
+ totalPackages: number;
71
+ percentage: number;
72
+ isComplete: boolean;
73
+ reanalysisStatus?: string;
74
+ }>;
75
+ /**
76
+ * Get analysis by ID (uses existing analyze endpoint)
77
+ * Called after prefetch completes to get updated results
78
+ */
79
+ getAnalysisById(analysisId: string): Promise<{
80
+ success: boolean;
81
+ data?: any;
82
+ error?: string;
83
+ }>;
84
+ /**
85
+ * Handle API errors
86
+ */
87
+ private handleError;
88
+ }
89
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAc;;IA6CjC;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAChE,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KACpD,CAAC;IAsBF;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAWF;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACzF,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAYF;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACL,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACL,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;YACtD,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF;;;OAGG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAKF;;;OAGG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF;;OAEG;IACH,OAAO,CAAC,WAAW;CAqCpB"}