@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.
- package/LICENSE +21 -0
- package/README.ja.md +184 -0
- package/README.md +185 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/api.d.ts +2 -0
- package/dist/commands/api.js +27 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +238 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.js +390 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +63 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/content.d.ts +2 -0
- package/dist/commands/content.js +191 -0
- package/dist/commands/content.js.map +1 -0
- package/dist/commands/media.d.ts +2 -0
- package/dist/commands/media.js +47 -0
- package/dist/commands/media.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +71 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.js +85 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/utils.d.ts +8 -0
- package/dist/commands/utils.js +56 -0
- package/dist/commands/utils.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +38 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/auth-store.d.ts +11 -0
- package/dist/core/auth-store.js +83 -0
- package/dist/core/auth-store.js.map +1 -0
- package/dist/core/client.d.ts +33 -0
- package/dist/core/client.js +416 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +11 -0
- package/dist/core/config.js +73 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +39 -0
- package/dist/core/context.js +382 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.js +167 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/exit-codes.d.ts +10 -0
- package/dist/core/exit-codes.js +10 -0
- package/dist/core/exit-codes.js.map +1 -0
- package/dist/core/http.d.ts +24 -0
- package/dist/core/http.js +237 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/io.d.ts +2 -0
- package/dist/core/io.js +39 -0
- package/dist/core/io.js.map +1 -0
- package/dist/core/output.d.ts +4 -0
- package/dist/core/output.js +182 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/schema.d.ts +23 -0
- package/dist/core/schema.js +319 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/validation/payload.d.ts +6 -0
- package/dist/validation/payload.js +204 -0
- package/dist/validation/payload.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type RequestBaseParams = {
|
|
2
|
+
url: string;
|
|
3
|
+
method: "GET" | "POST" | "PATCH" | "PUT" | "DELETE";
|
|
4
|
+
apiKey: string;
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
retry: number;
|
|
7
|
+
retryMaxDelayMs: number;
|
|
8
|
+
verbose?: boolean;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
type JsonRequestParams = Omit<RequestBaseParams, "method"> & {
|
|
12
|
+
method?: RequestBaseParams["method"];
|
|
13
|
+
body?: unknown;
|
|
14
|
+
};
|
|
15
|
+
type JsonResponse<T> = {
|
|
16
|
+
data: T;
|
|
17
|
+
requestId: string | null;
|
|
18
|
+
};
|
|
19
|
+
export declare function requestJson<T>(params: JsonRequestParams): Promise<JsonResponse<T>>;
|
|
20
|
+
type FormRequestParams = Omit<RequestBaseParams, "method"> & {
|
|
21
|
+
formData: FormData;
|
|
22
|
+
};
|
|
23
|
+
export declare function requestFormData<T>(params: FormRequestParams): Promise<JsonResponse<T>>;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { CliError, fromHttpStatus, normalizeError } from "./errors.js";
|
|
2
|
+
import { EXIT_CODE } from "./exit-codes.js";
|
|
3
|
+
export async function requestJson(params) {
|
|
4
|
+
const method = params.method ?? "GET";
|
|
5
|
+
return requestWithRetry({
|
|
6
|
+
...params,
|
|
7
|
+
method
|
|
8
|
+
}, async (signal) => {
|
|
9
|
+
return fetch(params.url, {
|
|
10
|
+
method,
|
|
11
|
+
headers: {
|
|
12
|
+
"Content-Type": "application/json",
|
|
13
|
+
"X-MICROCMS-API-KEY": params.apiKey,
|
|
14
|
+
...params.headers
|
|
15
|
+
},
|
|
16
|
+
body: params.body === undefined ? undefined : JSON.stringify(params.body),
|
|
17
|
+
signal
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function requestFormData(params) {
|
|
22
|
+
return requestWithRetry({
|
|
23
|
+
...params,
|
|
24
|
+
method: "POST"
|
|
25
|
+
}, async (signal) => {
|
|
26
|
+
return fetch(params.url, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: {
|
|
29
|
+
"X-MICROCMS-API-KEY": params.apiKey,
|
|
30
|
+
...params.headers
|
|
31
|
+
},
|
|
32
|
+
body: params.formData,
|
|
33
|
+
signal
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function requestWithRetry(params, sender) {
|
|
38
|
+
const retryPolicy = resolveRetryPolicy(params.method, params.headers);
|
|
39
|
+
const maxAttempts = retryPolicy.allowed ? params.retry + 1 : 1;
|
|
40
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
41
|
+
let response;
|
|
42
|
+
try {
|
|
43
|
+
response = await withTimeout(params.timeoutMs, sender);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const normalized = normalizeNetworkError(error, params.timeoutMs);
|
|
47
|
+
if (shouldRetry(normalized, attempt, maxAttempts)) {
|
|
48
|
+
const delayMs = computeRetryDelay(attempt, undefined, params.retryMaxDelayMs);
|
|
49
|
+
emitRetryLog(params, normalized, attempt, maxAttempts, delayMs);
|
|
50
|
+
await sleep(delayMs);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
emitRetrySkipLog(params, normalized, retryPolicy);
|
|
54
|
+
throw withRetryDiagnostics(normalized, attempt, maxAttempts, retryPolicy);
|
|
55
|
+
}
|
|
56
|
+
const requestId = response.headers.get("x-request-id");
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const data = await parseSuccessBody(response);
|
|
59
|
+
return {
|
|
60
|
+
data,
|
|
61
|
+
requestId
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const retryAfterMs = parseRetryAfterHeader(response.headers.get("retry-after"));
|
|
65
|
+
const responseText = await response.text();
|
|
66
|
+
const responseBody = responseText.length > 0 ? safeJsonParse(responseText) : undefined;
|
|
67
|
+
const errorDetails = withMetadata(responseBody, {
|
|
68
|
+
status: response.status,
|
|
69
|
+
requestId,
|
|
70
|
+
retryAfterMs
|
|
71
|
+
});
|
|
72
|
+
const normalized = fromHttpStatus(response.status, `microCMS API request failed with status ${response.status}`, errorDetails);
|
|
73
|
+
if (shouldRetry(normalized, attempt, maxAttempts)) {
|
|
74
|
+
const delayMs = computeRetryDelay(attempt, retryAfterMs, params.retryMaxDelayMs);
|
|
75
|
+
emitRetryLog(params, normalized, attempt, maxAttempts, delayMs);
|
|
76
|
+
await sleep(delayMs);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
emitRetrySkipLog(params, normalized, retryPolicy);
|
|
80
|
+
throw withRetryDiagnostics(normalized, attempt, maxAttempts, retryPolicy);
|
|
81
|
+
}
|
|
82
|
+
throw new CliError({
|
|
83
|
+
code: "UNKNOWN_ERROR",
|
|
84
|
+
message: "Retry loop terminated unexpectedly",
|
|
85
|
+
exitCode: EXIT_CODE.UNKNOWN
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async function withTimeout(timeoutMs, sender) {
|
|
89
|
+
const controller = new AbortController();
|
|
90
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
91
|
+
try {
|
|
92
|
+
return await sender(controller.signal);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function resolveRetryPolicy(method, headers) {
|
|
99
|
+
const upperMethod = method.toUpperCase();
|
|
100
|
+
if (upperMethod === "GET") {
|
|
101
|
+
return {
|
|
102
|
+
allowed: true,
|
|
103
|
+
reason: "safe_method"
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const hasIdempotencyKey = Object.entries(headers ?? {}).some(([key, value]) => {
|
|
107
|
+
const lower = key.toLowerCase();
|
|
108
|
+
if (lower !== "idempotency-key" && lower !== "x-idempotency-key") {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return value.trim().length > 0;
|
|
112
|
+
});
|
|
113
|
+
if (hasIdempotencyKey) {
|
|
114
|
+
return {
|
|
115
|
+
allowed: true,
|
|
116
|
+
reason: "idempotency_key"
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
allowed: false,
|
|
121
|
+
reason: "unsafe_method"
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function normalizeNetworkError(error, timeoutMs) {
|
|
125
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
126
|
+
return new CliError({
|
|
127
|
+
code: "NETWORK_ERROR",
|
|
128
|
+
message: `Request timed out after ${timeoutMs}ms`,
|
|
129
|
+
exitCode: EXIT_CODE.NETWORK,
|
|
130
|
+
retryable: true
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return normalizeError(error);
|
|
134
|
+
}
|
|
135
|
+
function shouldRetry(error, attempt, maxAttempts) {
|
|
136
|
+
return error.retryable && attempt < maxAttempts;
|
|
137
|
+
}
|
|
138
|
+
function emitRetryLog(params, error, attempt, maxAttempts, delayMs) {
|
|
139
|
+
if (!params.verbose) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const nextAttempt = attempt + 1;
|
|
143
|
+
process.stderr.write(`[retry] ${error.code} on attempt ${attempt}/${maxAttempts}, retrying attempt ${nextAttempt} in ${delayMs}ms\n`);
|
|
144
|
+
}
|
|
145
|
+
function emitRetrySkipLog(params, error, retryPolicy) {
|
|
146
|
+
if (!params.verbose) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!error.retryable || retryPolicy.allowed || params.retry <= 0) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const safeUrl = sanitizeUrlForLog(params.url);
|
|
153
|
+
process.stderr.write(`[retry] skipped for ${params.method} ${safeUrl} because request is not retry-safe (set an idempotency key to enable)\n`);
|
|
154
|
+
}
|
|
155
|
+
function computeRetryDelay(attempt, retryAfterMs, maxDelayMs) {
|
|
156
|
+
if (retryAfterMs !== undefined) {
|
|
157
|
+
return Math.max(0, Math.min(retryAfterMs, maxDelayMs));
|
|
158
|
+
}
|
|
159
|
+
const exponential = 250 * 2 ** (attempt - 1);
|
|
160
|
+
const jitter = Math.floor(Math.random() * 100);
|
|
161
|
+
return Math.min(exponential + jitter, maxDelayMs);
|
|
162
|
+
}
|
|
163
|
+
function parseRetryAfterHeader(value) {
|
|
164
|
+
if (!value) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
const asSeconds = Number.parseInt(value, 10);
|
|
168
|
+
if (Number.isFinite(asSeconds) && asSeconds >= 0) {
|
|
169
|
+
return asSeconds * 1000;
|
|
170
|
+
}
|
|
171
|
+
const timestamp = Date.parse(value);
|
|
172
|
+
if (Number.isFinite(timestamp)) {
|
|
173
|
+
return Math.max(0, timestamp - Date.now());
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
async function parseSuccessBody(response) {
|
|
178
|
+
const text = await response.text();
|
|
179
|
+
const body = text.length > 0 ? safeJsonParse(text) : undefined;
|
|
180
|
+
return (body ?? {});
|
|
181
|
+
}
|
|
182
|
+
function withMetadata(body, metadata) {
|
|
183
|
+
if (typeof body === "object" && body !== null && !Array.isArray(body)) {
|
|
184
|
+
return {
|
|
185
|
+
...body,
|
|
186
|
+
...metadata
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
body,
|
|
191
|
+
...metadata
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function withRetryDiagnostics(error, attempt, maxAttempts, retryPolicy) {
|
|
195
|
+
const retriesUsed = Math.max(0, attempt - 1);
|
|
196
|
+
const details = withMetadata(error.details, {
|
|
197
|
+
retry: {
|
|
198
|
+
attempts: attempt,
|
|
199
|
+
retriesUsed,
|
|
200
|
+
maxAttempts,
|
|
201
|
+
policy: retryPolicy
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
return new CliError({
|
|
205
|
+
code: error.code,
|
|
206
|
+
message: error.message,
|
|
207
|
+
exitCode: error.exitCode,
|
|
208
|
+
retryable: error.retryable,
|
|
209
|
+
details
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function safeJsonParse(text) {
|
|
213
|
+
try {
|
|
214
|
+
return JSON.parse(text);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return { raw: text };
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function sleep(ms) {
|
|
221
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
222
|
+
}
|
|
223
|
+
function sanitizeUrlForLog(url) {
|
|
224
|
+
try {
|
|
225
|
+
const parsed = new URL(url);
|
|
226
|
+
parsed.search = "";
|
|
227
|
+
return parsed.toString();
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
const index = url.indexOf("?");
|
|
231
|
+
if (index === -1) {
|
|
232
|
+
return url;
|
|
233
|
+
}
|
|
234
|
+
return `${url.slice(0, index)}?<redacted>`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}
|
package/dist/core/io.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
import { EXIT_CODE } from "./exit-codes.js";
|
|
4
|
+
export async function readJsonFile(path) {
|
|
5
|
+
let raw;
|
|
6
|
+
try {
|
|
7
|
+
raw = await readFile(path, "utf8");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new CliError({
|
|
11
|
+
code: "INVALID_INPUT",
|
|
12
|
+
message: `Could not read file: ${path}`,
|
|
13
|
+
exitCode: EXIT_CODE.INVALID_INPUT,
|
|
14
|
+
details: { path }
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new CliError({
|
|
22
|
+
code: "INVALID_INPUT",
|
|
23
|
+
message: `Invalid JSON file: ${path}`,
|
|
24
|
+
exitCode: EXIT_CODE.INVALID_INPUT,
|
|
25
|
+
details: { path }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function assertObjectPayload(payload) {
|
|
30
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
|
|
31
|
+
throw new CliError({
|
|
32
|
+
code: "INVALID_INPUT",
|
|
33
|
+
message: "Payload must be a JSON object",
|
|
34
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return payload;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/core/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,wBAAwB,IAAI,EAAE;YACvC,QAAQ,EAAE,SAAS,CAAC,aAAa;YACjC,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,sBAAsB,IAAI,EAAE;YACrC,QAAQ,EAAE,SAAS,CAAC,aAAa;YACjC,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,+BAA+B;YACxC,QAAQ,EAAE,SAAS,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAkC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RuntimeContext } from "./context.js";
|
|
2
|
+
import type { CliError } from "./errors.js";
|
|
3
|
+
export declare function printSuccess(ctx: RuntimeContext, data: unknown, requestId?: string | null): void;
|
|
4
|
+
export declare function printError(ctx: RuntimeContext, error: CliError, requestId?: string | null): void;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { inspect } from "node:util";
|
|
2
|
+
const OUTPUT_VERSION = "0.x";
|
|
3
|
+
export function printSuccess(ctx, data, requestId = null) {
|
|
4
|
+
const payload = {
|
|
5
|
+
ok: true,
|
|
6
|
+
data,
|
|
7
|
+
meta: {
|
|
8
|
+
requestId,
|
|
9
|
+
version: OUTPUT_VERSION
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
if (ctx.json) {
|
|
13
|
+
process.stdout.write(`${JSON.stringify(payload)}\n`);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (ctx.outputMode === "plain") {
|
|
17
|
+
process.stdout.write(`${renderPlain(data, ctx.selectFields)}\n`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (ctx.outputMode === "table") {
|
|
21
|
+
process.stdout.write(`${renderTable(data, ctx.selectFields)}\n`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (typeof data === "string") {
|
|
25
|
+
process.stdout.write(`${data}\n`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
process.stdout.write(`${inspect(data, { colors: ctx.color, depth: 6 })}\n`);
|
|
29
|
+
}
|
|
30
|
+
export function printError(ctx, error, requestId = null) {
|
|
31
|
+
const payload = {
|
|
32
|
+
ok: false,
|
|
33
|
+
error: error.toJson({ includeDetails: ctx.verbose }),
|
|
34
|
+
meta: {
|
|
35
|
+
requestId,
|
|
36
|
+
version: OUTPUT_VERSION
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
if (ctx.json) {
|
|
40
|
+
process.stderr.write(`${JSON.stringify(payload)}\n`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
process.stderr.write(`[${error.code}] ${error.message}\n`);
|
|
44
|
+
if (ctx.verbose && error.details) {
|
|
45
|
+
process.stderr.write(`${inspect(error.details, { colors: ctx.color, depth: 6 })}\n`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function renderPlain(data, selectFields) {
|
|
49
|
+
if (typeof data === "string") {
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(data)) {
|
|
53
|
+
if (data.length === 0) {
|
|
54
|
+
return "(empty)";
|
|
55
|
+
}
|
|
56
|
+
return data.map((item) => renderPlainItem(item, selectFields)).join("\n");
|
|
57
|
+
}
|
|
58
|
+
const objectWithContents = getObjectWithContents(data);
|
|
59
|
+
if (objectWithContents) {
|
|
60
|
+
if (objectWithContents.contents.length === 0) {
|
|
61
|
+
return "(empty)";
|
|
62
|
+
}
|
|
63
|
+
return objectWithContents.contents.map((item) => renderPlainItem(item, selectFields)).join("\n");
|
|
64
|
+
}
|
|
65
|
+
return renderPlainItem(data, selectFields);
|
|
66
|
+
}
|
|
67
|
+
function renderPlainItem(item, selectFields) {
|
|
68
|
+
if (typeof item !== "object" || item === null || Array.isArray(item)) {
|
|
69
|
+
return formatScalar(item);
|
|
70
|
+
}
|
|
71
|
+
const projected = projectRow(item, selectFields);
|
|
72
|
+
const keys = Object.keys(projected);
|
|
73
|
+
if (keys.length === 0) {
|
|
74
|
+
return "{}";
|
|
75
|
+
}
|
|
76
|
+
return keys.map((key) => `${key}=${formatScalar(projected[key])}`).join("\t");
|
|
77
|
+
}
|
|
78
|
+
function renderTable(data, selectFields) {
|
|
79
|
+
const rows = extractRows(data).map((row) => projectRow(row, selectFields));
|
|
80
|
+
if (rows.length === 0) {
|
|
81
|
+
return "(no rows)";
|
|
82
|
+
}
|
|
83
|
+
const columns = selectFields && selectFields.length > 0 ? selectFields : collectColumns(rows);
|
|
84
|
+
if (columns.length === 0) {
|
|
85
|
+
return "(no columns)";
|
|
86
|
+
}
|
|
87
|
+
const widths = columns.map((column) => {
|
|
88
|
+
const cellMax = Math.max(...rows.map((row) => formatScalar(row[column]).length));
|
|
89
|
+
return Math.max(column.length, cellMax);
|
|
90
|
+
});
|
|
91
|
+
const header = formatTableRow(columns, widths);
|
|
92
|
+
const separator = widths.map((width) => "-".repeat(width)).join("-+-");
|
|
93
|
+
const body = rows.map((row) => formatTableRow(columns.map((column) => formatScalar(row[column])), widths));
|
|
94
|
+
return [header, separator, ...body].join("\n");
|
|
95
|
+
}
|
|
96
|
+
function extractRows(data) {
|
|
97
|
+
if (Array.isArray(data)) {
|
|
98
|
+
return data.map(normalizeRow);
|
|
99
|
+
}
|
|
100
|
+
const objectWithContents = getObjectWithContents(data);
|
|
101
|
+
if (objectWithContents) {
|
|
102
|
+
return objectWithContents.contents.map(normalizeRow);
|
|
103
|
+
}
|
|
104
|
+
if (typeof data === "object" && data !== null) {
|
|
105
|
+
return [data];
|
|
106
|
+
}
|
|
107
|
+
return [{ value: data }];
|
|
108
|
+
}
|
|
109
|
+
function normalizeRow(item) {
|
|
110
|
+
if (typeof item === "object" && item !== null && !Array.isArray(item)) {
|
|
111
|
+
return item;
|
|
112
|
+
}
|
|
113
|
+
return { value: item };
|
|
114
|
+
}
|
|
115
|
+
function getObjectWithContents(data) {
|
|
116
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const maybeContents = data.contents;
|
|
120
|
+
if (!Array.isArray(maybeContents)) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
contents: maybeContents
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function collectColumns(rows) {
|
|
128
|
+
const columns = [];
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
for (const key of Object.keys(row)) {
|
|
131
|
+
if (!columns.includes(key)) {
|
|
132
|
+
columns.push(key);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return columns;
|
|
137
|
+
}
|
|
138
|
+
function projectRow(row, selectFields) {
|
|
139
|
+
if (!selectFields || selectFields.length === 0) {
|
|
140
|
+
return row;
|
|
141
|
+
}
|
|
142
|
+
const projected = {};
|
|
143
|
+
for (const field of selectFields) {
|
|
144
|
+
projected[field] = getValueByPath(row, field);
|
|
145
|
+
}
|
|
146
|
+
return projected;
|
|
147
|
+
}
|
|
148
|
+
function getValueByPath(row, path) {
|
|
149
|
+
const keys = path.split(".").filter((part) => part.length > 0);
|
|
150
|
+
let current = row;
|
|
151
|
+
for (const key of keys) {
|
|
152
|
+
if (typeof current !== "object" || current === null || Array.isArray(current)) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
current = current[key];
|
|
156
|
+
}
|
|
157
|
+
return current;
|
|
158
|
+
}
|
|
159
|
+
function formatTableRow(values, widths) {
|
|
160
|
+
return values
|
|
161
|
+
.map((value, index) => {
|
|
162
|
+
const rendered = typeof value === "string" ? value : formatScalar(value);
|
|
163
|
+
return rendered.padEnd(widths[index], " ");
|
|
164
|
+
})
|
|
165
|
+
.join(" | ");
|
|
166
|
+
}
|
|
167
|
+
function formatScalar(value) {
|
|
168
|
+
if (value === undefined) {
|
|
169
|
+
return "";
|
|
170
|
+
}
|
|
171
|
+
if (value === null) {
|
|
172
|
+
return "null";
|
|
173
|
+
}
|
|
174
|
+
if (typeof value === "string") {
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
|
|
178
|
+
return String(value);
|
|
179
|
+
}
|
|
180
|
+
return JSON.stringify(value);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type SchemaBundle = {
|
|
2
|
+
version: "0.x";
|
|
3
|
+
pulledAt: string;
|
|
4
|
+
serviceDomain: string | null;
|
|
5
|
+
apis: Array<{
|
|
6
|
+
endpoint: string;
|
|
7
|
+
api: unknown;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export type GeneratedTypesResult = {
|
|
11
|
+
code: string;
|
|
12
|
+
endpointCount: number;
|
|
13
|
+
warnings: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function buildSchemaBundle(params: {
|
|
16
|
+
serviceDomain?: string;
|
|
17
|
+
apis: Array<{
|
|
18
|
+
endpoint: string;
|
|
19
|
+
api: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
}): SchemaBundle;
|
|
22
|
+
export declare function extractApiEndpoints(data: unknown): string[];
|
|
23
|
+
export declare function generateTypesFromSchema(input: unknown): GeneratedTypesResult;
|