@forumulate/cli 0.5.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -5
- package/dist/api/args.d.ts +21 -0
- package/dist/api/args.d.ts.map +1 -0
- package/dist/api/args.js +81 -0
- package/dist/api/args.js.map +1 -0
- package/dist/api/command.d.ts +17 -0
- package/dist/api/command.d.ts.map +1 -0
- package/dist/api/command.js +182 -0
- package/dist/api/command.js.map +1 -0
- package/dist/api/describe.d.ts +5 -0
- package/dist/api/describe.d.ts.map +1 -0
- package/dist/api/describe.js +121 -0
- package/dist/api/describe.js.map +1 -0
- package/dist/api/http.d.ts +81 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +183 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/operations.json +1 -0
- package/dist/api/output.d.ts +35 -0
- package/dist/api/output.d.ts.map +1 -0
- package/dist/api/output.js +176 -0
- package/dist/api/output.js.map +1 -0
- package/dist/api/request.d.ts +37 -0
- package/dist/api/request.d.ts.map +1 -0
- package/dist/api/request.js +230 -0
- package/dist/api/request.js.map +1 -0
- package/dist/api/send.d.ts +35 -0
- package/dist/api/send.d.ts.map +1 -0
- package/dist/api/send.js +85 -0
- package/dist/api/send.js.map +1 -0
- package/dist/api/spec.d.ts +96 -0
- package/dist/api/spec.d.ts.map +1 -0
- package/dist/api/spec.js +126 -0
- package/dist/api/spec.js.map +1 -0
- package/dist/commands/completion.d.ts +12 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +169 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +33 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +144 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +35 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +59 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/groups-api.d.ts +11 -0
- package/dist/commands/groups-api.d.ts.map +1 -0
- package/dist/commands/groups-api.js +140 -0
- package/dist/commands/groups-api.js.map +1 -0
- package/dist/commands/groups-community.d.ts +15 -0
- package/dist/commands/groups-community.d.ts.map +1 -0
- package/dist/commands/groups-community.js +344 -0
- package/dist/commands/groups-community.js.map +1 -0
- package/dist/commands/groups-content.d.ts +10 -0
- package/dist/commands/groups-content.d.ts.map +1 -0
- package/dist/commands/groups-content.js +331 -0
- package/dist/commands/groups-content.js.map +1 -0
- package/dist/commands/groups-docs.d.ts +12 -0
- package/dist/commands/groups-docs.d.ts.map +1 -0
- package/dist/commands/groups-docs.js +414 -0
- package/dist/commands/groups-docs.js.map +1 -0
- package/dist/commands/groups-org.d.ts +10 -0
- package/dist/commands/groups-org.d.ts.map +1 -0
- package/dist/commands/groups-org.js +405 -0
- package/dist/commands/groups-org.js.map +1 -0
- package/dist/commands/groups-site.d.ts +3 -0
- package/dist/commands/groups-site.d.ts.map +1 -0
- package/dist/commands/groups-site.js +237 -0
- package/dist/commands/groups-site.js.map +1 -0
- package/dist/commands/groups-spaces.d.ts +3 -0
- package/dist/commands/groups-spaces.d.ts.map +1 -0
- package/dist/commands/groups-spaces.js +273 -0
- package/dist/commands/groups-spaces.js.map +1 -0
- package/dist/commands/groups-types.d.ts +3 -0
- package/dist/commands/groups-types.d.ts.map +1 -0
- package/dist/commands/groups-types.js +251 -0
- package/dist/commands/groups-types.js.map +1 -0
- package/dist/commands/groups.d.ts +4 -0
- package/dist/commands/groups.d.ts.map +1 -0
- package/dist/commands/groups.js +71 -0
- package/dist/commands/groups.js.map +1 -0
- package/dist/commands/index.d.ts +25 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +118 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/resource.d.ts +86 -0
- package/dist/commands/resource.d.ts.map +1 -0
- package/dist/commands/resource.js +314 -0
- package/dist/commands/resource.js.map +1 -0
- package/dist/content/library.d.ts +1 -0
- package/dist/content/library.d.ts.map +1 -1
- package/dist/content/library.js +1 -0
- package/dist/content/library.js.map +1 -1
- package/dist/dev/command.d.ts +41 -0
- package/dist/dev/command.d.ts.map +1 -0
- package/dist/dev/command.js +158 -0
- package/dist/dev/command.js.map +1 -0
- package/dist/help.d.ts +3 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +159 -0
- package/dist/help.js.map +1 -0
- package/dist/publish/api.d.ts +30 -12
- package/dist/publish/api.d.ts.map +1 -1
- package/dist/publish/api.js +62 -10
- package/dist/publish/api.js.map +1 -1
- package/dist/publish/client.d.ts +19 -0
- package/dist/publish/client.d.ts.map +1 -0
- package/dist/publish/client.js +3 -0
- package/dist/publish/client.js.map +1 -0
- package/dist/publish/command.d.ts +31 -2
- package/dist/publish/command.d.ts.map +1 -1
- package/dist/publish/command.js +62 -15
- package/dist/publish/command.js.map +1 -1
- package/dist/publish/context.d.ts +4 -1
- package/dist/publish/context.d.ts.map +1 -1
- package/dist/publish/context.js.map +1 -1
- package/dist/publish/diff.d.ts +21 -0
- package/dist/publish/diff.d.ts.map +1 -0
- package/dist/publish/diff.js +96 -0
- package/dist/publish/diff.js.map +1 -0
- package/dist/publish/docs-apply.d.ts +8 -1
- package/dist/publish/docs-apply.d.ts.map +1 -1
- package/dist/publish/docs-apply.js +37 -10
- package/dist/publish/docs-apply.js.map +1 -1
- package/dist/publish/docs-plan.d.ts +16 -3
- package/dist/publish/docs-plan.d.ts.map +1 -1
- package/dist/publish/docs-plan.js +57 -6
- package/dist/publish/docs-plan.js.map +1 -1
- package/dist/publish/frontmatter.d.ts +1 -1
- package/dist/publish/frontmatter.d.ts.map +1 -1
- package/dist/publish/frontmatter.js +1 -0
- package/dist/publish/frontmatter.js.map +1 -1
- package/dist/publish/index.d.ts +12 -0
- package/dist/publish/index.d.ts.map +1 -0
- package/dist/publish/index.js +17 -0
- package/dist/publish/index.js.map +1 -0
- package/dist/publish/manifest.d.ts.map +1 -1
- package/dist/publish/manifest.js +23 -3
- package/dist/publish/manifest.js.map +1 -1
- package/dist/publish/names.d.ts +28 -0
- package/dist/publish/names.d.ts.map +1 -0
- package/dist/publish/names.js +80 -0
- package/dist/publish/names.js.map +1 -0
- package/dist/publish/posts.d.ts.map +1 -1
- package/dist/publish/posts.js +46 -13
- package/dist/publish/posts.js.map +1 -1
- package/dist/publish/reserved.d.ts +49 -0
- package/dist/publish/reserved.d.ts.map +1 -0
- package/dist/publish/reserved.js +118 -0
- package/dist/publish/reserved.js.map +1 -0
- package/dist/publish/rewrite.d.ts +12 -0
- package/dist/publish/rewrite.d.ts.map +1 -1
- package/dist/publish/rewrite.js +22 -0
- package/dist/publish/rewrite.js.map +1 -1
- package/dist/publish/scan-docs.d.ts +10 -0
- package/dist/publish/scan-docs.d.ts.map +1 -0
- package/dist/publish/scan-docs.js +160 -0
- package/dist/publish/scan-docs.js.map +1 -0
- package/dist/publish/scan.d.ts +21 -17
- package/dist/publish/scan.d.ts.map +1 -1
- package/dist/publish/scan.js +99 -232
- package/dist/publish/scan.js.map +1 -1
- package/dist/publish/slots.d.ts +39 -0
- package/dist/publish/slots.d.ts.map +1 -0
- package/dist/publish/slots.js +64 -0
- package/dist/publish/slots.js.map +1 -0
- package/dist/publish/tags.d.ts +9 -0
- package/dist/publish/tags.d.ts.map +1 -0
- package/dist/publish/tags.js +194 -0
- package/dist/publish/tags.js.map +1 -0
- package/dist/publish/types.d.ts +62 -0
- package/dist/publish/types.d.ts.map +1 -1
- package/dist/publish/types.js +0 -10
- package/dist/publish/types.js.map +1 -1
- package/dist/run.d.ts +16 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +124 -117
- package/dist/run.js.map +1 -1
- package/dist/translations/command.d.ts +36 -0
- package/dist/translations/command.d.ts.map +1 -0
- package/dist/translations/command.js +411 -0
- package/dist/translations/command.js.map +1 -0
- package/dist/translations/extras.d.ts +29 -0
- package/dist/translations/extras.d.ts.map +1 -0
- package/dist/translations/extras.js +123 -0
- package/dist/translations/extras.js.map +1 -0
- package/dist/translations/files.d.ts +22 -0
- package/dist/translations/files.d.ts.map +1 -0
- package/dist/translations/files.js +75 -0
- package/dist/translations/files.js.map +1 -0
- package/dist/translations/sync.d.ts +89 -0
- package/dist/translations/sync.d.ts.map +1 -0
- package/dist/translations/sync.js +215 -0
- package/dist/translations/sync.js.map +1 -0
- package/dist/translations/target.d.ts +33 -0
- package/dist/translations/target.d.ts.map +1 -0
- package/dist/translations/target.js +54 -0
- package/dist/translations/target.js.map +1 -0
- package/dist/translations/xliff.d.ts +29 -0
- package/dist/translations/xliff.d.ts.map +1 -0
- package/dist/translations/xliff.js +62 -0
- package/dist/translations/xliff.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How an API answer is printed when nobody asked for `--json`.
|
|
3
|
+
*
|
|
4
|
+
* A list answer becomes a table of the columns a person scans for (id, slug,
|
|
5
|
+
* name/title, state), a single resource becomes `key value` lines, and the
|
|
6
|
+
* paging envelope becomes one footer line that says whether there is more and
|
|
7
|
+
* how to get it. `--json` always prints the body untouched — scripts read that,
|
|
8
|
+
* and nothing here is allowed to reshape it.
|
|
9
|
+
*/
|
|
10
|
+
type Row = Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* The rows of a list answer: `data` when the envelope carries it (the same rows
|
|
13
|
+
* as the named key), else the named key, else the first array of objects.
|
|
14
|
+
* Undefined when the answer is not a list.
|
|
15
|
+
*/
|
|
16
|
+
export declare function rowsOf(body: unknown): {
|
|
17
|
+
key: string;
|
|
18
|
+
rows: Row[];
|
|
19
|
+
} | undefined;
|
|
20
|
+
export interface PageInfo {
|
|
21
|
+
hasMore: boolean;
|
|
22
|
+
nextCursor?: string;
|
|
23
|
+
total?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function pageOf(body: unknown): PageInfo | undefined;
|
|
26
|
+
export declare function cell(v: unknown, width?: number): string;
|
|
27
|
+
/** Up to six columns, preferred names first, then whatever scalars the rows carry. */
|
|
28
|
+
export declare function pickColumns(rows: Row[], wanted?: string[]): string[];
|
|
29
|
+
export declare function table(rows: Row[], columns?: string[]): string[];
|
|
30
|
+
/** A single resource: unwrap `{ data }` / `{ <resource> }`, then one `key value` line per field. */
|
|
31
|
+
export declare function details(body: unknown): string[];
|
|
32
|
+
/** Print an answer: table for a list, details for a resource, a paging footer when there is more. */
|
|
33
|
+
export declare function render(body: unknown, columns?: string[]): string[];
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/api/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAKnC;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,SAAS,CAU9E;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAe1D;AA2BD,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAK,GAAG,MAAM,CAUnD;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAepE;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY/D;AAED,qGAAqG;AACrG,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CA0B/C;AAED,qGAAqG;AACrG,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAiBlE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* How an API answer is printed when nobody asked for `--json`.
|
|
4
|
+
*
|
|
5
|
+
* A list answer becomes a table of the columns a person scans for (id, slug,
|
|
6
|
+
* name/title, state), a single resource becomes `key value` lines, and the
|
|
7
|
+
* paging envelope becomes one footer line that says whether there is more and
|
|
8
|
+
* how to get it. `--json` always prints the body untouched — scripts read that,
|
|
9
|
+
* and nothing here is allowed to reshape it.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.rowsOf = rowsOf;
|
|
13
|
+
exports.pageOf = pageOf;
|
|
14
|
+
exports.cell = cell;
|
|
15
|
+
exports.pickColumns = pickColumns;
|
|
16
|
+
exports.table = table;
|
|
17
|
+
exports.details = details;
|
|
18
|
+
exports.render = render;
|
|
19
|
+
/** Keys that are envelope, never the rows themselves. */
|
|
20
|
+
const ENVELOPE = new Set(['page', 'sync', 'warnings', 'conformance', 'facets']);
|
|
21
|
+
/**
|
|
22
|
+
* The rows of a list answer: `data` when the envelope carries it (the same rows
|
|
23
|
+
* as the named key), else the named key, else the first array of objects.
|
|
24
|
+
* Undefined when the answer is not a list.
|
|
25
|
+
*/
|
|
26
|
+
function rowsOf(body) {
|
|
27
|
+
if (Array.isArray(body))
|
|
28
|
+
return { key: '', rows: body };
|
|
29
|
+
if (!body || typeof body !== 'object')
|
|
30
|
+
return undefined;
|
|
31
|
+
const obj = body;
|
|
32
|
+
const arrays = Object.entries(obj).filter(([k, v]) => !ENVELOPE.has(k) && Array.isArray(v) && v.every((x) => x && typeof x === 'object'));
|
|
33
|
+
const named = arrays.find(([k]) => k !== 'data');
|
|
34
|
+
if (Array.isArray(obj.data))
|
|
35
|
+
return { key: named?.[0] ?? 'data', rows: obj.data };
|
|
36
|
+
return named ? { key: named[0], rows: named[1] } : undefined;
|
|
37
|
+
}
|
|
38
|
+
function pageOf(body) {
|
|
39
|
+
const page = body?.page;
|
|
40
|
+
if (!page || typeof page !== 'object')
|
|
41
|
+
return undefined;
|
|
42
|
+
const p = page;
|
|
43
|
+
return {
|
|
44
|
+
hasMore: Boolean(p.hasMore ?? p.has_more),
|
|
45
|
+
nextCursor: p.nextCursor ?? p.next_cursor ?? undefined,
|
|
46
|
+
total: typeof p.total === 'number' ? p.total : undefined,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const PREFERRED = [
|
|
50
|
+
'id',
|
|
51
|
+
'key',
|
|
52
|
+
'slug',
|
|
53
|
+
'hostname',
|
|
54
|
+
'email',
|
|
55
|
+
'name',
|
|
56
|
+
'title',
|
|
57
|
+
'label',
|
|
58
|
+
'type',
|
|
59
|
+
'kind',
|
|
60
|
+
'role',
|
|
61
|
+
'state',
|
|
62
|
+
'status',
|
|
63
|
+
'visibility',
|
|
64
|
+
'verified',
|
|
65
|
+
'url',
|
|
66
|
+
'events',
|
|
67
|
+
'version',
|
|
68
|
+
'createdAt',
|
|
69
|
+
'updatedAt',
|
|
70
|
+
];
|
|
71
|
+
const scalar = (v) => v === null || ['string', 'number', 'boolean'].includes(typeof v);
|
|
72
|
+
function cell(v, width = 48) {
|
|
73
|
+
let s;
|
|
74
|
+
if (v === null || v === undefined)
|
|
75
|
+
s = '';
|
|
76
|
+
else if (Array.isArray(v))
|
|
77
|
+
s = v.every(scalar) ? v.join(',') : `[${v.length}]`;
|
|
78
|
+
else if (typeof v === 'object') {
|
|
79
|
+
const o = v;
|
|
80
|
+
s = String(o.name ?? o.title ?? o.slug ?? o.id ?? JSON.stringify(v));
|
|
81
|
+
}
|
|
82
|
+
else
|
|
83
|
+
s = String(v);
|
|
84
|
+
s = s.replace(/\s+/g, ' ');
|
|
85
|
+
return s.length > width ? `${s.slice(0, width - 1)}…` : s;
|
|
86
|
+
}
|
|
87
|
+
/** Up to six columns, preferred names first, then whatever scalars the rows carry. */
|
|
88
|
+
function pickColumns(rows, wanted) {
|
|
89
|
+
const present = new Set();
|
|
90
|
+
for (const r of rows.slice(0, 20))
|
|
91
|
+
for (const [k, v] of Object.entries(r))
|
|
92
|
+
if (v !== undefined)
|
|
93
|
+
present.add(k);
|
|
94
|
+
// A column nobody's rows carry is noise; with none left, choose as if unasked.
|
|
95
|
+
const asked = wanted?.filter((k) => present.has(k));
|
|
96
|
+
if (asked?.length)
|
|
97
|
+
return asked;
|
|
98
|
+
const cols = PREFERRED.filter((k) => present.has(k));
|
|
99
|
+
// `name` and `title` both present: keep one, the second is usually a copy.
|
|
100
|
+
if (cols.includes('name') && cols.includes('title'))
|
|
101
|
+
cols.splice(cols.indexOf('name'), 1);
|
|
102
|
+
for (const k of present) {
|
|
103
|
+
if (cols.length >= 6)
|
|
104
|
+
break;
|
|
105
|
+
if (!cols.includes(k) && rows.some((r) => scalar(r[k]) && r[k] !== null))
|
|
106
|
+
cols.push(k);
|
|
107
|
+
}
|
|
108
|
+
return cols.slice(0, 6);
|
|
109
|
+
}
|
|
110
|
+
function table(rows, columns) {
|
|
111
|
+
if (rows.length === 0)
|
|
112
|
+
return ['(none)'];
|
|
113
|
+
const cols = pickColumns(rows, columns);
|
|
114
|
+
if (cols.length === 0)
|
|
115
|
+
return rows.map((r) => JSON.stringify(r));
|
|
116
|
+
const cells = rows.map((r) => cols.map((c) => cell(r[c])));
|
|
117
|
+
const widths = cols.map((c, i) => Math.max(c.length, ...cells.map((row) => row[i].length)));
|
|
118
|
+
const line = (vals) => vals
|
|
119
|
+
.map((v, i) => (i === vals.length - 1 ? v : v.padEnd(widths[i])))
|
|
120
|
+
.join(' ')
|
|
121
|
+
.trimEnd();
|
|
122
|
+
return [line(cols.map((c) => c.toUpperCase())), ...cells.map(line)];
|
|
123
|
+
}
|
|
124
|
+
/** A single resource: unwrap `{ data }` / `{ <resource> }`, then one `key value` line per field. */
|
|
125
|
+
function details(body) {
|
|
126
|
+
if (body === undefined || body === null || body === '')
|
|
127
|
+
return ['OK'];
|
|
128
|
+
if (typeof body !== 'object')
|
|
129
|
+
return [String(body)];
|
|
130
|
+
let obj = body;
|
|
131
|
+
const extras = [];
|
|
132
|
+
const named = Object.entries(obj).filter(([k]) => !ENVELOPE.has(k) && k !== 'data');
|
|
133
|
+
if (obj.data && typeof obj.data === 'object' && !Array.isArray(obj.data)) {
|
|
134
|
+
// `token` beside the row on a credential mint is the one-time secret: keep it visible.
|
|
135
|
+
for (const [k, v] of named)
|
|
136
|
+
if (scalar(v))
|
|
137
|
+
extras.push(`${k} ${cell(v, 200)}`);
|
|
138
|
+
obj = obj.data;
|
|
139
|
+
}
|
|
140
|
+
else if (named.length === 1 &&
|
|
141
|
+
named[0][1] &&
|
|
142
|
+
typeof named[0][1] === 'object' &&
|
|
143
|
+
!Array.isArray(named[0][1])) {
|
|
144
|
+
obj = named[0][1];
|
|
145
|
+
}
|
|
146
|
+
const keys = Object.keys(obj);
|
|
147
|
+
const width = Math.min(Math.max(0, ...keys.map((k) => k.length)), 24);
|
|
148
|
+
const lines = keys
|
|
149
|
+
.filter((k) => obj[k] !== undefined)
|
|
150
|
+
.map((k) => `${k.padEnd(width)} ${cell(obj[k], 100)}`);
|
|
151
|
+
const warnings = body.warnings;
|
|
152
|
+
if (Array.isArray(warnings))
|
|
153
|
+
for (const w of warnings)
|
|
154
|
+
lines.push(`warning: ${cell(w, 200)}`);
|
|
155
|
+
return [...extras, ...lines];
|
|
156
|
+
}
|
|
157
|
+
/** Print an answer: table for a list, details for a resource, a paging footer when there is more. */
|
|
158
|
+
function render(body, columns) {
|
|
159
|
+
if (typeof body === 'string')
|
|
160
|
+
return [body];
|
|
161
|
+
const list = rowsOf(body);
|
|
162
|
+
if (!list)
|
|
163
|
+
return details(body);
|
|
164
|
+
const out = table(list.rows, columns);
|
|
165
|
+
const page = pageOf(body);
|
|
166
|
+
if (page && (page.hasMore || page.total !== undefined)) {
|
|
167
|
+
out.push(`-- ${list.rows.length} shown${page.total === undefined ? '' : ` of ${page.total}`}` +
|
|
168
|
+
(page.hasMore
|
|
169
|
+
? page.nextCursor
|
|
170
|
+
? `, more: --cursor ${page.nextCursor} (or --paginate)`
|
|
171
|
+
: ', more available'
|
|
172
|
+
: ''));
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/api/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Parsed } from './args';
|
|
2
|
+
import { type Operation } from './spec';
|
|
3
|
+
import type { HttpRequest } from './http';
|
|
4
|
+
/**
|
|
5
|
+
* Turn `forumulate api <op> …flags` into one HTTP request.
|
|
6
|
+
*
|
|
7
|
+
* Where a value comes from, in order of precedence:
|
|
8
|
+
* - path params: `--orgId acme` (or `--org-id`), else the positionals in path
|
|
9
|
+
* order, else — for `orgId` only — the default org (`--org`,
|
|
10
|
+
* `FORUMULATE_ORG`, `forumulate config set org`).
|
|
11
|
+
* - query and header params: `--<name> value`; a repeated flag is joined with
|
|
12
|
+
* commas, which is how every array parameter in this API is spelled.
|
|
13
|
+
* - body: `--data '{…}'`, `--data @file.json`, or `--data -` (stdin), then each
|
|
14
|
+
* `--field a.b=value` (typed by the body schema; `a:=<json>` for raw JSON),
|
|
15
|
+
* then any other `--flag` that names a top-level body property.
|
|
16
|
+
* - `-p name=value` sets a parameter whose name collides with one of ours.
|
|
17
|
+
*
|
|
18
|
+
* An operation's own parameter always beats a CLI flag of the same name — the
|
|
19
|
+
* API has a `dryRun` and a `form`, and those must reach it.
|
|
20
|
+
*/
|
|
21
|
+
export interface RequestSources {
|
|
22
|
+
readFile: (path: string) => string | Buffer;
|
|
23
|
+
readStdin: () => Promise<string>;
|
|
24
|
+
defaultOrg?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Flags `forumulate api` consumes itself, unless the operation declares a parameter so named. */
|
|
27
|
+
export declare const API_FLAGS: Set<string>;
|
|
28
|
+
export declare const norm: (s: string) => string;
|
|
29
|
+
export declare class UsageError extends Error {
|
|
30
|
+
}
|
|
31
|
+
export interface Planned {
|
|
32
|
+
request: HttpRequest;
|
|
33
|
+
/** Parameter values, by name — what `--paginate` keeps between pages. */
|
|
34
|
+
query: Record<string, string>;
|
|
35
|
+
}
|
|
36
|
+
export declare function planRequest(op: Operation, parsed: Parsed, positionals: string[], src: RequestSources, preset?: Record<string, string>): Promise<Planned>;
|
|
37
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/api/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAA0C,KAAK,SAAS,EAAmB,MAAM,QAAQ,CAAC;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC5C,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kGAAkG;AAClG,eAAO,MAAM,SAAS,aAiBpB,CAAC;AAEH,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAA8C,CAAC;AAEhF,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAyDxC,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EAAE,EACrB,GAAG,EAAE,cAAc,EACnB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,OAAO,CAAC,OAAO,CAAC,CAwHlB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsageError = exports.norm = exports.API_FLAGS = void 0;
|
|
4
|
+
exports.planRequest = planRequest;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const args_1 = require("./args");
|
|
7
|
+
const spec_1 = require("./spec");
|
|
8
|
+
/** Flags `forumulate api` consumes itself, unless the operation declares a parameter so named. */
|
|
9
|
+
exports.API_FLAGS = new Set([
|
|
10
|
+
'json',
|
|
11
|
+
'paginate',
|
|
12
|
+
'max-pages',
|
|
13
|
+
'data',
|
|
14
|
+
'field',
|
|
15
|
+
'form',
|
|
16
|
+
'param',
|
|
17
|
+
'header',
|
|
18
|
+
'api-version',
|
|
19
|
+
'idempotency-key',
|
|
20
|
+
'columns',
|
|
21
|
+
'include-headers',
|
|
22
|
+
'dry-run',
|
|
23
|
+
'help',
|
|
24
|
+
'verbose',
|
|
25
|
+
'org',
|
|
26
|
+
]);
|
|
27
|
+
const norm = (s) => s.toLowerCase().replace(/[-_]/g, '');
|
|
28
|
+
exports.norm = norm;
|
|
29
|
+
class UsageError extends Error {
|
|
30
|
+
}
|
|
31
|
+
exports.UsageError = UsageError;
|
|
32
|
+
function coerce(raw, schema, at) {
|
|
33
|
+
const t = schema?.t ?? (schema?.any ? schema.any.map((v) => v.t).find(Boolean) : undefined);
|
|
34
|
+
if (raw === 'null' && schema?.n)
|
|
35
|
+
return null;
|
|
36
|
+
switch (t) {
|
|
37
|
+
case 'integer':
|
|
38
|
+
case 'number': {
|
|
39
|
+
const n = Number(raw);
|
|
40
|
+
if (!Number.isFinite(n))
|
|
41
|
+
throw new UsageError(`${at} expects a number, got "${raw}"`);
|
|
42
|
+
return n;
|
|
43
|
+
}
|
|
44
|
+
case 'boolean':
|
|
45
|
+
if (raw === 'true' || raw === 'false')
|
|
46
|
+
return raw === 'true';
|
|
47
|
+
throw new UsageError(`${at} expects true or false, got "${raw}"`);
|
|
48
|
+
case 'array':
|
|
49
|
+
if (raw.trim().startsWith('['))
|
|
50
|
+
return parseJson(raw, at);
|
|
51
|
+
return raw === '' ? [] : raw.split(',').map((v) => coerce(v, schema?.i, at));
|
|
52
|
+
case 'object':
|
|
53
|
+
return parseJson(raw, at);
|
|
54
|
+
default:
|
|
55
|
+
return raw;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function parseJson(raw, at) {
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(raw);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
throw new UsageError(`${at}: not valid JSON (${e.message})`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** `a.b.c` → nested set, so `--field settings.overview=Hi` works without writing JSON. */
|
|
67
|
+
function setPath(target, path, value) {
|
|
68
|
+
const keys = path.split('.');
|
|
69
|
+
let node = target;
|
|
70
|
+
for (const k of keys.slice(0, -1)) {
|
|
71
|
+
if (!node[k] || typeof node[k] !== 'object')
|
|
72
|
+
node[k] = {};
|
|
73
|
+
node = node[k];
|
|
74
|
+
}
|
|
75
|
+
node[keys.at(-1)] = value;
|
|
76
|
+
}
|
|
77
|
+
function schemaAt(op, path) {
|
|
78
|
+
const [head, ...rest] = path.split('.');
|
|
79
|
+
let node = (0, spec_1.bodyProperties)(op)[head];
|
|
80
|
+
for (const k of rest)
|
|
81
|
+
node = (0, spec_1.resolveRef)((0, spec_1.resolveRef)(node)?.p?.[k]);
|
|
82
|
+
return (0, spec_1.resolveRef)(node);
|
|
83
|
+
}
|
|
84
|
+
async function readData(raw, src) {
|
|
85
|
+
if (raw === '-' || raw === '@-')
|
|
86
|
+
return src.readStdin();
|
|
87
|
+
if (raw.startsWith('@'))
|
|
88
|
+
return String(src.readFile(raw.slice(1)));
|
|
89
|
+
return raw;
|
|
90
|
+
}
|
|
91
|
+
async function planRequest(op, parsed, positionals, src, preset = {}) {
|
|
92
|
+
const params = op.q ?? [];
|
|
93
|
+
const byNorm = new Map(params.map((p) => [(0, exports.norm)(p.n), p]));
|
|
94
|
+
const bodyProps = op.b ? (0, spec_1.bodyProperties)(op) : {};
|
|
95
|
+
const bodyByNorm = new Map(Object.keys(bodyProps).map((k) => [(0, exports.norm)(k), k]));
|
|
96
|
+
const values = {};
|
|
97
|
+
for (const [k, v] of Object.entries(preset))
|
|
98
|
+
values[k] = [v];
|
|
99
|
+
const body = {};
|
|
100
|
+
let bodySet = false;
|
|
101
|
+
const form = new FormData();
|
|
102
|
+
let formSet = false;
|
|
103
|
+
for (const [name, vals] of parsed.flags) {
|
|
104
|
+
const param = byNorm.get((0, exports.norm)(name));
|
|
105
|
+
if (param) {
|
|
106
|
+
values[param.n] = [...(values[param.n] && !preset[param.n] ? values[param.n] : []), ...vals];
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (exports.API_FLAGS.has(name))
|
|
110
|
+
continue;
|
|
111
|
+
const prop = bodyByNorm.get((0, exports.norm)(name));
|
|
112
|
+
if (prop && !op.mp) {
|
|
113
|
+
const v = vals.at(-1);
|
|
114
|
+
body[prop] = coerce(v, bodyProps[prop], `--${name}`);
|
|
115
|
+
bodySet = true;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (prop && op.mp) {
|
|
119
|
+
await appendForm(form, prop, vals.at(-1), src);
|
|
120
|
+
formSet = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
throw new UsageError(`--${name} is not a parameter of ${op.id}. See: forumulate api describe ${op.id}`);
|
|
124
|
+
}
|
|
125
|
+
for (const pv of (0, args_1.all)(parsed, 'param')) {
|
|
126
|
+
const eq = pv.indexOf('=');
|
|
127
|
+
if (eq < 1)
|
|
128
|
+
throw new UsageError(`--param expects name=value, got "${pv}"`);
|
|
129
|
+
const p = byNorm.get((0, exports.norm)(pv.slice(0, eq)));
|
|
130
|
+
if (!p)
|
|
131
|
+
throw new UsageError(`${op.id} has no parameter "${pv.slice(0, eq)}"`);
|
|
132
|
+
values[p.n] = [...(values[p.n] ?? []), pv.slice(eq + 1)];
|
|
133
|
+
}
|
|
134
|
+
// Positionals fill the path params nobody named, in path order.
|
|
135
|
+
const pathNames = (0, spec_1.pathParams)(op);
|
|
136
|
+
const queue = [...positionals];
|
|
137
|
+
for (const n of pathNames)
|
|
138
|
+
if (!values[n] && queue.length)
|
|
139
|
+
values[n] = [queue.shift()];
|
|
140
|
+
if (queue.length)
|
|
141
|
+
throw new UsageError(`Unexpected argument${queue.length > 1 ? 's' : ''}: ${queue.join(' ')}`);
|
|
142
|
+
if (!values.orgId && pathNames.includes('orgId') && src.defaultOrg)
|
|
143
|
+
values.orgId = [src.defaultOrg];
|
|
144
|
+
const missing = pathNames.filter((n) => !values[n]);
|
|
145
|
+
if (missing.length)
|
|
146
|
+
throw new UsageError(`${op.id} needs ${missing.map((n) => `<${n}>`).join(' ')} (positional, or --${missing[0]})`);
|
|
147
|
+
const missingQ = params.filter((p) => p.r && p.in !== 'path' && !values[p.n]).map((p) => p.n);
|
|
148
|
+
if (missingQ.length)
|
|
149
|
+
throw new UsageError(`${op.id} needs --${missingQ.join(', --')}`);
|
|
150
|
+
const path = op.p.replace(/\{([^}]+)\}/g, (_, n) => encodeURIComponent(values[n][0]));
|
|
151
|
+
const query = {};
|
|
152
|
+
const headers = {};
|
|
153
|
+
for (const p of params) {
|
|
154
|
+
const v = values[p.n];
|
|
155
|
+
if (!v || p.in === 'path')
|
|
156
|
+
continue;
|
|
157
|
+
if (p.in === 'query')
|
|
158
|
+
query[p.n] = v.join(',');
|
|
159
|
+
else if (p.in === 'header')
|
|
160
|
+
headers[p.n] = v.at(-1);
|
|
161
|
+
}
|
|
162
|
+
for (const h of (0, args_1.all)(parsed, 'header')) {
|
|
163
|
+
const at = h.indexOf(':');
|
|
164
|
+
if (at < 1)
|
|
165
|
+
throw new UsageError(`--header expects "Name: value", got "${h}"`);
|
|
166
|
+
headers[h.slice(0, at).trim()] = h.slice(at + 1).trim();
|
|
167
|
+
}
|
|
168
|
+
const key = (0, args_1.flag)(parsed, 'idempotency-key');
|
|
169
|
+
if (key)
|
|
170
|
+
headers['Idempotency-Key'] = key;
|
|
171
|
+
// The body: --data first, then --field on top of it.
|
|
172
|
+
let payload;
|
|
173
|
+
const data = byNorm.has('data') ? undefined : (0, args_1.flag)(parsed, 'data');
|
|
174
|
+
if (data !== undefined) {
|
|
175
|
+
const text = await readData(data, src);
|
|
176
|
+
payload = text.trim() === '' ? undefined : parseJson(text, '--data');
|
|
177
|
+
bodySet = payload !== undefined;
|
|
178
|
+
}
|
|
179
|
+
for (const f of (0, args_1.all)(parsed, 'field')) {
|
|
180
|
+
const raw = f.indexOf(':=');
|
|
181
|
+
const eq = f.indexOf('=');
|
|
182
|
+
if (eq < 1)
|
|
183
|
+
throw new UsageError(`--field expects name=value, got "${f}"`);
|
|
184
|
+
if (op.mp) {
|
|
185
|
+
await appendForm(form, f.slice(0, eq), f.slice(eq + 1), src);
|
|
186
|
+
formSet = true;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const isRaw = raw > 0 && raw < eq;
|
|
190
|
+
const name = f.slice(0, isRaw ? raw : eq);
|
|
191
|
+
const value = isRaw
|
|
192
|
+
? parseJson(f.slice(raw + 2), `--field ${name}`)
|
|
193
|
+
: coerce(f.slice(eq + 1), schemaAt(op, name), `--field ${name}`);
|
|
194
|
+
setPath(body, name, value);
|
|
195
|
+
bodySet = true;
|
|
196
|
+
}
|
|
197
|
+
if (!byNorm.has('form'))
|
|
198
|
+
for (const f of (0, args_1.all)(parsed, 'form')) {
|
|
199
|
+
const eq = f.indexOf('=');
|
|
200
|
+
if (eq < 1)
|
|
201
|
+
throw new UsageError(`--form expects name=value or name=@file, got "${f}"`);
|
|
202
|
+
await appendForm(form, f.slice(0, eq), f.slice(eq + 1), src);
|
|
203
|
+
formSet = true;
|
|
204
|
+
}
|
|
205
|
+
const request = { method: op.m, path, query, headers, idempotent: Boolean(op.ik) };
|
|
206
|
+
if (formSet)
|
|
207
|
+
request.form = form;
|
|
208
|
+
else if (bodySet) {
|
|
209
|
+
request.body =
|
|
210
|
+
payload && typeof payload === 'object' && !Array.isArray(payload)
|
|
211
|
+
? { ...payload, ...body }
|
|
212
|
+
: Object.keys(body).length
|
|
213
|
+
? body
|
|
214
|
+
: payload;
|
|
215
|
+
}
|
|
216
|
+
else if (op.b && op.br && op.m !== 'GET')
|
|
217
|
+
request.body = {};
|
|
218
|
+
return { request, query };
|
|
219
|
+
}
|
|
220
|
+
async function appendForm(form, name, value, src) {
|
|
221
|
+
if (value.startsWith('@')) {
|
|
222
|
+
const file = value.slice(1);
|
|
223
|
+
const bytes = src.readFile(file);
|
|
224
|
+
const blob = new Blob([typeof bytes === 'string' ? bytes : new Uint8Array(bytes)]);
|
|
225
|
+
form.append(name, blob, (0, node_path_1.basename)(file));
|
|
226
|
+
}
|
|
227
|
+
else
|
|
228
|
+
form.append(name, value);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/api/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Http, HttpRequest } from './http';
|
|
2
|
+
/**
|
|
3
|
+
* Send one planned request and print the answer — shared by `forumulate api`
|
|
4
|
+
* and every resource command, so `--json`, `--paginate`, `--columns` and
|
|
5
|
+
* `--include-headers` mean the same thing everywhere.
|
|
6
|
+
*/
|
|
7
|
+
export interface SendOptions {
|
|
8
|
+
json: boolean;
|
|
9
|
+
paginate?: boolean;
|
|
10
|
+
maxPages?: number;
|
|
11
|
+
columns?: string[];
|
|
12
|
+
includeHeaders?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface Printer {
|
|
15
|
+
out: (line: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function sendAndPrint(http: Http, request: HttpRequest, opts: SendOptions, io: Printer): Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Every row of a cursor-paged list. Stops on `hasMore: false`, a missing
|
|
20
|
+
* cursor, or a cursor that did not move (a ranking answers `nextCursor: null`
|
|
21
|
+
* and pages with `?page=`, which is not a walk). Says so when the first
|
|
22
|
+
* answer is not a list at all (`list: false`, and `first` is that answer).
|
|
23
|
+
*/
|
|
24
|
+
export declare function walk(http: Http, request: HttpRequest, maxPages?: number): Promise<{
|
|
25
|
+
key: string;
|
|
26
|
+
rows: unknown[];
|
|
27
|
+
list: boolean;
|
|
28
|
+
first: unknown;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function print(data: unknown, opts: {
|
|
31
|
+
json: boolean;
|
|
32
|
+
columns?: string[];
|
|
33
|
+
}, io: Printer): void;
|
|
34
|
+
export declare function printRequest(http: Http, req: HttpRequest, io: Printer): void;
|
|
35
|
+
//# sourceMappingURL=send.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/api/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAgB,MAAM,QAAQ,CAAC;AAI9D;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,OAAO,GACV,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CACxB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,EACpB,QAAQ,SAAO,GACd,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAoB1E;AAED,wBAAgB,KAAK,CACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC3C,EAAE,EAAE,OAAO,GACV,IAAI,CAGN;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAM5E"}
|
package/dist/api/send.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendAndPrint = sendAndPrint;
|
|
4
|
+
exports.walk = walk;
|
|
5
|
+
exports.print = print;
|
|
6
|
+
exports.printRequest = printRequest;
|
|
7
|
+
const output_1 = require("./output");
|
|
8
|
+
const request_1 = require("./request");
|
|
9
|
+
async function sendAndPrint(http, request, opts, io) {
|
|
10
|
+
if (!opts.paginate) {
|
|
11
|
+
const res = await http.send(request);
|
|
12
|
+
if (opts.includeHeaders)
|
|
13
|
+
printHeaders(res, io);
|
|
14
|
+
print(res.data, opts, io);
|
|
15
|
+
return res.data;
|
|
16
|
+
}
|
|
17
|
+
if (request.method !== 'GET')
|
|
18
|
+
throw new request_1.UsageError('--paginate only applies to GET operations');
|
|
19
|
+
const rows = await walk(http, request, opts.maxPages ?? 1000);
|
|
20
|
+
if (!rows.list) {
|
|
21
|
+
// Not a list: nothing to walk, so the one answer is the answer.
|
|
22
|
+
print(rows.first, opts, io);
|
|
23
|
+
return rows.first;
|
|
24
|
+
}
|
|
25
|
+
if (opts.json)
|
|
26
|
+
io.out(JSON.stringify(rows.rows, null, 2));
|
|
27
|
+
else {
|
|
28
|
+
for (const l of (0, output_1.table)(rows.rows, opts.columns))
|
|
29
|
+
io.out(l);
|
|
30
|
+
io.out(`-- ${rows.rows.length} ${rows.key || 'rows'}`);
|
|
31
|
+
}
|
|
32
|
+
return rows.rows;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Every row of a cursor-paged list. Stops on `hasMore: false`, a missing
|
|
36
|
+
* cursor, or a cursor that did not move (a ranking answers `nextCursor: null`
|
|
37
|
+
* and pages with `?page=`, which is not a walk). Says so when the first
|
|
38
|
+
* answer is not a list at all (`list: false`, and `first` is that answer).
|
|
39
|
+
*/
|
|
40
|
+
async function walk(http, request, maxPages = 1000) {
|
|
41
|
+
const rows = [];
|
|
42
|
+
let key = '';
|
|
43
|
+
let cursor = request.query?.cursor;
|
|
44
|
+
let first;
|
|
45
|
+
for (let page = 0; page < maxPages; page++) {
|
|
46
|
+
const res = await http.send({
|
|
47
|
+
...request,
|
|
48
|
+
query: { ...request.query, ...(cursor ? { cursor } : {}) },
|
|
49
|
+
});
|
|
50
|
+
if (page === 0)
|
|
51
|
+
first = res.data;
|
|
52
|
+
const found = (0, output_1.rowsOf)(res.data);
|
|
53
|
+
if (!found)
|
|
54
|
+
return { key, rows, list: page > 0, first };
|
|
55
|
+
key ||= found.key;
|
|
56
|
+
rows.push(...found.rows);
|
|
57
|
+
const info = (0, output_1.pageOf)(res.data);
|
|
58
|
+
if (!info?.hasMore || !info.nextCursor || info.nextCursor === cursor)
|
|
59
|
+
break;
|
|
60
|
+
cursor = info.nextCursor;
|
|
61
|
+
}
|
|
62
|
+
return { key, rows, list: true, first };
|
|
63
|
+
}
|
|
64
|
+
function print(data, opts, io) {
|
|
65
|
+
if (opts.json)
|
|
66
|
+
io.out(typeof data === 'string' ? data : JSON.stringify(data ?? null, null, 2));
|
|
67
|
+
else
|
|
68
|
+
for (const l of (0, output_1.render)(data, opts.columns))
|
|
69
|
+
io.out(l);
|
|
70
|
+
}
|
|
71
|
+
function printHeaders(res, io) {
|
|
72
|
+
io.out(`HTTP ${res.status}`);
|
|
73
|
+
res.headers.forEach((v, k) => io.out(`${k}: ${v}`));
|
|
74
|
+
io.out('');
|
|
75
|
+
}
|
|
76
|
+
function printRequest(http, req, io) {
|
|
77
|
+
io.out(`${req.method} ${http.url(req.path, req.query)}`);
|
|
78
|
+
for (const [k, v] of Object.entries(http.headersFor(req)))
|
|
79
|
+
io.out(`${k}: ${k.toLowerCase() === 'authorization' ? 'Bearer ***' : v}`);
|
|
80
|
+
if (req.form)
|
|
81
|
+
io.out('(multipart form)');
|
|
82
|
+
else if (req.body !== undefined)
|
|
83
|
+
io.out(`\n${JSON.stringify(req.body, null, 2)}`);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/api/send.ts"],"names":[],"mappings":"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"}
|