@meilisearch/cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -2
  3. package/bin/run.js +15 -0
  4. package/dist/commands/add/documents.js +54 -0
  5. package/dist/commands/add/documents.js.map +1 -0
  6. package/dist/commands/add/indexes.js +39 -0
  7. package/dist/commands/add/indexes.js.map +1 -0
  8. package/dist/commands/add/keys.js +63 -0
  9. package/dist/commands/add/keys.js.map +1 -0
  10. package/dist/commands/add/projects.js +96 -0
  11. package/dist/commands/add/projects.js.map +1 -0
  12. package/dist/commands/auth/login.js +26 -0
  13. package/dist/commands/auth/login.js.map +1 -0
  14. package/dist/commands/auth/logout.js +33 -0
  15. package/dist/commands/auth/logout.js.map +1 -0
  16. package/dist/commands/auth/refresh.js +22 -0
  17. package/dist/commands/auth/refresh.js.map +1 -0
  18. package/dist/commands/auth/status.js +34 -0
  19. package/dist/commands/auth/status.js.map +1 -0
  20. package/dist/commands/cancel/tasks.js +24 -0
  21. package/dist/commands/cancel/tasks.js.map +1 -0
  22. package/dist/commands/config/list.js +18 -0
  23. package/dist/commands/config/list.js.map +1 -0
  24. package/dist/commands/config/set.js +48 -0
  25. package/dist/commands/config/set.js.map +1 -0
  26. package/dist/commands/config/sync-with-cloud.js +144 -0
  27. package/dist/commands/config/sync-with-cloud.js.map +1 -0
  28. package/dist/commands/config/unset.js +28 -0
  29. package/dist/commands/config/unset.js.map +1 -0
  30. package/dist/commands/config/update.js +53 -0
  31. package/dist/commands/config/update.js.map +1 -0
  32. package/dist/commands/delete/documents.js +81 -0
  33. package/dist/commands/delete/documents.js.map +1 -0
  34. package/dist/commands/delete/indexes.js +28 -0
  35. package/dist/commands/delete/indexes.js.map +1 -0
  36. package/dist/commands/delete/keys.js +28 -0
  37. package/dist/commands/delete/keys.js.map +1 -0
  38. package/dist/commands/delete/projects.js +40 -0
  39. package/dist/commands/delete/projects.js.map +1 -0
  40. package/dist/commands/delete/settings.js +28 -0
  41. package/dist/commands/delete/settings.js.map +1 -0
  42. package/dist/commands/delete/tasks.js +34 -0
  43. package/dist/commands/delete/tasks.js.map +1 -0
  44. package/dist/commands/export.js +67 -0
  45. package/dist/commands/export.js.map +1 -0
  46. package/dist/commands/facet-search.js +87 -0
  47. package/dist/commands/facet-search.js.map +1 -0
  48. package/dist/commands/get/batches.js +35 -0
  49. package/dist/commands/get/batches.js.map +1 -0
  50. package/dist/commands/get/documents.js +74 -0
  51. package/dist/commands/get/documents.js.map +1 -0
  52. package/dist/commands/get/health.js +17 -0
  53. package/dist/commands/get/health.js.map +1 -0
  54. package/dist/commands/get/indexes.js +33 -0
  55. package/dist/commands/get/indexes.js.map +1 -0
  56. package/dist/commands/get/keys.js +36 -0
  57. package/dist/commands/get/keys.js.map +1 -0
  58. package/dist/commands/get/projects.js +40 -0
  59. package/dist/commands/get/projects.js.map +1 -0
  60. package/dist/commands/get/settings.js +25 -0
  61. package/dist/commands/get/settings.js.map +1 -0
  62. package/dist/commands/get/stats.js +37 -0
  63. package/dist/commands/get/stats.js.map +1 -0
  64. package/dist/commands/get/tasks.js +35 -0
  65. package/dist/commands/get/tasks.js.map +1 -0
  66. package/dist/commands/get/version.js +16 -0
  67. package/dist/commands/get/version.js.map +1 -0
  68. package/dist/commands/multi-search.js +39 -0
  69. package/dist/commands/multi-search.js.map +1 -0
  70. package/dist/commands/schema.js +95 -0
  71. package/dist/commands/schema.js.map +1 -0
  72. package/dist/commands/search.js +164 -0
  73. package/dist/commands/search.js.map +1 -0
  74. package/dist/commands/similar.js +86 -0
  75. package/dist/commands/similar.js.map +1 -0
  76. package/dist/commands/teleport.js +472 -0
  77. package/dist/commands/teleport.js.map +1 -0
  78. package/dist/commands/update/documents.js +56 -0
  79. package/dist/commands/update/documents.js.map +1 -0
  80. package/dist/commands/update/indexes.js +44 -0
  81. package/dist/commands/update/indexes.js.map +1 -0
  82. package/dist/commands/update/keys.js +42 -0
  83. package/dist/commands/update/keys.js.map +1 -0
  84. package/dist/commands/update/projects.js +62 -0
  85. package/dist/commands/update/projects.js.map +1 -0
  86. package/dist/commands/update/settings.js +145 -0
  87. package/dist/commands/update/settings.js.map +1 -0
  88. package/dist/lib/analytics.js +135 -0
  89. package/dist/lib/analytics.js.map +1 -0
  90. package/dist/lib/api-naming.js +435 -0
  91. package/dist/lib/api-naming.js.map +1 -0
  92. package/dist/lib/base-command.js +318 -0
  93. package/dist/lib/base-command.js.map +1 -0
  94. package/dist/lib/clients/analytics.js +24 -0
  95. package/dist/lib/clients/analytics.js.map +1 -0
  96. package/dist/lib/clients/management/generated/client/client.gen.js +217 -0
  97. package/dist/lib/clients/management/generated/client/client.gen.js.map +1 -0
  98. package/dist/lib/clients/management/generated/client/index.js +7 -0
  99. package/dist/lib/clients/management/generated/client/index.js.map +1 -0
  100. package/dist/lib/clients/management/generated/client/types.gen.js +3 -0
  101. package/dist/lib/clients/management/generated/client/types.gen.js.map +1 -0
  102. package/dist/lib/clients/management/generated/client/utils.gen.js +229 -0
  103. package/dist/lib/clients/management/generated/client/utils.gen.js.map +1 -0
  104. package/dist/lib/clients/management/generated/client.gen.js +4 -0
  105. package/dist/lib/clients/management/generated/client.gen.js.map +1 -0
  106. package/dist/lib/clients/management/generated/core/auth.gen.js +15 -0
  107. package/dist/lib/clients/management/generated/core/auth.gen.js.map +1 -0
  108. package/dist/lib/clients/management/generated/core/bodySerializer.gen.js +58 -0
  109. package/dist/lib/clients/management/generated/core/bodySerializer.gen.js.map +1 -0
  110. package/dist/lib/clients/management/generated/core/params.gen.js +110 -0
  111. package/dist/lib/clients/management/generated/core/params.gen.js.map +1 -0
  112. package/dist/lib/clients/management/generated/core/pathSerializer.gen.js +107 -0
  113. package/dist/lib/clients/management/generated/core/pathSerializer.gen.js.map +1 -0
  114. package/dist/lib/clients/management/generated/core/queryKeySerializer.gen.js +93 -0
  115. package/dist/lib/clients/management/generated/core/queryKeySerializer.gen.js.map +1 -0
  116. package/dist/lib/clients/management/generated/core/serverSentEvents.gen.js +133 -0
  117. package/dist/lib/clients/management/generated/core/serverSentEvents.gen.js.map +1 -0
  118. package/dist/lib/clients/management/generated/core/types.gen.js +3 -0
  119. package/dist/lib/clients/management/generated/core/types.gen.js.map +1 -0
  120. package/dist/lib/clients/management/generated/core/utils.gen.js +88 -0
  121. package/dist/lib/clients/management/generated/core/utils.gen.js.map +1 -0
  122. package/dist/lib/clients/management/generated/index.js +3 -0
  123. package/dist/lib/clients/management/generated/index.js.map +1 -0
  124. package/dist/lib/clients/management/generated/sdk.gen.js +398 -0
  125. package/dist/lib/clients/management/generated/sdk.gen.js.map +1 -0
  126. package/dist/lib/clients/management/generated/types.gen.js +3 -0
  127. package/dist/lib/clients/management/generated/types.gen.js.map +1 -0
  128. package/dist/lib/clients/management.js +21 -0
  129. package/dist/lib/clients/management.js.map +1 -0
  130. package/dist/lib/clients/meilisearch.js +69 -0
  131. package/dist/lib/clients/meilisearch.js.map +1 -0
  132. package/dist/lib/clients/oauth.js +225 -0
  133. package/dist/lib/clients/oauth.js.map +1 -0
  134. package/dist/lib/clients/ping.js +26 -0
  135. package/dist/lib/clients/ping.js.map +1 -0
  136. package/dist/lib/clients/trace.js +69 -0
  137. package/dist/lib/clients/trace.js.map +1 -0
  138. package/dist/lib/cloud-sync.js +113 -0
  139. package/dist/lib/cloud-sync.js.map +1 -0
  140. package/dist/lib/config.js +322 -0
  141. package/dist/lib/config.js.map +1 -0
  142. package/dist/lib/errors.js +302 -0
  143. package/dist/lib/errors.js.map +1 -0
  144. package/dist/lib/help.js +37 -0
  145. package/dist/lib/help.js.map +1 -0
  146. package/dist/lib/input.js +76 -0
  147. package/dist/lib/input.js.map +1 -0
  148. package/dist/lib/login.js +57 -0
  149. package/dist/lib/login.js.map +1 -0
  150. package/dist/lib/output.js +39 -0
  151. package/dist/lib/output.js.map +1 -0
  152. package/dist/lib/pagination.js +52 -0
  153. package/dist/lib/pagination.js.map +1 -0
  154. package/dist/lib/session.js +149 -0
  155. package/dist/lib/session.js.map +1 -0
  156. package/dist/lib/task-filters.js +118 -0
  157. package/dist/lib/task-filters.js.map +1 -0
  158. package/dist/lib/tasks.js +64 -0
  159. package/dist/lib/tasks.js.map +1 -0
  160. package/dist/lib/terminal.js +168 -0
  161. package/dist/lib/terminal.js.map +1 -0
  162. package/dist/lib/values.js +48 -0
  163. package/dist/lib/values.js.map +1 -0
  164. package/oclif.manifest.json +10470 -0
  165. package/package.json +81 -3
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Derives command names and flags from API routes, as specified in
3
+ * docs/contract/commands.md, "Naming rules". The contract tests and
4
+ * `pnpm api:coverage` use it against the downloaded OpenAPI documents.
5
+ */
6
+ import { MeiliCliError } from "./errors.js";
7
+ const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
8
+ /** Flags the CLI owns. Every other flag of an API command comes from a route. */
9
+ export const CLI_OWNED_FLAGS = [
10
+ "wait",
11
+ "timeout",
12
+ "all",
13
+ "file",
14
+ "data",
15
+ "yes",
16
+ "sync-config",
17
+ "project-destination",
18
+ ];
19
+ /** Trailing path literals that are verbs (rule 1). A closed list: adding one is a contract change. */
20
+ export const LITERAL_VERBS = [
21
+ "delete",
22
+ "cancel",
23
+ "compact",
24
+ "swap",
25
+ "search",
26
+ "similar",
27
+ "facet-search",
28
+ "multi-search",
29
+ "export",
30
+ ];
31
+ const METHOD_VERBS = {
32
+ GET: "get",
33
+ POST: "add",
34
+ PUT: "update",
35
+ PATCH: "update",
36
+ DELETE: "delete",
37
+ };
38
+ /**
39
+ * API parameters that carry identifiers, and what they identify (rule 5): the
40
+ * command's own resource gives `--id` or `--ids`, another resource gives
41
+ * `--<resource>-ids`. The API spelling stays accepted as an alias.
42
+ */
43
+ const IDENTIFIERS = {
44
+ uid: { of: "own", flag: "id" },
45
+ uids: { of: "task", flag: "ids" },
46
+ batchUids: { of: "batch", flag: "ids" },
47
+ indexUids: { of: "index", flag: "ids" },
48
+ };
49
+ /** `"GET /indexes"` into a route. */
50
+ export function parseRoute(text) {
51
+ const match = text.match(/^(GET|POST|PUT|PATCH|DELETE) (\/\S*)$/);
52
+ if (match === null) {
53
+ throw new MeiliCliError("cli_internal", `Invalid route \`${text}\`: expected "<METHOD> /path" with an upper-case method.`);
54
+ }
55
+ return { method: match[1], path: match[2] ?? "/" };
56
+ }
57
+ export function routeKey(route) {
58
+ return `${route.method} ${route.path}`;
59
+ }
60
+ function findOperation(spec, route) {
61
+ return spec.paths[route.path]?.[route.method.toLowerCase()];
62
+ }
63
+ export function hasRoute(spec, route) {
64
+ return findOperation(spec, route) !== undefined;
65
+ }
66
+ /**
67
+ * The key actions the routes require, the specific one of each: the document
68
+ * lists them from the most specific to the widest wildcard, `["indexes.get",
69
+ * "indexes.*", "*"]`, and a command declares the first one in `keyActions`.
70
+ * Empty when the routes need no key action, as on `GET /health`, and on the
71
+ * Management API, whose document declares no key action.
72
+ */
73
+ export function keyActionsForRoutes(spec, routes) {
74
+ const actions = new Set();
75
+ for (const route of routes) {
76
+ for (const scheme of findOperation(spec, route)?.security ?? []) {
77
+ const specific = Object.values(scheme)[0]?.[0];
78
+ if (specific !== undefined)
79
+ actions.add(specific);
80
+ }
81
+ }
82
+ return [...actions].sort();
83
+ }
84
+ /** Every route of an OpenAPI document. */
85
+ export function eachRoute(spec) {
86
+ const routes = [];
87
+ for (const path of Object.keys(spec.paths)) {
88
+ for (const method of METHODS) {
89
+ if (findOperation(spec, { method, path }) !== undefined)
90
+ routes.push({ method, path });
91
+ }
92
+ }
93
+ return routes;
94
+ }
95
+ export const ROUTE_EXCEPTIONS = [
96
+ {
97
+ route: "GET /indexes/{index_uid}/search",
98
+ command: null,
99
+ reason: "Twin of the POST route, which takes the same parameters in a body. The CLI implements POST.",
100
+ },
101
+ {
102
+ route: "POST /indexes/{index_uid}/search",
103
+ command: "search --index",
104
+ reason: "Verb only, the most typed command.",
105
+ },
106
+ {
107
+ route: "GET /indexes/{index_uid}/similar",
108
+ command: null,
109
+ reason: "Twin of the POST route. The CLI implements POST.",
110
+ },
111
+ {
112
+ route: "POST /indexes/{index_uid}/similar",
113
+ command: "similar --index",
114
+ reason: "Verb only, like `search`. `--id` is the API field: the document to compare with.",
115
+ },
116
+ {
117
+ route: "POST /indexes/{index_uid}/facet-search",
118
+ command: "facet-search --index",
119
+ reason: "Verb only, like `search`.",
120
+ },
121
+ {
122
+ route: "POST /multi-search",
123
+ command: "multi-search",
124
+ reason: "Verb only, like `search`. No index: the queries name theirs.",
125
+ },
126
+ {
127
+ route: "POST /export",
128
+ command: "export",
129
+ reason: "Verb only: the route has no resource.",
130
+ },
131
+ {
132
+ route: "POST /swap-indexes",
133
+ command: "swap indexes --indexes",
134
+ reason: "The literal holds the verb and the resource. `--indexes a,b` swaps one pair; several pairs go through `--data` or `--file`.",
135
+ },
136
+ {
137
+ route: "GET /indexes/{index_uid}/documents",
138
+ command: null,
139
+ reason: "Covered by `get documents`, which uses the fetch route and its body.",
140
+ },
141
+ {
142
+ route: "POST /indexes/{index_uid}/documents/fetch",
143
+ command: "get documents --index",
144
+ reason: "A POST that lists: filters, fields and pagination travel in its body. `--id` is an alias of `--ids`.",
145
+ },
146
+ {
147
+ route: "GET /indexes/{index_uid}/documents/{document_id}",
148
+ command: null,
149
+ reason: "Covered by `get documents --ids`.",
150
+ },
151
+ {
152
+ route: "DELETE /indexes/{index_uid}/documents/{document_id}",
153
+ command: null,
154
+ reason: "Covered by `delete documents --ids`.",
155
+ },
156
+ {
157
+ route: "POST /indexes/{index_uid}/documents/delete-batch",
158
+ command: "delete documents --ids",
159
+ reason: "The body is an array of identifiers without a name; `--ids` is the name of the fetch route.",
160
+ },
161
+ {
162
+ route: "POST /indexes/{index_uid}/fields",
163
+ command: "get fields --index",
164
+ reason: "A POST that lists.",
165
+ },
166
+ {
167
+ route: "* /indexes/{index_uid}/settings/*",
168
+ command: null,
169
+ reason: "`update settings` sends any subset of the settings; `null` resets one of them.",
170
+ },
171
+ {
172
+ route: "GET /tasks/{task_id}",
173
+ command: null,
174
+ reason: "Covered by `get tasks --ids`, which filters `uids`.",
175
+ },
176
+ {
177
+ route: "GET /batches/{batch_id}",
178
+ command: null,
179
+ reason: "Covered by `get batches --ids`.",
180
+ },
181
+ {
182
+ route: "POST /tasks/compact",
183
+ command: "compact tasks",
184
+ reason: "Experimental (`taskQueueCompactionRoute`), kept on purpose.",
185
+ },
186
+ {
187
+ route: "GET /api/v2/meilisearch-versions",
188
+ command: null,
189
+ reason: "Not needed for now.",
190
+ },
191
+ {
192
+ route: "* /chats",
193
+ command: null,
194
+ reason: "Experimental (`chatCompletions`). Out of the contract until stable.",
195
+ },
196
+ { route: "* /chats/*", command: null, reason: "Experimental (`chatCompletions`)." },
197
+ { route: "GET /metrics", command: null, reason: "Experimental (`metrics`)." },
198
+ { route: "* /logs/*", command: null, reason: "Experimental (`logsRoute`)." },
199
+ { route: "POST /render-template", command: null, reason: "Experimental (`renderRoute`)." },
200
+ {
201
+ route: "POST /indexes/{index_uid}/documents/edit",
202
+ command: null,
203
+ reason: "Experimental (`editDocumentsByFunction`).",
204
+ },
205
+ {
206
+ route: "* /dynamic-search-rules",
207
+ command: null,
208
+ reason: "Experimental (`dynamicSearchRules`).",
209
+ },
210
+ {
211
+ route: "* /dynamic-search-rules/*",
212
+ command: null,
213
+ reason: "Experimental (`dynamicSearchRules`).",
214
+ },
215
+ { route: "* /network", command: null, reason: "Experimental (`network`)." },
216
+ { route: "* /network/*", command: null, reason: "Experimental (`network`)." },
217
+ {
218
+ route: "GET /tasks/stream",
219
+ command: null,
220
+ reason: "Experimental (`tasksStreamingRoute`). The CLI may use it internally for `--wait`, see issue #1.",
221
+ },
222
+ {
223
+ route: "GET /batches/stream",
224
+ command: null,
225
+ reason: "Experimental (`tasksStreamingRoute`).",
226
+ },
227
+ {
228
+ route: "GET /tasks/{task_id}/documents",
229
+ command: null,
230
+ reason: "Experimental (`getTaskDocumentsRoute`).",
231
+ },
232
+ {
233
+ route: "* /experimental-features",
234
+ command: null,
235
+ reason: "Toggles experimental features; the CLI does not expose it for now.",
236
+ },
237
+ {
238
+ route: "POST /mcp",
239
+ command: null,
240
+ reason: "Meilisearch serves its own MCP endpoint; the CLI does not proxy it. The name `mcp` stays reserved for this route: a CLI-side MCP server, if ever built, takes another name.",
241
+ },
242
+ ];
243
+ /** True when `pattern` (an exception route) matches the exact route `key`. */
244
+ export function matchesRoutePattern(pattern, key) {
245
+ const [patternMethod, patternPath] = pattern.split(" ", 2);
246
+ const [method, path] = key.split(" ", 2);
247
+ if (patternPath === undefined || path === undefined)
248
+ return false;
249
+ if (patternMethod !== "*" && patternMethod !== method)
250
+ return false;
251
+ if (patternPath.endsWith("/*"))
252
+ return path.startsWith(patternPath.slice(0, -1));
253
+ return patternPath === path;
254
+ }
255
+ function findRouteException(route) {
256
+ const key = routeKey(route);
257
+ return ROUTE_EXCEPTIONS.find((exception) => matchesRoutePattern(exception.route, key));
258
+ }
259
+ /** `"get documents --index"` is the command `get documents` with the flag `index`. */
260
+ function parseCommand(command) {
261
+ const [id = command, ...flags] = command.split(" --");
262
+ return { id, flags };
263
+ }
264
+ // Naming
265
+ const VERSION_PREFIX = /^\/api\/v\d+(?=\/|$)/;
266
+ /** Path segments without the `/api/v2` prefix of the Management API. */
267
+ function pathSegments(path) {
268
+ return path
269
+ .replace(VERSION_PREFIX, "")
270
+ .split("/")
271
+ .filter((segment) => segment !== "");
272
+ }
273
+ function isParameter(segment) {
274
+ return segment.startsWith("{") && segment.endsWith("}");
275
+ }
276
+ /** `team_members` and `retrieveVectors` become `team-members` and `retrieve-vectors`. */
277
+ export function toKebabCase(name) {
278
+ return name
279
+ .replace(/_/g, "-")
280
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
281
+ .toLowerCase();
282
+ }
283
+ /** `indexes` gives `index`, `batches` gives `batch`, `keys` gives `key`. */
284
+ export function singular(word) {
285
+ if (word.endsWith("ies"))
286
+ return `${word.slice(0, -3)}y`;
287
+ if (/(xes|ches|shes|sses)$/.test(word))
288
+ return word.slice(0, -2);
289
+ if (word.endsWith("s") && !word.endsWith("ss"))
290
+ return word.slice(0, -1);
291
+ return word;
292
+ }
293
+ /**
294
+ * The command id of a route before exceptions: the verb, then the resource
295
+ * (rules 1 and 2). `GET /indexes/{index_uid}` is `get indexes`,
296
+ * `POST /tasks/cancel` is `cancel tasks`, `POST /export` is `export`.
297
+ */
298
+ export function deriveCommandId(route) {
299
+ const literals = pathSegments(route.path)
300
+ .filter((segment) => !isParameter(segment))
301
+ .map(toKebabCase);
302
+ const last = literals.at(-1);
303
+ if (last !== undefined && LITERAL_VERBS.includes(last)) {
304
+ const resource = literals.at(-2);
305
+ return resource === undefined ? last : `${last} ${resource}`;
306
+ }
307
+ return [METHOD_VERBS[route.method], last].filter((word) => word !== undefined).join(" ");
308
+ }
309
+ /**
310
+ * The command id of a route once the exceptions are applied, or null for a
311
+ * route declared without command.
312
+ */
313
+ export function commandIdFor(route) {
314
+ const exception = findRouteException(route);
315
+ if (exception !== undefined) {
316
+ return exception.command === null ? null : parseCommand(exception.command).id;
317
+ }
318
+ return deriveCommandId(route);
319
+ }
320
+ /** The second word of a command id: `documents` in `get documents`, undefined for `search`. */
321
+ function resourceOf(commandId) {
322
+ return commandId.split(" ")[1];
323
+ }
324
+ /**
325
+ * The flags that carry the path parameters of a route, in path order (rule 4):
326
+ * `id` for the parameter of the command's own resource, the singular of the
327
+ * collection for a parent. `GET /indexes/{index_uid}/documents/{document_id}`
328
+ * under `delete documents` gives `["index", "id"]`.
329
+ */
330
+ export function pathFlagsForRoute(route, commandId) {
331
+ const resource = resourceOf(commandId);
332
+ const segments = pathSegments(route.path);
333
+ return segments.flatMap((segment, index) => {
334
+ if (!isParameter(segment))
335
+ return [];
336
+ const collection = toKebabCase(segments[index - 1] ?? "");
337
+ if (collection === resource)
338
+ return ["id"];
339
+ // On the Management API a parent parameter keeps its API name, `{projectId}` is
340
+ // `--project-id`: `--project` is the global flag that names a config file entry.
341
+ return [
342
+ VERSION_PREFIX.test(route.path) ? toKebabCase(segment.slice(1, -1)) : singular(collection),
343
+ ];
344
+ });
345
+ }
346
+ /**
347
+ * The flag of a Management API route that identifies a Cloud project, which
348
+ * `--project <name>` can fill from the config file (rule 4): `id` on the
349
+ * `projects` commands, `project-id` under a project, nothing otherwise.
350
+ */
351
+ export function projectFlagForRoute(route) {
352
+ const commandId = VERSION_PREFIX.test(route.path) ? commandIdFor(route) : null;
353
+ if (commandId === null)
354
+ return undefined;
355
+ const flags = pathFlagsForRoute(route, commandId);
356
+ if (flags.includes("project-id"))
357
+ return "project-id";
358
+ return resourceOf(commandId) === "projects" && flags.includes("id") ? "id" : undefined;
359
+ }
360
+ function resolveSchema(spec, schema) {
361
+ if (schema?.$ref === undefined)
362
+ return schema;
363
+ const name = schema.$ref.split("/").at(-1) ?? "";
364
+ return spec.components?.schemas?.[name];
365
+ }
366
+ function schemaProperties(spec, schema) {
367
+ const resolved = resolveSchema(spec, schema);
368
+ if (resolved === undefined)
369
+ return {};
370
+ const inherited = (resolved.allOf ?? []).map((part) => schemaProperties(spec, part));
371
+ return Object.assign({}, ...inherited, resolved.properties ?? {});
372
+ }
373
+ /** The first-level fields of a JSON body (rule 6). */
374
+ function bodyFields(spec, operation) {
375
+ return Object.keys(schemaProperties(spec, operation.requestBody?.content?.["application/json"]?.schema));
376
+ }
377
+ /**
378
+ * The flags a route accepts besides its path flags (rules 5 and 6): its query
379
+ * parameters and body fields in kebab-case, the identifiers among them named
380
+ * by what they identify with the API spelling as an alias, the `--new-id` of
381
+ * `update indexes`, and the flags of its exception.
382
+ */
383
+ export function flagsForRoute(spec, route, commandId) {
384
+ const operation = findOperation(spec, route);
385
+ if (operation === undefined)
386
+ return new Set();
387
+ const resource = resourceOf(commandId);
388
+ const hasPathId = pathFlagsForRoute(route, commandId).includes("id");
389
+ const exception = findRouteException(route)?.command;
390
+ const flags = new Set(exception === null || exception === undefined ? [] : parseCommand(exception).flags);
391
+ const query = [...(spec.paths[route.path]?.parameters ?? []), ...(operation.parameters ?? [])]
392
+ .filter((parameter) => parameter.in === "query")
393
+ .map((parameter) => parameter.name);
394
+ for (const name of [...query, ...bodyFields(spec, operation)]) {
395
+ const identifier = IDENTIFIERS[name];
396
+ if (identifier !== undefined) {
397
+ const own = identifier.of === "own" || (resource !== undefined && identifier.of === singular(resource));
398
+ if (own && identifier.flag === "id" && hasPathId)
399
+ flags.add("new-id");
400
+ else
401
+ flags.add(own ? identifier.flag : `${identifier.of}-${identifier.flag}`);
402
+ }
403
+ flags.add(toKebabCase(name));
404
+ }
405
+ return flags;
406
+ }
407
+ /**
408
+ * Every flag a command accepts, over all of its routes, with `--id` as an
409
+ * alias of `--ids` when no route takes a path `id` (rule 4).
410
+ */
411
+ export function flagsForCommand(spec, routes, commandId) {
412
+ const flags = new Set();
413
+ for (const route of routes) {
414
+ for (const flag of pathFlagsForRoute(route, commandId))
415
+ flags.add(flag);
416
+ for (const flag of flagsForRoute(spec, route, commandId))
417
+ flags.add(flag);
418
+ }
419
+ const hasPathId = routes.some((route) => pathFlagsForRoute(route, commandId).includes("id"));
420
+ if (flags.has("ids") && !hasPathId)
421
+ flags.add("id");
422
+ return flags;
423
+ }
424
+ /** The routes of a document grouped by the command that covers them; routes without command are left out. */
425
+ export function commandsOf(spec) {
426
+ const commands = new Map();
427
+ for (const route of eachRoute(spec)) {
428
+ const id = commandIdFor(route);
429
+ if (id === null)
430
+ continue;
431
+ commands.set(id, [...(commands.get(id) ?? []), route]);
432
+ }
433
+ return commands;
434
+ }
435
+ //# sourceMappingURL=api-naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-naming.js","sourceRoot":"","sources":["../../src/lib/api-naming.ts"],"names":[],"mappings":"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"}