From 663f1f23e5bf25b1de718fdbf5e4387f14cfc6ca Mon Sep 17 00:00:00 2001 From: "F. Levi" <55688616+flevi29@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:41:25 +0300 Subject: [PATCH 1/5] Add export method feature --- .code-samples.meilisearch.yaml | 12 ++++++ .../workflows/meilisearch-prototype-tests.yml | 7 ++++ .github/workflows/pre-release-tests.yml | 7 ++++ .github/workflows/tests.yml | 7 ++++ docker-compose.yml | 8 ++++ src/meilisearch.ts | 10 +++++ src/types/export.ts | 30 +++++++++++++++ src/types/index.ts | 1 + src/types/task_and_batch.ts | 1 + tests/export.test.ts | 38 +++++++++++++++++++ 10 files changed, 121 insertions(+) create mode 100644 src/types/export.ts create mode 100644 tests/export.test.ts diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 5370f8281..8ce9606dd 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -858,3 +858,15 @@ search_parameter_reference_media_1: |- } } }) +export_post_1: |- + client.export({ + url: 'http://localhost:7711', + apiKey: null, + payloadSize: '123 MiB', + indexes: { + '*': { + filter: null, + overrideSettings: true + } + } + }) diff --git a/.github/workflows/meilisearch-prototype-tests.yml b/.github/workflows/meilisearch-prototype-tests.yml index 961598618..47f1d6f65 100644 --- a/.github/workflows/meilisearch-prototype-tests.yml +++ b/.github/workflows/meilisearch-prototype-tests.yml @@ -44,6 +44,13 @@ jobs: MEILI_NO_ANALYTICS: 'true' ports: - '7700:7700' + export-meilisearch: + image: getmeili/meilisearch:${{ needs.meilisearch-version.outputs.version }} + env: + MEILI_MASTER_KEY: 'masterKey' + MEILI_NO_ANALYTICS: 'true' + ports: + - '7701:7700' strategy: matrix: node: ['20', '22'] diff --git a/.github/workflows/pre-release-tests.yml b/.github/workflows/pre-release-tests.yml index cc27fd8a2..2a5c0ac6d 100644 --- a/.github/workflows/pre-release-tests.yml +++ b/.github/workflows/pre-release-tests.yml @@ -41,6 +41,13 @@ jobs: MEILI_NO_ANALYTICS: 'true' ports: - '7700:7700' + export-meilisearch: + image: getmeili/meilisearch:${{ needs.meilisearch-version.outputs.version }} + env: + MEILI_MASTER_KEY: 'masterKey' + MEILI_NO_ANALYTICS: 'true' + ports: + - '7701:7700' strategy: matrix: node: ['20', '22'] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c154680fa..fb115447f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,6 +33,13 @@ jobs: MEILI_NO_ANALYTICS: 'true' ports: - '7700:7700' + export-meilisearch: + image: getmeili/meilisearch:latest + env: + MEILI_MASTER_KEY: 'masterKey' + MEILI_NO_ANALYTICS: 'true' + ports: + - '7701:7700' strategy: fail-fast: false matrix: diff --git a/docker-compose.yml b/docker-compose.yml index cb0c9c7dc..c63271bae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,3 +20,11 @@ services: environment: - MEILI_MASTER_KEY=masterKey - MEILI_NO_ANALYTICS=true + + export-meilisearch: + image: getmeili/meilisearch + ports: + - "7701:7700" + environment: + - MEILI_MASTER_KEY=masterKey + - MEILI_NO_ANALYTICS=true diff --git a/src/meilisearch.ts b/src/meilisearch.ts index b2e7d7527..4976b1894 100644 --- a/src/meilisearch.ts +++ b/src/meilisearch.ts @@ -34,6 +34,7 @@ import type { ResultsWrapper, WebhookCreatePayload, WebhookUpdatePayload, + ExportOptions, } from "./types/index.js"; import { ErrorStatusCode } from "./types/index.js"; import { HttpRequests } from "./http-requests.js"; @@ -547,6 +548,15 @@ export class MeiliSearch { }); } + /// + /// EXPORT + /// + + /** {@link https://www.meilisearch.com/docs/reference/api/export} */ + export(options: ExportOptions): EnqueuedTaskPromise { + return this.#httpRequestsWithTask.post({ path: "export", body: options }); + } + /// /// EXPERIMENTAL-FEATURES /// diff --git a/src/types/export.ts b/src/types/export.ts new file mode 100644 index 000000000..de839d4aa --- /dev/null +++ b/src/types/export.ts @@ -0,0 +1,30 @@ +import type { Filter } from "./types.js"; + +/** + * {@link https://www.meilisearch.com/docs/reference/api/export#indexes} + * + * @see `meilisearch::routes::export::ExportIndexSettings` + */ +export type ExportIndexSettings = { + filter?: Filter; + overrideSettings?: boolean; +}; + +/** {@link https://www.meilisearch.com/docs/reference/api/export#indexes} */ +export type ExportIndexSettingsRecord = Record; + +/** + * {@link https://www.meilisearch.com/docs/reference/api/export#body} + * + * @see `meilisearch::routes::export::Export` + */ +export type ExportOptions = { + /** {@link https://www.meilisearch.com/docs/reference/api/export#url} */ + url: string; + /** {@link https://www.meilisearch.com/docs/reference/api/export#apikey} */ + apiKey?: string; + /** {@link https://www.meilisearch.com/docs/reference/api/export#payloadsize} */ + payloadSize?: string; + /** {@link https://www.meilisearch.com/docs/reference/api/export#indexes} */ + indexes?: ExportIndexSettingsRecord; +}; diff --git a/src/types/index.ts b/src/types/index.ts index 6d744c635..01f8ef9d7 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,5 @@ export * from "./experimental-features.js"; +export * from "./export.js"; export * from "./task_and_batch.js"; export * from "./token.js"; export * from "./types.js"; diff --git a/src/types/task_and_batch.ts b/src/types/task_and_batch.ts index 0c30212f6..01fc1b26c 100644 --- a/src/types/task_and_batch.ts +++ b/src/types/task_and_batch.ts @@ -52,6 +52,7 @@ export type TaskType = PascalToCamelCase< | "TaskDeletion" | "DumpCreation" | "SnapshotCreation" + | "Export" | "UpgradeDatabase" >; diff --git a/tests/export.test.ts b/tests/export.test.ts new file mode 100644 index 000000000..c43c9819d --- /dev/null +++ b/tests/export.test.ts @@ -0,0 +1,38 @@ +import { randomUUID } from "node:crypto"; +import { afterAll, beforeAll, test } from "vitest"; +import { assert, getClient } from "./utils/meilisearch-test-utils.js"; + +const INDEX_UID = randomUUID(); +const ms = await getClient("Master"); + +beforeAll(async () => { + const task = await ms.createIndex(INDEX_UID).waitTask(); + assert.isTaskSuccessful(task); + + const task2 = await ms + .index(INDEX_UID) + .addDocuments([{ id: 0, beep: "boop" }]) + .waitTask(); + assert.isTaskSuccessful(task2); +}); + +afterAll(async () => { + const task = await ms.deleteIndex(INDEX_UID).waitTask(); + assert.isTaskSuccessful(task); +}); + +test(`${ms.export.name} method`, async () => { + const task = await ms + .export({ + url: "http://127.0.0.1:7701", + apiKey: "masterKey", + payloadSize: "50MiB", + indexes: { + [INDEX_UID]: { filter: "beep = boop", overrideSettings: true }, + }, + }) + .waitTask({ timeout: 60_000 }); + + assert.isTaskSuccessful(task); + assert.strictEqual(task.type, "export"); +}); From e82ddc08b5aacf13b56557860bbba52e7d5829fa Mon Sep 17 00:00:00 2001 From: "F. Levi" <55688616+flevi29@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:51:44 +0300 Subject: [PATCH 2/5] Fix type error --- tests/utils/meilisearch-test-utils.ts | 1 + tests/utils/tasks-and-batches.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/utils/meilisearch-test-utils.ts b/tests/utils/meilisearch-test-utils.ts index 234e502d5..afb03ddf5 100644 --- a/tests/utils/meilisearch-test-utils.ts +++ b/tests/utils/meilisearch-test-utils.ts @@ -199,6 +199,7 @@ const source = { taskDeletion: null, dumpCreation: null, snapshotCreation: null, + export: null, upgradeDatabase: null, }), ); diff --git a/tests/utils/tasks-and-batches.ts b/tests/utils/tasks-and-batches.ts index 79a56ae7c..f438c8de9 100644 --- a/tests/utils/tasks-and-batches.ts +++ b/tests/utils/tasks-and-batches.ts @@ -29,6 +29,7 @@ export const possibleTaskTypes = objectKeys({ taskDeletion: null, dumpCreation: null, snapshotCreation: null, + export: null, upgradeDatabase: null, }); From b9d1a4753865f76ea6ad2e561168b548c3f50b82 Mon Sep 17 00:00:00 2001 From: "F. Levi" <55688616+flevi29@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:01:11 +0300 Subject: [PATCH 3/5] Fix conflicting port --- .github/workflows/meilisearch-prototype-tests.yml | 2 +- .github/workflows/pre-release-tests.yml | 2 +- .github/workflows/tests.yml | 2 +- docker-compose.yml | 2 +- tests/export.test.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/meilisearch-prototype-tests.yml b/.github/workflows/meilisearch-prototype-tests.yml index 47f1d6f65..0e29e984a 100644 --- a/.github/workflows/meilisearch-prototype-tests.yml +++ b/.github/workflows/meilisearch-prototype-tests.yml @@ -50,7 +50,7 @@ jobs: MEILI_MASTER_KEY: 'masterKey' MEILI_NO_ANALYTICS: 'true' ports: - - '7701:7700' + - '7702:7700' strategy: matrix: node: ['20', '22'] diff --git a/.github/workflows/pre-release-tests.yml b/.github/workflows/pre-release-tests.yml index 2a5c0ac6d..905be4a9b 100644 --- a/.github/workflows/pre-release-tests.yml +++ b/.github/workflows/pre-release-tests.yml @@ -47,7 +47,7 @@ jobs: MEILI_MASTER_KEY: 'masterKey' MEILI_NO_ANALYTICS: 'true' ports: - - '7701:7700' + - '7702:7700' strategy: matrix: node: ['20', '22'] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fb115447f..9dd00d057 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -39,7 +39,7 @@ jobs: MEILI_MASTER_KEY: 'masterKey' MEILI_NO_ANALYTICS: 'true' ports: - - '7701:7700' + - '7702:7700' strategy: fail-fast: false matrix: diff --git a/docker-compose.yml b/docker-compose.yml index c63271bae..aaf8aaf9b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: export-meilisearch: image: getmeili/meilisearch ports: - - "7701:7700" + - "7702:7700" environment: - MEILI_MASTER_KEY=masterKey - MEILI_NO_ANALYTICS=true diff --git a/tests/export.test.ts b/tests/export.test.ts index c43c9819d..ff3f162b4 100644 --- a/tests/export.test.ts +++ b/tests/export.test.ts @@ -24,7 +24,7 @@ afterAll(async () => { test(`${ms.export.name} method`, async () => { const task = await ms .export({ - url: "http://127.0.0.1:7701", + url: "http://127.0.0.1:7702", apiKey: "masterKey", payloadSize: "50MiB", indexes: { From f0b5896f5c83f63249a3da7218d4240911098936 Mon Sep 17 00:00:00 2001 From: "F. Levi" <55688616+flevi29@users.noreply.github.com> Date: Thu, 2 Oct 2025 10:07:56 +0300 Subject: [PATCH 4/5] Update .code-samples.meilisearch.yaml Co-authored-by: Laurent Cazanove --- .code-samples.meilisearch.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 8ce9606dd..a31d7a654 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -860,12 +860,9 @@ search_parameter_reference_media_1: |- }) export_post_1: |- client.export({ - url: 'http://localhost:7711', - apiKey: null, - payloadSize: '123 MiB', + url: 'TARGET_INSTANCE_URL', indexes: { '*': { - filter: null, overrideSettings: true } } From 99fd3ae644f2075a215337d6f25c7ebbef483f6c Mon Sep 17 00:00:00 2001 From: "F. Levi" <55688616+flevi29@users.noreply.github.com> Date: Thu, 2 Oct 2025 12:07:54 +0300 Subject: [PATCH 5/5] Try fix test --- .github/workflows/tests.yml | 2 -- docker-compose.yml | 10 ++++++++-- tests/export.test.ts | 12 +++++++----- tests/utils/meilisearch-test-utils.ts | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9dd00d057..4ee53252b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,8 +38,6 @@ jobs: env: MEILI_MASTER_KEY: 'masterKey' MEILI_NO_ANALYTICS: 'true' - ports: - - '7702:7700' strategy: fail-fast: false matrix: diff --git a/docker-compose.yml b/docker-compose.yml index aaf8aaf9b..ccaea6d2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,11 +20,17 @@ services: environment: - MEILI_MASTER_KEY=masterKey - MEILI_NO_ANALYTICS=true + networks: + - ms-network export-meilisearch: image: getmeili/meilisearch - ports: - - "7702:7700" environment: - MEILI_MASTER_KEY=masterKey - MEILI_NO_ANALYTICS=true + networks: + - ms-network + +networks: + ms-network: + driver: bridge diff --git a/tests/export.test.ts b/tests/export.test.ts index ff3f162b4..76909377d 100644 --- a/tests/export.test.ts +++ b/tests/export.test.ts @@ -9,11 +9,13 @@ beforeAll(async () => { const task = await ms.createIndex(INDEX_UID).waitTask(); assert.isTaskSuccessful(task); - const task2 = await ms - .index(INDEX_UID) - .addDocuments([{ id: 0, beep: "boop" }]) - .waitTask(); + const idx = ms.index(INDEX_UID); + + const task2 = await idx.updateFilterableAttributes(["beep"]).waitTask(); assert.isTaskSuccessful(task2); + + const task3 = await idx.addDocuments([{ id: 0, beep: "boop" }]).waitTask(); + assert.isTaskSuccessful(task3); }); afterAll(async () => { @@ -24,7 +26,7 @@ afterAll(async () => { test(`${ms.export.name} method`, async () => { const task = await ms .export({ - url: "http://127.0.0.1:7702", + url: "http://export-meilisearch:7700", apiKey: "masterKey", payloadSize: "50MiB", indexes: { diff --git a/tests/utils/meilisearch-test-utils.ts b/tests/utils/meilisearch-test-utils.ts index afb03ddf5..b5e397565 100644 --- a/tests/utils/meilisearch-test-utils.ts +++ b/tests/utils/meilisearch-test-utils.ts @@ -155,7 +155,7 @@ const source = { }, isTask(task: Task) { const { length } = Object.keys(task); - vitestAssert(length >= 11 && length <= 12); + vitestAssert(length >= 11 && length <= 13); const { indexUid, status,