@cakemail-org/cakemail-cli 1.2.0 → 1.5.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 +140 -0
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client.js +0 -2
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts +5 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +231 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/attributes.d.ts +5 -0
- package/dist/commands/attributes.d.ts.map +1 -0
- package/dist/commands/attributes.js +126 -0
- package/dist/commands/attributes.js.map +1 -0
- package/dist/commands/campaigns.d.ts.map +1 -1
- package/dist/commands/campaigns.js +153 -19
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +235 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +436 -14
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/emails.d.ts.map +1 -1
- package/dist/commands/emails.js +53 -0
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +282 -11
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/reports.d.ts +5 -0
- package/dist/commands/reports.d.ts.map +1 -0
- package/dist/commands/reports.js +334 -0
- package/dist/commands/reports.js.map +1 -0
- package/dist/commands/segments.d.ts +5 -0
- package/dist/commands/segments.d.ts.map +1 -0
- package/dist/commands/segments.js +203 -0
- package/dist/commands/segments.js.map +1 -0
- package/dist/commands/senders.d.ts.map +1 -1
- package/dist/commands/senders.js +36 -5
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/suppressed.d.ts +5 -0
- package/dist/commands/suppressed.d.ts.map +1 -0
- package/dist/commands/suppressed.js +193 -0
- package/dist/commands/suppressed.js.map +1 -0
- package/dist/commands/templates.d.ts.map +1 -1
- package/dist/commands/templates.js +11 -3
- package/dist/commands/templates.js.map +1 -1
- package/dist/types/profile.d.ts +92 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +119 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/utils/auth.d.ts +26 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +198 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/config-file.d.ts +92 -0
- package/dist/utils/config-file.d.ts.map +1 -0
- package/dist/utils/config-file.js +244 -0
- package/dist/utils/config-file.js.map +1 -0
- package/dist/utils/config.d.ts +11 -2
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +74 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/confirm.d.ts +38 -0
- package/dist/utils/confirm.d.ts.map +1 -0
- package/dist/utils/confirm.js +124 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/defaults.d.ts +39 -0
- package/dist/utils/defaults.d.ts.map +1 -0
- package/dist/utils/defaults.js +195 -0
- package/dist/utils/defaults.js.map +1 -0
- package/dist/utils/errors.d.ts +67 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +395 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/interactive.d.ts +97 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +265 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/output.d.ts +72 -2
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +383 -37
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/progress.d.ts +139 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +216 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Common HTTP status codes and their user-friendly messages
|
|
4
|
+
*/
|
|
5
|
+
const HTTP_ERROR_MESSAGES = {
|
|
6
|
+
400: (ctx) => ({
|
|
7
|
+
message: 'Invalid request parameters',
|
|
8
|
+
suggestion: ctx.operation
|
|
9
|
+
? `Check the parameters for '${ctx.operation}' operation`
|
|
10
|
+
: 'Please check your command arguments and try again',
|
|
11
|
+
help: 'Use --help to see available options'
|
|
12
|
+
}),
|
|
13
|
+
401: (ctx) => ({
|
|
14
|
+
message: 'Authentication failed',
|
|
15
|
+
suggestion: 'Your credentials are invalid or expired',
|
|
16
|
+
help: [
|
|
17
|
+
'To re-authenticate, run: cakemail account logout --force',
|
|
18
|
+
'Then run any command to authenticate again',
|
|
19
|
+
'Or check your .env file credentials'
|
|
20
|
+
].join('\n')
|
|
21
|
+
}),
|
|
22
|
+
403: (ctx) => ({
|
|
23
|
+
message: 'Permission denied',
|
|
24
|
+
suggestion: ctx.resource
|
|
25
|
+
? `You don't have permission to access this ${ctx.resource}`
|
|
26
|
+
: 'You don\'t have permission to perform this action',
|
|
27
|
+
help: ctx.resourceId
|
|
28
|
+
? `Check if ${ctx.resource} ${ctx.resourceId} exists and you have access`
|
|
29
|
+
: 'Verify your account permissions'
|
|
30
|
+
}),
|
|
31
|
+
404: (ctx) => ({
|
|
32
|
+
message: ctx.resource
|
|
33
|
+
? `${capitalize(ctx.resource)} not found`
|
|
34
|
+
: 'Resource not found',
|
|
35
|
+
suggestion: ctx.resourceId && ctx.resource
|
|
36
|
+
? `${capitalize(ctx.resource)} with ID '${ctx.resourceId}' doesn't exist`
|
|
37
|
+
: `The requested ${ctx.resource || 'resource'} doesn't exist`,
|
|
38
|
+
help: getListCommandSuggestion(ctx.resource)
|
|
39
|
+
}),
|
|
40
|
+
409: (ctx) => ({
|
|
41
|
+
message: 'Conflict - resource already exists',
|
|
42
|
+
suggestion: ctx.resource
|
|
43
|
+
? `This ${ctx.resource} already exists or conflicts with existing data`
|
|
44
|
+
: 'The resource already exists',
|
|
45
|
+
help: 'Try updating the existing resource instead of creating a new one'
|
|
46
|
+
}),
|
|
47
|
+
422: (ctx) => ({
|
|
48
|
+
message: 'Validation error',
|
|
49
|
+
suggestion: 'One or more fields have invalid values',
|
|
50
|
+
help: 'Check the error details above for specific field errors'
|
|
51
|
+
}),
|
|
52
|
+
429: (ctx) => ({
|
|
53
|
+
message: 'Rate limit exceeded',
|
|
54
|
+
suggestion: 'You\'re making too many requests',
|
|
55
|
+
help: 'Wait a moment before trying again, or reduce request frequency'
|
|
56
|
+
}),
|
|
57
|
+
500: (ctx) => ({
|
|
58
|
+
message: 'Server error',
|
|
59
|
+
suggestion: 'Something went wrong on the Cakemail server',
|
|
60
|
+
help: 'This is not your fault. Please try again in a few moments or contact support'
|
|
61
|
+
}),
|
|
62
|
+
502: (ctx) => ({
|
|
63
|
+
message: 'Bad gateway',
|
|
64
|
+
suggestion: 'The Cakemail API is temporarily unavailable',
|
|
65
|
+
help: 'Please try again in a few moments'
|
|
66
|
+
}),
|
|
67
|
+
503: (ctx) => ({
|
|
68
|
+
message: 'Service unavailable',
|
|
69
|
+
suggestion: 'The Cakemail API is temporarily down for maintenance',
|
|
70
|
+
help: 'Please try again later'
|
|
71
|
+
})
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Common error patterns and their user-friendly messages
|
|
75
|
+
*/
|
|
76
|
+
const ERROR_PATTERNS = [
|
|
77
|
+
{
|
|
78
|
+
pattern: /network|ECONNREFUSED|ENOTFOUND|timeout/i,
|
|
79
|
+
handler: (match, ctx) => ({
|
|
80
|
+
message: 'Network connection error',
|
|
81
|
+
suggestion: 'Unable to connect to the Cakemail API',
|
|
82
|
+
help: [
|
|
83
|
+
'Check your internet connection',
|
|
84
|
+
'Verify the API endpoint is correct',
|
|
85
|
+
'Check if there\'s a firewall blocking the connection'
|
|
86
|
+
].join('\n')
|
|
87
|
+
})
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
pattern: /email.*required|invalid.*email/i,
|
|
91
|
+
handler: (match, ctx) => ({
|
|
92
|
+
message: 'Invalid email address',
|
|
93
|
+
suggestion: 'Please provide a valid email address',
|
|
94
|
+
help: 'Example: user@example.com'
|
|
95
|
+
})
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
pattern: /list.*not.*found/i,
|
|
99
|
+
handler: (match, ctx) => ({
|
|
100
|
+
message: 'List not found',
|
|
101
|
+
suggestion: ctx.resourceId
|
|
102
|
+
? `List ${ctx.resourceId} doesn't exist or you don't have access`
|
|
103
|
+
: 'The specified list doesn\'t exist',
|
|
104
|
+
help: 'Use: cakemail lists list to see all available lists'
|
|
105
|
+
})
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
pattern: /campaign.*not.*found/i,
|
|
109
|
+
handler: (match, ctx) => ({
|
|
110
|
+
message: 'Campaign not found',
|
|
111
|
+
suggestion: ctx.resourceId
|
|
112
|
+
? `Campaign ${ctx.resourceId} doesn't exist or you don't have access`
|
|
113
|
+
: 'The specified campaign doesn\'t exist',
|
|
114
|
+
help: 'Use: cakemail campaigns list to see all campaigns'
|
|
115
|
+
})
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
pattern: /contact.*not.*found/i,
|
|
119
|
+
handler: (match, ctx) => ({
|
|
120
|
+
message: 'Contact not found',
|
|
121
|
+
suggestion: ctx.resourceId
|
|
122
|
+
? `Contact ${ctx.resourceId} doesn't exist in this list`
|
|
123
|
+
: 'The specified contact doesn\'t exist',
|
|
124
|
+
help: 'Use: cakemail contacts list <list-id> to see contacts'
|
|
125
|
+
})
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
pattern: /Missing.*CAKEMAIL/i,
|
|
129
|
+
handler: (match, ctx) => ({
|
|
130
|
+
message: 'Missing credentials',
|
|
131
|
+
suggestion: 'Authentication credentials are not configured',
|
|
132
|
+
help: [
|
|
133
|
+
'Set credentials in .env file or environment variables:',
|
|
134
|
+
' CAKEMAIL_EMAIL=your@email.com',
|
|
135
|
+
' CAKEMAIL_PASSWORD=your_password',
|
|
136
|
+
'',
|
|
137
|
+
'Or run any command to authenticate interactively'
|
|
138
|
+
].join('\n')
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
];
|
|
142
|
+
/**
|
|
143
|
+
* Get list command suggestion for a resource type
|
|
144
|
+
*/
|
|
145
|
+
function getListCommandSuggestion(resource) {
|
|
146
|
+
if (!resource)
|
|
147
|
+
return undefined;
|
|
148
|
+
const commands = {
|
|
149
|
+
'list': 'cakemail lists list',
|
|
150
|
+
'campaign': 'cakemail campaigns list',
|
|
151
|
+
'contact': 'cakemail contacts list <list-id>',
|
|
152
|
+
'sender': 'cakemail senders list',
|
|
153
|
+
'template': 'cakemail templates list',
|
|
154
|
+
'webhook': 'cakemail webhooks list',
|
|
155
|
+
'segment': 'cakemail segments list <list-id>',
|
|
156
|
+
'attribute': 'cakemail attributes list <list-id>'
|
|
157
|
+
};
|
|
158
|
+
const command = commands[resource.toLowerCase()];
|
|
159
|
+
return command ? `To see all ${resource}s, use: ${command}` : undefined;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Capitalize first letter
|
|
163
|
+
*/
|
|
164
|
+
function capitalize(str) {
|
|
165
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse API error response
|
|
169
|
+
*/
|
|
170
|
+
function parseApiError(error) {
|
|
171
|
+
// Check for SDK/Axios error structure
|
|
172
|
+
if (error.response) {
|
|
173
|
+
return {
|
|
174
|
+
statusCode: error.response.status,
|
|
175
|
+
message: error.response.data?.message || error.response.data?.error || error.message,
|
|
176
|
+
details: error.response.data
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Check for SDK ApiError structure
|
|
180
|
+
if (error.status) {
|
|
181
|
+
return {
|
|
182
|
+
statusCode: error.status,
|
|
183
|
+
message: error.body?.message || error.message,
|
|
184
|
+
details: error.body
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Fallback to error message
|
|
188
|
+
return {
|
|
189
|
+
message: error.message || 'An unknown error occurred'
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Enhance error with user-friendly message and suggestions
|
|
194
|
+
*/
|
|
195
|
+
export function enhanceError(error, context) {
|
|
196
|
+
const parsed = parseApiError(error);
|
|
197
|
+
// Try HTTP status code mapping first
|
|
198
|
+
if (parsed.statusCode && HTTP_ERROR_MESSAGES[parsed.statusCode]) {
|
|
199
|
+
const enhanced = HTTP_ERROR_MESSAGES[parsed.statusCode](context);
|
|
200
|
+
// Add validation details for 422 errors
|
|
201
|
+
if (parsed.statusCode === 422 && parsed.details?.errors) {
|
|
202
|
+
enhanced.suggestion = formatValidationErrors(parsed.details.errors);
|
|
203
|
+
}
|
|
204
|
+
return enhanced;
|
|
205
|
+
}
|
|
206
|
+
// Try pattern matching
|
|
207
|
+
for (const { pattern, handler } of ERROR_PATTERNS) {
|
|
208
|
+
const match = parsed.message.match(pattern);
|
|
209
|
+
if (match) {
|
|
210
|
+
return handler(match, context);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Fallback to original error message
|
|
214
|
+
return {
|
|
215
|
+
message: parsed.message,
|
|
216
|
+
suggestion: 'An unexpected error occurred',
|
|
217
|
+
help: 'If this persists, please report it at: https://github.com/cakemail/cli/issues'
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Format validation errors from API response
|
|
222
|
+
*/
|
|
223
|
+
function formatValidationErrors(errors) {
|
|
224
|
+
if (Array.isArray(errors)) {
|
|
225
|
+
return errors.map(err => {
|
|
226
|
+
if (typeof err === 'string')
|
|
227
|
+
return err;
|
|
228
|
+
if (err.field && err.message)
|
|
229
|
+
return `${err.field}: ${err.message}`;
|
|
230
|
+
if (err.loc && err.msg)
|
|
231
|
+
return `${err.loc.join('.')}: ${err.msg}`;
|
|
232
|
+
return JSON.stringify(err);
|
|
233
|
+
}).join('\n');
|
|
234
|
+
}
|
|
235
|
+
if (typeof errors === 'object') {
|
|
236
|
+
return Object.entries(errors)
|
|
237
|
+
.map(([field, message]) => `${field}: ${message}`)
|
|
238
|
+
.join('\n');
|
|
239
|
+
}
|
|
240
|
+
return String(errors);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Display enhanced error to user (profile-aware)
|
|
244
|
+
*/
|
|
245
|
+
export function displayError(error, context) {
|
|
246
|
+
const enhanced = enhanceError(error, context);
|
|
247
|
+
const profile = context.profileConfig;
|
|
248
|
+
const verboseErrors = profile?.display.verbose_errors ?? false;
|
|
249
|
+
const showApiDetails = profile?.display.show_api_details ?? false;
|
|
250
|
+
// For developer profile: show technical details
|
|
251
|
+
if (verboseErrors && showApiDetails) {
|
|
252
|
+
displayDeveloperError(error, enhanced, context);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// For marketer/balanced profile: show friendly error
|
|
256
|
+
displayFriendlyError(enhanced, context);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Display friendly error message (marketer/balanced profile)
|
|
261
|
+
*/
|
|
262
|
+
function displayFriendlyError(enhanced, context) {
|
|
263
|
+
// Main error message
|
|
264
|
+
console.error(chalk.red('✗ Oops!'), chalk.bold(enhanced.message));
|
|
265
|
+
// Suggestion
|
|
266
|
+
if (enhanced.suggestion) {
|
|
267
|
+
console.error(chalk.yellow('\n→'), enhanced.suggestion);
|
|
268
|
+
}
|
|
269
|
+
// Help text
|
|
270
|
+
if (enhanced.help) {
|
|
271
|
+
console.error(chalk.gray('\n💡 What you can do:'));
|
|
272
|
+
enhanced.help.split('\n').forEach(line => {
|
|
273
|
+
console.error(chalk.gray(' ' + line));
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// Docs URL
|
|
277
|
+
if (enhanced.docsUrl) {
|
|
278
|
+
console.error(chalk.cyan('\n📖 Learn more:'), enhanced.docsUrl);
|
|
279
|
+
}
|
|
280
|
+
console.error(''); // Empty line for spacing
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Display technical error message (developer profile)
|
|
284
|
+
*/
|
|
285
|
+
function displayDeveloperError(error, enhanced, context) {
|
|
286
|
+
const parsed = parseApiError(error);
|
|
287
|
+
// Main error message
|
|
288
|
+
console.error(chalk.red('Error:'), enhanced.message);
|
|
289
|
+
// Status code and details
|
|
290
|
+
if (parsed.statusCode) {
|
|
291
|
+
console.error(chalk.gray(`Status: ${parsed.statusCode}`));
|
|
292
|
+
}
|
|
293
|
+
if (context.operation) {
|
|
294
|
+
console.error(chalk.gray(`Operation: ${context.operation}`));
|
|
295
|
+
}
|
|
296
|
+
if (context.resource && context.resourceId) {
|
|
297
|
+
console.error(chalk.gray(`Resource: ${context.resource} (${context.resourceId})`));
|
|
298
|
+
}
|
|
299
|
+
// API response details
|
|
300
|
+
if (parsed.details) {
|
|
301
|
+
console.error(chalk.gray('\nAPI Response:'));
|
|
302
|
+
console.error(chalk.gray(JSON.stringify(parsed.details, null, 2)));
|
|
303
|
+
}
|
|
304
|
+
// Suggestion
|
|
305
|
+
if (enhanced.suggestion) {
|
|
306
|
+
console.error(chalk.yellow('\nSuggestion:'), enhanced.suggestion);
|
|
307
|
+
}
|
|
308
|
+
// Help text
|
|
309
|
+
if (enhanced.help) {
|
|
310
|
+
console.error(chalk.gray('\nHelp:'));
|
|
311
|
+
enhanced.help.split('\n').forEach(line => {
|
|
312
|
+
console.error(chalk.gray(' ' + line));
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
console.error(''); // Empty line for spacing
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Validation helpers
|
|
319
|
+
*/
|
|
320
|
+
export const validate = {
|
|
321
|
+
/**
|
|
322
|
+
* Validate email format
|
|
323
|
+
*/
|
|
324
|
+
email(email) {
|
|
325
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
326
|
+
if (!emailRegex.test(email)) {
|
|
327
|
+
return {
|
|
328
|
+
valid: false,
|
|
329
|
+
error: `Invalid email format: ${email}`
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return { valid: true };
|
|
333
|
+
},
|
|
334
|
+
/**
|
|
335
|
+
* Validate ID is a positive integer
|
|
336
|
+
*/
|
|
337
|
+
id(id, resourceName = 'ID') {
|
|
338
|
+
const numId = typeof id === 'string' ? parseInt(id, 10) : id;
|
|
339
|
+
if (isNaN(numId) || numId <= 0) {
|
|
340
|
+
return {
|
|
341
|
+
valid: false,
|
|
342
|
+
error: `${resourceName} must be a positive number, got: ${id}`
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
return { valid: true };
|
|
346
|
+
},
|
|
347
|
+
/**
|
|
348
|
+
* Validate date format (YYYY-MM-DD)
|
|
349
|
+
*/
|
|
350
|
+
date(date) {
|
|
351
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
|
|
352
|
+
if (!dateRegex.test(date)) {
|
|
353
|
+
return {
|
|
354
|
+
valid: false,
|
|
355
|
+
error: `Invalid date format: ${date}. Expected: YYYY-MM-DD (e.g., 2025-01-15)`
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const parsed = new Date(date);
|
|
359
|
+
if (isNaN(parsed.getTime())) {
|
|
360
|
+
return {
|
|
361
|
+
valid: false,
|
|
362
|
+
error: `Invalid date: ${date}`
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
return { valid: true };
|
|
366
|
+
},
|
|
367
|
+
/**
|
|
368
|
+
* Validate required field
|
|
369
|
+
*/
|
|
370
|
+
required(value, fieldName) {
|
|
371
|
+
if (value === undefined || value === null || value === '') {
|
|
372
|
+
return {
|
|
373
|
+
valid: false,
|
|
374
|
+
error: `${fieldName} is required`
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
return { valid: true };
|
|
378
|
+
},
|
|
379
|
+
/**
|
|
380
|
+
* Validate JSON string
|
|
381
|
+
*/
|
|
382
|
+
json(jsonString, fieldName = 'JSON') {
|
|
383
|
+
try {
|
|
384
|
+
const parsed = JSON.parse(jsonString);
|
|
385
|
+
return { valid: true, parsed };
|
|
386
|
+
}
|
|
387
|
+
catch (e) {
|
|
388
|
+
return {
|
|
389
|
+
valid: false,
|
|
390
|
+
error: `Invalid ${fieldName}: ${e.message}`
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Prompt System
|
|
3
|
+
*
|
|
4
|
+
* Profile-aware prompts that adapt to user preferences:
|
|
5
|
+
* - Developer profile: Skip prompts, require explicit arguments
|
|
6
|
+
* - Marketer profile: Interactive prompts for missing arguments
|
|
7
|
+
* - Balanced profile: Auto-detect TTY and prompt when interactive
|
|
8
|
+
*/
|
|
9
|
+
import { ProfileConfig } from '../types/profile.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check if we're in an interactive terminal
|
|
12
|
+
*/
|
|
13
|
+
export declare function isInteractive(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if we're in scripting/batch mode
|
|
16
|
+
* Indicators: CI environment, non-TTY, or explicit flags
|
|
17
|
+
*/
|
|
18
|
+
export declare function isScriptingMode(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Determine if prompts should be shown based on profile and environment
|
|
21
|
+
*/
|
|
22
|
+
export declare function shouldPrompt(profileConfig?: ProfileConfig): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Prompt for a text input
|
|
25
|
+
*/
|
|
26
|
+
export declare function promptText(message: string, options?: {
|
|
27
|
+
default?: string;
|
|
28
|
+
required?: boolean;
|
|
29
|
+
validate?: (input: string) => boolean | string;
|
|
30
|
+
profileConfig?: ProfileConfig;
|
|
31
|
+
}): Promise<string | undefined>;
|
|
32
|
+
/**
|
|
33
|
+
* Prompt for a number input
|
|
34
|
+
*/
|
|
35
|
+
export declare function promptNumber(message: string, options?: {
|
|
36
|
+
default?: number;
|
|
37
|
+
required?: boolean;
|
|
38
|
+
min?: number;
|
|
39
|
+
max?: number;
|
|
40
|
+
profileConfig?: ProfileConfig;
|
|
41
|
+
}): Promise<number | undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* Prompt for a selection from a list
|
|
44
|
+
*/
|
|
45
|
+
export declare function promptSelect<T = string>(message: string, choices: Array<{
|
|
46
|
+
name: string;
|
|
47
|
+
value: T;
|
|
48
|
+
description?: string;
|
|
49
|
+
}>, options?: {
|
|
50
|
+
default?: T;
|
|
51
|
+
required?: boolean;
|
|
52
|
+
profileConfig?: ProfileConfig;
|
|
53
|
+
}): Promise<T | undefined>;
|
|
54
|
+
/**
|
|
55
|
+
* Prompt for multiple selections from a list
|
|
56
|
+
*/
|
|
57
|
+
export declare function promptMultiSelect<T = string>(message: string, choices: Array<{
|
|
58
|
+
name: string;
|
|
59
|
+
value: T;
|
|
60
|
+
description?: string;
|
|
61
|
+
checked?: boolean;
|
|
62
|
+
}>, options?: {
|
|
63
|
+
required?: boolean;
|
|
64
|
+
profileConfig?: ProfileConfig;
|
|
65
|
+
}): Promise<T[] | undefined>;
|
|
66
|
+
/**
|
|
67
|
+
* Prompt for yes/no confirmation
|
|
68
|
+
*/
|
|
69
|
+
export declare function promptConfirm(message: string, options?: {
|
|
70
|
+
default?: boolean;
|
|
71
|
+
profileConfig?: ProfileConfig;
|
|
72
|
+
}): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Prompt for password/secret input (hidden)
|
|
75
|
+
*/
|
|
76
|
+
export declare function promptPassword(message: string, options?: {
|
|
77
|
+
required?: boolean;
|
|
78
|
+
validate?: (input: string) => boolean | string;
|
|
79
|
+
profileConfig?: ProfileConfig;
|
|
80
|
+
}): Promise<string | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* Show a loading spinner (profile-aware)
|
|
83
|
+
*/
|
|
84
|
+
export interface Spinner {
|
|
85
|
+
start(text?: string): void;
|
|
86
|
+
stop(text?: string): void;
|
|
87
|
+
succeed(text?: string): void;
|
|
88
|
+
fail(text?: string): void;
|
|
89
|
+
text: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a profile-aware spinner
|
|
93
|
+
* Returns a real spinner for profiles with show_progress enabled,
|
|
94
|
+
* otherwise returns a no-op spinner
|
|
95
|
+
*/
|
|
96
|
+
export declare function createSpinner(initialText: string, profileConfig?: ProfileConfig): Spinner;
|
|
97
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"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"}
|