@absmartly/cli 1.2.0 → 1.4.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 (62) hide show
  1. package/README.md +275 -0
  2. package/dist/commands/experiments/analyze.d.ts +3 -0
  3. package/dist/commands/experiments/analyze.d.ts.map +1 -0
  4. package/dist/commands/experiments/analyze.js +33 -0
  5. package/dist/commands/experiments/analyze.js.map +1 -0
  6. package/dist/commands/experiments/export.d.ts.map +1 -1
  7. package/dist/commands/experiments/export.js +11 -4
  8. package/dist/commands/experiments/export.js.map +1 -1
  9. package/dist/commands/experiments/index.d.ts.map +1 -1
  10. package/dist/commands/experiments/index.js +2 -0
  11. package/dist/commands/experiments/index.js.map +1 -1
  12. package/dist/core/experiments/analyze/extract-signals.d.ts +42 -0
  13. package/dist/core/experiments/analyze/extract-signals.d.ts.map +1 -0
  14. package/dist/core/experiments/analyze/extract-signals.js +154 -0
  15. package/dist/core/experiments/analyze/extract-signals.js.map +1 -0
  16. package/dist/core/experiments/analyze/heuristics.d.ts +43 -0
  17. package/dist/core/experiments/analyze/heuristics.d.ts.map +1 -0
  18. package/dist/core/experiments/analyze/heuristics.js +186 -0
  19. package/dist/core/experiments/analyze/heuristics.js.map +1 -0
  20. package/dist/core/experiments/analyze/index.d.ts +9 -0
  21. package/dist/core/experiments/analyze/index.d.ts.map +1 -0
  22. package/dist/core/experiments/analyze/index.js +114 -0
  23. package/dist/core/experiments/analyze/index.js.map +1 -0
  24. package/dist/core/experiments/analyze/related-benchmarks.d.ts +28 -0
  25. package/dist/core/experiments/analyze/related-benchmarks.d.ts.map +1 -0
  26. package/dist/core/experiments/analyze/related-benchmarks.js +54 -0
  27. package/dist/core/experiments/analyze/related-benchmarks.js.map +1 -0
  28. package/dist/core/experiments/analyze/source-signals.d.ts +8 -0
  29. package/dist/core/experiments/analyze/source-signals.d.ts.map +1 -0
  30. package/dist/core/experiments/analyze/source-signals.js +15 -0
  31. package/dist/core/experiments/analyze/source-signals.js.map +1 -0
  32. package/dist/core/experiments/analyze/summary.d.ts +3 -0
  33. package/dist/core/experiments/analyze/summary.d.ts.map +1 -0
  34. package/dist/core/experiments/analyze/summary.js +35 -0
  35. package/dist/core/experiments/analyze/summary.js.map +1 -0
  36. package/dist/core/experiments/analyze/types.d.ts +108 -0
  37. package/dist/core/experiments/analyze/types.d.ts.map +1 -0
  38. package/dist/core/experiments/analyze/types.js +2 -0
  39. package/dist/core/experiments/analyze/types.js.map +1 -0
  40. package/dist/index.js +7 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/api/axios-adapter.d.ts +30 -11
  43. package/dist/lib/api/axios-adapter.d.ts.map +1 -1
  44. package/dist/lib/api/axios-adapter.js +110 -0
  45. package/dist/lib/api/axios-adapter.js.map +1 -1
  46. package/dist/lib/api/client.d.ts +2 -6
  47. package/dist/lib/api/client.d.ts.map +1 -1
  48. package/dist/lib/api/client.js +1 -1
  49. package/dist/lib/api/client.js.map +1 -1
  50. package/dist/lib/api/request-logger.d.ts +18 -0
  51. package/dist/lib/api/request-logger.d.ts.map +1 -0
  52. package/dist/lib/api/request-logger.js +353 -0
  53. package/dist/lib/api/request-logger.js.map +1 -0
  54. package/dist/lib/utils/api-helper.d.ts +7 -0
  55. package/dist/lib/utils/api-helper.d.ts.map +1 -1
  56. package/dist/lib/utils/api-helper.js +22 -1
  57. package/dist/lib/utils/api-helper.js.map +1 -1
  58. package/dist/lib/utils/download.d.ts +10 -1
  59. package/dist/lib/utils/download.d.ts.map +1 -1
  60. package/dist/lib/utils/download.js +69 -8
  61. package/dist/lib/utils/download.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.d.ts","sourceRoot":"","sources":["../../../src/lib/api/request-logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAYnF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IAIf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAyDD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAgBnE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,OAAO,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBxB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAGvE;AA4ID,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAkBjG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CA8BjG;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,GAClB,MAAM,CAsBR;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,GAClB,MAAM,CAKR;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAMjG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7E"}
@@ -0,0 +1,353 @@
1
+ import { Chalk } from 'chalk';
2
+ import { highlight } from 'cli-highlight';
3
+ // level: 1 forces ANSI on; coloring is gated per-call via opts.color.
4
+ const c = new Chalk({ level: 1 });
5
+ const JSON_THEME = {
6
+ attr: c.cyan,
7
+ string: c.green,
8
+ number: c.yellow,
9
+ literal: c.magenta,
10
+ };
11
+ const REDACTED = '***';
12
+ const SENSITIVE_HEADERS = new Set([
13
+ 'authorization',
14
+ 'cookie',
15
+ 'set-cookie',
16
+ 'x-api-key',
17
+ 'proxy-authorization',
18
+ ]);
19
+ // Body field names that commonly carry secrets in ABSmartly API request/response
20
+ // payloads (api keys, password reset, OAuth login, etc.). Match is case-insensitive
21
+ // on the key; values are replaced with '***' when showSecrets is false.
22
+ const SENSITIVE_BODY_FIELDS = new Set([
23
+ 'key',
24
+ 'password',
25
+ 'token',
26
+ 'secret',
27
+ 'access_token',
28
+ 'refresh_token',
29
+ 'api_key',
30
+ 'apikey',
31
+ ]);
32
+ // Headers redacted to keep their scheme prefix (e.g. "Api-Key ***", "Bearer ***").
33
+ const SCHEMED_AUTH_HEADERS = new Set(['authorization', 'proxy-authorization']);
34
+ // Query-string parameter names that frequently carry presigned credentials
35
+ // (AWS / GCP / Azure / generic). Matched case-insensitively. When any of these
36
+ // appear we replace the *entire* query string — not just the matched keys —
37
+ // since the surrounding params (Expires, Policy, etc.) are also part of the
38
+ // signed bundle and a partial reveal can still attribute the URL.
39
+ const SENSITIVE_QUERY_PARAMS = new Set([
40
+ 'signature',
41
+ 'x-amz-signature',
42
+ 'x-amz-credential',
43
+ 'x-amz-security-token',
44
+ 'x-amz-algorithm',
45
+ 'x-amz-date',
46
+ 'x-amz-expires',
47
+ 'x-amz-signedheaders',
48
+ 'x-goog-signature',
49
+ 'x-goog-credential',
50
+ 'x-goog-algorithm',
51
+ 'x-goog-date',
52
+ 'x-goog-expires',
53
+ 'x-goog-signedheaders',
54
+ 'sig',
55
+ 'token',
56
+ 'auth',
57
+ 'access_token',
58
+ ]);
59
+ const PRESIGNED_REDACTED_QS = '?[redacted-presigned]';
60
+ const REDIRECT_HEADERS = new Set(['location', 'content-location']);
61
+ export function redactUrl(url, showSecrets) {
62
+ if (showSecrets)
63
+ return url;
64
+ const qIdx = url.indexOf('?');
65
+ if (qIdx < 0)
66
+ return url;
67
+ const qs = url.slice(qIdx + 1);
68
+ const hashIdx = qs.indexOf('#');
69
+ const params = (hashIdx >= 0 ? qs.slice(0, hashIdx) : qs).split('&');
70
+ const trailing = hashIdx >= 0 ? qs.slice(hashIdx) : '';
71
+ for (const p of params) {
72
+ const eq = p.indexOf('=');
73
+ const name = (eq >= 0 ? p.slice(0, eq) : p).toLowerCase();
74
+ if (SENSITIVE_QUERY_PARAMS.has(name)) {
75
+ return url.slice(0, qIdx) + PRESIGNED_REDACTED_QS + trailing;
76
+ }
77
+ }
78
+ return url;
79
+ }
80
+ export function redactHeaders(headers, showSecrets) {
81
+ if (showSecrets)
82
+ return { ...headers };
83
+ const out = {};
84
+ for (const [key, value] of Object.entries(headers)) {
85
+ const lower = key.toLowerCase();
86
+ if (REDIRECT_HEADERS.has(lower) && typeof value === 'string') {
87
+ out[key] = redactUrl(value, false);
88
+ continue;
89
+ }
90
+ if (!SENSITIVE_HEADERS.has(lower)) {
91
+ out[key] = value;
92
+ continue;
93
+ }
94
+ if (typeof value !== 'string') {
95
+ out[key] = REDACTED;
96
+ continue;
97
+ }
98
+ if (SCHEMED_AUTH_HEADERS.has(lower)) {
99
+ const space = value.indexOf(' ');
100
+ out[key] = space > 0 ? `${value.slice(0, space)} ${REDACTED}` : REDACTED;
101
+ }
102
+ else {
103
+ out[key] = REDACTED;
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ export function redactBody(data, showSecrets) {
109
+ if (showSecrets)
110
+ return data;
111
+ return redactBodyInner(data, new WeakSet());
112
+ }
113
+ function redactBodyInner(data, visited) {
114
+ if (data === null || typeof data !== 'object')
115
+ return data;
116
+ if (visited.has(data))
117
+ return '[circular]';
118
+ visited.add(data);
119
+ if (Array.isArray(data))
120
+ return data.map((item) => redactBodyInner(item, visited));
121
+ const out = {};
122
+ for (const [k, v] of Object.entries(data)) {
123
+ // Sensitive keys redact regardless of value type so an object/array under
124
+ // `token` etc. cannot leak its children. Even null/0/false are masked —
125
+ // the key being present is itself a signal worth concealing.
126
+ if (SENSITIVE_BODY_FIELDS.has(k.toLowerCase())) {
127
+ out[k] = REDACTED;
128
+ continue;
129
+ }
130
+ out[k] = redactBodyInner(v, visited);
131
+ }
132
+ return out;
133
+ }
134
+ const METHOD_COLORS = {
135
+ GET: (s) => c.bold.green(s),
136
+ POST: (s) => c.bold.yellow(s),
137
+ PUT: (s) => c.bold.blue(s),
138
+ DELETE: (s) => c.bold.red(s),
139
+ PATCH: (s) => c.bold.magenta(s),
140
+ };
141
+ function colorMethod(method, color) {
142
+ if (!color)
143
+ return method;
144
+ return (METHOD_COLORS[method] ?? c.bold)(method);
145
+ }
146
+ function colorStatus(status, statusText, color) {
147
+ const text = statusText ? `${status} ${statusText}` : String(status);
148
+ if (!color)
149
+ return text;
150
+ if (status >= 500)
151
+ return c.bold.red(text);
152
+ if (status >= 400)
153
+ return c.red(text);
154
+ if (status >= 300)
155
+ return c.yellow(text);
156
+ if (status >= 200)
157
+ return c.green(text);
158
+ return text;
159
+ }
160
+ function colorHeaderName(name, color) {
161
+ return color ? c.cyan(name) : name;
162
+ }
163
+ function buildUrl(config) {
164
+ const base = config.baseURL ?? '';
165
+ const url = config.url ?? '';
166
+ let full;
167
+ if (!url) {
168
+ full = base;
169
+ }
170
+ else if (/^https?:\/\//i.test(url)) {
171
+ full = url;
172
+ }
173
+ else if (base) {
174
+ full = `${base.replace(/\/$/, '')}/${url.replace(/^\//, '')}`;
175
+ }
176
+ else {
177
+ full = url;
178
+ }
179
+ if (config.params && typeof config.params === 'object') {
180
+ const qs = new URLSearchParams();
181
+ for (const [k, v] of Object.entries(config.params)) {
182
+ if (v === undefined || v === null)
183
+ continue;
184
+ if (Array.isArray(v)) {
185
+ for (const item of v)
186
+ qs.append(k, String(item));
187
+ }
188
+ else {
189
+ qs.append(k, String(v));
190
+ }
191
+ }
192
+ const qStr = qs.toString();
193
+ if (qStr)
194
+ full += (full.includes('?') ? '&' : '?') + qStr;
195
+ }
196
+ return full;
197
+ }
198
+ function extractHeaders(source) {
199
+ const headers = source.headers;
200
+ const out = {};
201
+ if (!headers)
202
+ return out;
203
+ const obj = typeof headers.toJSON === 'function'
204
+ ? headers.toJSON()
205
+ : headers;
206
+ for (const [k, v] of Object.entries(obj)) {
207
+ if (typeof v === 'string')
208
+ out[k] = v;
209
+ else if (typeof v === 'number' || typeof v === 'boolean')
210
+ out[k] = String(v);
211
+ else if (Array.isArray(v))
212
+ out[k] = v.map((item) => String(item)).join(', ');
213
+ else if (v !== null && v !== undefined)
214
+ out[k] = `[unprintable: ${typeof v}]`;
215
+ }
216
+ return out;
217
+ }
218
+ function getContentType(headers) {
219
+ for (const [k, v] of Object.entries(headers)) {
220
+ if (k.toLowerCase() === 'content-type')
221
+ return v;
222
+ }
223
+ return '';
224
+ }
225
+ function formatJsonBody(data, color) {
226
+ let json;
227
+ if (typeof data === 'string') {
228
+ try {
229
+ json = JSON.stringify(JSON.parse(data), null, 2);
230
+ }
231
+ catch {
232
+ const tag = color
233
+ ? c.dim('// (invalid JSON, showing raw body)')
234
+ : '// (invalid JSON, showing raw body)';
235
+ return `${tag}\n${data}`;
236
+ }
237
+ }
238
+ else {
239
+ json = safeStringify(data, 2);
240
+ }
241
+ return color
242
+ ? highlight(json, { language: 'json', ignoreIllegals: true, theme: JSON_THEME })
243
+ : json;
244
+ }
245
+ function formatBodyHTTP(data, contentType, opts) {
246
+ if (opts.omitBody)
247
+ return '';
248
+ if (data === undefined || data === null || data === '')
249
+ return '';
250
+ const redacted = redactBody(data, opts.showSecrets);
251
+ if (contentType.toLowerCase().includes('application/json')) {
252
+ return formatJsonBody(redacted, opts.color);
253
+ }
254
+ return typeof redacted === 'string' ? redacted : safeStringify(redacted);
255
+ }
256
+ function indent(text, prefix) {
257
+ return text
258
+ .split('\n')
259
+ .map((line) => prefix + line)
260
+ .join('\n');
261
+ }
262
+ // Wraps JSON.stringify so logging never throws into the request path. Circular
263
+ // references (and any other Errors from stringify) become a fixed placeholder.
264
+ export function safeStringify(value, indentSpaces) {
265
+ try {
266
+ return JSON.stringify(value, null, indentSpaces);
267
+ }
268
+ catch {
269
+ return '"[unserialisable]"';
270
+ }
271
+ }
272
+ export function formatRequestHTTP(config, opts) {
273
+ const method = (config.method ?? 'GET').toUpperCase();
274
+ const url = redactUrl(buildUrl(config), opts.showSecrets);
275
+ const arrow = opts.color ? c.bold.cyan('→') : '→';
276
+ const renderedUrl = opts.color ? c.dim(url) : url;
277
+ const lines = [`${arrow} ${colorMethod(method, opts.color)} ${renderedUrl}`];
278
+ const headers = redactHeaders(extractHeaders(config), opts.showSecrets);
279
+ for (const [k, v] of Object.entries(headers)) {
280
+ lines.push(` ${colorHeaderName(k, opts.color)}: ${v}`);
281
+ }
282
+ const body = formatBodyHTTP(config.data, getContentType(headers), opts);
283
+ if (body) {
284
+ lines.push('');
285
+ lines.push(indent(body, ' '));
286
+ }
287
+ return lines.join('\n');
288
+ }
289
+ export function formatRequestCurl(config, opts) {
290
+ const method = (config.method ?? 'GET').toUpperCase();
291
+ const url = redactUrl(buildUrl(config), opts.showSecrets);
292
+ const headers = redactHeaders(extractHeaders(config), opts.showSecrets);
293
+ const headerEntries = Object.entries(headers);
294
+ const hasBody = !opts.omitBody && config.data !== undefined && config.data !== null && config.data !== '';
295
+ const dollar = opts.color ? c.dim('$') : '$';
296
+ const flag = (s) => (opts.color ? c.cyan(s) : s);
297
+ const shellEscape = (s) => s.replace(/'/g, `'\\''`);
298
+ const lines = [];
299
+ const firstTrailing = headerEntries.length > 0 || hasBody ? ' \\' : '';
300
+ lines.push(`${dollar} curl ${flag('-X')} ${method} '${shellEscape(url)}'${firstTrailing}`);
301
+ for (let i = 0; i < headerEntries.length; i++) {
302
+ const [k, v] = headerEntries[i];
303
+ const isLastHeader = i === headerEntries.length - 1;
304
+ const trailing = !isLastHeader || hasBody ? ' \\' : '';
305
+ lines.push(` ${flag('-H')} '${shellEscape(`${k}: ${v}`)}'${trailing}`);
306
+ }
307
+ if (hasBody) {
308
+ const redacted = redactBody(config.data, opts.showSecrets);
309
+ const body = typeof redacted === 'string' ? redacted : safeStringify(redacted);
310
+ lines.push(` ${flag('-d')} '${shellEscape(body)}'`);
311
+ }
312
+ return lines.join('\n');
313
+ }
314
+ export function formatResponseHTTP(response, elapsedMs, opts) {
315
+ const isError = response.status >= 400;
316
+ const arrowColor = isError ? c.bold.red : c.bold.green;
317
+ const arrow = opts.color ? arrowColor('←') : '←';
318
+ const status = colorStatus(response.status, response.statusText || '', opts.color);
319
+ const elapsed = opts.color ? c.dim(`(${elapsedMs}ms)`) : `(${elapsedMs}ms)`;
320
+ const statusLine = `${arrow} ${status} ${elapsed}`;
321
+ if (opts.statusOnly)
322
+ return statusLine;
323
+ const lines = [statusLine];
324
+ const headers = redactHeaders(extractHeaders(response), opts.showSecrets);
325
+ for (const [k, v] of Object.entries(headers)) {
326
+ lines.push(` ${colorHeaderName(k, opts.color)}: ${v}`);
327
+ }
328
+ const body = formatBodyHTTP(response.data, getContentType(headers), opts);
329
+ if (body) {
330
+ lines.push('');
331
+ lines.push(indent(body, ' '));
332
+ }
333
+ return lines.join('\n');
334
+ }
335
+ export function formatNetworkError(error, elapsedMs, opts) {
336
+ const arrow = opts.color ? c.bold.red('←') : '←';
337
+ const msg = error.message || error.code || 'network error';
338
+ const elapsed = opts.color ? c.dim(`(${elapsedMs}ms)`) : `(${elapsedMs}ms)`;
339
+ return `${arrow} ${msg} ${elapsed}`;
340
+ }
341
+ export function formatGenericError(error, elapsedMs, opts) {
342
+ const arrow = opts.color ? c.bold.red('←') : '←';
343
+ const msg = error instanceof Error ? error.message : String(error);
344
+ const tag = opts.color ? c.dim('(non-HTTP error)') : '(non-HTTP error)';
345
+ const elapsed = opts.color ? c.dim(`(${elapsedMs}ms)`) : `(${elapsedMs}ms)`;
346
+ return `${arrow} ${tag} ${msg} ${elapsed}`;
347
+ }
348
+ export function formatSuppressionNotice(count, color) {
349
+ const word = count === 1 ? 'request' : 'requests';
350
+ const text = `(${count} identical ${word} suppressed)`;
351
+ return color ? ` ${c.dim(text)}` : ` ${text}`;
352
+ }
353
+ //# sourceMappingURL=request-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.js","sourceRoot":"","sources":["../../../src/lib/api/request-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAc,MAAM,eAAe,CAAC;AAGtD,sEAAsE;AACtE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAElC,MAAM,UAAU,GAAU;IACxB,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,MAAM,EAAE,CAAC,CAAC,KAAK;IACf,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,OAAO,EAAE,CAAC,CAAC,OAAO;CACnB,CAAC;AAcF,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,eAAe;IACf,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,qBAAqB;CACtB,CAAC,CAAC;AAEH,iFAAiF;AACjF,oFAAoF;AACpF,wEAAwE;AACxE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,KAAK;IACL,UAAU;IACV,OAAO;IACP,QAAQ;IACR,cAAc;IACd,eAAe;IACf,SAAS;IACT,QAAQ;CACT,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAE/E,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,kEAAkE;AAClE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,WAAW;IACX,iBAAiB;IACjB,kBAAkB;IAClB,sBAAsB;IACtB,iBAAiB;IACjB,YAAY;IACZ,eAAe;IACf,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;IACtB,KAAK;IACL,OAAO;IACP,MAAM;IACN,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,WAAoB;IACzD,IAAI,WAAW;QAAE,OAAO,GAAG,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,qBAAqB,GAAG,QAAQ,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAA+B,EAC/B,WAAoB;IAEpB,IAAI,WAAW;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7D,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,WAAoB;IAC5D,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,IAAa,EAAE,OAAwB;IAC9D,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,IAAc,CAAC;QAAE,OAAO,YAAY,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;QACrE,0EAA0E;QAC1E,wEAAwE;QACxE,6DAA6D;QAC7D,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YAClB,SAAS;QACX,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,aAAa,GAA0C;IAC3D,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,SAAS,WAAW,CAAC,MAAc,EAAE,KAAc;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,UAAkB,EAAE,KAAc;IACrE,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAc;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAkC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAC7B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;SAAM,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAiC,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;gBAAE,SAAS;YAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,KAAK,MAAM,IAAI,IAAI,CAAC;oBAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,IAAI;YAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAA6B;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC;IACzB,MAAM,GAAG,GACP,OAAQ,OAAsC,CAAC,MAAM,KAAK,UAAU;QAClE,CAAC,CAAG,OAAqD,CAAC,MAAM,EAA8B;QAC9F,CAAC,CAAE,OAAmC,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACjC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;aACxE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACxE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,OAAO,CAAC,GAAG,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,OAA+B;IACrD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,cAAc;YAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,IAAa,EAAE,KAAc;IACnD,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,GAAG,KAAK;gBACf,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,qCAAqC,CAAC;gBAC9C,CAAC,CAAC,qCAAqC,CAAC;YAC1C,OAAO,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK;QACV,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAChF,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,IAAa,EAAE,WAAmB,EAAE,IAAmB;IAC7E,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3D,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,MAAc;IAC1C,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;SAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,YAAqB;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,oBAAoB,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAkC,EAAE,IAAmB;IACvF,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,MAAM,KAAK,GAAa,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAkC,EAAE,IAAmB;IACvF,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GACX,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;IAE5F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAE3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,YAAY,GAAG,CAAC,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,SAAiB,EACjB,IAAmB;IAEnB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC;IAC5E,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;IAEnD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEvC,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1E,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAiB,EACjB,SAAiB,EACjB,IAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC;IAC5E,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,SAAiB,EAAE,IAAmB;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC;IAC5E,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,KAAc;IACnE,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,KAAK,cAAc,IAAI,cAAc,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAClD,CAAC"}
@@ -14,12 +14,19 @@ export interface GlobalOptions {
14
14
  env?: string;
15
15
  output?: OutputFormat;
16
16
  noColor?: boolean;
17
+ colorDisabled?: boolean;
17
18
  verbose?: boolean;
18
19
  quiet?: boolean;
19
20
  profile?: string;
20
21
  terse?: boolean;
21
22
  full?: boolean;
22
23
  raw?: boolean;
24
+ showRequest?: boolean;
25
+ showResponse?: boolean;
26
+ curl?: boolean;
27
+ showSecrets?: boolean;
28
+ headersOnly?: boolean;
29
+ statusOnly?: boolean;
23
30
  }
24
31
  export declare function getGlobalOptions(cmd: Command): GlobalOptions;
25
32
  export declare function printFormatted(data: unknown, globalOptions: GlobalOptions): void;
@@ -1 +1 @@
1
- {"version":3,"file":"api-helper.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/api-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEzE,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAK9D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAkC7E;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBxF;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAcD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAyB5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CAOhF;AAcD,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,OAAO,EAAE,EACvD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACpC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAQnC"}
1
+ {"version":3,"file":"api-helper.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/api-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEzE,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAK9D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAkC7E;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CA4BxF;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAIlB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAcD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAsC5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CAOhF;AAcD,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,OAAO,EAAE,EACvD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACpC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAQnC"}
@@ -60,6 +60,15 @@ export async function getAPIClientFromOptions(options) {
60
60
  return createAPIClient(endpoint, auth, {
61
61
  verbose: options.verbose ?? false,
62
62
  insecure: profile.api.insecure ?? false,
63
+ showRequest: options.showRequest ?? false,
64
+ showResponse: options.showResponse ?? false,
65
+ curl: options.curl ?? false,
66
+ showSecrets: options.showSecrets ?? false,
67
+ headersOnly: options.headersOnly ?? false,
68
+ statusOnly: options.statusOnly ?? false,
69
+ // Pass user-intent only (--no-color or NO_COLOR), not the stdout-TTY
70
+ // conflated value: stderr diagnostics make their own TTY decision.
71
+ noColor: options.colorDisabled ?? false,
63
72
  });
64
73
  }
65
74
  const VALID_FORMATS = [
@@ -79,6 +88,11 @@ export function getGlobalOptions(cmd) {
79
88
  if (!VALID_FORMATS.includes(output)) {
80
89
  throw new Error(`Invalid output format: '${output}'. Must be one of: ${VALID_FORMATS.join(', ')}`);
81
90
  }
91
+ const colorDisabled = opts.color === false || !!process.env.NO_COLOR;
92
+ // --status-only is response-only by definition; auto-enable --show-response
93
+ // so the user doesn't have to type both.
94
+ const statusOnly = opts.statusOnly || false;
95
+ const showResponse = opts.showResponse || statusOnly || false;
82
96
  return {
83
97
  config: opts.config,
84
98
  apiKey: opts.apiKey,
@@ -86,13 +100,20 @@ export function getGlobalOptions(cmd) {
86
100
  app: opts.app,
87
101
  env: opts.env,
88
102
  output,
89
- noColor: opts.color === false || !process.stdout.isTTY,
103
+ noColor: colorDisabled || !process.stdout.isTTY,
104
+ colorDisabled,
90
105
  verbose: opts.verbose || false,
91
106
  quiet: opts.quiet || false,
92
107
  profile: opts.profile,
93
108
  terse: opts.terse || false,
94
109
  full: opts.full || false,
95
110
  raw: opts.raw || false,
111
+ showRequest: opts.showRequest || false,
112
+ showResponse,
113
+ curl: opts.curl || false,
114
+ showSecrets: opts.showSecrets || false,
115
+ headersOnly: opts.headersOnly || false,
116
+ statusOnly,
96
117
  };
97
118
  }
98
119
  export function printFormatted(data, globalOptions) {
@@ -1 +1 @@
1
- {"version":3,"file":"api-helper.js","sourceRoot":"","sources":["../../../src/lib/utils/api-helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-helper.js","sourceRoot":"","sources":["../../../src/lib/utils/api-helper.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,13 @@
1
- export interface DownloadOptions {
1
+ export interface DownloadLoggingOptions {
2
+ showRequest?: boolean;
3
+ showResponse?: boolean;
4
+ curl?: boolean;
5
+ showSecrets?: boolean;
6
+ headersOnly?: boolean;
7
+ statusOnly?: boolean;
8
+ noColor?: boolean;
9
+ }
10
+ export interface DownloadOptions extends DownloadLoggingOptions {
2
11
  url: string;
3
12
  outputPath: string;
4
13
  headers?: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/download.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAkFD,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiFpF"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/download.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,sBAAsB;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACjE;AAgED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAsGD,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAkFpF"}
@@ -3,6 +3,53 @@ import { pipeline } from 'stream/promises';
3
3
  import { Transform } from 'stream';
4
4
  import https from 'https';
5
5
  import http from 'http';
6
+ import { formatRequestHTTP, formatRequestCurl, formatResponseHTTP, formatGenericError, } from '../api/request-logger.js';
7
+ function resolveLogger(options) {
8
+ const showRequest = options.showRequest ?? false;
9
+ const showResponse = options.showResponse ?? false;
10
+ const curl = options.curl ?? false;
11
+ if (!showRequest && !showResponse && !curl)
12
+ return undefined;
13
+ return {
14
+ showRequest,
15
+ showResponse,
16
+ curl,
17
+ formatOpts: {
18
+ showSecrets: options.showSecrets ?? false,
19
+ omitBody: options.headersOnly ?? false,
20
+ statusOnly: options.statusOnly ?? false,
21
+ color: !!process.stderr.isTTY && !(options.noColor ?? false),
22
+ },
23
+ };
24
+ }
25
+ function logRequest(method, url, headers, logger) {
26
+ if (!logger || (!logger.showRequest && !logger.curl))
27
+ return;
28
+ const fakeConfig = {
29
+ method,
30
+ url,
31
+ headers,
32
+ data: undefined,
33
+ };
34
+ if (logger.showRequest) {
35
+ process.stderr.write(formatRequestHTTP(fakeConfig, logger.formatOpts) + '\n');
36
+ }
37
+ if (logger.curl) {
38
+ process.stderr.write(formatRequestCurl(fakeConfig, logger.formatOpts) + '\n');
39
+ }
40
+ }
41
+ function logResponse(response, elapsedMs, logger) {
42
+ if (!logger?.showResponse)
43
+ return;
44
+ const fakeResp = {
45
+ status: response.statusCode ?? 0,
46
+ statusText: response.statusMessage ?? '',
47
+ headers: response.headers,
48
+ data: undefined,
49
+ config: {},
50
+ };
51
+ process.stderr.write(formatResponseHTTP(fakeResp, elapsedMs, logger.formatOpts) + '\n');
52
+ }
6
53
  function getExistingSize(path) {
7
54
  try {
8
55
  return statSync(path).size;
@@ -33,19 +80,32 @@ function cleanupMeta(outputPath) {
33
80
  // ignore
34
81
  }
35
82
  }
36
- function httpGet(url, headers) {
83
+ function httpGet(url, headers, logger) {
37
84
  return new Promise((resolve, reject) => {
85
+ const start = Date.now();
86
+ logRequest('GET', url, headers, logger);
38
87
  const client = url.startsWith('https:') ? https : http;
39
- const req = client.get(url, { headers }, resolve);
40
- req.on('error', reject);
88
+ const req = client.get(url, { headers }, (response) => {
89
+ logResponse(response, Date.now() - start, logger);
90
+ resolve(response);
91
+ });
92
+ req.on('error', (error) => {
93
+ // Surface DNS / TLS / socket failures on stderr when --show-response is on.
94
+ // Without this the raw download path stays silent for errors that never
95
+ // produce an HTTP response, unlike the axios path.
96
+ if (logger?.showResponse) {
97
+ process.stderr.write(formatGenericError(error, Date.now() - start, logger.formatOpts) + '\n');
98
+ }
99
+ reject(error);
100
+ });
41
101
  });
42
102
  }
43
- async function resolveRedirects(url, headers, maxRedirects = 10) {
103
+ async function resolveRedirects(url, headers, maxRedirects = 10, logger) {
44
104
  let currentUrl = url;
45
105
  const reqHeaders = { ...headers };
46
106
  let redirectCount = 0;
47
107
  while (redirectCount < maxRedirects) {
48
- const response = await httpGet(currentUrl, reqHeaders);
108
+ const response = await httpGet(currentUrl, reqHeaders, logger);
49
109
  const status = response.statusCode ?? 0;
50
110
  if (status >= 300 && status < 400 && response.headers.location) {
51
111
  response.resume();
@@ -67,13 +127,14 @@ async function resolveRedirects(url, headers, maxRedirects = 10) {
67
127
  }
68
128
  export async function downloadFile(options) {
69
129
  const { url, outputPath, onProgress } = options;
130
+ const logger = resolveLogger(options);
70
131
  const existingSize = options.resume ? getExistingSize(outputPath) : 0;
71
132
  // On resume, try the saved S3 URL directly (avoids hitting the API which triggers cleanup)
72
133
  if (existingSize > 0) {
73
134
  const savedUrl = loadMeta(outputPath);
74
135
  if (savedUrl) {
75
136
  const rangeHeaders = { Range: `bytes=${existingSize}-` };
76
- const rangeResponse = await httpGet(savedUrl, rangeHeaders);
137
+ const rangeResponse = await httpGet(savedUrl, rangeHeaders, logger);
77
138
  const rangeStatus = rangeResponse.statusCode ?? 0;
78
139
  if (rangeStatus === 416) {
79
140
  rangeResponse.resume();
@@ -91,7 +152,7 @@ export async function downloadFile(options) {
91
152
  }
92
153
  // Resolve redirects (API → S3) to get the final URL
93
154
  const headers = { ...options.headers };
94
- const { response, finalUrl, finalHeaders } = await resolveRedirects(url, headers);
155
+ const { response, finalUrl, finalHeaders } = await resolveRedirects(url, headers, 10, logger);
95
156
  const status = response.statusCode ?? 0;
96
157
  if (status < 200 || status >= 300) {
97
158
  response.resume();
@@ -103,7 +164,7 @@ export async function downloadFile(options) {
103
164
  if (existingSize > 0) {
104
165
  response.resume();
105
166
  const rangeHeaders = { ...finalHeaders, Range: `bytes=${existingSize}-` };
106
- const rangeResponse = await httpGet(finalUrl, rangeHeaders);
167
+ const rangeResponse = await httpGet(finalUrl, rangeHeaders, logger);
107
168
  const rangeStatus = rangeResponse.statusCode ?? 0;
108
169
  if (rangeStatus === 416) {
109
170
  rangeResponse.resume();