@meilisearch/cli 0.0.0-stage → 0.0.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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -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 +31 -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 +466 -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/api-naming.js +435 -0
  89. package/dist/lib/api-naming.js.map +1 -0
  90. package/dist/lib/base-command.js +285 -0
  91. package/dist/lib/base-command.js.map +1 -0
  92. package/dist/lib/clients/management/generated/client/client.gen.js +217 -0
  93. package/dist/lib/clients/management/generated/client/client.gen.js.map +1 -0
  94. package/dist/lib/clients/management/generated/client/index.js +7 -0
  95. package/dist/lib/clients/management/generated/client/index.js.map +1 -0
  96. package/dist/lib/clients/management/generated/client/types.gen.js +3 -0
  97. package/dist/lib/clients/management/generated/client/types.gen.js.map +1 -0
  98. package/dist/lib/clients/management/generated/client/utils.gen.js +229 -0
  99. package/dist/lib/clients/management/generated/client/utils.gen.js.map +1 -0
  100. package/dist/lib/clients/management/generated/client.gen.js +4 -0
  101. package/dist/lib/clients/management/generated/client.gen.js.map +1 -0
  102. package/dist/lib/clients/management/generated/core/auth.gen.js +15 -0
  103. package/dist/lib/clients/management/generated/core/auth.gen.js.map +1 -0
  104. package/dist/lib/clients/management/generated/core/bodySerializer.gen.js +58 -0
  105. package/dist/lib/clients/management/generated/core/bodySerializer.gen.js.map +1 -0
  106. package/dist/lib/clients/management/generated/core/params.gen.js +110 -0
  107. package/dist/lib/clients/management/generated/core/params.gen.js.map +1 -0
  108. package/dist/lib/clients/management/generated/core/pathSerializer.gen.js +107 -0
  109. package/dist/lib/clients/management/generated/core/pathSerializer.gen.js.map +1 -0
  110. package/dist/lib/clients/management/generated/core/queryKeySerializer.gen.js +93 -0
  111. package/dist/lib/clients/management/generated/core/queryKeySerializer.gen.js.map +1 -0
  112. package/dist/lib/clients/management/generated/core/serverSentEvents.gen.js +133 -0
  113. package/dist/lib/clients/management/generated/core/serverSentEvents.gen.js.map +1 -0
  114. package/dist/lib/clients/management/generated/core/types.gen.js +3 -0
  115. package/dist/lib/clients/management/generated/core/types.gen.js.map +1 -0
  116. package/dist/lib/clients/management/generated/core/utils.gen.js +88 -0
  117. package/dist/lib/clients/management/generated/core/utils.gen.js.map +1 -0
  118. package/dist/lib/clients/management/generated/index.js +3 -0
  119. package/dist/lib/clients/management/generated/index.js.map +1 -0
  120. package/dist/lib/clients/management/generated/sdk.gen.js +398 -0
  121. package/dist/lib/clients/management/generated/sdk.gen.js.map +1 -0
  122. package/dist/lib/clients/management/generated/types.gen.js +3 -0
  123. package/dist/lib/clients/management/generated/types.gen.js.map +1 -0
  124. package/dist/lib/clients/management.js +21 -0
  125. package/dist/lib/clients/management.js.map +1 -0
  126. package/dist/lib/clients/meilisearch.js +69 -0
  127. package/dist/lib/clients/meilisearch.js.map +1 -0
  128. package/dist/lib/clients/oauth.js +225 -0
  129. package/dist/lib/clients/oauth.js.map +1 -0
  130. package/dist/lib/clients/ping.js +26 -0
  131. package/dist/lib/clients/ping.js.map +1 -0
  132. package/dist/lib/clients/trace.js +69 -0
  133. package/dist/lib/clients/trace.js.map +1 -0
  134. package/dist/lib/cloud-sync.js +113 -0
  135. package/dist/lib/cloud-sync.js.map +1 -0
  136. package/dist/lib/config.js +317 -0
  137. package/dist/lib/config.js.map +1 -0
  138. package/dist/lib/errors.js +302 -0
  139. package/dist/lib/errors.js.map +1 -0
  140. package/dist/lib/help.js +37 -0
  141. package/dist/lib/help.js.map +1 -0
  142. package/dist/lib/input.js +76 -0
  143. package/dist/lib/input.js.map +1 -0
  144. package/dist/lib/login.js +43 -0
  145. package/dist/lib/login.js.map +1 -0
  146. package/dist/lib/output.js +39 -0
  147. package/dist/lib/output.js.map +1 -0
  148. package/dist/lib/pagination.js +52 -0
  149. package/dist/lib/pagination.js.map +1 -0
  150. package/dist/lib/session.js +149 -0
  151. package/dist/lib/session.js.map +1 -0
  152. package/dist/lib/task-filters.js +118 -0
  153. package/dist/lib/task-filters.js.map +1 -0
  154. package/dist/lib/tasks.js +64 -0
  155. package/dist/lib/tasks.js.map +1 -0
  156. package/dist/lib/terminal.js +146 -0
  157. package/dist/lib/terminal.js.map +1 -0
  158. package/dist/lib/values.js +48 -0
  159. package/dist/lib/values.js.map +1 -0
  160. package/oclif.manifest.json +10470 -0
  161. package/package.json +81 -4
@@ -0,0 +1,466 @@
1
+ import { Errors, Flags } from "@oclif/core";
2
+ import { MeilisearchApiError } from "meilisearch";
3
+ import { BaseCommand } from "../lib/base-command.js";
4
+ import { getApiV2Me, getApiV2Organizations, getApiV2Regions, getApiV2Resources, getApiV2Teams, postApiV2Projects, } from "../lib/clients/management/generated/sdk.gen.js";
5
+ import { probeExport, triggerExport } from "../lib/clients/meilisearch.js";
6
+ import { regionLatency } from "../lib/clients/ping.js";
7
+ import { cloudOf, everyPage, waitForProject } from "../lib/cloud-sync.js";
8
+ import { assertNoProject, isProjectUrl, writeConfigFile } from "../lib/config.js";
9
+ import { ManagementApiError, MeiliCliError, parseErrorBody, toRenderedError, } from "../lib/errors.js";
10
+ import { logInWithBrowser } from "../lib/login.js";
11
+ import { resolveOauthClient } from "../lib/session.js";
12
+ import { isTaskFailure, isTaskFinal, pollUntil } from "../lib/tasks.js";
13
+ import { ask, askSecret, bar, choose, detail, elapsed, endStatus, field, heading, paint, problem, say, status, step, } from "../lib/terminal.js";
14
+ const PRICING_URL = "https://www.meilisearch.com/pricing";
15
+ const SUPPORT = "support@meilisearch.com";
16
+ /** Shown in turn while Meilisearch Cloud creates the project, `<name>` replaced by its name. */
17
+ const TIPS = [
18
+ `Choose the best plan for your usage: ${PRICING_URL}`,
19
+ "Meilisearch Cloud upgrades your project to new Meilisearch versions smoothly.",
20
+ "`meili get indexes --project <name>` lists the indexes of the project.",
21
+ "Meilisearch Cloud monitors your instance for you.",
22
+ '`meili search --project <name> --index <uid> --q "<query>"` searches an index.',
23
+ "Meilisearch Cloud shows analytics on how your project is searched.",
24
+ "`meili get stats --project <name>` shows the number of documents of each index.",
25
+ "`meili get tasks --project <name> --statuses failed` lists the tasks that failed.",
26
+ "`meili config list` shows the projects of your config file.",
27
+ ];
28
+ const TIP_MS = 8000;
29
+ /** The answers of `POST /api/v2/projects` to an organization without a payment method or an address. */
30
+ const BILLING_ERRORS = new Set([
31
+ "project_billing_information_missing",
32
+ "project_payment_method_missing",
33
+ "project_billing_address_missing",
34
+ ]);
35
+ /** The rule of Meilisearch Cloud for a project name. */
36
+ const PROJECT_NAME = /^.{3,40}$/;
37
+ /** The waits on the data have no deadline: the human sees them progress and stops them with Ctrl-C. */
38
+ const NO_DEADLINE = Number.POSITIVE_INFINITY;
39
+ const NEVER = () => new MeiliCliError("cli_internal", "A wait without a deadline timed out.");
40
+ /** What an agent runs in place of `teleport`. */
41
+ const WITHOUT_TELEPORT = "Run `meili auth login`, then `meili add projects --name <name> --team-id <id> --resource-id <id> --sync-config --wait`, then `meili export --project <source> --project-destination <name> --wait`, then `meili get tasks --project <name> --statuses enqueued,processing` until it lists no task.";
42
+ export default class Teleport extends BaseCommand {
43
+ static api = "none";
44
+ static description = `Move the data of a Meilisearch project to a new Meilisearch Cloud project, by asking questions on the terminal. An interactive command, for humans: an agent never runs it.
45
+
46
+ It checks that the source can export, logs in to Meilisearch Cloud, creates a project in the region, team and plan chosen, adds it to the config file, exports the data to it, and waits until the new project has indexed it. It refuses to run without a terminal.
47
+
48
+ An agent does the same without questions. ${WITHOUT_TELEPORT}`;
49
+ static examples = [
50
+ "<%= config.bin %> <%= command.id %>",
51
+ "<%= config.bin %> <%= command.id %> --project local",
52
+ ];
53
+ static flags = {
54
+ project: Flags.string({
55
+ description: "A project of the config file, the one whose data moves to Meilisearch Cloud. Without it, the command asks.",
56
+ helpValue: "<name>",
57
+ }),
58
+ };
59
+ /** The Cloud project created so far, said when the command stops halfway. */
60
+ created;
61
+ async run() {
62
+ const { flags } = await this.parse(Teleport);
63
+ if (process.stdin.isTTY !== true || process.stderr.isTTY !== true) {
64
+ throw new MeiliCliError("cli_usage", "`meili teleport` asks questions, so it runs only in a terminal, for a human.", { hint: WITHOUT_TELEPORT });
65
+ }
66
+ const onInterrupt = () => {
67
+ endStatus();
68
+ // The export is enqueued: the transfer goes on without the CLI.
69
+ if (this.created?.transferring === true) {
70
+ say();
71
+ say(`⏳ ${paint("bold", "The transfer goes on in Meilisearch Cloud. meili stopped watching it.")}`);
72
+ say();
73
+ field("Watch it", `${this.created.link}/batches`);
74
+ sayLinks(this.created.link);
75
+ process.exit(0);
76
+ }
77
+ this.sayWhatExists();
78
+ process.exit(130);
79
+ };
80
+ process.once("SIGINT", onInterrupt);
81
+ try {
82
+ await this.teleport(flags.project);
83
+ }
84
+ finally {
85
+ process.removeListener("SIGINT", onInterrupt);
86
+ }
87
+ }
88
+ async teleport(named) {
89
+ say(`${paint("bold", "meili teleport")} ${paint("dim", "· move your data to Meilisearch Cloud")}`);
90
+ say();
91
+ const file = this.configFile();
92
+ const source = await this.chooseSource(file, named);
93
+ await this.logIn();
94
+ const client = this.managementClient;
95
+ const dashboard = resolveOauthClient(this.env).dashboardUrl;
96
+ status(() => "Loading the regions, the organizations and the teams");
97
+ const [regions, organizations, teams] = await Promise.all([
98
+ everyPage((query) => getApiV2Regions({ client, query }), { page: 1 }),
99
+ everyPage((query) => getApiV2Organizations({ client, query }), { page: 1 }),
100
+ everyPage((query) => getApiV2Teams({ client, query }), { page: 1 }),
101
+ ]);
102
+ const region = await choose("Region of the new project", await closestFirst(regions));
103
+ step("Region", region.name);
104
+ const team = await chooseTeam(organizations, teams);
105
+ const created = await this.createProject(file, await askName(file, `${source.name ?? "meilisearch"}-cloud`), team, region.id, dashboard);
106
+ // The entry of the config file takes the name of the project.
107
+ const { name } = created;
108
+ const link = `${dashboard}/teams/${team.id}/projects/${created.id}`;
109
+ this.created = {
110
+ name,
111
+ link,
112
+ sourceName: source.name,
113
+ inConfigFile: false,
114
+ transferring: false,
115
+ };
116
+ const start = Date.now();
117
+ let current = created.status;
118
+ const creating = () => {
119
+ const tip = TIPS[Math.floor((Date.now() - start) / TIP_MS) % TIPS.length];
120
+ return `Creating ${name}: ${current}. It can take several minutes. ${paint("dim", elapsed(start))}
121
+ ${paint("dim", `Tip: ${tip.replaceAll("<name>", name)}`)}`;
122
+ };
123
+ status(creating);
124
+ const project = await waitForProject(client, created.id, {
125
+ timeoutMs: this.waitTimeoutMs({}),
126
+ onProgress: (each) => {
127
+ current = each.status;
128
+ },
129
+ });
130
+ if (project.status === "failed" || project.url == null) {
131
+ throw new MeiliCliError("cli_task_failed", `Meilisearch Cloud could not create project ${project.name}.`, { hint: `Contact ${SUPPORT} and give the project id, ${project.id}.` });
132
+ }
133
+ this.addToConfigFile({ ...project, url: project.url }, created.masterKey, teams);
134
+ this.created.inConfigFile = true;
135
+ step("Created", `${name} is running, in the config file as \`${name}\``, start);
136
+ const task = await triggerExport(source.client, {
137
+ url: project.url,
138
+ apiKey: created.masterKey,
139
+ });
140
+ this.created.transferring = true;
141
+ await followExport(source.client, task.taskUid, source.name ?? source.url);
142
+ const destination = this.meilisearchClient(project.url, created.masterKey);
143
+ await followIndexing(destination, name);
144
+ const [index] = (await destination.getIndexes({ limit: 1 })).results;
145
+ say();
146
+ say(`✨ ${paint("bold", `Done in ${elapsed(start)}: your data is in Meilisearch Cloud, in project ${name}.`)}`);
147
+ say();
148
+ if (index !== undefined) {
149
+ field("Search", `meili search --project ${name} --index ${index.uid} --q "<query>"`);
150
+ }
151
+ sayLinks(link);
152
+ }
153
+ /** The source named, else the one chosen, once its key can call `POST /export`. */
154
+ async chooseSource(file, named) {
155
+ let name = named;
156
+ for (;;) {
157
+ const source = await this.pickSource(file, name);
158
+ name = undefined;
159
+ const why = await exportProblem(source.client);
160
+ if (why === undefined) {
161
+ step("Source", source.name === undefined ? source.url : `${source.name}, ${source.url}`);
162
+ return source;
163
+ }
164
+ problem(`${source.name ?? source.url} cannot export. ${why}`);
165
+ }
166
+ }
167
+ async pickSource(file, name) {
168
+ const entry = name === undefined ? undefined : file.projects[name];
169
+ if (entry !== undefined) {
170
+ return { name, url: entry.url, client: this.meilisearchClient(entry.url, entry.apiKey) };
171
+ }
172
+ if (name !== undefined)
173
+ problem(`No project \`${name}\` in ${file.path}.`);
174
+ const names = Object.keys(file.projects);
175
+ const picked = names.length === 0
176
+ ? null
177
+ : await choose("Which project moves to Meilisearch Cloud?", [
178
+ ...names.map((each) => ({ name: `${each} ${file.projects[each]?.url}`, value: each })),
179
+ { name: "Another one: enter its URL and its API key", value: null },
180
+ ]);
181
+ if (picked !== null)
182
+ return this.pickSource(file, picked);
183
+ const url = await ask("URL of the Meilisearch instance", {
184
+ validate: (value) => isProjectUrl(value) || "Enter an HTTP(S) URL, for example http://localhost:7700.",
185
+ });
186
+ const apiKey = await askSecret("Its API key, with the export action (empty when it has none)");
187
+ return { name: undefined, url, client: this.meilisearchClient(url, apiKey || undefined) };
188
+ }
189
+ /** Connects with the stored session, or logs in with the browser first. */
190
+ async logIn() {
191
+ let me = await this.loggedInUser();
192
+ if (me === undefined) {
193
+ say("Log in to Meilisearch Cloud in your browser. Without an account, you create one there.");
194
+ await logInWithBrowser(this.env, true, detail);
195
+ await this.connectManagement();
196
+ me = await getApiV2Me({ client: this.managementClient });
197
+ }
198
+ step("Logged in", me.email);
199
+ }
200
+ /** The user of the stored session, or undefined when there is none or the server refuses it. */
201
+ async loggedInUser() {
202
+ try {
203
+ await this.connectManagement();
204
+ return await getApiV2Me({ client: this.managementClient });
205
+ }
206
+ catch (error) {
207
+ const refused = error instanceof MeiliCliError
208
+ ? error.code === "cli_auth_missing" || error.code === "cli_auth_failed"
209
+ : error instanceof ManagementApiError && error.status === 401;
210
+ if (refused)
211
+ return undefined;
212
+ throw error;
213
+ }
214
+ }
215
+ /**
216
+ * `POST /api/v2/projects` on the free trial of the region, else on the plan
217
+ * chosen. A name the team already has asks for another one.
218
+ */
219
+ async createProject(file, firstName, team, regionId, dashboard) {
220
+ const client = this.managementClient;
221
+ const resources = await everyPage((query) => getApiV2Resources({ client, query: { ...query, regionId } }), { page: 1 });
222
+ let name = firstName;
223
+ const trialId = resources.find((resource) => resource.plan === "free_trial")?.id;
224
+ let resourceId = trialId ?? (await choosePlan(resources, "This region has no free trial."));
225
+ for (;;) {
226
+ try {
227
+ const project = await postApiV2Projects({
228
+ client,
229
+ body: { name, teamId: team.id, resourceId },
230
+ });
231
+ const plan = resourceId === trialId
232
+ ? "free trial, free for 14 days"
233
+ : `plan ${resources.find((resource) => resource.id === resourceId)?.name}`;
234
+ step("Project", `${name}, ${plan}`);
235
+ return project;
236
+ }
237
+ catch (error) {
238
+ const code = apiErrorCode(error);
239
+ if (code === "user_not_entitled_to_free_trial") {
240
+ resourceId = await choosePlan(resources, "Your free trial is already used.");
241
+ continue;
242
+ }
243
+ if (code === "project_create_name_exists") {
244
+ problem(`Team ${team.name} already has a project ${name}.`);
245
+ name = await askName(file, name);
246
+ continue;
247
+ }
248
+ if (code !== undefined && BILLING_ERRORS.has(code)) {
249
+ say(`Add a payment method and an address at ${dashboard}/teams/${team.id}/billing, then run \`meili teleport\` again.`);
250
+ }
251
+ if (code === "organization_not_self_serve") {
252
+ say(`Contact ${SUPPORT} to create a project in this organization.`);
253
+ }
254
+ throw error;
255
+ }
256
+ }
257
+ }
258
+ /** Adds the project as an entry named after it, as `add projects --sync-config` does. */
259
+ addToConfigFile(project, apiKey, teams) {
260
+ const { name, url } = project;
261
+ try {
262
+ // Read again: the human may have changed the file while the project was created.
263
+ const file = this.configFile();
264
+ assertNoProject(file, name, `: project ${project.id} is created but was not added to it.`);
265
+ const cloud = cloudOf(project, new Map(teams.map((team) => [team.id, team.name])));
266
+ writeConfigFile({
267
+ path: file.path,
268
+ projects: { ...file.projects, [name]: { url, apiKey, cloud } },
269
+ });
270
+ }
271
+ catch (error) {
272
+ say(`Once the config file is fixed, run \`meili config sync-with-cloud --project-name ${name}\` to add the project to it, then \`meili export --project-destination ${name}\` to send the data.`);
273
+ throw error;
274
+ }
275
+ }
276
+ /** Without a terminal, an agent reads the error: the JSON of the contract. With one, a human reads it. */
277
+ async catch(error) {
278
+ if (process.stderr.isTTY !== true || error instanceof Errors.ExitError) {
279
+ return super.catch(error);
280
+ }
281
+ endStatus();
282
+ // Ctrl-C on a question.
283
+ if (error instanceof Error && error.name === "ExitPromptError") {
284
+ this.sayWhatExists();
285
+ this.exit(130);
286
+ }
287
+ const { body, exitCode } = toRenderedError(error);
288
+ say();
289
+ problem(`Error: ${body.message}`);
290
+ if (body.hint !== undefined)
291
+ detail(body.hint);
292
+ this.sayWhatExists();
293
+ this.exit(exitCode);
294
+ }
295
+ sayWhatExists() {
296
+ if (this.created === undefined)
297
+ return;
298
+ detail(`Project ${this.created.name} exists in Meilisearch Cloud: ${this.created.link}`);
299
+ const { name, sourceName, inConfigFile } = this.created;
300
+ if (inConfigFile) {
301
+ detail(`It is in the config file. To send the data again, run \`meili export --project ${sourceName ?? "<source>"} --project-destination ${name} --wait\`.`);
302
+ }
303
+ }
304
+ }
305
+ /** The links to the project in the dashboard. */
306
+ function sayLinks(link) {
307
+ field("Try it", `${link}/preview`);
308
+ field("Project settings", `${link}/settings/general`);
309
+ }
310
+ /** Why the source cannot export, or undefined when it can. */
311
+ async function exportProblem(client) {
312
+ try {
313
+ await probeExport(client);
314
+ return undefined;
315
+ }
316
+ catch (error) {
317
+ const status = error instanceof MeilisearchApiError ? error.response.status : undefined;
318
+ if (status === 401 || status === 403) {
319
+ return "The API key is missing or wrong, or it lacks the `export` action. Use the master key, or a key with the `export` action.";
320
+ }
321
+ if (status === 404) {
322
+ return "It has no export route: export needs Meilisearch v1.16 or later. Upgrade the instance, or check the URL.";
323
+ }
324
+ return toRenderedError(error).body.message;
325
+ }
326
+ }
327
+ /**
328
+ * The regions as the dashboard shows them: the closest first, then by latency,
329
+ * with a 🌱 on a green label region. A region that does not answer comes last.
330
+ */
331
+ async function closestFirst(regions) {
332
+ const measured = await Promise.all(regions.map(async (region) => ({ region, latency: await regionLatency(region.regionUrl) })));
333
+ measured.sort((a, b) => (a.latency ?? Number.POSITIVE_INFINITY) - (b.latency ?? Number.POSITIVE_INFINITY));
334
+ const width = Math.max(...regions.map((region) => region.name.length)) + 3;
335
+ return measured.map(({ region, latency }, index) => {
336
+ const name = `${region.name}${region.greenLabel ? " 🌱" : ""}`.padEnd(width);
337
+ const ms = latency === undefined ? "" : `${String(latency).padStart(4)}ms`;
338
+ const closest = index === 0 && latency !== undefined ? " (closest)" : "";
339
+ return { name: `${name}${ms}${closest}`.trimEnd(), value: region };
340
+ });
341
+ }
342
+ /** The team of the new project, asked only when there are several, grouped by organization. */
343
+ async function chooseTeam(organizations, teams) {
344
+ const [only] = teams;
345
+ const team = only !== undefined && teams.length === 1
346
+ ? only
347
+ : await choose("Team of the new project", organizations.flatMap((organization) => {
348
+ const its = teams.filter((each) => each.organizationId === organization.id);
349
+ return its.length === 0
350
+ ? []
351
+ : [
352
+ heading(organization.name),
353
+ ...its.map((each) => ({ name: ` ${each.name}`, value: each })),
354
+ ];
355
+ }));
356
+ const organization = organizations.find((each) => each.id === team.organizationId);
357
+ step("Team", organization === undefined ? team.name : `${team.name} (${organization.name})`);
358
+ return team;
359
+ }
360
+ /** A name Meilisearch Cloud accepts and the config file does not have yet. */
361
+ function askName(file, suggested) {
362
+ return ask("Name of the new project", {
363
+ default: suggested,
364
+ validate: (value) => !PROJECT_NAME.test(value)
365
+ ? "A project name has 3 to 40 characters."
366
+ : file.projects[value] !== undefined
367
+ ? `The config file already has a project \`${value}\`.`
368
+ : true,
369
+ });
370
+ }
371
+ /** The plans offered when the free trial is not, in this order. Any other plan comes after them. */
372
+ const PLAN_ORDER = ["XS", "S", "M", "L", "XL", "2XL", "4XL", "8XL"];
373
+ /** The plans that show a monthly estimation, in `PLAN_ORDER`, except the Build plan: it is never offered here. */
374
+ function choosePlan(resources, why) {
375
+ say(`${why} Get help to choose the right plan based on your usage here: ${PRICING_URL}`);
376
+ const rank = (resource) => {
377
+ const index = PLAN_ORDER.indexOf(resource.name);
378
+ return index === -1 ? PLAN_ORDER.length : index;
379
+ };
380
+ const priced = resources.flatMap((resource) => {
381
+ const estimation = resource.name === "Build" ? undefined : monthlyEstimation(resource);
382
+ return estimation === undefined ? [] : [{ resource, estimation }];
383
+ });
384
+ return choose("Plan of the new project", priced
385
+ .sort((a, b) => rank(a.resource) - rank(b.resource))
386
+ .map(({ resource, estimation }) => ({
387
+ name: describeResource(resource, estimation),
388
+ value: resource.id,
389
+ })));
390
+ }
391
+ /**
392
+ * What the dashboard shows as the monthly price of a resource: the estimation
393
+ * of the first feature of its plan billed per month or per hour of runtime.
394
+ */
395
+ function monthlyEstimation(resource) {
396
+ return (resource.fullPlan?.features.find((feature) => feature.kind === "base" || feature.kind === "instance_runtime")?.monthlyEstimation ?? undefined);
397
+ }
398
+ const USD = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" });
399
+ /** `XS: 0.5 vCPU, 1 GB RAM, 50 GB storage, about $21.90 a month (recommended for development only)`. */
400
+ function describeResource(resource, estimation) {
401
+ const size = [
402
+ resource.vcpu == null ? undefined : `${resource.vcpu} vCPU`,
403
+ resource.memory == null ? undefined : `${resource.memory} GB RAM`,
404
+ resource.storage == null ? undefined : `${resource.storage} GB storage`,
405
+ ].filter((part) => part !== undefined);
406
+ const note = resource.name === "XS" ? " (recommended for development only)" : "";
407
+ return `${resource.name}: ${[...size, `about ${USD.format(estimation)} a month`].join(", ")}${note}`;
408
+ }
409
+ /** The `code` of a Management API error body. */
410
+ function apiErrorCode(error) {
411
+ return error instanceof ManagementApiError ? parseErrorBody(error.body)?.code : undefined;
412
+ }
413
+ /** Follows the export task of the source, with the progress of its batch. */
414
+ async function followExport(client, uid, label) {
415
+ const start = Date.now();
416
+ let percentage = 0;
417
+ status(() => `Sending ${bar(percentage / 100)} ${paint("dim", elapsed(start))}`);
418
+ const final = await pollUntil(async () => {
419
+ const task = await client.tasks.getTask(uid);
420
+ const batch = task.status === "processing" && task.batchUid !== null
421
+ ? await client.batches.getBatch(task.batchUid)
422
+ : undefined;
423
+ return { task, percentage: batch?.progress?.percentage ?? 0 };
424
+ }, ({ task }) => isTaskFinal(task), NEVER, {
425
+ timeoutMs: NO_DEADLINE,
426
+ onProgress: (current) => {
427
+ percentage = current.percentage;
428
+ },
429
+ });
430
+ if (isTaskFailure(final.task)) {
431
+ throw new MeiliCliError("cli_task_failed", `The export failed: ${final.task.error?.message ?? final.task.status}.`);
432
+ }
433
+ step("Sent", `the data of ${label}`, start);
434
+ }
435
+ const tasks = (count) => (count === 1 ? "1 task" : `${count} tasks`);
436
+ /**
437
+ * Follows the tasks of the new project until none is left to process. The
438
+ * project is new, so every task of it comes from the export.
439
+ */
440
+ async function followIndexing(client, entry) {
441
+ const start = Date.now();
442
+ // The export is over, so the total no longer grows: only what is left is polled.
443
+ const { total } = await client.tasks.getTasks({ limit: 1 });
444
+ let left = total;
445
+ status(() => `Indexing ${bar(total === 0 ? 1 : (total - left) / total)} ${total - left}/${total} tasks ${paint("dim", elapsed(start))}`);
446
+ await pollUntil(async () => (await client.tasks.getTasks({ statuses: ["enqueued", "processing"], limit: 1 })).total, (count) => count === 0, NEVER, {
447
+ timeoutMs: NO_DEADLINE,
448
+ maxIntervalMs: 2000,
449
+ onProgress: (count) => {
450
+ left = count;
451
+ },
452
+ });
453
+ left = 0;
454
+ const failed = await client.tasks.getTasks({ statuses: ["failed"] });
455
+ if (failed.total === 0) {
456
+ step("Indexed", tasks(total), start);
457
+ return;
458
+ }
459
+ for (const task of failed.results) {
460
+ problem(`Task ${task.uid} (${task.type}) failed: ${task.error?.message ?? "no error message"}`);
461
+ }
462
+ throw new MeiliCliError("cli_task_failed", `${tasks(failed.total)} failed in project ${entry}.`, {
463
+ hint: `Run \`meili get tasks --project ${entry} --statuses failed\` to see them.`,
464
+ });
465
+ }
466
+ //# sourceMappingURL=teleport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teleport.js","sourceRoot":"","sources":["../../src/commands/teleport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { MeiliCliError } from "../../lib/errors.js";
4
+ import { readJsonBody } from "../../lib/input.js";
5
+ export default class UpdateDocuments extends BaseCommand {
6
+ static api = "meilisearch";
7
+ static routes = ["PUT /indexes/{index_uid}/documents"];
8
+ static keyActions = ["documents.add"];
9
+ static description = "Add documents to an index, merging their fields into the ones that already have the same primary key.";
10
+ static examples = [
11
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file changes.json",
12
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file changes.json --output json",
13
+ "cat changes.json | <%= config.bin %> <%= command.id %> --project prod --index movies --file -",
14
+ '<%= config.bin %> <%= command.id %> --project prod --index movies --data \'[{"id":1,"rating":4}]\'',
15
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file changes.json --wait",
16
+ ];
17
+ static flags = {
18
+ ...BaseCommand.connectionFlags,
19
+ index: Flags.string({
20
+ required: true,
21
+ description: "The index to update the documents of.",
22
+ helpValue: "<index>",
23
+ }),
24
+ "primary-key": Flags.string({
25
+ description: "Primary key of the index. Only taken into account on its first documents.",
26
+ helpValue: "<field>",
27
+ }),
28
+ "custom-metadata": Flags.string({
29
+ description: "String attached to the task, returned in the task object.",
30
+ helpValue: "<string>",
31
+ }),
32
+ "skip-creation": Flags.boolean({
33
+ description: "Only update documents that already exist, ignore the new ones.",
34
+ }),
35
+ ...BaseCommand.bodyInputFlags,
36
+ ...BaseCommand.waitFlags,
37
+ };
38
+ async run() {
39
+ const { flags } = await this.parse(UpdateDocuments);
40
+ const documents = readJsonBody(flags);
41
+ if (documents === undefined) {
42
+ throw new MeiliCliError("cli_usage", "The documents to update are missing.", {
43
+ hint: "Pass them with `--file <path>`, `--file -` to read stdin, or `--data '<json>'`.",
44
+ });
45
+ }
46
+ const task = await this.meilisearch
47
+ .index(flags.index)
48
+ .updateDocuments(documents, {
49
+ primaryKey: flags["primary-key"],
50
+ customMetadata: flags["custom-metadata"],
51
+ skipCreation: flags["skip-creation"] ? true : undefined,
52
+ });
53
+ await this.outputTask(task, flags);
54
+ }
55
+ }
56
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/commands/update/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAEvD,MAAM,CAAC,UAAU,GAAG,CAAC,eAAe,CAAC,CAAC;IAEtC,MAAM,CAAU,WAAW,GACzB,uGAAuG,CAAC;IAE1G,MAAM,CAAU,QAAQ,GAAG;QACzB,uFAAuF;QACvF,qGAAqG;QACrG,+FAA+F;QAC/F,oGAAoG;QACpG,8FAA8F;KAC/F,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,eAAe;QAC9B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,uCAAuC;YACpD,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,WAAW,EAAE,2EAA2E;YACxF,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC9B,WAAW,EAAE,2DAA2D;YACxE,SAAS,EAAE,UAAU;SACtB,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC;YAC7B,WAAW,EAAE,gEAAgE;SAC9E,CAAC;QACF,GAAG,WAAW,CAAC,cAAc;QAC7B,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,WAAW,EAAE,sCAAsC,EAAE;gBAC3E,IAAI,EAAE,iFAAiF;aACxF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW;aAChC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;aAClB,eAAe,CAAC,SAAwB,EAAE;YACzC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;YAChC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC;YACxC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SACxD,CAAC,CAAC;QACL,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { readJsonObjectBody } from "../../lib/input.js";
4
+ export default class UpdateIndexes extends BaseCommand {
5
+ static api = "meilisearch";
6
+ static routes = ["PATCH /indexes/{index_uid}"];
7
+ static keyActions = ["indexes.update"];
8
+ static description = "Change the primary key of an index with --primary-key, or rename it with --new-id.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --primary-key movie_id",
11
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --primary-key movie_id --output json",
12
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --new-id films",
13
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --new-id films --wait",
14
+ ];
15
+ static flags = {
16
+ ...BaseCommand.connectionFlags,
17
+ id: Flags.string({
18
+ required: true,
19
+ description: "The index to update.",
20
+ helpValue: "<index>",
21
+ }),
22
+ "new-id": Flags.string({
23
+ aliases: ["uid"],
24
+ description: "New uid of the index, which renames it.",
25
+ helpValue: "<index>",
26
+ }),
27
+ "primary-key": Flags.string({
28
+ description: "The field that holds the identifier of each document.",
29
+ helpValue: "<field>",
30
+ }),
31
+ ...BaseCommand.bodyInputFlags,
32
+ ...BaseCommand.waitFlags,
33
+ };
34
+ async run() {
35
+ const { flags } = await this.parse(UpdateIndexes);
36
+ const options = { ...readJsonObjectBody(flags) };
37
+ if (flags["primary-key"] !== undefined)
38
+ options.primaryKey = flags["primary-key"];
39
+ if (flags["new-id"] !== undefined)
40
+ options.uid = flags["new-id"];
41
+ await this.outputTask(await this.meilisearch.updateIndex(flags.id, options), flags);
42
+ }
43
+ }
44
+ //# sourceMappingURL=indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../../src/commands/update/indexes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE/C,MAAM,CAAC,UAAU,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAEvC,MAAM,CAAU,WAAW,GACzB,oFAAoF,CAAC;IAEvF,MAAM,CAAU,QAAQ,GAAG;QACzB,uFAAuF;QACvF,qGAAqG;QACrG,+EAA+E;QAC/E,sFAAsF;KACvF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,eAAe;QAC9B,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,sBAAsB;YACnC,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,WAAW,EAAE,yCAAyC;YACtD,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,WAAW,EAAE,uDAAuD;YACpE,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,GAAG,WAAW,CAAC,cAAc;QAC7B,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAkB,CAAC;QACjE,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACtF,CAAC;CACF"}