@forumulate/cli 0.4.0 → 0.8.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 (229) hide show
  1. package/README.md +116 -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/cli.js +12 -0
  36. package/dist/cli.js.map +1 -1
  37. package/dist/commands/completion.d.ts +12 -0
  38. package/dist/commands/completion.d.ts.map +1 -0
  39. package/dist/commands/completion.js +153 -0
  40. package/dist/commands/completion.js.map +1 -0
  41. package/dist/commands/config.d.ts +33 -0
  42. package/dist/commands/config.d.ts.map +1 -0
  43. package/dist/commands/config.js +144 -0
  44. package/dist/commands/config.js.map +1 -0
  45. package/dist/commands/context.d.ts +35 -0
  46. package/dist/commands/context.d.ts.map +1 -0
  47. package/dist/commands/context.js +59 -0
  48. package/dist/commands/context.js.map +1 -0
  49. package/dist/commands/groups-api.d.ts +11 -0
  50. package/dist/commands/groups-api.d.ts.map +1 -0
  51. package/dist/commands/groups-api.js +140 -0
  52. package/dist/commands/groups-api.js.map +1 -0
  53. package/dist/commands/groups-community.d.ts +15 -0
  54. package/dist/commands/groups-community.d.ts.map +1 -0
  55. package/dist/commands/groups-community.js +344 -0
  56. package/dist/commands/groups-community.js.map +1 -0
  57. package/dist/commands/groups-content.d.ts +10 -0
  58. package/dist/commands/groups-content.d.ts.map +1 -0
  59. package/dist/commands/groups-content.js +331 -0
  60. package/dist/commands/groups-content.js.map +1 -0
  61. package/dist/commands/groups-docs.d.ts +12 -0
  62. package/dist/commands/groups-docs.d.ts.map +1 -0
  63. package/dist/commands/groups-docs.js +414 -0
  64. package/dist/commands/groups-docs.js.map +1 -0
  65. package/dist/commands/groups-org.d.ts +10 -0
  66. package/dist/commands/groups-org.d.ts.map +1 -0
  67. package/dist/commands/groups-org.js +405 -0
  68. package/dist/commands/groups-org.js.map +1 -0
  69. package/dist/commands/groups-site.d.ts +3 -0
  70. package/dist/commands/groups-site.d.ts.map +1 -0
  71. package/dist/commands/groups-site.js +230 -0
  72. package/dist/commands/groups-site.js.map +1 -0
  73. package/dist/commands/groups-spaces.d.ts +3 -0
  74. package/dist/commands/groups-spaces.d.ts.map +1 -0
  75. package/dist/commands/groups-spaces.js +273 -0
  76. package/dist/commands/groups-spaces.js.map +1 -0
  77. package/dist/commands/groups-types.d.ts +3 -0
  78. package/dist/commands/groups-types.d.ts.map +1 -0
  79. package/dist/commands/groups-types.js +251 -0
  80. package/dist/commands/groups-types.js.map +1 -0
  81. package/dist/commands/groups.d.ts +4 -0
  82. package/dist/commands/groups.d.ts.map +1 -0
  83. package/dist/commands/groups.js +71 -0
  84. package/dist/commands/groups.js.map +1 -0
  85. package/dist/commands/index.d.ts +25 -0
  86. package/dist/commands/index.d.ts.map +1 -0
  87. package/dist/commands/index.js +118 -0
  88. package/dist/commands/index.js.map +1 -0
  89. package/dist/commands/resource.d.ts +86 -0
  90. package/dist/commands/resource.d.ts.map +1 -0
  91. package/dist/commands/resource.js +314 -0
  92. package/dist/commands/resource.js.map +1 -0
  93. package/dist/content/command.d.ts +34 -0
  94. package/dist/content/command.d.ts.map +1 -0
  95. package/dist/content/command.js +225 -0
  96. package/dist/content/command.js.map +1 -0
  97. package/dist/content/library.d.ts +23 -0
  98. package/dist/content/library.d.ts.map +1 -0
  99. package/dist/content/library.js +41 -0
  100. package/dist/content/library.js.map +1 -0
  101. package/dist/content/render.d.ts +15 -0
  102. package/dist/content/render.d.ts.map +1 -0
  103. package/dist/content/render.js +85 -0
  104. package/dist/content/render.js.map +1 -0
  105. package/dist/content/types-gen.d.ts +40 -0
  106. package/dist/content/types-gen.d.ts.map +1 -0
  107. package/dist/content/types-gen.js +200 -0
  108. package/dist/content/types-gen.js.map +1 -0
  109. package/dist/help.d.ts +3 -0
  110. package/dist/help.d.ts.map +1 -0
  111. package/dist/help.js +142 -0
  112. package/dist/help.js.map +1 -0
  113. package/dist/import/coerce.d.ts +34 -0
  114. package/dist/import/coerce.d.ts.map +1 -0
  115. package/dist/import/coerce.js +134 -0
  116. package/dist/import/coerce.js.map +1 -0
  117. package/dist/import/command.d.ts +25 -0
  118. package/dist/import/command.d.ts.map +1 -0
  119. package/dist/import/command.js +127 -0
  120. package/dist/import/command.js.map +1 -0
  121. package/dist/import/config.d.ts +39 -0
  122. package/dist/import/config.d.ts.map +1 -0
  123. package/dist/import/config.js +48 -0
  124. package/dist/import/config.js.map +1 -0
  125. package/dist/import/contentful.d.ts +3 -0
  126. package/dist/import/contentful.d.ts.map +1 -0
  127. package/dist/import/contentful.js +179 -0
  128. package/dist/import/contentful.js.map +1 -0
  129. package/dist/import/disk.d.ts +4 -0
  130. package/dist/import/disk.d.ts.map +1 -0
  131. package/dist/import/disk.js +19 -0
  132. package/dist/import/disk.js.map +1 -0
  133. package/dist/import/engine-locales.d.ts +35 -0
  134. package/dist/import/engine-locales.d.ts.map +1 -0
  135. package/dist/import/engine-locales.js +61 -0
  136. package/dist/import/engine-locales.js.map +1 -0
  137. package/dist/import/engine.d.ts +29 -0
  138. package/dist/import/engine.d.ts.map +1 -0
  139. package/dist/import/engine.js +248 -0
  140. package/dist/import/engine.js.map +1 -0
  141. package/dist/import/media.d.ts +24 -0
  142. package/dist/import/media.d.ts.map +1 -0
  143. package/dist/import/media.js +39 -0
  144. package/dist/import/media.js.map +1 -0
  145. package/dist/import/model-fields.d.ts +22 -0
  146. package/dist/import/model-fields.d.ts.map +1 -0
  147. package/dist/import/model-fields.js +60 -0
  148. package/dist/import/model-fields.js.map +1 -0
  149. package/dist/import/payload/index.d.ts +9 -0
  150. package/dist/import/payload/index.d.ts.map +1 -0
  151. package/dist/import/payload/index.js +129 -0
  152. package/dist/import/payload/index.js.map +1 -0
  153. package/dist/import/report.d.ts +5 -0
  154. package/dist/import/report.d.ts.map +1 -0
  155. package/dist/import/report.js +52 -0
  156. package/dist/import/report.js.map +1 -0
  157. package/dist/import/richtext-core.d.ts +26 -0
  158. package/dist/import/richtext-core.d.ts.map +1 -0
  159. package/dist/import/richtext-core.js +65 -0
  160. package/dist/import/richtext-core.js.map +1 -0
  161. package/dist/import/richtext-html.d.ts +5 -0
  162. package/dist/import/richtext-html.d.ts.map +1 -0
  163. package/dist/import/richtext-html.js +311 -0
  164. package/dist/import/richtext-html.js.map +1 -0
  165. package/dist/import/richtext-json.d.ts +10 -0
  166. package/dist/import/richtext-json.d.ts.map +1 -0
  167. package/dist/import/richtext-json.js +250 -0
  168. package/dist/import/richtext-json.js.map +1 -0
  169. package/dist/import/sanity.d.ts +8 -0
  170. package/dist/import/sanity.d.ts.map +1 -0
  171. package/dist/import/sanity.js +158 -0
  172. package/dist/import/sanity.js.map +1 -0
  173. package/dist/import/strapi-archive.d.ts +6 -0
  174. package/dist/import/strapi-archive.d.ts.map +1 -0
  175. package/dist/import/strapi-archive.js +127 -0
  176. package/dist/import/strapi-archive.js.map +1 -0
  177. package/dist/import/strapi.d.ts +7 -0
  178. package/dist/import/strapi.d.ts.map +1 -0
  179. package/dist/import/strapi.js +185 -0
  180. package/dist/import/strapi.js.map +1 -0
  181. package/dist/import/tar.d.ts +3 -0
  182. package/dist/import/tar.d.ts.map +1 -0
  183. package/dist/import/tar.js +48 -0
  184. package/dist/import/tar.js.map +1 -0
  185. package/dist/import/types.d.ts +157 -0
  186. package/dist/import/types.d.ts.map +1 -0
  187. package/dist/import/types.js +12 -0
  188. package/dist/import/types.js.map +1 -0
  189. package/dist/import/wordpress.d.ts +15 -0
  190. package/dist/import/wordpress.d.ts.map +1 -0
  191. package/dist/import/wordpress.js +147 -0
  192. package/dist/import/wordpress.js.map +1 -0
  193. package/dist/publish/scan.d.ts +1 -1
  194. package/dist/publish/scan.d.ts.map +1 -1
  195. package/dist/publish/scan.js +2 -2
  196. package/dist/publish/scan.js.map +1 -1
  197. package/dist/publish-dir.d.ts +54 -0
  198. package/dist/publish-dir.d.ts.map +1 -0
  199. package/dist/publish-dir.js +119 -0
  200. package/dist/publish-dir.js.map +1 -0
  201. package/dist/run.d.ts +21 -1
  202. package/dist/run.d.ts.map +1 -1
  203. package/dist/run.js +70 -65
  204. package/dist/run.js.map +1 -1
  205. package/dist/translations/command.d.ts +36 -0
  206. package/dist/translations/command.d.ts.map +1 -0
  207. package/dist/translations/command.js +411 -0
  208. package/dist/translations/command.js.map +1 -0
  209. package/dist/translations/extras.d.ts +29 -0
  210. package/dist/translations/extras.d.ts.map +1 -0
  211. package/dist/translations/extras.js +123 -0
  212. package/dist/translations/extras.js.map +1 -0
  213. package/dist/translations/files.d.ts +22 -0
  214. package/dist/translations/files.d.ts.map +1 -0
  215. package/dist/translations/files.js +75 -0
  216. package/dist/translations/files.js.map +1 -0
  217. package/dist/translations/sync.d.ts +89 -0
  218. package/dist/translations/sync.d.ts.map +1 -0
  219. package/dist/translations/sync.js +215 -0
  220. package/dist/translations/sync.js.map +1 -0
  221. package/dist/translations/target.d.ts +33 -0
  222. package/dist/translations/target.d.ts.map +1 -0
  223. package/dist/translations/target.js +54 -0
  224. package/dist/translations/target.js.map +1 -0
  225. package/dist/translations/xliff.d.ts +29 -0
  226. package/dist/translations/xliff.d.ts.map +1 -0
  227. package/dist/translations/xliff.js +62 -0
  228. package/dist/translations/xliff.js.map +1 -0
  229. package/package.json +6 -4
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The operation index `forumulate api` runs from.
3
+ *
4
+ * `operations.json` is cut from `packages/sdk/openapi.json` by
5
+ * `scripts/slim-spec.mjs`: every operation's method, path, params and request
6
+ * body shape, nothing else (the full spec is 21 MB; this is under 1). It is read
7
+ * lazily, so `forumulate whoami` does not pay to parse a thousand operations.
8
+ */
9
+ /** A slimmed JSON Schema node (see `slim-spec.mjs` for the key names). */
10
+ export interface SchemaNode {
11
+ $ref?: string;
12
+ /** type */
13
+ t?: string;
14
+ /** properties */
15
+ p?: Record<string, SchemaNode>;
16
+ /** required */
17
+ r?: string[];
18
+ /** items */
19
+ i?: SchemaNode;
20
+ /** enum */
21
+ e?: unknown[];
22
+ /** const */
23
+ c?: unknown;
24
+ /** description (first sentence) */
25
+ d?: string;
26
+ /** anyOf/oneOf, minus a null variant */
27
+ any?: SchemaNode[];
28
+ all?: SchemaNode[];
29
+ /** nullable */
30
+ n?: 1;
31
+ }
32
+ export interface Param {
33
+ n: string;
34
+ in: 'path' | 'query' | 'header' | 'cookie';
35
+ r?: 1;
36
+ t?: string;
37
+ e?: unknown[];
38
+ d?: string;
39
+ }
40
+ export interface Operation {
41
+ id: string;
42
+ m: string;
43
+ p: string;
44
+ s?: string;
45
+ t?: string[];
46
+ q?: Param[];
47
+ /** Declares `Idempotency-Key`: the CLI sends one, so a retried write is not a second write. */
48
+ ik?: 1;
49
+ b?: SchemaNode;
50
+ /** multipart/form-data body */
51
+ mp?: 1;
52
+ /** body required */
53
+ br?: 1;
54
+ dep?: 1;
55
+ }
56
+ export interface OperationIndex {
57
+ info: {
58
+ title?: string;
59
+ version?: string;
60
+ };
61
+ ops: Operation[];
62
+ schemas: Record<string, SchemaNode>;
63
+ }
64
+ export declare function loadIndex(): OperationIndex;
65
+ /** For tests: run against an index that is not the bundled one. */
66
+ export declare function setIndex(index: OperationIndex | undefined): void;
67
+ export declare function resolveRef(node: SchemaNode | undefined, index?: OperationIndex): SchemaNode | undefined;
68
+ /**
69
+ * The top-level properties a body accepts, across every variant of a `oneOf`
70
+ * (blog/forum/changelog take a block-JSON form OR a markdown form) — the set a
71
+ * `--field` flag may name.
72
+ */
73
+ export declare function bodyProperties(op: Operation, index?: OperationIndex): Record<string, SchemaNode>;
74
+ export declare function pathParams(op: Operation): string[];
75
+ export declare const isMethod: (s: string | undefined) => boolean;
76
+ /** By operationId — exact first, then case-insensitive, so `space_list` works too. */
77
+ export declare function findById(id: string, index?: OperationIndex): Operation | undefined;
78
+ /**
79
+ * By method and path: a template (`/orgs/{orgId}/spaces`) or a concrete path
80
+ * (`/orgs/acme/spaces`). A concrete path also hands back the values it filled
81
+ * in, so `forumulate api GET /orgs/acme/spaces --paginate` knows `orgId=acme`.
82
+ *
83
+ * A literal segment beats a parameter, the same rule the API's router applies:
84
+ * `/orgs/acme/members/invites` is the invite list, not member `invites`.
85
+ */
86
+ export declare function findByPath(method: string, rawPath: string, index?: OperationIndex): {
87
+ op: Operation;
88
+ values: Record<string, string>;
89
+ } | undefined;
90
+ export interface ListFilter {
91
+ tag?: string;
92
+ search?: string;
93
+ method?: string;
94
+ }
95
+ export declare function filterOps(filter: ListFilter, index?: OperationIndex): Operation[];
96
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/api/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMethod = void 0;
4
+ exports.loadIndex = loadIndex;
5
+ exports.setIndex = setIndex;
6
+ exports.resolveRef = resolveRef;
7
+ exports.bodyProperties = bodyProperties;
8
+ exports.pathParams = pathParams;
9
+ exports.findById = findById;
10
+ exports.findByPath = findByPath;
11
+ exports.filterOps = filterOps;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_path_1 = require("node:path");
14
+ let cached;
15
+ function loadIndex() {
16
+ if (!cached) {
17
+ cached = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, 'operations.json'), 'utf8'));
18
+ }
19
+ return cached;
20
+ }
21
+ /** For tests: run against an index that is not the bundled one. */
22
+ function setIndex(index) {
23
+ cached = index;
24
+ }
25
+ function resolveRef(node, index = loadIndex()) {
26
+ let n = node;
27
+ for (let i = 0; n?.$ref && i < 20; i++)
28
+ n = index.schemas[n.$ref];
29
+ return n ?? undefined;
30
+ }
31
+ /**
32
+ * The top-level properties a body accepts, across every variant of a `oneOf`
33
+ * (blog/forum/changelog take a block-JSON form OR a markdown form) — the set a
34
+ * `--field` flag may name.
35
+ */
36
+ function bodyProperties(op, index = loadIndex()) {
37
+ const out = {};
38
+ const visit = (raw, depth) => {
39
+ const node = resolveRef(raw, index);
40
+ if (!node || depth > 4)
41
+ return;
42
+ for (const [k, v] of Object.entries(node.p ?? {}))
43
+ out[k] ??= resolveRef(v, index) ?? {};
44
+ for (const v of node.any ?? [])
45
+ visit(v, depth + 1);
46
+ for (const v of node.all ?? [])
47
+ visit(v, depth + 1);
48
+ };
49
+ visit(op.b, 0);
50
+ return out;
51
+ }
52
+ function pathParams(op) {
53
+ return [...op.p.matchAll(/\{([^}]+)\}/g)].map((m) => m[1]);
54
+ }
55
+ const METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
56
+ const isMethod = (s) => Boolean(s && METHODS.has(s.toUpperCase()));
57
+ exports.isMethod = isMethod;
58
+ /** By operationId — exact first, then case-insensitive, so `space_list` works too. */
59
+ function findById(id, index = loadIndex()) {
60
+ return (index.ops.find((o) => o.id === id) ??
61
+ index.ops.find((o) => o.id.toLowerCase() === id.toLowerCase()));
62
+ }
63
+ /**
64
+ * By method and path: a template (`/orgs/{orgId}/spaces`) or a concrete path
65
+ * (`/orgs/acme/spaces`). A concrete path also hands back the values it filled
66
+ * in, so `forumulate api GET /orgs/acme/spaces --paginate` knows `orgId=acme`.
67
+ *
68
+ * A literal segment beats a parameter, the same rule the API's router applies:
69
+ * `/orgs/acme/members/invites` is the invite list, not member `invites`.
70
+ */
71
+ function findByPath(method, rawPath, index = loadIndex()) {
72
+ const m = method.toUpperCase();
73
+ const path = rawPath
74
+ .split('?')[0]
75
+ .replace(/^\/api(?=\/)/, '')
76
+ .replace(/\/+$/, '') || '/';
77
+ const want = path.split('/');
78
+ let best;
79
+ for (const op of index.ops) {
80
+ if (op.m !== m)
81
+ continue;
82
+ if (op.p === path)
83
+ return { op, values: {} };
84
+ const have = op.p.split('/');
85
+ if (have.length !== want.length)
86
+ continue;
87
+ const values = {};
88
+ let score = 0;
89
+ let ok = true;
90
+ for (let i = 0; i < have.length; i++) {
91
+ const seg = have[i];
92
+ const param = seg.match(/^\{([^}]+)\}$/);
93
+ if (param) {
94
+ // `{orgId}` typed literally is the template, not a value.
95
+ if (want[i] !== seg)
96
+ values[param[1]] = decodeURIComponent(want[i]);
97
+ }
98
+ else if (seg === want[i])
99
+ score++;
100
+ else {
101
+ ok = false;
102
+ break;
103
+ }
104
+ }
105
+ if (ok && (!best || score > best.score))
106
+ best = { op, values, score };
107
+ }
108
+ return best && { op: best.op, values: best.values };
109
+ }
110
+ function filterOps(filter, index = loadIndex()) {
111
+ const tag = filter.tag?.toLowerCase();
112
+ const words = (filter.search ?? '').toLowerCase().split(/\s+/).filter(Boolean);
113
+ return index.ops.filter((o) => {
114
+ if (filter.method && o.m !== filter.method.toUpperCase())
115
+ return false;
116
+ if (tag && !(o.t ?? []).some((t) => t.toLowerCase() === tag))
117
+ return false;
118
+ if (words.length) {
119
+ const hay = `${o.id} ${o.m} ${o.p} ${o.s ?? ''} ${(o.t ?? []).join(' ')}`.toLowerCase();
120
+ if (!words.every((w) => hay.includes(w)))
121
+ return false;
122
+ }
123
+ return true;
124
+ });
125
+ }
126
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/api/spec.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -32,6 +32,16 @@ function askSecret(question) {
32
32
  });
33
33
  });
34
34
  }
35
+ /** A visible question, for a y/N; no answer where nobody can type one. */
36
+ function ask(question) {
37
+ const rl = (0, node_readline_1.createInterface)({ input: process.stdin, output: process.stdout });
38
+ return new Promise((resolve) => {
39
+ rl.question(question, (answer) => {
40
+ rl.close();
41
+ resolve(answer);
42
+ });
43
+ });
44
+ }
35
45
  async function main() {
36
46
  const baseUrl = (0, api_base_1.apiBaseFromEnv)();
37
47
  // The environment first, then what `login` stored for THIS API — see
@@ -66,6 +76,8 @@ async function main() {
66
76
  authed: Boolean(token),
67
77
  upload,
68
78
  prompt: askSecret,
79
+ // A push in CI has no one to ask: it needs --yes, rather than hanging on stdin.
80
+ ask: process.stdin.isTTY ? ask : undefined,
69
81
  out: (l) => process.stdout.write(l + '\n'),
70
82
  err: (l) => process.stderr.write(l + '\n'),
71
83
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shell completion: `forumulate completion bash|zsh|fish` prints a script, and
3
+ * the script asks the CLI itself (`forumulate __complete <words…>`) what comes
4
+ * next. One source of candidates for three shells, so a verb added to
5
+ * `groups.ts` or an operation added to the spec completes everywhere with no
6
+ * script to regenerate.
7
+ */
8
+ export declare const TOP_LEVEL: string[];
9
+ /** Candidates for the word being completed, given the words before it. */
10
+ export declare function complete(words: string[]): string[];
11
+ export declare function completionScript(shell: string): string | undefined;
12
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,UAcrB,CAAC;AAIF,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmDlD;AAyCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8BlE"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOP_LEVEL = void 0;
4
+ exports.complete = complete;
5
+ exports.completionScript = completionScript;
6
+ const spec_1 = require("../api/spec");
7
+ const groups_1 = require("./groups");
8
+ const config_1 = require("./config");
9
+ /**
10
+ * Shell completion: `forumulate completion bash|zsh|fish` prints a script, and
11
+ * the script asks the CLI itself (`forumulate __complete <words…>`) what comes
12
+ * next. One source of candidates for three shells, so a verb added to
13
+ * `groups.ts` or an operation added to the spec completes everywhere with no
14
+ * script to regenerate.
15
+ */
16
+ exports.TOP_LEVEL = [
17
+ 'login',
18
+ 'logout',
19
+ 'whoami',
20
+ 'config',
21
+ 'api',
22
+ 'publish',
23
+ 'snapshot',
24
+ 'content',
25
+ 'import',
26
+ 'conformance',
27
+ 'doctor',
28
+ 'completion',
29
+ 'help',
30
+ ];
31
+ const COMMON_FLAGS = ['--json', '--org', '--space', '--paginate', '--dry-run', '--help', '--yes'];
32
+ /** Candidates for the word being completed, given the words before it. */
33
+ function complete(words) {
34
+ const [cmd, ...rest] = words;
35
+ const current = rest.length ? rest[rest.length - 1] : (cmd ?? '');
36
+ const before = rest.slice(0, -1);
37
+ if (rest.length === 0) {
38
+ const all = [...exports.TOP_LEVEL, ...groups_1.GROUPS.flatMap((g) => [g.name, ...(g.aliases ?? [])])];
39
+ return all.filter((w) => w.startsWith(current)).sort();
40
+ }
41
+ if (current.startsWith('-'))
42
+ return flagsFor(cmd, before).filter((f) => f.startsWith(current));
43
+ const positionals = before.filter((w) => !w.startsWith('-'));
44
+ if (cmd === 'api') {
45
+ if (positionals.length === 0) {
46
+ if (current === '' || /^[A-Z]/.test(current)) {
47
+ const ids = (0, spec_1.loadIndex)().ops.map((o) => o.id);
48
+ return ['list', 'describe', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', ...ids].filter((w) => w.startsWith(current));
49
+ }
50
+ return ['list', 'describe', ...(0, spec_1.loadIndex)().ops.map((o) => o.id)].filter((w) => w.startsWith(current));
51
+ }
52
+ if (positionals[0] === 'describe' && positionals.length === 1)
53
+ return (0, spec_1.loadIndex)()
54
+ .ops.map((o) => o.id)
55
+ .filter((w) => w.startsWith(current));
56
+ if ((0, spec_1.isMethod)(positionals[0]) && positionals.length === 1)
57
+ return (0, spec_1.filterOps)({ method: positionals[0] })
58
+ .map((o) => o.p)
59
+ .filter((p) => p.startsWith(current));
60
+ return [];
61
+ }
62
+ if (cmd === 'config') {
63
+ if (positionals.length === 0)
64
+ return ['set', 'get', 'unset', 'list', 'path'].filter((w) => w.startsWith(current));
65
+ if (positionals.length === 1)
66
+ return Object.keys(config_1.CONFIG_KEYS).filter((w) => w.startsWith(current));
67
+ return [];
68
+ }
69
+ if (cmd === 'completion')
70
+ return ['bash', 'zsh', 'fish'].filter((w) => w.startsWith(current));
71
+ const g = (0, groups_1.findGroup)(cmd);
72
+ if (!g)
73
+ return [];
74
+ const verbs = Object.keys(g.verbs);
75
+ if (positionals.length === 0)
76
+ return [...new Set(verbs.map((v) => v.split(' ')[0]))].filter((w) => w.startsWith(current));
77
+ if (positionals.length === 1)
78
+ return verbs
79
+ .filter((v) => v.startsWith(`${positionals[0]} `))
80
+ .map((v) => v.split(' ')[1])
81
+ .filter((w) => w.startsWith(current));
82
+ return [];
83
+ }
84
+ function flagsFor(cmd, before) {
85
+ const positionals = before.filter((w) => !w.startsWith('-'));
86
+ if (cmd === 'api') {
87
+ const op = (positionals[0] && (0, spec_1.findById)(positionals[0])) ||
88
+ ((0, spec_1.isMethod)(positionals[0]) && positionals[1]
89
+ ? (0, spec_1.findByPath)(positionals[0], positionals[1])?.op
90
+ : undefined);
91
+ const own = [
92
+ '--data',
93
+ '--field',
94
+ '--param',
95
+ '--header',
96
+ '--paginate',
97
+ '--json',
98
+ '--columns',
99
+ '--dry-run',
100
+ '--api-version',
101
+ '--include-headers',
102
+ ];
103
+ return [...(op?.q ?? []).map((p) => `--${p.n}`), ...own];
104
+ }
105
+ const g = (0, groups_1.findGroup)(cmd);
106
+ if (!g)
107
+ return COMMON_FLAGS;
108
+ const verb = g.verbs[`${positionals[0]} ${positionals[1]}`] ?? g.verbs[positionals[0] ?? ''];
109
+ const op = verb && (0, spec_1.findById)(verb.op);
110
+ const params = (op?.q ?? []).filter((p) => p.in === 'query').map((p) => `--${p.n}`);
111
+ return [
112
+ ...new Set([
113
+ ...COMMON_FLAGS,
114
+ ...params,
115
+ ...(verb?.markdown ? ['--file'] : []),
116
+ ...(verb?.download ? ['--out'] : []),
117
+ '--data',
118
+ '--field',
119
+ ]),
120
+ ];
121
+ }
122
+ function completionScript(shell) {
123
+ switch (shell) {
124
+ case 'bash':
125
+ return `# forumulate bash completion — add to ~/.bashrc:
126
+ # eval "$(forumulate completion bash)"
127
+ _forumulate() {
128
+ local IFS=$'\\n'
129
+ COMPREPLY=($(forumulate __complete "\${COMP_WORDS[@]:1:COMP_CWORD}" 2>/dev/null))
130
+ }
131
+ complete -o default -F _forumulate forumulate
132
+ `;
133
+ case 'zsh':
134
+ return `#compdef forumulate
135
+ # forumulate zsh completion — add to ~/.zshrc:
136
+ # eval "$(forumulate completion zsh)"
137
+ _forumulate() {
138
+ local -a candidates
139
+ candidates=("\${(@f)$(forumulate __complete "\${(@)words[2,CURRENT]}" 2>/dev/null)}")
140
+ compadd -a candidates
141
+ }
142
+ compdef _forumulate forumulate
143
+ `;
144
+ case 'fish':
145
+ return `# forumulate fish completion — save as ~/.config/fish/completions/forumulate.fish
146
+ # forumulate completion fish > ~/.config/fish/completions/forumulate.fish
147
+ complete -c forumulate -f -a '(forumulate __complete (commandline -opc)[2..-1] (commandline -ct) 2>/dev/null)'
148
+ `;
149
+ default:
150
+ return undefined;
151
+ }
152
+ }
153
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `forumulate config` — defaults a person would otherwise type on every call.
3
+ *
4
+ * Stored beside the credentials (same directory, `FORUMULATE_CONFIG_DIR`
5
+ * honoured) but in its own file: a config is something you paste into a bug
6
+ * report, and a token must never ride along with it.
7
+ *
8
+ * Precedence for every key is flag → environment → this file, so CI that
9
+ * passes `--org` or `FORUMULATE_ORG` is never overridden by a laptop's file.
10
+ */
11
+ export declare const CONFIG_KEYS: Record<string, {
12
+ env: string;
13
+ about: string;
14
+ }>;
15
+ export type CliConfig = Partial<Record<string, string>>;
16
+ export declare function configPath(env?: NodeJS.ProcessEnv): string;
17
+ export declare function readConfig(env?: NodeJS.ProcessEnv): CliConfig;
18
+ export declare function writeConfig(cfg: CliConfig, env?: NodeJS.ProcessEnv): string;
19
+ /** flag → env → file. */
20
+ export declare function setting(key: keyof typeof CONFIG_KEYS & string, flagValue: string | undefined, env: NodeJS.ProcessEnv, cfg: CliConfig): string | undefined;
21
+ export declare const CONFIG_HELP: string;
22
+ export declare function runConfig(positionals: string[], json: boolean, io: {
23
+ out: (l: string) => void;
24
+ err: (l: string) => void;
25
+ env: NodeJS.ProcessEnv;
26
+ }): number;
27
+ /**
28
+ * The environment the older commands read (`content`, `import`), with the
29
+ * config file's defaults filled in where the environment says nothing — so
30
+ * `config set org` reaches them too without teaching each one to read a file.
31
+ */
32
+ export declare function envWithConfig(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
33
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQtE,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEvE;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAO1E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAMxF;AAED,yBAAyB;AACzB,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,OAAO,WAAW,GAAG,MAAM,EACtC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,SAAS,GACb,MAAM,GAAG,SAAS,CAGpB;AAED,eAAO,MAAM,WAAW,QAc2C,CAAC;AAEpE,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,OAAO,EACb,EAAE,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACjF,MAAM,CAwDR;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAMrF"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_HELP = exports.CONFIG_KEYS = void 0;
4
+ exports.configPath = configPath;
5
+ exports.readConfig = readConfig;
6
+ exports.writeConfig = writeConfig;
7
+ exports.setting = setting;
8
+ exports.runConfig = runConfig;
9
+ exports.envWithConfig = envWithConfig;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const credentials_1 = require("../credentials");
13
+ /**
14
+ * `forumulate config` — defaults a person would otherwise type on every call.
15
+ *
16
+ * Stored beside the credentials (same directory, `FORUMULATE_CONFIG_DIR`
17
+ * honoured) but in its own file: a config is something you paste into a bug
18
+ * report, and a token must never ride along with it.
19
+ *
20
+ * Precedence for every key is flag → environment → this file, so CI that
21
+ * passes `--org` or `FORUMULATE_ORG` is never overridden by a laptop's file.
22
+ */
23
+ exports.CONFIG_KEYS = {
24
+ org: { env: 'FORUMULATE_ORG', about: 'default organization (id or slug) for --org' },
25
+ space: { env: 'FORUMULATE_SPACE', about: 'default space (id or slug) for --space' },
26
+ library: { env: 'FORUMULATE_LIBRARY', about: 'default content library for --library' },
27
+ 'api-version': {
28
+ env: 'FORUMULATE_API_VERSION',
29
+ about: 'Forumulate-Version header sent by `api` and the resource commands',
30
+ },
31
+ };
32
+ function configPath(env = process.env) {
33
+ return (0, node_path_1.join)((0, node_path_1.dirname)((0, credentials_1.credentialsPath)(env)), 'config.json');
34
+ }
35
+ function readConfig(env = process.env) {
36
+ try {
37
+ const parsed = JSON.parse((0, node_fs_1.readFileSync)(configPath(env), 'utf8'));
38
+ return parsed && typeof parsed === 'object' ? parsed : {};
39
+ }
40
+ catch {
41
+ return {};
42
+ }
43
+ }
44
+ function writeConfig(cfg, env = process.env) {
45
+ const path = configPath(env);
46
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
47
+ (0, node_fs_1.writeFileSync)(path, `${JSON.stringify(cfg, null, 2)}\n`, { mode: 0o600 });
48
+ (0, node_fs_1.chmodSync)(path, 0o600);
49
+ return path;
50
+ }
51
+ /** flag → env → file. */
52
+ function setting(key, flagValue, env, cfg) {
53
+ const fromEnv = env[exports.CONFIG_KEYS[key].env]?.trim();
54
+ return flagValue ?? (fromEnv || undefined) ?? cfg[key];
55
+ }
56
+ exports.CONFIG_HELP = `forumulate config — defaults for every command
57
+
58
+ Usage:
59
+ forumulate config set <key> <value>
60
+ forumulate config get <key>
61
+ forumulate config unset <key>
62
+ forumulate config list [--json]
63
+ forumulate config path
64
+
65
+ Keys:
66
+ ${Object.entries(exports.CONFIG_KEYS)
67
+ .map(([k, v]) => ` ${k.padEnd(12)} ${v.about} (env ${v.env})`)
68
+ .join('\n')}
69
+
70
+ A flag beats the environment, and the environment beats this file.`;
71
+ function runConfig(positionals, json, io) {
72
+ const [verb, key, ...value] = positionals;
73
+ const cfg = readConfig(io.env);
74
+ const known = (k) => {
75
+ if (k && k in exports.CONFIG_KEYS)
76
+ return true;
77
+ io.err(`Unknown key "${k ?? ''}". Keys: ${Object.keys(exports.CONFIG_KEYS).join(', ')}`);
78
+ return false;
79
+ };
80
+ switch (verb) {
81
+ case 'set': {
82
+ if (!known(key))
83
+ return 1;
84
+ if (value.length === 0) {
85
+ io.err(`Usage: forumulate config set ${key} <value>`);
86
+ return 1;
87
+ }
88
+ cfg[key] = value.join(' ');
89
+ const path = writeConfig(cfg, io.env);
90
+ io.out(`${key} = ${cfg[key]} (${path})`);
91
+ return 0;
92
+ }
93
+ case 'get': {
94
+ if (!known(key))
95
+ return 1;
96
+ const v = setting(key, undefined, io.env, cfg);
97
+ if (v === undefined)
98
+ return 1;
99
+ io.out(v);
100
+ return 0;
101
+ }
102
+ case 'unset': {
103
+ if (!known(key))
104
+ return 1;
105
+ delete cfg[key];
106
+ writeConfig(cfg, io.env);
107
+ io.out(`${key} unset`);
108
+ return 0;
109
+ }
110
+ case 'list':
111
+ case undefined: {
112
+ const rows = Object.keys(exports.CONFIG_KEYS).map((k) => {
113
+ const env = io.env[exports.CONFIG_KEYS[k].env]?.trim();
114
+ return { key: k, value: env || cfg[k] || '', from: env ? 'env' : cfg[k] ? 'file' : '' };
115
+ });
116
+ if (json)
117
+ io.out(JSON.stringify(Object.fromEntries(rows.map((r) => [r.key, r.value || null])), null, 2));
118
+ else
119
+ for (const r of rows)
120
+ io.out(`${r.key.padEnd(12)} ${r.value || '-'}${r.from ? ` (${r.from})` : ''}`);
121
+ return 0;
122
+ }
123
+ case 'path':
124
+ io.out(configPath(io.env));
125
+ return 0;
126
+ default:
127
+ io.out(exports.CONFIG_HELP);
128
+ return verb === 'help' ? 0 : 1;
129
+ }
130
+ }
131
+ /**
132
+ * The environment the older commands read (`content`, `import`), with the
133
+ * config file's defaults filled in where the environment says nothing — so
134
+ * `config set org` reaches them too without teaching each one to read a file.
135
+ */
136
+ function envWithConfig(env = process.env) {
137
+ const cfg = readConfig(env);
138
+ const out = { ...env };
139
+ for (const [key, { env: name }] of Object.entries(exports.CONFIG_KEYS))
140
+ if (!out[name]?.trim() && cfg[key])
141
+ out[name] = cfg[key];
142
+ return out;
143
+ }
144
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}