@mrmtsu/mcms-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +184 -0
  3. package/README.md +185 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +143 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/api.d.ts +2 -0
  8. package/dist/commands/api.js +27 -0
  9. package/dist/commands/api.js.map +1 -0
  10. package/dist/commands/auth.d.ts +2 -0
  11. package/dist/commands/auth.js +238 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/completion.d.ts +2 -0
  14. package/dist/commands/completion.js +390 -0
  15. package/dist/commands/completion.js.map +1 -0
  16. package/dist/commands/config.d.ts +2 -0
  17. package/dist/commands/config.js +63 -0
  18. package/dist/commands/config.js.map +1 -0
  19. package/dist/commands/content.d.ts +2 -0
  20. package/dist/commands/content.js +191 -0
  21. package/dist/commands/content.js.map +1 -0
  22. package/dist/commands/media.d.ts +2 -0
  23. package/dist/commands/media.js +47 -0
  24. package/dist/commands/media.js.map +1 -0
  25. package/dist/commands/schema.d.ts +2 -0
  26. package/dist/commands/schema.js +71 -0
  27. package/dist/commands/schema.js.map +1 -0
  28. package/dist/commands/types.d.ts +2 -0
  29. package/dist/commands/types.js +85 -0
  30. package/dist/commands/types.js.map +1 -0
  31. package/dist/commands/utils.d.ts +8 -0
  32. package/dist/commands/utils.js +56 -0
  33. package/dist/commands/utils.js.map +1 -0
  34. package/dist/commands/validate.d.ts +2 -0
  35. package/dist/commands/validate.js +38 -0
  36. package/dist/commands/validate.js.map +1 -0
  37. package/dist/core/auth-store.d.ts +11 -0
  38. package/dist/core/auth-store.js +83 -0
  39. package/dist/core/auth-store.js.map +1 -0
  40. package/dist/core/client.d.ts +33 -0
  41. package/dist/core/client.js +416 -0
  42. package/dist/core/client.js.map +1 -0
  43. package/dist/core/config.d.ts +11 -0
  44. package/dist/core/config.js +73 -0
  45. package/dist/core/config.js.map +1 -0
  46. package/dist/core/context.d.ts +39 -0
  47. package/dist/core/context.js +382 -0
  48. package/dist/core/context.js.map +1 -0
  49. package/dist/core/errors.d.ts +26 -0
  50. package/dist/core/errors.js +167 -0
  51. package/dist/core/errors.js.map +1 -0
  52. package/dist/core/exit-codes.d.ts +10 -0
  53. package/dist/core/exit-codes.js +10 -0
  54. package/dist/core/exit-codes.js.map +1 -0
  55. package/dist/core/http.d.ts +24 -0
  56. package/dist/core/http.js +237 -0
  57. package/dist/core/http.js.map +1 -0
  58. package/dist/core/io.d.ts +2 -0
  59. package/dist/core/io.js +39 -0
  60. package/dist/core/io.js.map +1 -0
  61. package/dist/core/output.d.ts +4 -0
  62. package/dist/core/output.js +182 -0
  63. package/dist/core/output.js.map +1 -0
  64. package/dist/core/schema.d.ts +23 -0
  65. package/dist/core/schema.js +319 -0
  66. package/dist/core/schema.js.map +1 -0
  67. package/dist/validation/payload.d.ts +6 -0
  68. package/dist/validation/payload.js +204 -0
  69. package/dist/validation/payload.js.map +1 -0
  70. package/package.json +39 -0
@@ -0,0 +1,39 @@
1
+ export type ApiKeySource = "option" | "env" | "keychain" | "none";
2
+ export type ApiKeySourceDetail = "option" | "stdin" | "prompt" | "env" | "keychain_profile" | "keychain_service" | "none";
3
+ export type ProfileSource = "option" | "env" | "config" | "none";
4
+ export type ServiceDomainSource = "option" | "env" | "profile" | "config" | "none";
5
+ export type OutputMode = "inspect" | "plain" | "table";
6
+ export type RuntimeContext = {
7
+ json: boolean;
8
+ verbose: boolean;
9
+ color: boolean;
10
+ timeoutMs: number;
11
+ retry: number;
12
+ retryMaxDelayMs: number;
13
+ outputMode: OutputMode;
14
+ selectFields?: string[];
15
+ profile?: string;
16
+ profileSource: ProfileSource;
17
+ serviceDomain?: string;
18
+ serviceDomainSource: ServiceDomainSource;
19
+ apiKey?: string;
20
+ apiKeySource: ApiKeySource;
21
+ apiKeySourceDetail: ApiKeySourceDetail;
22
+ };
23
+ export type GlobalOptions = {
24
+ json?: boolean;
25
+ plain?: boolean;
26
+ table?: boolean;
27
+ select?: string;
28
+ profile?: string;
29
+ serviceDomain?: string;
30
+ apiKey?: string;
31
+ apiKeyStdin?: boolean;
32
+ apiKeyPrompt?: boolean;
33
+ timeout?: string | number;
34
+ retry?: string | number;
35
+ retryMaxDelay?: string | number;
36
+ verbose?: boolean;
37
+ color?: boolean;
38
+ };
39
+ export declare function createRuntimeContext(options: GlobalOptions): Promise<RuntimeContext>;
@@ -0,0 +1,382 @@
1
+ import { readApiKey, readApiKeyForProfile } from "./auth-store.js";
2
+ import { readConfig } from "./config.js";
3
+ import { CliError } from "./errors.js";
4
+ import { EXIT_CODE } from "./exit-codes.js";
5
+ export async function createRuntimeContext(options) {
6
+ const config = await readConfig();
7
+ const profileOption = normalizeString(options.profile);
8
+ const profileEnv = normalizeString(process.env.MICROCMS_PROFILE);
9
+ const profileConfig = normalizeString(config.defaultProfile);
10
+ const profile = resolveProfileName(profileOption ?? profileEnv ?? profileConfig);
11
+ const profileSource = profileOption
12
+ ? "option"
13
+ : profileEnv
14
+ ? "env"
15
+ : profileConfig
16
+ ? "config"
17
+ : "none";
18
+ const profileServiceDomain = profile ? normalizeString(config.profiles?.[profile]?.serviceDomain) : undefined;
19
+ const serviceDomainOption = normalizeString(options.serviceDomain);
20
+ const serviceDomainEnv = normalizeString(process.env.MICROCMS_SERVICE_DOMAIN);
21
+ const serviceDomainConfig = normalizeString(config.serviceDomain);
22
+ const serviceDomain = resolveServiceDomain(serviceDomainOption ?? serviceDomainEnv ?? profileServiceDomain ?? serviceDomainConfig);
23
+ const serviceDomainSource = serviceDomainOption
24
+ ? "option"
25
+ : serviceDomainEnv
26
+ ? "env"
27
+ : profileServiceDomain
28
+ ? "profile"
29
+ : serviceDomainConfig
30
+ ? "config"
31
+ : "none";
32
+ const fromOption = normalizeString(options.apiKey);
33
+ const apiKeyStdin = Boolean(options.apiKeyStdin);
34
+ const apiKeyPrompt = Boolean(options.apiKeyPrompt);
35
+ if (fromOption && apiKeyStdin) {
36
+ throw new CliError({
37
+ code: "INVALID_INPUT",
38
+ message: "Use either --api-key or --api-key-stdin, not both",
39
+ exitCode: EXIT_CODE.INVALID_INPUT
40
+ });
41
+ }
42
+ if (apiKeyPrompt && (fromOption || apiKeyStdin)) {
43
+ throw new CliError({
44
+ code: "INVALID_INPUT",
45
+ message: "Use --prompt alone. It conflicts with --api-key and --api-key-stdin.",
46
+ exitCode: EXIT_CODE.INVALID_INPUT
47
+ });
48
+ }
49
+ let apiKey = fromOption;
50
+ let apiKeySource = "none";
51
+ let apiKeySourceDetail = "none";
52
+ if (apiKey) {
53
+ apiKeySource = "option";
54
+ apiKeySourceDetail = "option";
55
+ }
56
+ else if (apiKeyStdin) {
57
+ apiKey = await readApiKeyFromStdin();
58
+ apiKeySource = "option";
59
+ apiKeySourceDetail = "stdin";
60
+ }
61
+ else if (apiKeyPrompt) {
62
+ apiKey = await readApiKeyFromPrompt();
63
+ apiKeySource = "option";
64
+ apiKeySourceDetail = "prompt";
65
+ }
66
+ else {
67
+ apiKey = normalizeString(process.env.MICROCMS_API_KEY);
68
+ if (apiKey) {
69
+ apiKeySource = "env";
70
+ apiKeySourceDetail = "env";
71
+ }
72
+ }
73
+ if (!apiKey && profile) {
74
+ const fromProfileKeychain = await readApiKeyForProfile(profile);
75
+ if (fromProfileKeychain) {
76
+ apiKey = fromProfileKeychain;
77
+ apiKeySource = "keychain";
78
+ apiKeySourceDetail = "keychain_profile";
79
+ }
80
+ }
81
+ if (!apiKey && serviceDomain) {
82
+ const fromKeychain = await readApiKey(serviceDomain);
83
+ if (fromKeychain) {
84
+ apiKey = fromKeychain;
85
+ apiKeySource = "keychain";
86
+ apiKeySourceDetail = "keychain_service";
87
+ }
88
+ }
89
+ return {
90
+ json: Boolean(options.json),
91
+ verbose: Boolean(options.verbose),
92
+ color: options.color !== false,
93
+ timeoutMs: parseTimeout(options.timeout),
94
+ retry: parseRetry(options.retry),
95
+ retryMaxDelayMs: parseRetryMaxDelay(options.retryMaxDelay),
96
+ ...parseOutputMode(options),
97
+ profile,
98
+ profileSource,
99
+ serviceDomain,
100
+ serviceDomainSource,
101
+ apiKey,
102
+ apiKeySource,
103
+ apiKeySourceDetail
104
+ };
105
+ }
106
+ function parseOutputMode(options) {
107
+ const plain = Boolean(options.plain);
108
+ const table = Boolean(options.table);
109
+ if (plain && table) {
110
+ throw new CliError({
111
+ code: "INVALID_INPUT",
112
+ message: "Use either --plain or --table, not both",
113
+ exitCode: EXIT_CODE.INVALID_INPUT
114
+ });
115
+ }
116
+ if (Boolean(options.json) && (plain || table)) {
117
+ throw new CliError({
118
+ code: "INVALID_INPUT",
119
+ message: "--json cannot be combined with --plain or --table",
120
+ exitCode: EXIT_CODE.INVALID_INPUT
121
+ });
122
+ }
123
+ const selectFields = parseSelectFields(options.select);
124
+ return {
125
+ outputMode: table ? "table" : plain ? "plain" : "inspect",
126
+ selectFields
127
+ };
128
+ }
129
+ function parseSelectFields(value) {
130
+ if (!value) {
131
+ return undefined;
132
+ }
133
+ const fields = value
134
+ .split(",")
135
+ .map((field) => field.trim())
136
+ .filter((field) => field.length > 0);
137
+ if (fields.length === 0) {
138
+ throw new CliError({
139
+ code: "INVALID_INPUT",
140
+ message: "--select requires at least one field name",
141
+ exitCode: EXIT_CODE.INVALID_INPUT
142
+ });
143
+ }
144
+ const unique = [...new Set(fields)];
145
+ if (unique.some((field) => !/^[A-Za-z0-9_.-]+$/.test(field))) {
146
+ throw new CliError({
147
+ code: "INVALID_INPUT",
148
+ message: "--select supports letters, numbers, dot, underscore, hyphen",
149
+ exitCode: EXIT_CODE.INVALID_INPUT
150
+ });
151
+ }
152
+ return unique;
153
+ }
154
+ function parseTimeout(value) {
155
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
156
+ return assertRange("timeout", value, 1, 120_000);
157
+ }
158
+ if (typeof value === "string") {
159
+ const parsed = Number.parseInt(value, 10);
160
+ if (/^\d+$/.test(value.trim()) && Number.isFinite(parsed) && parsed > 0) {
161
+ return assertRange("timeout", parsed, 1, 120_000);
162
+ }
163
+ throw invalidInteger("timeout", value, "1-120000");
164
+ }
165
+ return 10_000;
166
+ }
167
+ function parseRetry(value) {
168
+ if (typeof value === "number" && Number.isFinite(value)) {
169
+ return assertRange("retry", value, 0, 10);
170
+ }
171
+ if (typeof value === "string") {
172
+ const parsed = Number.parseInt(value, 10);
173
+ if (/^\d+$/.test(value.trim()) && Number.isFinite(parsed)) {
174
+ return assertRange("retry", parsed, 0, 10);
175
+ }
176
+ throw invalidInteger("retry", value, "0-10");
177
+ }
178
+ return 2;
179
+ }
180
+ function parseRetryMaxDelay(value) {
181
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
182
+ return assertRange("retry-max-delay", value, 100, 120_000);
183
+ }
184
+ if (typeof value === "string") {
185
+ const parsed = Number.parseInt(value, 10);
186
+ if (/^\d+$/.test(value.trim()) && Number.isFinite(parsed) && parsed > 0) {
187
+ return assertRange("retry-max-delay", parsed, 100, 120_000);
188
+ }
189
+ throw invalidInteger("retry-max-delay", value, "100-120000");
190
+ }
191
+ return 3_000;
192
+ }
193
+ function normalizeString(value) {
194
+ if (!value) {
195
+ return undefined;
196
+ }
197
+ const trimmed = value.trim();
198
+ return trimmed.length > 0 ? trimmed : undefined;
199
+ }
200
+ function resolveProfileName(value) {
201
+ if (!value) {
202
+ return undefined;
203
+ }
204
+ if (!/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62}[A-Za-z0-9])?$/.test(value)) {
205
+ throw new CliError({
206
+ code: "INVALID_INPUT",
207
+ message: "Invalid profile name format. Use letters, numbers, dot, underscore, hyphen (1-64 chars).",
208
+ exitCode: EXIT_CODE.INVALID_INPUT,
209
+ details: { provided: value }
210
+ });
211
+ }
212
+ return value;
213
+ }
214
+ function resolveServiceDomain(value) {
215
+ if (!value) {
216
+ return undefined;
217
+ }
218
+ const normalized = value.toLowerCase();
219
+ if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(normalized)) {
220
+ throw new CliError({
221
+ code: "INVALID_INPUT",
222
+ message: "Invalid service domain format. Expected lowercase letters, numbers, hyphens, max 63 chars, no leading/trailing hyphen.",
223
+ exitCode: EXIT_CODE.INVALID_INPUT,
224
+ details: {
225
+ provided: value
226
+ }
227
+ });
228
+ }
229
+ return normalized;
230
+ }
231
+ async function readApiKeyFromStdin() {
232
+ if (process.stdin.isTTY) {
233
+ throw new CliError({
234
+ code: "INVALID_INPUT",
235
+ message: "--api-key-stdin requires piped stdin input (TTY is not supported)",
236
+ exitCode: EXIT_CODE.INVALID_INPUT
237
+ });
238
+ }
239
+ const chunks = [];
240
+ for await (const chunk of process.stdin) {
241
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
242
+ }
243
+ const trimmed = Buffer.concat(chunks).toString("utf8").trim();
244
+ if (!trimmed) {
245
+ throw new CliError({
246
+ code: "INVALID_INPUT",
247
+ message: "--api-key-stdin was specified but stdin did not contain an API key",
248
+ exitCode: EXIT_CODE.INVALID_INPUT
249
+ });
250
+ }
251
+ return trimmed;
252
+ }
253
+ async function readApiKeyFromPrompt() {
254
+ if (!process.stdin.isTTY || !process.stderr.isTTY) {
255
+ throw new CliError({
256
+ code: "INVALID_INPUT",
257
+ message: "--prompt requires an interactive TTY",
258
+ exitCode: EXIT_CODE.INVALID_INPUT
259
+ });
260
+ }
261
+ const stdin = process.stdin;
262
+ const wasRaw = Boolean(stdin.isRaw);
263
+ stdin.setEncoding("utf8");
264
+ stdin.resume();
265
+ process.stderr.write("API key: ");
266
+ return new Promise((resolve, reject) => {
267
+ let value = "";
268
+ let escapePending = false;
269
+ let inControlSequence = false;
270
+ let settled = false;
271
+ const cleanup = () => {
272
+ stdin.off("data", onData);
273
+ stdin.off("end", onEnd);
274
+ stdin.off("error", onError);
275
+ if (stdin.isTTY) {
276
+ stdin.setRawMode(wasRaw);
277
+ }
278
+ stdin.pause();
279
+ process.stderr.write("\n");
280
+ };
281
+ const finishResolve = (apiKey) => {
282
+ if (settled) {
283
+ return;
284
+ }
285
+ settled = true;
286
+ cleanup();
287
+ resolve(apiKey);
288
+ };
289
+ const finishReject = (error) => {
290
+ if (settled) {
291
+ return;
292
+ }
293
+ settled = true;
294
+ cleanup();
295
+ reject(error);
296
+ };
297
+ const onData = (chunk) => {
298
+ const text = Buffer.isBuffer(chunk) ? chunk.toString("utf8") : chunk;
299
+ for (const char of text) {
300
+ if (escapePending) {
301
+ escapePending = false;
302
+ if (char === "[" || char === "O") {
303
+ inControlSequence = true;
304
+ }
305
+ continue;
306
+ }
307
+ if (inControlSequence) {
308
+ if (/[A-Za-z~]/.test(char)) {
309
+ inControlSequence = false;
310
+ }
311
+ continue;
312
+ }
313
+ if (char === "\r" || char === "\n") {
314
+ const trimmed = value.trim();
315
+ if (!trimmed) {
316
+ finishReject(new CliError({
317
+ code: "INVALID_INPUT",
318
+ message: "No API key was entered",
319
+ exitCode: EXIT_CODE.INVALID_INPUT
320
+ }));
321
+ return;
322
+ }
323
+ finishResolve(trimmed);
324
+ return;
325
+ }
326
+ if (char === "\u0003") {
327
+ finishReject(new CliError({
328
+ code: "INVALID_INPUT",
329
+ message: "API key input canceled",
330
+ exitCode: EXIT_CODE.INVALID_INPUT
331
+ }));
332
+ return;
333
+ }
334
+ if (char === "\u007f" || char === "\b" || char === "\u0008") {
335
+ value = value.slice(0, -1);
336
+ continue;
337
+ }
338
+ if (char === "\u001b") {
339
+ escapePending = true;
340
+ continue;
341
+ }
342
+ if (char >= " ") {
343
+ value += char;
344
+ }
345
+ }
346
+ };
347
+ const onEnd = () => {
348
+ finishReject(new CliError({
349
+ code: "INVALID_INPUT",
350
+ message: "API key input stream ended before completion",
351
+ exitCode: EXIT_CODE.INVALID_INPUT
352
+ }));
353
+ };
354
+ const onError = () => {
355
+ finishReject(new CliError({
356
+ code: "INVALID_INPUT",
357
+ message: "Failed to read API key from prompt",
358
+ exitCode: EXIT_CODE.INVALID_INPUT
359
+ }));
360
+ };
361
+ if (stdin.isTTY) {
362
+ stdin.setRawMode(true);
363
+ }
364
+ stdin.on("data", onData);
365
+ stdin.on("end", onEnd);
366
+ stdin.on("error", onError);
367
+ });
368
+ }
369
+ function assertRange(name, value, min, max) {
370
+ if (!Number.isInteger(value) || value < min || value > max) {
371
+ throw invalidInteger(name, String(value), `${min}-${max}`);
372
+ }
373
+ return value;
374
+ }
375
+ function invalidInteger(name, value, expectedRange) {
376
+ return new CliError({
377
+ code: "INVALID_INPUT",
378
+ message: `Invalid ${name}: ${value}. Expected integer in range ${expectedRange}.`,
379
+ exitCode: EXIT_CODE.INVALID_INPUT
380
+ });
381
+ }
382
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ExitCode } from "./exit-codes.js";
2
+ export type ErrorCode = "INVALID_INPUT" | "AUTH_FAILED" | "FORBIDDEN" | "NETWORK_ERROR" | "CONFLICT" | "NOT_FOUND" | "API_ERROR" | "UNKNOWN_ERROR";
3
+ export type JsonErrorShape = {
4
+ code: ErrorCode;
5
+ message: string;
6
+ details?: unknown;
7
+ retryable: boolean;
8
+ };
9
+ export declare class CliError extends Error {
10
+ readonly code: ErrorCode;
11
+ readonly exitCode: ExitCode;
12
+ readonly details?: unknown;
13
+ readonly retryable: boolean;
14
+ constructor(params: {
15
+ code: ErrorCode;
16
+ message: string;
17
+ exitCode: ExitCode;
18
+ details?: unknown;
19
+ retryable?: boolean;
20
+ });
21
+ toJson(options?: {
22
+ includeDetails?: boolean;
23
+ }): JsonErrorShape;
24
+ }
25
+ export declare function fromHttpStatus(status: number, message: string, details?: unknown): CliError;
26
+ export declare function normalizeError(error: unknown): CliError;
@@ -0,0 +1,167 @@
1
+ import { EXIT_CODE } from "./exit-codes.js";
2
+ export class CliError extends Error {
3
+ code;
4
+ exitCode;
5
+ details;
6
+ retryable;
7
+ constructor(params) {
8
+ super(params.message);
9
+ this.name = "CliError";
10
+ this.code = params.code;
11
+ this.exitCode = params.exitCode;
12
+ this.details = params.details;
13
+ this.retryable = Boolean(params.retryable);
14
+ }
15
+ toJson(options) {
16
+ const payload = {
17
+ code: this.code,
18
+ message: this.message,
19
+ retryable: this.retryable
20
+ };
21
+ if (options?.includeDetails && this.details !== undefined) {
22
+ payload.details = this.details;
23
+ }
24
+ return payload;
25
+ }
26
+ }
27
+ const NETWORK_NAMES = new Set(["AbortError", "FetchError"]);
28
+ function isLikelyNetworkError(err) {
29
+ if (!(err instanceof Error)) {
30
+ return false;
31
+ }
32
+ if (NETWORK_NAMES.has(err.name)) {
33
+ return true;
34
+ }
35
+ const code = err.code;
36
+ if (typeof code === "string") {
37
+ return [
38
+ "ECONNRESET",
39
+ "ECONNREFUSED",
40
+ "ENOTFOUND",
41
+ "ETIMEDOUT",
42
+ "EAI_AGAIN"
43
+ ].includes(code);
44
+ }
45
+ return false;
46
+ }
47
+ export function fromHttpStatus(status, message, details) {
48
+ if (status === 401) {
49
+ return new CliError({
50
+ code: "AUTH_FAILED",
51
+ message,
52
+ details,
53
+ exitCode: EXIT_CODE.AUTH,
54
+ retryable: false
55
+ });
56
+ }
57
+ if (status === 403) {
58
+ return new CliError({
59
+ code: "FORBIDDEN",
60
+ message,
61
+ details,
62
+ exitCode: EXIT_CODE.PERMISSION,
63
+ retryable: false
64
+ });
65
+ }
66
+ if (status === 404) {
67
+ return new CliError({
68
+ code: "NOT_FOUND",
69
+ message,
70
+ details,
71
+ exitCode: EXIT_CODE.INVALID_INPUT,
72
+ retryable: false
73
+ });
74
+ }
75
+ if (status === 409) {
76
+ return new CliError({
77
+ code: "CONFLICT",
78
+ message,
79
+ details,
80
+ exitCode: EXIT_CODE.CONFLICT,
81
+ retryable: false
82
+ });
83
+ }
84
+ if (status === 408 || status === 425 || status === 429) {
85
+ return new CliError({
86
+ code: "NETWORK_ERROR",
87
+ message,
88
+ details,
89
+ exitCode: EXIT_CODE.NETWORK,
90
+ retryable: true
91
+ });
92
+ }
93
+ if (status >= 500) {
94
+ return new CliError({
95
+ code: "API_ERROR",
96
+ message,
97
+ details,
98
+ exitCode: EXIT_CODE.NETWORK,
99
+ retryable: true
100
+ });
101
+ }
102
+ return new CliError({
103
+ code: "API_ERROR",
104
+ message,
105
+ details,
106
+ exitCode: EXIT_CODE.UNKNOWN,
107
+ retryable: false
108
+ });
109
+ }
110
+ export function normalizeError(error) {
111
+ if (error instanceof CliError) {
112
+ return error;
113
+ }
114
+ if (isLikelyNetworkError(error)) {
115
+ return new CliError({
116
+ code: "NETWORK_ERROR",
117
+ message: "Network request failed",
118
+ details: toErrorDetails(error),
119
+ exitCode: EXIT_CODE.NETWORK,
120
+ retryable: true
121
+ });
122
+ }
123
+ const status = getStatusCode(error);
124
+ if (typeof status === "number") {
125
+ return fromHttpStatus(status, `microCMS API request failed with status ${status}`, toErrorDetails(error));
126
+ }
127
+ if (error instanceof Error) {
128
+ return new CliError({
129
+ code: "UNKNOWN_ERROR",
130
+ message: error.message,
131
+ details: toErrorDetails(error),
132
+ exitCode: EXIT_CODE.UNKNOWN,
133
+ retryable: false
134
+ });
135
+ }
136
+ return new CliError({
137
+ code: "UNKNOWN_ERROR",
138
+ message: "Unexpected error",
139
+ details: { error },
140
+ exitCode: EXIT_CODE.UNKNOWN,
141
+ retryable: false
142
+ });
143
+ }
144
+ function getStatusCode(error) {
145
+ if (typeof error !== "object" || error === null) {
146
+ return undefined;
147
+ }
148
+ const maybeStatus = error.status;
149
+ if (typeof maybeStatus === "number") {
150
+ return maybeStatus;
151
+ }
152
+ const responseStatus = error.response?.status;
153
+ if (typeof responseStatus === "number") {
154
+ return responseStatus;
155
+ }
156
+ return undefined;
157
+ }
158
+ function toErrorDetails(error) {
159
+ if (error instanceof Error) {
160
+ return {
161
+ name: error.name,
162
+ message: error.message
163
+ };
164
+ }
165
+ return error;
166
+ }
167
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAmB3D,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAY;IAChB,QAAQ,CAAW;IACnB,OAAO,CAAW;IAClB,SAAS,CAAU;IAE5B,YAAY,MAMX;QACC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,OAAsC;QAC3C,MAAM,OAAO,GAAmB;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QAEF,IAAI,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AAE5D,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO;YACL,YAAY;YACZ,cAAc;YACd,WAAW;YACX,WAAW;YACX,WAAW;SACZ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe,EAAE,OAAiB;IAC/E,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,aAAa;YACnB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,IAAI;YACxB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,UAAU;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,aAAa;YACjC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,UAAU;YAChB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACvD,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,OAAO;QACP,QAAQ,EAAE,SAAS,CAAC,OAAO;QAC3B,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;YAC9B,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC,MAAM,EAAE,2CAA2C,MAAM,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5G,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;YAC9B,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC;QAClB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,EAAE,KAAK,EAAE;QAClB,QAAQ,EAAE,SAAS,CAAC,OAAO;QAC3B,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAI,KAA8B,CAAC,MAAM,CAAC;IAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,cAAc,GAAI,KAA6C,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvF,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const EXIT_CODE: {
2
+ readonly SUCCESS: 0;
3
+ readonly UNKNOWN: 1;
4
+ readonly INVALID_INPUT: 2;
5
+ readonly AUTH: 3;
6
+ readonly PERMISSION: 4;
7
+ readonly NETWORK: 5;
8
+ readonly CONFLICT: 6;
9
+ };
10
+ export type ExitCode = (typeof EXIT_CODE)[keyof typeof EXIT_CODE];
@@ -0,0 +1,10 @@
1
+ export const EXIT_CODE = {
2
+ SUCCESS: 0,
3
+ UNKNOWN: 1,
4
+ INVALID_INPUT: 2,
5
+ AUTH: 3,
6
+ PERMISSION: 4,
7
+ NETWORK: 5,
8
+ CONFLICT: 6
9
+ };
10
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/core/exit-codes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;CACH,CAAC"}