@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Meilisearch
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,98 @@
1
- # Temporary Holding Version
1
+ # Meilisearch CLI
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ `meili` is the command line tool for [Meilisearch](https://www.meilisearch.com). It works with any instance, local or remote, and with Meilisearch Cloud through its Management API.
4
+
5
+ ## Install
6
+
7
+ With npm, where Node 22 or newer is installed:
8
+
9
+ ```sh
10
+ npm install -g @meilisearch/cli
11
+ ```
12
+
13
+ With Homebrew, on macOS and Linux:
14
+
15
+ ```sh
16
+ brew install meilisearch/tap/meili
17
+ ```
18
+
19
+ From the GitHub release assets, on macOS and Linux, without Node:
20
+
21
+ ```sh
22
+ curl -fsSL https://raw.githubusercontent.com/meilisearch/cli/main/scripts/install.sh | sh
23
+ ```
24
+
25
+ - The script installs the CLI with its own Node in `~/.local/share/meili`.
26
+ - It links `meili` in `~/.local/bin`, or in the folder of `MEILI_CLI_INSTALL_DIR`.
27
+ - `MEILI_CLI_VERSION=0.1.0` installs this version instead of the latest one.
28
+ - Run the script again to update.
29
+
30
+ ## Get started
31
+
32
+ **1. Log in to Meilisearch Cloud**, once, in a browser:
33
+
34
+ ```sh
35
+ meili auth login
36
+ ```
37
+
38
+ **2. Add your projects to the config file**:
39
+
40
+ ```sh
41
+ meili config sync-with-cloud --all # every Cloud project you can see, with its URL and, when you own its team, its master key
42
+ meili config set --project local --project-url http://localhost:7700 --project-api-key <your-key> # an instance that is not on Meilisearch Cloud
43
+ meili config list # the projects of the file, keys masked
44
+ ```
45
+
46
+ The config file is `~/.config/meili/config.json` by default. `MEILI_CONFIG` sets another file.
47
+
48
+ `--team-ids`, `--project-name` and `--project-url` limit the projects that `sync-with-cloud` adds. A key already in the file is never replaced. To give a project a key you got elsewhere, run `meili config update --project <name> --project-api-key -`.
49
+
50
+ **3. Run commands**, naming the project with `--project`:
51
+
52
+ ```sh
53
+ meili get indexes --project prod
54
+ meili search --project prod --index movies --q "star wars"
55
+ meili add documents --project local --index movies --file movies.json --wait
56
+ meili update projects --project prod --name renamed # a management command, on the Cloud project of the entry
57
+ meili add projects --name demo --team-id 12 --resource-id 3 --sync-config # creates a Cloud project and adds it to the file
58
+ ```
59
+
60
+ `--project` is required on every command. Without a config file, give the instance directly: `--project-url <url> --project-api-key <key>`.
61
+
62
+ ## From self-hosted to Meilisearch Cloud
63
+
64
+ Meilisearch Cloud upgrades and monitors your project for you, shows how it is searched, and is [free for 14 days](https://www.meilisearch.com/pricing).
65
+
66
+ `meili teleport` moves the data of a self-hosted Meilisearch, local or in production, to a new Meilisearch Cloud project. It asks its questions in the terminal:
67
+
68
+ ```sh
69
+ meili teleport
70
+ ```
71
+
72
+ It asks for the project to move, from the config file or by its URL and key. It checks that the key can export, logs you in to Meilisearch Cloud (and creates your account), creates the project on the free trial or on the plan you choose, adds it to the config file, and sends the data to it.
73
+
74
+ `meili teleport` is interactive, for humans only. Coding agents must not run it: without a terminal, it fails. The same steps without questions:
75
+
76
+ ```sh
77
+ meili auth login # a human logs in once, in a browser
78
+ meili add projects --name cloud --team-id <id> --resource-id <id> --sync-config --wait
79
+ meili export --project local --project-destination cloud --wait
80
+ meili get tasks --project cloud --statuses enqueued,processing # run it again until it lists no task
81
+ ```
82
+
83
+ The team id and the resource id are in the Meilisearch Cloud dashboard.
84
+
85
+ ## Documentation
86
+
87
+ ```sh
88
+ meili --help # every command, global flag and environment variable
89
+ meili get indexes --help # one command: flags, examples
90
+ meili schema # the command tree as JSON, one entry per command with its routes
91
+ meili schema --command "get indexes" # one command in full, as JSON
92
+ ```
93
+
94
+ ## Analytics
95
+
96
+ `meili` sends anonymous usage data to Meilisearch: the commands you run, the names of their flags, their errors, and in `meili teleport` the options you choose. It never sends the values of the flags, your data or your keys. After `meili auth login`, the events are linked to your Meilisearch Cloud account. To turn it off, set `MEILI_NO_ANALYTICS=true`. `DO_NOT_TRACK=1` works too, and nothing is sent in CI. The details are in [`docs/contract/config.md`](docs/contract/config.md#analytics).
97
+
98
+ To contribute, read [`CONTRIBUTING.md`](CONTRIBUTING.md). [MIT](LICENSE).
package/bin/run.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { Config, flush, run, toConfiguredId } from "@oclif/core";
3
+ import { handleFatalError } from "../dist/lib/errors.js";
4
+
5
+ // oclif's own `execute()` prints errors as text. Errors here must follow
6
+ // docs/contract/output.md, so the last-resort handler is ours.
7
+ const argv = process.argv.slice(2);
8
+ const config = await Config.load(import.meta.url);
9
+ try {
10
+ await run(argv, config);
11
+ await flush();
12
+ } catch (error) {
13
+ const commandIds = config.commandIDs.map((id) => toConfiguredId(id, config));
14
+ handleFatalError(error, argv, commandIds);
15
+ }
@@ -0,0 +1,54 @@
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 AddDocuments extends BaseCommand {
6
+ static api = "meilisearch";
7
+ static routes = ["POST /indexes/{index_uid}/documents"];
8
+ static keyActions = ["documents.add"];
9
+ static description = "Add documents to an index, replacing the ones that already have the same primary key.";
10
+ static examples = [
11
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file movies.json",
12
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file movies.json --output json",
13
+ "cat movies.json | <%= config.bin %> <%= command.id %> --project prod --index movies --file -",
14
+ '<%= config.bin %> <%= command.id %> --project prod --index movies --data \'[{"id":1,"title":"Nosferatu"}]\' --primary-key id',
15
+ "<%= config.bin %> <%= command.id %> --project prod --index movies --file movies.json --wait",
16
+ ];
17
+ static flags = {
18
+ ...BaseCommand.connectionFlags,
19
+ index: Flags.string({
20
+ required: true,
21
+ description: "The index to add the documents to.",
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(AddDocuments);
40
+ const documents = readJsonBody(flags);
41
+ if (documents === undefined) {
42
+ throw new MeiliCliError("cli_usage", "The documents to add are missing.", {
43
+ hint: "Pass them with `--file <path>`, `--file -` to read stdin, or `--data '<json>'`.",
44
+ });
45
+ }
46
+ const task = await this.meilisearch.index(flags.index).addDocuments(documents, {
47
+ primaryKey: flags["primary-key"],
48
+ customMetadata: flags["custom-metadata"],
49
+ skipCreation: flags["skip-creation"] ? true : undefined,
50
+ });
51
+ await this.outputTask(task, flags);
52
+ }
53
+ }
54
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/commands/add/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,YAAa,SAAQ,WAAW;IACnD,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAExD,MAAM,CAAC,UAAU,GAAG,CAAC,eAAe,CAAC,CAAC;IAEtC,MAAM,CAAU,WAAW,GACzB,uFAAuF,CAAC;IAE1F,MAAM,CAAU,QAAQ,GAAG;QACzB,sFAAsF;QACtF,oGAAoG;QACpG,8FAA8F;QAC9F,8HAA8H;QAC9H,6FAA6F;KAC9F,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,oCAAoC;YACjD,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,YAAY,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CAAC,WAAW,EAAE,mCAAmC,EAAE;gBACxE,IAAI,EAAE,iFAAiF;aACxF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,SAAwB,EAAE;YAC5F,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;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,39 @@
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 AddIndexes extends BaseCommand {
5
+ static api = "meilisearch";
6
+ static routes = ["POST /indexes"];
7
+ static keyActions = ["indexes.create"];
8
+ static description = "Create an empty index, named by --id, with --primary-key as its primary key.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> --project prod --id movies",
11
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --primary-key id --output json",
12
+ "<%= config.bin %> <%= command.id %> --project prod --id movies --wait",
13
+ ];
14
+ static flags = {
15
+ ...BaseCommand.connectionFlags,
16
+ id: Flags.string({
17
+ required: true,
18
+ aliases: ["uid"],
19
+ description: "The index to create.",
20
+ helpValue: "<index>",
21
+ }),
22
+ "primary-key": Flags.string({
23
+ description: "The field that holds the identifier of each document. Without it, Meilisearch infers it from the first documents.",
24
+ helpValue: "<field>",
25
+ }),
26
+ ...BaseCommand.bodyInputFlags,
27
+ ...BaseCommand.waitFlags,
28
+ };
29
+ async run() {
30
+ const { flags } = await this.parse(AddIndexes);
31
+ // The body goes out whole, so a field this command declares no flag for
32
+ // reaches the API, which refuses it rather than the CLI dropping it.
33
+ const options = { ...readJsonObjectBody(flags) };
34
+ if (flags["primary-key"] !== undefined)
35
+ options.primaryKey = flags["primary-key"];
36
+ await this.outputTask(await this.meilisearch.createIndex(flags.id, options), flags);
37
+ }
38
+ }
39
+ //# sourceMappingURL=indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../../src/commands/add/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,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;IAElC,MAAM,CAAC,UAAU,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAEvC,MAAM,CAAU,WAAW,GACzB,8EAA8E,CAAC;IAEjF,MAAM,CAAU,QAAQ,GAAG;QACzB,gEAAgE;QAChE,+FAA+F;QAC/F,uEAAuE;KACxE,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,eAAe;QAC9B,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,WAAW,EAAE,sBAAsB;YACnC,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,WAAW,EACT,mHAAmH;YACrH,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,UAAU,CAAC,CAAC;QAC/C,wEAAwE;QACxE,qEAAqE;QACrE,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,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"}
@@ -0,0 +1,63 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { readBodyWithFields } from "../../lib/input.js";
4
+ import { asList, asText } from "../../lib/values.js";
5
+ export default class AddKeys extends BaseCommand {
6
+ static api = "meilisearch";
7
+ static routes = ["POST /keys"];
8
+ static keyActions = ["keys.create"];
9
+ static description = `Create an API key that runs --actions on --indexes until --expires-at.
10
+
11
+ The answer carries the \`key\` field, the credential itself, on stdout like any other data.`;
12
+ static examples = [
13
+ "<%= config.bin %> <%= command.id %> --project prod --actions search --indexes movies --expires-at null",
14
+ "<%= config.bin %> <%= command.id %> --project prod --actions search --indexes '*' --expires-at 2027-01-01T00:00:00Z --output json",
15
+ "<%= config.bin %> <%= command.id %> --project prod --actions documents.add,documents.delete --indexes movies --expires-at null --name 'CI indexer'",
16
+ '<%= config.bin %> <%= command.id %> --project prod --data \'{"actions":["search"],"indexes":["movies"],"expiresAt":null}\'',
17
+ ];
18
+ static flags = {
19
+ ...BaseCommand.connectionFlags,
20
+ id: Flags.string({
21
+ aliases: ["uid"],
22
+ description: "Uid of the key, a uuid v4. Without it, Meilisearch generates one.",
23
+ helpValue: "<uuid>",
24
+ }),
25
+ actions: Flags.string({
26
+ description: "Actions the key permits, comma-separated, for example `search` or `documents.*`. `*` permits them all.",
27
+ helpValue: "<actions>",
28
+ }),
29
+ indexes: Flags.string({
30
+ description: "Indexes the key reaches, comma-separated. `*` reaches them all, and `products_*` every index of that prefix.",
31
+ helpValue: "<indexes>",
32
+ }),
33
+ "expires-at": Flags.string({
34
+ description: "Expiration date in RFC 3339 format. The value null creates a key that never expires.",
35
+ helpValue: "<date>",
36
+ }),
37
+ name: Flags.string({
38
+ description: "Name of the key, for a human reading the list.",
39
+ helpValue: "<name>",
40
+ }),
41
+ description: Flags.string({
42
+ description: "Description of the key, for a human reading the list.",
43
+ helpValue: "<text>",
44
+ }),
45
+ ...BaseCommand.bodyInputFlags,
46
+ };
47
+ async run() {
48
+ const { flags } = await this.parse(AddKeys);
49
+ const fromFlags = {
50
+ uid: flags.id,
51
+ actions: asList(flags.actions),
52
+ indexes: asList(flags.indexes),
53
+ expiresAt: asText(flags["expires-at"]),
54
+ name: asText(flags.name),
55
+ description: asText(flags.description),
56
+ };
57
+ // The API refuses a body missing actions, indexes or expiresAt, with its own
58
+ // code: the CLI judges no value it can send.
59
+ const key = readBodyWithFields(flags, fromFlags);
60
+ await this.output(await this.meilisearch.createKey(key));
61
+ }
62
+ }
63
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/commands/add/keys.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;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW;IAC9C,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC;IAE/B,MAAM,CAAC,UAAU,GAAG,CAAC,aAAa,CAAC,CAAC;IAEpC,MAAM,CAAU,WAAW,GACzB;;4FAEwF,CAAC;IAE3F,MAAM,CAAU,QAAQ,GAAG;QACzB,wGAAwG;QACxG,mIAAmI;QACnI,oJAAoJ;QACpJ,4HAA4H;KAC7H,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,eAAe;QAC9B,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,WAAW,EAAE,mEAAmE;YAChF,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EACT,wGAAwG;YAC1G,SAAS,EAAE,WAAW;SACvB,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EACT,8GAA8G;YAChH,SAAS,EAAE,WAAW;SACvB,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,WAAW,EACT,sFAAsF;YACxF,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,gDAAgD;YAC7D,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,uDAAuD;YACpE,SAAS,EAAE,QAAQ;SACpB,CAAC;QACF,GAAG,WAAW,CAAC,cAAc;KAC9B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAA4B;YACzC,GAAG,EAAE,KAAK,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACtC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;SACvC,CAAC;QACF,6EAA6E;QAC7E,6CAA6C;QAC7C,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAgB,CAAC;QAChE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,96 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { postApiV2Projects } from "../../lib/clients/management/generated/sdk.gen.js";
4
+ import { cloudOf, readTeamNames, waitForProject } from "../../lib/cloud-sync.js";
5
+ import { assertNoProject, maskSecret, writeConfigFile } from "../../lib/config.js";
6
+ import { MeiliCliError, writeNotice } from "../../lib/errors.js";
7
+ import { readBodyWithFields } from "../../lib/input.js";
8
+ export default class AddProjects extends BaseCommand {
9
+ static api = "management";
10
+ static routes = ["POST /api/v2/projects"];
11
+ static description = "Create a Meilisearch Cloud project in a team, on a resource. The master key is printed masked: give --sync-config to write it to the config file instead.";
12
+ static examples = [
13
+ "<%= config.bin %> <%= command.id %> --name demo --team-id 12 --resource-id 3",
14
+ "<%= config.bin %> <%= command.id %> --name demo --team-id 12 --resource-id 3 --output json",
15
+ "<%= config.bin %> <%= command.id %> --name demo --team-id 12 --resource-id 3 --sync-config",
16
+ "<%= config.bin %> <%= command.id %> --name demo --team-id 12 --resource-id 3 --wait --sync-config",
17
+ "<%= config.bin %> <%= command.id %> --name demo --team-id 12 --resource-id 3 --ms-version v1.54.0",
18
+ '<%= config.bin %> <%= command.id %> --data \'{"name":"demo","teamId":12,"resourceId":3}\'',
19
+ "<%= config.bin %> <%= command.id %> --file project.json --name other-name",
20
+ ];
21
+ static flags = {
22
+ name: Flags.string({ description: "Name of the project.", helpValue: "<name>" }),
23
+ "team-id": Flags.integer({ description: "Team that owns the project.", helpValue: "<id>" }),
24
+ "resource-id": Flags.integer({
25
+ description: "Resource of the project: its plan and its region.",
26
+ helpValue: "<id>",
27
+ }),
28
+ "ms-version": Flags.string({
29
+ description: "Meilisearch version of the project, the latest by default.",
30
+ helpValue: "<version>",
31
+ }),
32
+ "sync-config": Flags.boolean({
33
+ description: "Add the project to the config file, as an entry named after it with its URL, its master key and its cloud identifiers.",
34
+ }),
35
+ wait: Flags.boolean({
36
+ description: "Poll the project until its status is running or failed, then print it.",
37
+ }),
38
+ timeout: BaseCommand.waitFlags.timeout,
39
+ ...BaseCommand.bodyInputFlags,
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(AddProjects);
43
+ // An invalid --timeout fails here, before a project exists.
44
+ const timeoutMs = flags.wait ? this.waitTimeoutMs(flags) : undefined;
45
+ const body = readBodyWithFields(flags, {
46
+ name: flags.name,
47
+ teamId: flags["team-id"],
48
+ resourceId: flags["resource-id"],
49
+ msVersion: flags["ms-version"],
50
+ });
51
+ // The entry takes the name checked here, whatever name the API answers.
52
+ let sync;
53
+ if (flags["sync-config"]) {
54
+ if (typeof body.name !== "string" || body.name === "") {
55
+ throw new MeiliCliError("cli_usage", "`--sync-config` names the entry after the project: give `--name`.");
56
+ }
57
+ const file = this.configFile();
58
+ assertNoProject(file, body.name, ": nothing was created.");
59
+ sync = { file, entry: body.name };
60
+ }
61
+ const created = await postApiV2Projects({ client: this.managementClient, body });
62
+ const project = timeoutMs === undefined
63
+ ? created
64
+ : await waitForProject(this.managementClient, created.id, {
65
+ timeoutMs,
66
+ onProgress: (current) => {
67
+ writeNotice(`waiting for project ${created.id}, status ${current.status}`);
68
+ },
69
+ });
70
+ await this.output(project.masterKey === undefined
71
+ ? project
72
+ : { ...project, masterKey: maskSecret(project.masterKey) });
73
+ if (project.status === "failed") {
74
+ throw new MeiliCliError("cli_task_failed", `Project ${project.id} finished with status failed${sync === undefined ? "" : `, so it was not added to ${sync.file.path}`}.`);
75
+ }
76
+ if (sync === undefined)
77
+ return;
78
+ if (project.url == null) {
79
+ throw new MeiliCliError("cli_config", `Project ${project.id} is created but has no URL yet, so it was not added to ${sync.file.path}.`, {
80
+ hint: `Run \`meili config sync-with-cloud --project-name ${project.name}\` once \`meili get projects --id ${project.id}\` shows its URL: it adds the project with its master key.`,
81
+ });
82
+ }
83
+ const cloud = cloudOf(project, await readTeamNames(this.managementClient));
84
+ // Read again: with --wait, minutes may have passed since the check above.
85
+ const file = this.configFile();
86
+ assertNoProject(file, sync.entry, `: project ${project.id} is created but was not added to it.`);
87
+ writeConfigFile({
88
+ path: file.path,
89
+ projects: {
90
+ ...file.projects,
91
+ [sync.entry]: { url: project.url, apiKey: created.masterKey, cloud },
92
+ },
93
+ });
94
+ }
95
+ }
96
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/commands/add/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { writeNotice } from "../../lib/errors.js";
4
+ import { logInWithBrowser } from "../../lib/login.js";
5
+ export default class AuthLogin extends BaseCommand {
6
+ static api = "none";
7
+ static description = "Log in to Meilisearch Cloud with a browser, and store the token for the management commands.";
8
+ static examples = [
9
+ "<%= config.bin %> <%= command.id %>",
10
+ "<%= config.bin %> <%= command.id %> --output json",
11
+ "<%= config.bin %> <%= command.id %> --no-browser",
12
+ ];
13
+ static flags = {
14
+ browser: Flags.boolean({
15
+ default: true,
16
+ allowNo: true,
17
+ description: "Open the consent page in a browser. --no-browser only prints the URL.",
18
+ }),
19
+ };
20
+ async run() {
21
+ const { flags } = await this.parse(AuthLogin);
22
+ const { path, session } = await logInWithBrowser(this.env, flags.browser, this.userAgent);
23
+ writeNotice(`Logged in for \`${session.scope}\`. The session is in ${path}.`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,GAAG,GAAQ,MAAM,CAAC;IAEzB,MAAM,CAAU,WAAW,GACzB,8FAA8F,CAAC;IAEjG,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,mDAAmD;QACnD,kDAAkD;KACnD,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,uEAAuE;SACrF,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1F,WAAW,CAAC,mBAAmB,OAAO,CAAC,KAAK,yBAAyB,IAAI,GAAG,CAAC,CAAC;IAChF,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { resetAnonymousId } from "../../lib/analytics.js";
2
+ import { BaseCommand } from "../../lib/base-command.js";
3
+ import { revokeSession } from "../../lib/clients/oauth.js";
4
+ import { MeiliCliError, writeNotice } from "../../lib/errors.js";
5
+ import { removeCredentialsFile } from "../../lib/session.js";
6
+ export default class AuthLogout extends BaseCommand {
7
+ static api = "none";
8
+ static description = "Revoke the token of `auth login` and forget it. Does nothing when nobody is logged in.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %>",
11
+ "<%= config.bin %> <%= command.id %> --output json",
12
+ ];
13
+ async run() {
14
+ const { path, session } = this.credentialsFile();
15
+ if (session === undefined)
16
+ return;
17
+ try {
18
+ await revokeSession(session);
19
+ }
20
+ catch (error) {
21
+ if (!(error instanceof MeiliCliError))
22
+ throw error;
23
+ // The session is forgotten either way, but the token is still live out there.
24
+ throw new MeiliCliError(error.code, `${error.message} The credentials file was removed anyway, so the token stays valid until it expires.`, { hint: "Revoke it from the Meilisearch Cloud dashboard." });
25
+ }
26
+ finally {
27
+ removeCredentialsFile(path);
28
+ resetAnonymousId(this.env);
29
+ }
30
+ writeNotice(`Logged out. The session was revoked and ${path} removed.`);
31
+ }
32
+ }
33
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,GAAG,GAAQ,MAAM,CAAC;IAEzB,MAAM,CAAU,WAAW,GACzB,wFAAwF,CAAC;IAE3F,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,mDAAmD;KACpD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAElC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC;gBAAE,MAAM,KAAK,CAAC;YACnD,8EAA8E;YAC9E,MAAM,IAAI,aAAa,CACrB,KAAK,CAAC,IAAI,EACV,GAAG,KAAK,CAAC,OAAO,sFAAsF,EACtG,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAC5D,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,WAAW,CAAC,2CAA2C,IAAI,WAAW,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { BaseCommand } from "../../lib/base-command.js";
2
+ import { MeiliCliError, writeNotice } from "../../lib/errors.js";
3
+ import { refreshSession } from "../../lib/session.js";
4
+ export default class AuthRefresh extends BaseCommand {
5
+ static api = "none";
6
+ static description = "Trade the refresh token of the stored session for a new access token, before it expires.";
7
+ static examples = [
8
+ "<%= config.bin %> <%= command.id %>",
9
+ "<%= config.bin %> <%= command.id %> --output json",
10
+ ];
11
+ async run() {
12
+ const { path, session } = this.credentialsFile();
13
+ if (session === undefined) {
14
+ throw new MeiliCliError("cli_auth_missing", "Nobody is logged in on this machine.", {
15
+ hint: "Run `meili auth login`.",
16
+ });
17
+ }
18
+ const refreshed = await refreshSession(path, session);
19
+ writeNotice(`Session refreshed. It now expires at ${refreshed.expiresAt}.`);
20
+ }
21
+ }
22
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/commands/auth/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAC,GAAG,GAAQ,MAAM,CAAC;IAEzB,MAAM,CAAU,WAAW,GACzB,0FAA0F,CAAC;IAE7F,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,mDAAmD;KACpD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,sCAAsC,EAAE;gBAClF,IAAI,EAAE,yBAAyB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,WAAW,CAAC,wCAAwC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import { BaseCommand } from "../../lib/base-command.js";
2
+ import { tokenInfo } from "../../lib/clients/oauth.js";
3
+ import { MeiliCliError } from "../../lib/errors.js";
4
+ import { ensureFreshSession } from "../../lib/session.js";
5
+ export default class AuthStatus extends BaseCommand {
6
+ static api = "none";
7
+ static description = "Say whether a session of `auth login` exists and whether the authorization server still accepts it.";
8
+ static examples = [
9
+ "<%= config.bin %> <%= command.id %>",
10
+ "<%= config.bin %> <%= command.id %> --output json",
11
+ ];
12
+ async run() {
13
+ const { path, session } = this.credentialsFile();
14
+ if (session === undefined) {
15
+ throw new MeiliCliError("cli_auth_missing", "Nobody is logged in on this machine.", {
16
+ hint: "Run `meili auth login`.",
17
+ });
18
+ }
19
+ // A spent access token is refreshed first, so the answer is what the next
20
+ // command would get, not what the file happens to hold.
21
+ const fresh = await ensureFreshSession(path, session);
22
+ const info = await tokenInfo(fresh);
23
+ if (info === undefined) {
24
+ throw new MeiliCliError("cli_auth_failed", "The authorization server no longer accepts this session.", { hint: "Run `meili auth login` to log in again." });
25
+ }
26
+ await this.output({
27
+ managementUrl: fresh.managementUrl,
28
+ scope: info.scope ?? fresh.scope,
29
+ expiresAt: info.expiresAt ?? fresh.expiresAt,
30
+ credentials: path,
31
+ });
32
+ }
33
+ }
34
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,GAAG,GAAQ,MAAM,CAAC;IAEzB,MAAM,CAAU,WAAW,GACzB,qGAAqG,CAAC;IAExG,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,mDAAmD;KACpD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,sCAAsC,EAAE;gBAClF,IAAI,EAAE,yBAAyB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,0EAA0E;QAC1E,wDAAwD;QACxD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,aAAa,CACrB,iBAAiB,EACjB,0DAA0D,EAC1D,EAAE,IAAI,EAAE,yCAAyC,EAAE,CACpD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC;YAChB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;YAC5C,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { BaseCommand } from "../../lib/base-command.js";
2
+ import { taskFilterFlags, taskFilterQuery } from "../../lib/task-filters.js";
3
+ export default class CancelTasks extends BaseCommand {
4
+ static api = "meilisearch";
5
+ static routes = ["POST /tasks/cancel"];
6
+ static keyActions = ["tasks.cancel"];
7
+ static description = "Cancel the enqueued and processing tasks matched by --ids, --statuses, --types and the other filters of the route.";
8
+ static examples = [
9
+ "<%= config.bin %> <%= command.id %> --project prod --ids 42,1344",
10
+ "<%= config.bin %> <%= command.id %> --project prod --ids 42 --output json",
11
+ "<%= config.bin %> <%= command.id %> --project prod --statuses enqueued --index-ids movies",
12
+ "<%= config.bin %> <%= command.id %> --project prod --statuses processing --wait",
13
+ ];
14
+ static flags = {
15
+ ...BaseCommand.connectionFlags,
16
+ ...taskFilterFlags,
17
+ ...BaseCommand.waitFlags,
18
+ };
19
+ async run() {
20
+ const { flags } = await this.parse(CancelTasks);
21
+ await this.outputTask(await this.meilisearch.tasks.cancelTasks(taskFilterQuery(flags)), flags);
22
+ }
23
+ }
24
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/commands/cancel/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAC,GAAG,GAAQ,aAAa,CAAC;IAEhC,MAAM,CAAC,MAAM,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAEvC,MAAM,CAAC,UAAU,GAAG,CAAC,cAAc,CAAC,CAAC;IAErC,MAAM,CAAU,WAAW,GACzB,oHAAoH,CAAC;IAEvH,MAAM,CAAU,QAAQ,GAAG;QACzB,kEAAkE;QAClE,2EAA2E;QAC3E,2FAA2F;QAC3F,iFAAiF;KAClF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,eAAe;QAC9B,GAAG,eAAe;QAClB,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { BaseCommand } from "../../lib/base-command.js";
2
+ import { redactBody } from "../../lib/config.js";
3
+ export default class ConfigList extends BaseCommand {
4
+ static api = "none";
5
+ static description = "Print the config file path and its projects as JSON, keys masked.";
6
+ static examples = [
7
+ "<%= config.bin %> <%= command.id %>",
8
+ "<%= config.bin %> <%= command.id %> --output json",
9
+ "MEILI_CONFIG=./meili.json <%= config.bin %> <%= command.id %>",
10
+ ];
11
+ async run() {
12
+ const file = this.configFile();
13
+ // Entry by entry: a project named `key` is not a secret.
14
+ const projects = Object.fromEntries(Object.entries(file.projects).map(([name, entry]) => [name, redactBody(entry)]));
15
+ await this.output({ path: file.path, projects });
16
+ }
17
+ }
18
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/config/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,GAAG,GAAQ,MAAM,CAAC;IAEzB,MAAM,CAAU,WAAW,GAAG,mEAAmE,CAAC;IAElG,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,mDAAmD;QACnD,+DAA+D;KAChE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,yDAAyD;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAChF,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;CACF"}