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.
- package/README.md +128 -0
- package/dist/commands/analyze.d.ts +18 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +404 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/fix.d.ts +14 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +82 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/graph.d.ts +12 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +58 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/login.d.ts +11 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +109 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +22 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api-client.d.ts +89 -0
- package/dist/services/api-client.d.ts.map +1 -0
- package/dist/services/api-client.js +162 -0
- package/dist/services/api-client.js.map +1 -0
- package/dist/services/auth-manager.d.ts +30 -0
- package/dist/services/auth-manager.d.ts.map +1 -0
- package/dist/services/auth-manager.js +82 -0
- package/dist/services/auth-manager.js.map +1 -0
- package/dist/services/cache-manager.d.ts +52 -0
- package/dist/services/cache-manager.d.ts.map +1 -0
- package/dist/services/cache-manager.js +87 -0
- package/dist/services/cache-manager.js.map +1 -0
- package/dist/services/gitignore.d.ts +19 -0
- package/dist/services/gitignore.d.ts.map +1 -0
- package/dist/services/gitignore.js +64 -0
- package/dist/services/gitignore.js.map +1 -0
- package/dist/services/package-json.d.ts +39 -0
- package/dist/services/package-json.d.ts.map +1 -0
- package/dist/services/package-json.js +106 -0
- package/dist/services/package-json.js.map +1 -0
- package/dist/utils/hash.d.ts +6 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +9 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/output.d.ts +91 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +222 -0
- package/dist/utils/output.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|