@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.
Files changed (204) hide show
  1. package/README.md +124 -5
  2. package/dist/api/args.d.ts +21 -0
  3. package/dist/api/args.d.ts.map +1 -0
  4. package/dist/api/args.js +81 -0
  5. package/dist/api/args.js.map +1 -0
  6. package/dist/api/command.d.ts +17 -0
  7. package/dist/api/command.d.ts.map +1 -0
  8. package/dist/api/command.js +182 -0
  9. package/dist/api/command.js.map +1 -0
  10. package/dist/api/describe.d.ts +5 -0
  11. package/dist/api/describe.d.ts.map +1 -0
  12. package/dist/api/describe.js +121 -0
  13. package/dist/api/describe.js.map +1 -0
  14. package/dist/api/http.d.ts +81 -0
  15. package/dist/api/http.d.ts.map +1 -0
  16. package/dist/api/http.js +183 -0
  17. package/dist/api/http.js.map +1 -0
  18. package/dist/api/operations.json +1 -0
  19. package/dist/api/output.d.ts +35 -0
  20. package/dist/api/output.d.ts.map +1 -0
  21. package/dist/api/output.js +176 -0
  22. package/dist/api/output.js.map +1 -0
  23. package/dist/api/request.d.ts +37 -0
  24. package/dist/api/request.d.ts.map +1 -0
  25. package/dist/api/request.js +230 -0
  26. package/dist/api/request.js.map +1 -0
  27. package/dist/api/send.d.ts +35 -0
  28. package/dist/api/send.d.ts.map +1 -0
  29. package/dist/api/send.js +85 -0
  30. package/dist/api/send.js.map +1 -0
  31. package/dist/api/spec.d.ts +96 -0
  32. package/dist/api/spec.d.ts.map +1 -0
  33. package/dist/api/spec.js +126 -0
  34. package/dist/api/spec.js.map +1 -0
  35. package/dist/commands/completion.d.ts +12 -0
  36. package/dist/commands/completion.d.ts.map +1 -0
  37. package/dist/commands/completion.js +169 -0
  38. package/dist/commands/completion.js.map +1 -0
  39. package/dist/commands/config.d.ts +33 -0
  40. package/dist/commands/config.d.ts.map +1 -0
  41. package/dist/commands/config.js +144 -0
  42. package/dist/commands/config.js.map +1 -0
  43. package/dist/commands/context.d.ts +35 -0
  44. package/dist/commands/context.d.ts.map +1 -0
  45. package/dist/commands/context.js +59 -0
  46. package/dist/commands/context.js.map +1 -0
  47. package/dist/commands/groups-api.d.ts +11 -0
  48. package/dist/commands/groups-api.d.ts.map +1 -0
  49. package/dist/commands/groups-api.js +140 -0
  50. package/dist/commands/groups-api.js.map +1 -0
  51. package/dist/commands/groups-community.d.ts +15 -0
  52. package/dist/commands/groups-community.d.ts.map +1 -0
  53. package/dist/commands/groups-community.js +344 -0
  54. package/dist/commands/groups-community.js.map +1 -0
  55. package/dist/commands/groups-content.d.ts +10 -0
  56. package/dist/commands/groups-content.d.ts.map +1 -0
  57. package/dist/commands/groups-content.js +331 -0
  58. package/dist/commands/groups-content.js.map +1 -0
  59. package/dist/commands/groups-docs.d.ts +12 -0
  60. package/dist/commands/groups-docs.d.ts.map +1 -0
  61. package/dist/commands/groups-docs.js +414 -0
  62. package/dist/commands/groups-docs.js.map +1 -0
  63. package/dist/commands/groups-org.d.ts +10 -0
  64. package/dist/commands/groups-org.d.ts.map +1 -0
  65. package/dist/commands/groups-org.js +405 -0
  66. package/dist/commands/groups-org.js.map +1 -0
  67. package/dist/commands/groups-site.d.ts +3 -0
  68. package/dist/commands/groups-site.d.ts.map +1 -0
  69. package/dist/commands/groups-site.js +237 -0
  70. package/dist/commands/groups-site.js.map +1 -0
  71. package/dist/commands/groups-spaces.d.ts +3 -0
  72. package/dist/commands/groups-spaces.d.ts.map +1 -0
  73. package/dist/commands/groups-spaces.js +273 -0
  74. package/dist/commands/groups-spaces.js.map +1 -0
  75. package/dist/commands/groups-types.d.ts +3 -0
  76. package/dist/commands/groups-types.d.ts.map +1 -0
  77. package/dist/commands/groups-types.js +251 -0
  78. package/dist/commands/groups-types.js.map +1 -0
  79. package/dist/commands/groups.d.ts +4 -0
  80. package/dist/commands/groups.d.ts.map +1 -0
  81. package/dist/commands/groups.js +71 -0
  82. package/dist/commands/groups.js.map +1 -0
  83. package/dist/commands/index.d.ts +25 -0
  84. package/dist/commands/index.d.ts.map +1 -0
  85. package/dist/commands/index.js +118 -0
  86. package/dist/commands/index.js.map +1 -0
  87. package/dist/commands/resource.d.ts +86 -0
  88. package/dist/commands/resource.d.ts.map +1 -0
  89. package/dist/commands/resource.js +314 -0
  90. package/dist/commands/resource.js.map +1 -0
  91. package/dist/content/library.d.ts +1 -0
  92. package/dist/content/library.d.ts.map +1 -1
  93. package/dist/content/library.js +1 -0
  94. package/dist/content/library.js.map +1 -1
  95. package/dist/dev/command.d.ts +41 -0
  96. package/dist/dev/command.d.ts.map +1 -0
  97. package/dist/dev/command.js +158 -0
  98. package/dist/dev/command.js.map +1 -0
  99. package/dist/help.d.ts +3 -0
  100. package/dist/help.d.ts.map +1 -0
  101. package/dist/help.js +159 -0
  102. package/dist/help.js.map +1 -0
  103. package/dist/publish/api.d.ts +30 -12
  104. package/dist/publish/api.d.ts.map +1 -1
  105. package/dist/publish/api.js +62 -10
  106. package/dist/publish/api.js.map +1 -1
  107. package/dist/publish/client.d.ts +19 -0
  108. package/dist/publish/client.d.ts.map +1 -0
  109. package/dist/publish/client.js +3 -0
  110. package/dist/publish/client.js.map +1 -0
  111. package/dist/publish/command.d.ts +31 -2
  112. package/dist/publish/command.d.ts.map +1 -1
  113. package/dist/publish/command.js +62 -15
  114. package/dist/publish/command.js.map +1 -1
  115. package/dist/publish/context.d.ts +4 -1
  116. package/dist/publish/context.d.ts.map +1 -1
  117. package/dist/publish/context.js.map +1 -1
  118. package/dist/publish/diff.d.ts +21 -0
  119. package/dist/publish/diff.d.ts.map +1 -0
  120. package/dist/publish/diff.js +96 -0
  121. package/dist/publish/diff.js.map +1 -0
  122. package/dist/publish/docs-apply.d.ts +8 -1
  123. package/dist/publish/docs-apply.d.ts.map +1 -1
  124. package/dist/publish/docs-apply.js +37 -10
  125. package/dist/publish/docs-apply.js.map +1 -1
  126. package/dist/publish/docs-plan.d.ts +16 -3
  127. package/dist/publish/docs-plan.d.ts.map +1 -1
  128. package/dist/publish/docs-plan.js +57 -6
  129. package/dist/publish/docs-plan.js.map +1 -1
  130. package/dist/publish/frontmatter.d.ts +1 -1
  131. package/dist/publish/frontmatter.d.ts.map +1 -1
  132. package/dist/publish/frontmatter.js +1 -0
  133. package/dist/publish/frontmatter.js.map +1 -1
  134. package/dist/publish/index.d.ts +12 -0
  135. package/dist/publish/index.d.ts.map +1 -0
  136. package/dist/publish/index.js +17 -0
  137. package/dist/publish/index.js.map +1 -0
  138. package/dist/publish/manifest.d.ts.map +1 -1
  139. package/dist/publish/manifest.js +23 -3
  140. package/dist/publish/manifest.js.map +1 -1
  141. package/dist/publish/names.d.ts +28 -0
  142. package/dist/publish/names.d.ts.map +1 -0
  143. package/dist/publish/names.js +80 -0
  144. package/dist/publish/names.js.map +1 -0
  145. package/dist/publish/posts.d.ts.map +1 -1
  146. package/dist/publish/posts.js +46 -13
  147. package/dist/publish/posts.js.map +1 -1
  148. package/dist/publish/reserved.d.ts +49 -0
  149. package/dist/publish/reserved.d.ts.map +1 -0
  150. package/dist/publish/reserved.js +118 -0
  151. package/dist/publish/reserved.js.map +1 -0
  152. package/dist/publish/rewrite.d.ts +12 -0
  153. package/dist/publish/rewrite.d.ts.map +1 -1
  154. package/dist/publish/rewrite.js +22 -0
  155. package/dist/publish/rewrite.js.map +1 -1
  156. package/dist/publish/scan-docs.d.ts +10 -0
  157. package/dist/publish/scan-docs.d.ts.map +1 -0
  158. package/dist/publish/scan-docs.js +160 -0
  159. package/dist/publish/scan-docs.js.map +1 -0
  160. package/dist/publish/scan.d.ts +21 -17
  161. package/dist/publish/scan.d.ts.map +1 -1
  162. package/dist/publish/scan.js +99 -232
  163. package/dist/publish/scan.js.map +1 -1
  164. package/dist/publish/slots.d.ts +39 -0
  165. package/dist/publish/slots.d.ts.map +1 -0
  166. package/dist/publish/slots.js +64 -0
  167. package/dist/publish/slots.js.map +1 -0
  168. package/dist/publish/tags.d.ts +9 -0
  169. package/dist/publish/tags.d.ts.map +1 -0
  170. package/dist/publish/tags.js +194 -0
  171. package/dist/publish/tags.js.map +1 -0
  172. package/dist/publish/types.d.ts +62 -0
  173. package/dist/publish/types.d.ts.map +1 -1
  174. package/dist/publish/types.js +0 -10
  175. package/dist/publish/types.js.map +1 -1
  176. package/dist/run.d.ts +16 -1
  177. package/dist/run.d.ts.map +1 -1
  178. package/dist/run.js +124 -117
  179. package/dist/run.js.map +1 -1
  180. package/dist/translations/command.d.ts +36 -0
  181. package/dist/translations/command.d.ts.map +1 -0
  182. package/dist/translations/command.js +411 -0
  183. package/dist/translations/command.js.map +1 -0
  184. package/dist/translations/extras.d.ts +29 -0
  185. package/dist/translations/extras.d.ts.map +1 -0
  186. package/dist/translations/extras.js +123 -0
  187. package/dist/translations/extras.js.map +1 -0
  188. package/dist/translations/files.d.ts +22 -0
  189. package/dist/translations/files.d.ts.map +1 -0
  190. package/dist/translations/files.js +75 -0
  191. package/dist/translations/files.js.map +1 -0
  192. package/dist/translations/sync.d.ts +89 -0
  193. package/dist/translations/sync.d.ts.map +1 -0
  194. package/dist/translations/sync.js +215 -0
  195. package/dist/translations/sync.js.map +1 -0
  196. package/dist/translations/target.d.ts +33 -0
  197. package/dist/translations/target.d.ts.map +1 -0
  198. package/dist/translations/target.js +54 -0
  199. package/dist/translations/target.js.map +1 -0
  200. package/dist/translations/xliff.d.ts +29 -0
  201. package/dist/translations/xliff.d.ts.map +1 -0
  202. package/dist/translations/xliff.js +62 -0
  203. package/dist/translations/xliff.js.map +1 -0
  204. 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"}
@@ -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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"}