depfixer 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/audit.d.ts +19 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +170 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/fix.d.ts +10 -3
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +407 -41
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/graph.d.ts +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +17 -12
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +120 -19
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +6 -0
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/migrate.d.ts +22 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +874 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/smart.d.ts +23 -0
- package/dist/commands/smart.d.ts.map +1 -0
- package/dist/commands/smart.js +1024 -0
- package/dist/commands/smart.js.map +1 -0
- package/dist/commands/whoami.d.ts +14 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +65 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +165 -40
- package/dist/index.js.map +1 -1
- package/dist/services/analytics.d.ts +108 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +305 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/api-client.d.ts +159 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +192 -10
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-manager.d.ts +14 -0
- package/dist/services/auth-manager.d.ts.map +1 -1
- package/dist/services/auth-manager.js +30 -0
- package/dist/services/auth-manager.js.map +1 -1
- package/dist/services/cache-manager.d.ts +62 -22
- package/dist/services/cache-manager.d.ts.map +1 -1
- package/dist/services/cache-manager.js +116 -30
- package/dist/services/cache-manager.js.map +1 -1
- package/dist/services/device-id.d.ts +20 -0
- package/dist/services/device-id.d.ts.map +1 -0
- package/dist/services/device-id.js +70 -0
- package/dist/services/device-id.js.map +1 -0
- package/dist/services/package-json.d.ts +44 -5
- package/dist/services/package-json.d.ts.map +1 -1
- package/dist/services/package-json.js +273 -20
- package/dist/services/package-json.js.map +1 -1
- package/dist/services/payment-flow.d.ts +108 -0
- package/dist/services/payment-flow.d.ts.map +1 -0
- package/dist/services/payment-flow.js +476 -0
- package/dist/services/payment-flow.js.map +1 -0
- package/dist/services/session-manager.d.ts +92 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +218 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/utils/design-system.d.ts +90 -0
- package/dist/utils/design-system.d.ts.map +1 -0
- package/dist/utils/design-system.js +338 -0
- package/dist/utils/design-system.js.map +1 -0
- package/dist/utils/output.d.ts +48 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +180 -17
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/print.d.ts +116 -0
- package/dist/utils/print.d.ts.map +1 -0
- package/dist/utils/print.js +190 -0
- package/dist/utils/print.js.map +1 -0
- package/package.json +13 -2
- package/dist/commands/analyze.d.ts +0 -18
- package/dist/commands/analyze.d.ts.map +0 -1
- package/dist/commands/analyze.js +0 -404
- package/dist/commands/analyze.js.map +0 -1
- package/dist/services/gitignore.d.ts +0 -19
- package/dist/services/gitignore.d.ts.map +0 -1
- package/dist/services/gitignore.js +0 -64
- package/dist/services/gitignore.js.map +0 -1
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import { ApiClient } from './api-client.js';
|
|
4
|
+
import { AuthManager } from './auth-manager.js';
|
|
5
|
+
import { analytics } from './analytics.js';
|
|
6
|
+
import { createSpinner, printError } from '../utils/output.js';
|
|
7
|
+
import { printUserDetails } from '../utils/design-system.js';
|
|
8
|
+
/**
|
|
9
|
+
* Payment Flow Service
|
|
10
|
+
*
|
|
11
|
+
* Handles the payment/credit flow for CLI:
|
|
12
|
+
* - Auth loop (device code login)
|
|
13
|
+
* - Balance checking
|
|
14
|
+
* - Balance polling with timeout
|
|
15
|
+
* - Credit deduction
|
|
16
|
+
*/
|
|
17
|
+
export class PaymentFlowService {
|
|
18
|
+
apiClient;
|
|
19
|
+
authManager;
|
|
20
|
+
webUrl;
|
|
21
|
+
constructor() {
|
|
22
|
+
this.apiClient = new ApiClient();
|
|
23
|
+
this.authManager = new AuthManager();
|
|
24
|
+
this.webUrl = process.env.DEPFIXER_WEB_URL || 'https://app.depfixer.com';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run the complete payment flow:
|
|
28
|
+
* 1. Check auth (login if needed)
|
|
29
|
+
* 2. Check balance (wait for top-up if needed)
|
|
30
|
+
* 3. Return user info if ready to proceed
|
|
31
|
+
*/
|
|
32
|
+
async ensureReadyToPay(cost) {
|
|
33
|
+
// Step 1: Ensure authenticated
|
|
34
|
+
const authResult = await this.ensureAuthenticated();
|
|
35
|
+
if (!authResult.success) {
|
|
36
|
+
return { ready: false };
|
|
37
|
+
}
|
|
38
|
+
// Step 2: Ensure sufficient balance
|
|
39
|
+
const hasBalance = await this.ensureSufficientBalance(cost);
|
|
40
|
+
if (!hasBalance) {
|
|
41
|
+
return { ready: false };
|
|
42
|
+
}
|
|
43
|
+
// Get final balance info (includes name and email)
|
|
44
|
+
const balanceInfo = await this.getBalanceInfo();
|
|
45
|
+
return {
|
|
46
|
+
ready: true,
|
|
47
|
+
name: balanceInfo?.name,
|
|
48
|
+
email: balanceInfo?.email || authResult.email,
|
|
49
|
+
credits: balanceInfo?.credits,
|
|
50
|
+
hasActivePass: balanceInfo?.hasActivePass,
|
|
51
|
+
wasAlreadyLoggedIn: authResult.wasAlreadyLoggedIn,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Ensure user is authenticated
|
|
56
|
+
* Runs device code flow if not logged in
|
|
57
|
+
* Returns user info on success
|
|
58
|
+
*/
|
|
59
|
+
async ensureAuthenticated() {
|
|
60
|
+
if (await this.authManager.isAuthenticated()) {
|
|
61
|
+
return { success: true, wasAlreadyLoggedIn: true };
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
console.log(chalk.bold('🔐 AUTHENTICATION REQUIRED'));
|
|
65
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
66
|
+
console.log();
|
|
67
|
+
// Ask if user has an account
|
|
68
|
+
const authChoice = await this.promptAuthChoice();
|
|
69
|
+
if (authChoice === 'register') {
|
|
70
|
+
// Open registration page
|
|
71
|
+
const registerUrl = `${this.webUrl}/register?from=cli`;
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(chalk.cyan('Opening registration page...'));
|
|
74
|
+
try {
|
|
75
|
+
await open(registerUrl);
|
|
76
|
+
console.log(chalk.dim('Browser opened. Create your account, then return here.'));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
console.log(chalk.yellow(`Please visit: ${registerUrl}`));
|
|
80
|
+
}
|
|
81
|
+
console.log();
|
|
82
|
+
const ready = await this.promptYesNo('Account created? Ready to login?');
|
|
83
|
+
if (!ready) {
|
|
84
|
+
return { success: false };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Run device code login flow
|
|
88
|
+
const result = await this.runDeviceCodeFlow();
|
|
89
|
+
return { success: result.success, email: result.email, wasAlreadyLoggedIn: false };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Prompt user to choose login or register with arrow key selection
|
|
93
|
+
*/
|
|
94
|
+
async promptAuthChoice() {
|
|
95
|
+
const options = [
|
|
96
|
+
{ value: 'login', label: 'Login', description: 'I have an account' },
|
|
97
|
+
{ value: 'register', label: 'Register', description: 'Create new account' },
|
|
98
|
+
];
|
|
99
|
+
return new Promise((resolve) => {
|
|
100
|
+
let selectedIndex = 0;
|
|
101
|
+
const render = () => {
|
|
102
|
+
// Move cursor up to redraw
|
|
103
|
+
process.stdout.write(`\x1b[${options.length + 1}A`);
|
|
104
|
+
console.log(chalk.dim(' Use ↑↓ arrows, Enter to confirm'));
|
|
105
|
+
for (let i = 0; i < options.length; i++) {
|
|
106
|
+
const opt = options[i];
|
|
107
|
+
const isSelected = i === selectedIndex;
|
|
108
|
+
const prefix = isSelected ? chalk.cyan('❯ ') : ' ';
|
|
109
|
+
const label = isSelected
|
|
110
|
+
? chalk.bold.white(opt.label) + chalk.dim(` - ${opt.description}`)
|
|
111
|
+
: chalk.dim(opt.label + ` - ${opt.description}`);
|
|
112
|
+
console.log(`${prefix}${label}`);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
// Initial render
|
|
116
|
+
console.log(chalk.dim(' Use ↑↓ arrows, Enter to confirm'));
|
|
117
|
+
for (let i = 0; i < options.length; i++) {
|
|
118
|
+
const opt = options[i];
|
|
119
|
+
const isSelected = i === selectedIndex;
|
|
120
|
+
const prefix = isSelected ? chalk.cyan('❯ ') : ' ';
|
|
121
|
+
const label = isSelected
|
|
122
|
+
? chalk.bold.white(opt.label) + chalk.dim(` - ${opt.description}`)
|
|
123
|
+
: chalk.dim(opt.label + ` - ${opt.description}`);
|
|
124
|
+
console.log(`${prefix}${label}`);
|
|
125
|
+
}
|
|
126
|
+
if (process.stdin.isTTY) {
|
|
127
|
+
process.stdin.setRawMode(true);
|
|
128
|
+
}
|
|
129
|
+
process.stdin.resume();
|
|
130
|
+
const onKeyPress = (key) => {
|
|
131
|
+
const char = key.toString();
|
|
132
|
+
// Up arrow
|
|
133
|
+
if (char === '\x1b[A') {
|
|
134
|
+
selectedIndex = (selectedIndex - 1 + options.length) % options.length;
|
|
135
|
+
render();
|
|
136
|
+
}
|
|
137
|
+
// Down arrow
|
|
138
|
+
else if (char === '\x1b[B') {
|
|
139
|
+
selectedIndex = (selectedIndex + 1) % options.length;
|
|
140
|
+
render();
|
|
141
|
+
}
|
|
142
|
+
// Enter
|
|
143
|
+
else if (char === '\r' || char === '\n') {
|
|
144
|
+
cleanup();
|
|
145
|
+
console.log(chalk.green(`✓ ${options[selectedIndex].label}`));
|
|
146
|
+
resolve(options[selectedIndex].value);
|
|
147
|
+
}
|
|
148
|
+
// Escape - default to login
|
|
149
|
+
else if (char === '\x1b' && key.length === 1) {
|
|
150
|
+
cleanup();
|
|
151
|
+
console.log(chalk.dim('Cancelled'));
|
|
152
|
+
resolve('login');
|
|
153
|
+
}
|
|
154
|
+
// Ctrl+C
|
|
155
|
+
else if (char === '\x03') {
|
|
156
|
+
cleanup();
|
|
157
|
+
process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
const cleanup = () => {
|
|
161
|
+
process.stdin.removeListener('data', onKeyPress);
|
|
162
|
+
if (process.stdin.isTTY) {
|
|
163
|
+
process.stdin.setRawMode(false);
|
|
164
|
+
}
|
|
165
|
+
process.stdin.pause();
|
|
166
|
+
};
|
|
167
|
+
process.stdin.on('data', onKeyPress);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get current balance info
|
|
172
|
+
*/
|
|
173
|
+
async getBalanceInfo() {
|
|
174
|
+
try {
|
|
175
|
+
const response = await this.apiClient.getBalance();
|
|
176
|
+
if (response.success && response.data) {
|
|
177
|
+
return response.data;
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Run device code authentication flow
|
|
187
|
+
* Returns user info on success
|
|
188
|
+
*/
|
|
189
|
+
async runDeviceCodeFlow() {
|
|
190
|
+
try {
|
|
191
|
+
// Get device code from server
|
|
192
|
+
const response = await this.apiClient.createDeviceCode();
|
|
193
|
+
if (!response.success || !response.data) {
|
|
194
|
+
printError('Failed to initiate login');
|
|
195
|
+
return { success: false };
|
|
196
|
+
}
|
|
197
|
+
const { deviceCode, userCode, verificationUrl, expiresIn, pollInterval } = response.data;
|
|
198
|
+
// Display instructions - DON'T auto-open browser
|
|
199
|
+
console.log();
|
|
200
|
+
console.log(chalk.bold('🔐 LOGIN REQUIRED'));
|
|
201
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
202
|
+
console.log();
|
|
203
|
+
console.log(chalk.bold('Your Code: ') + chalk.green.bold(userCode));
|
|
204
|
+
console.log();
|
|
205
|
+
const verificationUrlWithCode = `${verificationUrl}?code=${userCode}`;
|
|
206
|
+
console.log(chalk.dim('Go to: ') + chalk.cyan(verificationUrlWithCode));
|
|
207
|
+
console.log(chalk.dim('Code will be auto-filled. Just click Authorize.'));
|
|
208
|
+
console.log();
|
|
209
|
+
// Ask if user wants to open browser
|
|
210
|
+
const shouldOpen = await this.promptYesNo('Open browser now?');
|
|
211
|
+
if (shouldOpen) {
|
|
212
|
+
try {
|
|
213
|
+
await open(verificationUrlWithCode);
|
|
214
|
+
console.log(chalk.dim('Browser opened.'));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
console.log(chalk.yellow('Could not open browser. Please visit the URL manually.'));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
console.log();
|
|
221
|
+
// Poll for completion
|
|
222
|
+
const spinner = createSpinner(`Waiting for authentication... (expires in ${Math.floor(expiresIn / 60)} min)`).start();
|
|
223
|
+
const startTime = Date.now();
|
|
224
|
+
const expiresAt = startTime + expiresIn * 1000;
|
|
225
|
+
while (Date.now() < expiresAt) {
|
|
226
|
+
await this.sleep(pollInterval * 1000);
|
|
227
|
+
try {
|
|
228
|
+
const pollResponse = await this.apiClient.pollDeviceCode(deviceCode);
|
|
229
|
+
if (pollResponse.success && pollResponse.data) {
|
|
230
|
+
if (pollResponse.data.status === 'approved') {
|
|
231
|
+
// Save tokens
|
|
232
|
+
await this.authManager.saveTokens(pollResponse.data.accessToken, pollResponse.data.refreshToken, pollResponse.data.expiresIn || 3600);
|
|
233
|
+
spinner.succeed('Logged in successfully');
|
|
234
|
+
// Fetch and show user details
|
|
235
|
+
try {
|
|
236
|
+
const balanceResponse = await this.apiClient.getBalance();
|
|
237
|
+
if (balanceResponse.success && balanceResponse.data) {
|
|
238
|
+
printUserDetails({
|
|
239
|
+
name: balanceResponse.data.name,
|
|
240
|
+
email: balanceResponse.data.email,
|
|
241
|
+
credits: balanceResponse.data.credits,
|
|
242
|
+
hasActivePass: balanceResponse.data.hasActivePass,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Continue even if balance fetch fails
|
|
248
|
+
}
|
|
249
|
+
return { success: true, email: pollResponse.data.email };
|
|
250
|
+
}
|
|
251
|
+
else if (pollResponse.data.status === 'denied') {
|
|
252
|
+
spinner.fail('Login denied');
|
|
253
|
+
return { success: false };
|
|
254
|
+
}
|
|
255
|
+
else if (pollResponse.data.status === 'expired') {
|
|
256
|
+
spinner.fail('Login expired');
|
|
257
|
+
return { success: false };
|
|
258
|
+
}
|
|
259
|
+
// status === 'pending' - keep polling
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
// Continue polling on errors
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
spinner.fail('Login timed out');
|
|
267
|
+
return { success: false };
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
printError(`Login failed: ${error.message}`);
|
|
271
|
+
return { success: false };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Simple Enter/Esc prompt (Enter = Yes, Esc = No)
|
|
276
|
+
*/
|
|
277
|
+
async promptYesNo(question) {
|
|
278
|
+
return new Promise((resolve) => {
|
|
279
|
+
process.stdout.write(`${question} ${chalk.dim('(Enter/Esc)')} `);
|
|
280
|
+
if (process.stdin.isTTY) {
|
|
281
|
+
process.stdin.setRawMode(true);
|
|
282
|
+
}
|
|
283
|
+
process.stdin.resume();
|
|
284
|
+
const onKeyPress = (key) => {
|
|
285
|
+
const char = key.toString();
|
|
286
|
+
// Enter key
|
|
287
|
+
if (char === '\r' || char === '\n') {
|
|
288
|
+
cleanup();
|
|
289
|
+
console.log(chalk.green('Yes'));
|
|
290
|
+
resolve(true);
|
|
291
|
+
}
|
|
292
|
+
// Escape key
|
|
293
|
+
else if (char === '\x1b') {
|
|
294
|
+
cleanup();
|
|
295
|
+
console.log(chalk.red('No'));
|
|
296
|
+
resolve(false);
|
|
297
|
+
}
|
|
298
|
+
// 'y' or 'Y'
|
|
299
|
+
else if (char.toLowerCase() === 'y') {
|
|
300
|
+
cleanup();
|
|
301
|
+
console.log(chalk.green('Yes'));
|
|
302
|
+
resolve(true);
|
|
303
|
+
}
|
|
304
|
+
// 'n' or 'N'
|
|
305
|
+
else if (char.toLowerCase() === 'n') {
|
|
306
|
+
cleanup();
|
|
307
|
+
console.log(chalk.red('No'));
|
|
308
|
+
resolve(false);
|
|
309
|
+
}
|
|
310
|
+
// Ctrl+C
|
|
311
|
+
else if (char === '\x03') {
|
|
312
|
+
cleanup();
|
|
313
|
+
process.exit(0);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
const cleanup = () => {
|
|
317
|
+
process.stdin.removeListener('data', onKeyPress);
|
|
318
|
+
if (process.stdin.isTTY) {
|
|
319
|
+
process.stdin.setRawMode(false);
|
|
320
|
+
}
|
|
321
|
+
process.stdin.pause();
|
|
322
|
+
};
|
|
323
|
+
process.stdin.on('data', onKeyPress);
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Ensure user has sufficient credits
|
|
328
|
+
* Opens pricing page and polls if insufficient
|
|
329
|
+
* Note: Credit check UI should be shown before calling this method
|
|
330
|
+
*/
|
|
331
|
+
async ensureSufficientBalance(cost) {
|
|
332
|
+
try {
|
|
333
|
+
const response = await this.apiClient.getBalance();
|
|
334
|
+
if (!response.success || !response.data) {
|
|
335
|
+
printError('Failed to check balance');
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
const { credits, hasActivePass } = response.data;
|
|
339
|
+
// Active pass covers everything
|
|
340
|
+
if (hasActivePass) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
// Sufficient credits
|
|
344
|
+
if (credits >= cost) {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
// Insufficient credits - start top-up flow
|
|
348
|
+
return await this.waitForTopUp(cost);
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
printError(error.message);
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Wait for user to top up their balance
|
|
357
|
+
* Opens pricing page and polls for 5 minutes
|
|
358
|
+
*/
|
|
359
|
+
async waitForTopUp(requiredCredits) {
|
|
360
|
+
console.log();
|
|
361
|
+
console.log(chalk.bold.yellow('💳 CREDITS REQUIRED'));
|
|
362
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
363
|
+
console.log();
|
|
364
|
+
console.log(chalk.white(`You need ${chalk.bold(requiredCredits)} credits to unlock the full solution.`));
|
|
365
|
+
console.log(chalk.dim('This includes exact version fixes for all detected conflicts.'));
|
|
366
|
+
console.log();
|
|
367
|
+
// Track: topup_prompt_shown (user hit the paywall)
|
|
368
|
+
analytics.topupPromptShown({ creditsNeeded: requiredCredits });
|
|
369
|
+
// Ask before opening pricing page
|
|
370
|
+
const pricingUrl = `${this.webUrl}/dashboard/credits/pricing`;
|
|
371
|
+
const shouldOpen = await this.promptYesNo('Open pricing page to add credits?');
|
|
372
|
+
if (shouldOpen) {
|
|
373
|
+
// Track: topup_started (user clicked to go to pricing)
|
|
374
|
+
analytics.topupStarted({ creditsNeeded: requiredCredits });
|
|
375
|
+
try {
|
|
376
|
+
await open(pricingUrl);
|
|
377
|
+
console.log(chalk.dim('Browser opened.'));
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
console.log(chalk.yellow('Could not open browser.'));
|
|
381
|
+
console.log(chalk.dim('Visit: ') + chalk.cyan(pricingUrl));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
// Track: topup_abandoned (user declined to go to pricing)
|
|
386
|
+
analytics.topupAbandoned({ reason: 'declined_pricing_page', creditsNeeded: requiredCredits });
|
|
387
|
+
console.log();
|
|
388
|
+
console.log(chalk.dim('Visit: ') + chalk.cyan(pricingUrl));
|
|
389
|
+
console.log(chalk.dim('Run `npx depfixer fix` when ready.'));
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
console.log();
|
|
393
|
+
// Poll for balance update
|
|
394
|
+
const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
395
|
+
const POLL_INTERVAL_MS = 5000; // 5 seconds
|
|
396
|
+
const startTime = Date.now();
|
|
397
|
+
const spinner = createSpinner('Waiting for payment... (5 min timeout)').start();
|
|
398
|
+
while (Date.now() - startTime < TIMEOUT_MS) {
|
|
399
|
+
await this.sleep(POLL_INTERVAL_MS);
|
|
400
|
+
try {
|
|
401
|
+
const response = await this.apiClient.getBalance();
|
|
402
|
+
if (response.success && response.data) {
|
|
403
|
+
const { credits, hasActivePass } = response.data;
|
|
404
|
+
if (hasActivePass) {
|
|
405
|
+
// Track: topup_completed (purchased pass)
|
|
406
|
+
analytics.topupCompleted({ type: 'panic_pass', creditsNeeded: requiredCredits });
|
|
407
|
+
spinner.succeed('Panic Pass activated! Unlimited fixes unlocked.');
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
if (credits >= requiredCredits) {
|
|
411
|
+
// Track: topup_completed (purchased credits)
|
|
412
|
+
analytics.topupCompleted({ type: 'credits', creditsNeeded: requiredCredits, creditsPurchased: credits });
|
|
413
|
+
spinner.succeed(`Balance updated! (${credits} credits)`);
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
// Update spinner with remaining time
|
|
417
|
+
const elapsed = Date.now() - startTime;
|
|
418
|
+
const remaining = Math.ceil((TIMEOUT_MS - elapsed) / 60000);
|
|
419
|
+
spinner.text = `Waiting for payment... (${remaining} min remaining)`;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
// Continue polling on errors
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Track: topup_timeout (user didn't complete payment in time)
|
|
427
|
+
analytics.topupTimeout({ creditsNeeded: requiredCredits });
|
|
428
|
+
spinner.fail('Payment timeout');
|
|
429
|
+
console.log();
|
|
430
|
+
console.log(chalk.yellow('You can run `npx depfixer fix` later to resume.'));
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Deduct credits for an analysis
|
|
435
|
+
* Returns solution and full analysis data for CLI display
|
|
436
|
+
*/
|
|
437
|
+
async deductCredits(analysisId, hasActivePass) {
|
|
438
|
+
const spinnerText = hasActivePass ? 'Unlocking solution...' : 'Deducting credits...';
|
|
439
|
+
const spinner = createSpinner(spinnerText).start();
|
|
440
|
+
try {
|
|
441
|
+
const response = await this.apiClient.executeFix(analysisId);
|
|
442
|
+
if (!response.success) {
|
|
443
|
+
spinner.fail('Failed to unlock solution');
|
|
444
|
+
return { success: false, error: response.error };
|
|
445
|
+
}
|
|
446
|
+
// Check if pass was used (from server response)
|
|
447
|
+
if (response.data?.passUsed) {
|
|
448
|
+
spinner.succeed('Solution unlocked (Panic Pass)');
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
spinner.succeed('Credits deducted');
|
|
452
|
+
}
|
|
453
|
+
return {
|
|
454
|
+
success: true,
|
|
455
|
+
solution: response.data?.solution,
|
|
456
|
+
// Pass through full analysis data from server
|
|
457
|
+
conflicts: response.data?.conflicts,
|
|
458
|
+
missingDependencies: response.data?.missingDependencies,
|
|
459
|
+
deprecations: response.data?.deprecations,
|
|
460
|
+
healthScore: response.data?.healthScore,
|
|
461
|
+
summary: response.data?.summary,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
spinner.fail('Failed to deduct credits');
|
|
466
|
+
return { success: false, error: error.message };
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Sleep helper
|
|
471
|
+
*/
|
|
472
|
+
sleep(ms) {
|
|
473
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=payment-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-flow.js","sourceRoot":"","sources":["../../src/services/payment-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session data structure for CLI analysis caching
|
|
3
|
+
*/
|
|
4
|
+
export interface SessionData {
|
|
5
|
+
analysisId: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
intent: 'AUDIT' | 'ANALYZE' | 'MIGRATE';
|
|
8
|
+
args?: {
|
|
9
|
+
target?: string;
|
|
10
|
+
};
|
|
11
|
+
originalFileHash: string;
|
|
12
|
+
cost: number;
|
|
13
|
+
status: 'UNPAID' | 'PAID';
|
|
14
|
+
projectName: string;
|
|
15
|
+
packageCount: number;
|
|
16
|
+
tierName: string;
|
|
17
|
+
projectPath?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionFile {
|
|
20
|
+
lastSession: SessionData;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Session Manager
|
|
24
|
+
* Manages CLI session state for the new payment flow.
|
|
25
|
+
*
|
|
26
|
+
* Key features:
|
|
27
|
+
* - Stores session in ~/.depfixer/projects/{projectHash}/session.json
|
|
28
|
+
* - Tracks analysis ID, cost, payment status
|
|
29
|
+
* - Verifies package.json hash for integrity
|
|
30
|
+
* - Supports resume of unpaid analyses
|
|
31
|
+
* - Centralized storage (no .depfixer in project directory)
|
|
32
|
+
*/
|
|
33
|
+
export declare class SessionManager {
|
|
34
|
+
private readonly cacheDir;
|
|
35
|
+
private readonly sessionFile;
|
|
36
|
+
private readonly projectDir;
|
|
37
|
+
constructor(projectDir?: string);
|
|
38
|
+
/**
|
|
39
|
+
* Generate a short hash from project path for unique folder name
|
|
40
|
+
*/
|
|
41
|
+
private getProjectHash;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate SHA256 hash of content
|
|
44
|
+
*/
|
|
45
|
+
calculateHash(content: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Save a new session after analysis
|
|
48
|
+
*/
|
|
49
|
+
saveSession(data: Omit<SessionData, 'timestamp' | 'projectPath'>): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Load the current session
|
|
52
|
+
*/
|
|
53
|
+
loadSession(): Promise<SessionData | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a session exists
|
|
56
|
+
*/
|
|
57
|
+
hasSession(): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Update session status (e.g., mark as PAID)
|
|
60
|
+
*/
|
|
61
|
+
updateStatus(status: 'UNPAID' | 'PAID'): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Verify that package.json hasn't changed since analysis
|
|
64
|
+
*/
|
|
65
|
+
verifyHash(currentContent: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Get human-readable time since analysis
|
|
68
|
+
*/
|
|
69
|
+
getTimeSinceAnalysis(session: SessionData): string;
|
|
70
|
+
/**
|
|
71
|
+
* Get session description for display
|
|
72
|
+
*/
|
|
73
|
+
getSessionDescription(session: SessionData): string;
|
|
74
|
+
/**
|
|
75
|
+
* Clear the session (after successful fix or on user request)
|
|
76
|
+
*/
|
|
77
|
+
clearSession(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get the session file path
|
|
80
|
+
*/
|
|
81
|
+
getSessionFilePath(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Ensure cache directory exists
|
|
84
|
+
*/
|
|
85
|
+
private ensureCacheDir;
|
|
86
|
+
/**
|
|
87
|
+
* Migrate from old cache format (analysis-history.json) if present
|
|
88
|
+
* This provides backward compatibility with existing installations
|
|
89
|
+
*/
|
|
90
|
+
migrateFromOldCache(): Promise<boolean>;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/services/session-manager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,GAAE,MAAsB;IAQ9C;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IActF;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAahD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IASpC;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAiBlD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAenD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;YACW,cAAc;IAU5B;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;CA4C9C"}
|