Skip to content

Commit 9f850fa

Browse files
committed
Merge branch 'main' into jsr
2 parents d01a22c + 77505c0 commit 9f850fa

12 files changed

+405
-329
lines changed

.github/workflows/meilisearch-prototype-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ name: Meilisearch prototype tests
33

44
env:
55
HUSKY: 0
6+
NODE_OPTIONS: '--trace-warnings'
67

78
# Will only run for PRs and pushes to *-beta
89
on:

.github/workflows/pre-release-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ name: Pre-Release Tests
33

44
env:
55
HUSKY: 0
6+
NODE_OPTIONS: '--trace-warnings'
67

78
# Will only run for PRs and pushes to bump-meilisearch-v*
89
on:

.github/workflows/tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ name: Tests
22

33
env:
44
HUSKY: 0
5+
NODE_OPTIONS: '--trace-warnings'
56

67
on:
78
pull_request:

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,21 @@
7272
"devDependencies": {
7373
"@eslint/js": "^9.23.0",
7474
"@vitest/coverage-v8": "^3.1.1",
75-
"@types/node": "^22.13.15",
75+
"@types/node": "^22.15.3",
7676
"@typescript-eslint/utils": "^8.29.0",
7777
"@vitest/eslint-plugin": "^1.1.38",
78-
"eslint": "^9.23.0",
79-
"eslint-config-prettier": "^10.1.1",
78+
"eslint": "^9.25.1",
79+
"eslint-config-prettier": "^10.1.2",
8080
"eslint-plugin-tsdoc": "^0.4.0",
81-
"typescript": "^5.8.2",
82-
"vite": "^6.2.6",
81+
"typescript": "^5.8.3",
82+
"vite": "^6.3.4",
8383
"globals": "^16.0.0",
8484
"husky": "^9.1.7",
85-
"lint-staged": "15.5.0",
85+
"lint-staged": "15.5.1",
8686
"prettier": "^3.5.3",
8787
"prettier-plugin-jsdoc": "^1.3.2",
88-
"typedoc": "^0.28.1",
89-
"typescript-eslint": "^8.29.0",
88+
"typedoc": "^0.28.3",
89+
"typescript-eslint": "^8.31.1",
9090
"vitest": "^3.1.1"
9191
},
9292
"packageManager": "[email protected]"

src/meilisearch.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import type {
2828
ExtraRequestInit,
2929
Network,
3030
RecordAny,
31+
RuntimeTogglableFeatures,
3132
} from "./types/index.js";
3233
import { ErrorStatusCode } from "./types/index.js";
3334
import { HttpRequests } from "./http-requests.js";
@@ -454,4 +455,25 @@ export class MeiliSearch {
454455
path: "snapshots",
455456
});
456457
}
458+
459+
///
460+
/// EXPERIMENTAL-FEATURES
461+
///
462+
463+
/** {@link https://www.meilisearch.com/docs/reference/api/experimental_features#get-all-experimental-features} */
464+
async getExperimentalFeatures(): Promise<RuntimeTogglableFeatures> {
465+
return await this.httpRequest.get({
466+
path: "experimental-features",
467+
});
468+
}
469+
470+
/** {@link https://www.meilisearch.com/docs/reference/api/experimental_features#configure-experimental-features} */
471+
async updateExperimentalFeatures(
472+
runtimeTogglableFeatures: RuntimeTogglableFeatures,
473+
): Promise<RuntimeTogglableFeatures> {
474+
return await this.httpRequest.patch({
475+
path: "experimental-features",
476+
body: runtimeTogglableFeatures,
477+
});
478+
}
457479
}

src/types/experimental-features.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* {@link https://www.meilisearch.com/docs/reference/api/experimental_features#experimental-features-object}
3+
*
4+
* @see `meilisearch::routes::features::RuntimeTogglableFeatures`
5+
*/
6+
export type RuntimeTogglableFeatures = {
7+
metrics?: boolean | null;
8+
logsRoute?: boolean | null;
9+
editDocumentsByFunction?: boolean | null;
10+
containsFilter?: boolean | null;
11+
network?: boolean | null;
12+
getTaskDocumentsRoute?: boolean | null;
13+
compositeEmbedders?: boolean | null;
14+
};

src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
export * from "./experimental-features.js";
12
export * from "./task_and_batch.js";
23
export * from "./token.js";
34
export * from "./types.js";

tests/documents.test.ts

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -680,17 +680,13 @@ describe("Documents tests", () => {
680680
test(`${permission} key: test updateDocumentsByFunction`, async () => {
681681
const client = await getClient(permission);
682682
const index = client.index<(typeof dataset)[number]>(indexPk.uid);
683-
const adminKey = await getKey("Admin");
684683

685684
await index.updateFilterableAttributes(["id"]).waitTask();
686685

687-
await fetch(`${HOST}/experimental-features`, {
688-
body: JSON.stringify({ editDocumentsByFunction: true }),
689-
headers: {
690-
Authorization: `Bearer ${adminKey}`,
691-
"Content-Type": "application/json",
692-
},
693-
method: "PATCH",
686+
await (
687+
await getClient("Master")
688+
).updateExperimentalFeatures({
689+
editDocumentsByFunction: true,
694690
});
695691

696692
await index.addDocuments(dataset).waitTask();
@@ -761,15 +757,11 @@ describe("Documents tests", () => {
761757

762758
test(`${permission} key: Try updateDocumentsByFunction and be denied`, async () => {
763759
const client = await getClient(permission);
764-
const adminKey = await getKey("Admin");
765760

766-
await fetch(`${HOST}/experimental-features`, {
767-
body: JSON.stringify({ editDocumentsByFunction: true }),
768-
headers: {
769-
Authorization: `Bearer ${adminKey}`,
770-
"Content-Type": "application/json",
771-
},
772-
method: "PATCH",
761+
await (
762+
await getClient("Master")
763+
).updateExperimentalFeatures({
764+
editDocumentsByFunction: true,
773765
});
774766

775767
await expect(
@@ -848,15 +840,11 @@ describe("Documents tests", () => {
848840

849841
test(`${permission} key: Try updateDocumentsByFunction and be denied`, async () => {
850842
const client = await getClient(permission);
851-
const adminKey = await getKey("Admin");
852843

853-
await fetch(`${HOST}/experimental-features`, {
854-
body: JSON.stringify({ editDocumentsByFunction: true }),
855-
headers: {
856-
Authorization: `Bearer ${adminKey}`,
857-
"Content-Type": "application/json",
858-
},
859-
method: "PATCH",
844+
await (
845+
await getClient("Master")
846+
).updateExperimentalFeatures({
847+
editDocumentsByFunction: true,
860848
});
861849

862850
await expect(
@@ -962,15 +950,11 @@ describe("Documents tests", () => {
962950
const route = `indexes/${indexPk.uid}/documents/edit`;
963951
const client = new MeiliSearch({ host });
964952
const strippedHost = trailing ? host.slice(0, -1) : host;
965-
const adminKey = await getKey("Admin");
966-
967-
await fetch(`${HOST}/experimental-features`, {
968-
body: JSON.stringify({ editDocumentsByFunction: true }),
969-
headers: {
970-
Authorization: `Bearer ${adminKey}`,
971-
"Content-Type": "application/json",
972-
},
973-
method: "PATCH",
953+
954+
await (
955+
await getClient("Master")
956+
).updateExperimentalFeatures({
957+
editDocumentsByFunction: true,
974958
});
975959

976960
await expect(

tests/embedders.test.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import {
66
BAD_HOST,
77
MeiliSearch,
88
getClient,
9-
getKey,
10-
HOST,
9+
masterClient,
1110
} from "./utils/meilisearch-test-utils.js";
1211

1312
const index = {
@@ -239,16 +238,9 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(
239238
});
240239

241240
test(`${permission} key: Update embedders with composite embedder`, async () => {
242-
const adminKey = await getKey("Admin");
243-
244241
// first enable the network endpoint.
245-
await fetch(`${HOST}/experimental-features`, {
246-
body: JSON.stringify({ compositeEmbedders: true }),
247-
headers: {
248-
Authorization: `Bearer ${adminKey}`,
249-
"Content-Type": "application/json",
250-
},
251-
method: "PATCH",
242+
await masterClient.updateExperimentalFeatures({
243+
compositeEmbedders: true,
252244
});
253245

254246
const client = await getClient(permission);

tests/experimental-features.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { afterAll, test } from "vitest";
2+
import { assert, getClient } from "./utils/meilisearch-test-utils.js";
3+
import type { RuntimeTogglableFeatures } from "../src/index.js";
4+
5+
const ms = await getClient("Master");
6+
7+
afterAll(async () => {
8+
await ms.updateExperimentalFeatures({
9+
metrics: false,
10+
logsRoute: false,
11+
editDocumentsByFunction: false,
12+
containsFilter: false,
13+
network: false,
14+
getTaskDocumentsRoute: false,
15+
compositeEmbedders: false,
16+
} satisfies { [TKey in keyof RuntimeTogglableFeatures]-?: false });
17+
});
18+
19+
test(`${ms.updateExperimentalFeatures.name} and ${ms.getExperimentalFeatures.name} methods`, async () => {
20+
const features: { [TKey in keyof RuntimeTogglableFeatures]-?: true } = {
21+
metrics: true,
22+
logsRoute: true,
23+
editDocumentsByFunction: true,
24+
containsFilter: true,
25+
network: true,
26+
getTaskDocumentsRoute: true,
27+
compositeEmbedders: true,
28+
};
29+
30+
const updateFeatures = await ms.updateExperimentalFeatures(features);
31+
assert.deepEqual(updateFeatures, features);
32+
33+
const getFeatures = await ms.getExperimentalFeatures();
34+
assert.deepEqual(getFeatures, features);
35+
});

0 commit comments

Comments
 (0)