@better-i18n/mcp 0.15.2 → 0.15.4
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.
- package/dist/__tests__/base-tool.test.d.ts +2 -0
- package/dist/__tests__/base-tool.test.d.ts.map +1 -0
- package/dist/__tests__/base-tool.test.js +193 -0
- package/dist/__tests__/base-tool.test.js.map +1 -0
- package/dist/__tests__/contract.test.d.ts +24 -0
- package/dist/__tests__/contract.test.d.ts.map +1 -0
- package/dist/__tests__/contract.test.js +919 -0
- package/dist/__tests__/contract.test.js.map +1 -0
- package/dist/__tests__/fixtures/mock-client.d.ts +11 -0
- package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mock-client.js +33 -0
- package/dist/__tests__/fixtures/mock-client.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +10 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +27 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/schema-alignment.test.d.ts +15 -0
- package/dist/__tests__/schema-alignment.test.d.ts.map +1 -0
- package/dist/__tests__/schema-alignment.test.js +1011 -0
- package/dist/__tests__/schema-alignment.test.js.map +1 -0
- package/dist/__tests__/server-dispatch.test.d.ts +10 -0
- package/dist/__tests__/server-dispatch.test.d.ts.map +1 -0
- package/dist/__tests__/server-dispatch.test.js +202 -0
- package/dist/__tests__/server-dispatch.test.js.map +1 -0
- package/dist/tools/__tests__/createKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/createKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/createKeys.test.js +139 -0
- package/dist/tools/__tests__/createKeys.test.js.map +1 -0
- package/dist/tools/__tests__/deleteKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/deleteKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/deleteKeys.test.js +91 -0
- package/dist/tools/__tests__/deleteKeys.test.js.map +1 -0
- package/dist/tools/__tests__/getPendingChanges.test.d.ts +2 -0
- package/dist/tools/__tests__/getPendingChanges.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getPendingChanges.test.js +50 -0
- package/dist/tools/__tests__/getPendingChanges.test.js.map +1 -0
- package/dist/tools/__tests__/getProject.test.d.ts +2 -0
- package/dist/tools/__tests__/getProject.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getProject.test.js +55 -0
- package/dist/tools/__tests__/getProject.test.js.map +1 -0
- package/dist/tools/__tests__/getSync.test.d.ts +2 -0
- package/dist/tools/__tests__/getSync.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getSync.test.js +42 -0
- package/dist/tools/__tests__/getSync.test.js.map +1 -0
- package/dist/tools/__tests__/getSyncs.test.d.ts +2 -0
- package/dist/tools/__tests__/getSyncs.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getSyncs.test.js +66 -0
- package/dist/tools/__tests__/getSyncs.test.js.map +1 -0
- package/dist/tools/__tests__/getTranslations.test.d.ts +2 -0
- package/dist/tools/__tests__/getTranslations.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getTranslations.test.js +114 -0
- package/dist/tools/__tests__/getTranslations.test.js.map +1 -0
- package/dist/tools/__tests__/listKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/listKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listKeys.test.js +98 -0
- package/dist/tools/__tests__/listKeys.test.js.map +1 -0
- package/dist/tools/__tests__/listProjects.test.d.ts +2 -0
- package/dist/tools/__tests__/listProjects.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listProjects.test.js +45 -0
- package/dist/tools/__tests__/listProjects.test.js.map +1 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts +2 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts.map +1 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.js +87 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.js.map +1 -0
- package/dist/tools/__tests__/proposeLanguages.test.d.ts +2 -0
- package/dist/tools/__tests__/proposeLanguages.test.d.ts.map +1 -0
- package/dist/tools/__tests__/proposeLanguages.test.js +109 -0
- package/dist/tools/__tests__/proposeLanguages.test.js.map +1 -0
- package/dist/tools/__tests__/publishTranslations.test.d.ts +2 -0
- package/dist/tools/__tests__/publishTranslations.test.d.ts.map +1 -0
- package/dist/tools/__tests__/publishTranslations.test.js +127 -0
- package/dist/tools/__tests__/publishTranslations.test.js.map +1 -0
- package/dist/tools/__tests__/updateKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/updateKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/updateKeys.test.js +122 -0
- package/dist/tools/__tests__/updateKeys.test.js.map +1 -0
- package/dist/tools/createKeys.d.ts.map +1 -1
- package/dist/tools/createKeys.js +11 -2
- package/dist/tools/createKeys.js.map +1 -1
- package/dist/tools/getTranslations.d.ts.map +1 -1
- package/dist/tools/getTranslations.js +5 -1
- package/dist/tools/getTranslations.js.map +1 -1
- package/dist/tools/listKeys.d.ts.map +1 -1
- package/dist/tools/listKeys.js +1 -0
- package/dist/tools/listKeys.js.map +1 -1
- package/dist/tools/updateKeys.d.ts.map +1 -1
- package/dist/tools/updateKeys.js +9 -3
- package/dist/tools/updateKeys.js.map +1 -1
- package/dist/worker.test.d.ts +16 -0
- package/dist/worker.test.d.ts.map +1 -0
- package/dist/worker.test.js +244 -0
- package/dist/worker.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { getPendingChanges } from "../getPendingChanges.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockPendingChangesData = {
|
|
6
|
+
hasPendingChanges: true,
|
|
7
|
+
summary: {
|
|
8
|
+
translations: 5,
|
|
9
|
+
deletedKeys: 0,
|
|
10
|
+
languageChanges: 1,
|
|
11
|
+
total: 6,
|
|
12
|
+
},
|
|
13
|
+
byLanguage: {
|
|
14
|
+
tr: { count: 5, samples: ["auth.login.title"] },
|
|
15
|
+
},
|
|
16
|
+
deletedKeys: [],
|
|
17
|
+
publishDestination: "cdn",
|
|
18
|
+
cannotPublishReason: null,
|
|
19
|
+
};
|
|
20
|
+
describe("getPendingChanges", () => {
|
|
21
|
+
it("rejects missing project → isError", async () => {
|
|
22
|
+
const client = createMockClient();
|
|
23
|
+
const result = await getPendingChanges.execute(client, {});
|
|
24
|
+
expect(isErrorResult(result)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it("calls API with correct orgSlug and projectSlug", async () => {
|
|
27
|
+
const queryFn = vi.fn().mockResolvedValue(mockPendingChangesData);
|
|
28
|
+
const client = createMockClient({ mcp: { getPendingChanges: { query: queryFn } } });
|
|
29
|
+
await getPendingChanges.execute(client, { project: "my-org/my-project" });
|
|
30
|
+
expect(queryFn).toHaveBeenCalledWith({
|
|
31
|
+
orgSlug: "my-org",
|
|
32
|
+
projectSlug: "my-project",
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
it("returns API response as success", async () => {
|
|
36
|
+
const queryFn = vi.fn().mockResolvedValue(mockPendingChangesData);
|
|
37
|
+
const client = createMockClient({ mcp: { getPendingChanges: { query: queryFn } } });
|
|
38
|
+
const result = await getPendingChanges.execute(client, { project: "my-org/my-project" });
|
|
39
|
+
const data = expectSuccess(result);
|
|
40
|
+
expect(data).toMatchObject({ hasPendingChanges: true, publishDestination: "cdn" });
|
|
41
|
+
});
|
|
42
|
+
it("returns isError when API throws", async () => {
|
|
43
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Forbidden"));
|
|
44
|
+
const client = createMockClient({ mcp: { getPendingChanges: { query: queryFn } } });
|
|
45
|
+
const result = await getPendingChanges.execute(client, { project: "my-org/my-project" });
|
|
46
|
+
expect(isErrorResult(result)).toBe(true);
|
|
47
|
+
expect(expectError(result)).toContain("Forbidden");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=getPendingChanges.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPendingChanges.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/getPendingChanges.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getProject.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/getProject.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { getProject } from "../getProject.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockProjectData = {
|
|
6
|
+
id: "proj-1",
|
|
7
|
+
slug: "my-project",
|
|
8
|
+
name: "My Project",
|
|
9
|
+
orgSlug: "my-org",
|
|
10
|
+
namespaces: [{ name: "auth", keyCount: 10 }],
|
|
11
|
+
languages: [{ code: "tr", status: "active" }],
|
|
12
|
+
keyCount: 42,
|
|
13
|
+
cdn: {
|
|
14
|
+
baseUrl: "https://cdn.better-i18n.com/my-org/my-project",
|
|
15
|
+
pattern: "https://cdn.better-i18n.com/my-org/my-project/{locale}/{namespace}.json",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
describe("getProject", () => {
|
|
19
|
+
it("rejects missing project → isError", async () => {
|
|
20
|
+
const client = createMockClient();
|
|
21
|
+
const result = await getProject.execute(client, {});
|
|
22
|
+
expect(isErrorResult(result)).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("rejects invalid project format → isError", async () => {
|
|
25
|
+
const client = createMockClient();
|
|
26
|
+
const result = await getProject.execute(client, { project: "no-slash" });
|
|
27
|
+
expect(isErrorResult(result)).toBe(true);
|
|
28
|
+
const msg = expectError(result);
|
|
29
|
+
expect(msg).toContain("Invalid project format");
|
|
30
|
+
});
|
|
31
|
+
it("calls API with correct orgSlug and projectSlug", async () => {
|
|
32
|
+
const queryFn = vi.fn().mockResolvedValue(mockProjectData);
|
|
33
|
+
const client = createMockClient({ mcp: { getProject: { query: queryFn } } });
|
|
34
|
+
await getProject.execute(client, { project: "my-org/my-project" });
|
|
35
|
+
expect(queryFn).toHaveBeenCalledWith({
|
|
36
|
+
orgSlug: "my-org",
|
|
37
|
+
projectSlug: "my-project",
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
it("returns API response as success", async () => {
|
|
41
|
+
const queryFn = vi.fn().mockResolvedValue(mockProjectData);
|
|
42
|
+
const client = createMockClient({ mcp: { getProject: { query: queryFn } } });
|
|
43
|
+
const result = await getProject.execute(client, { project: "my-org/my-project" });
|
|
44
|
+
const data = expectSuccess(result);
|
|
45
|
+
expect(data).toMatchObject({ slug: "my-project", keyCount: 42 });
|
|
46
|
+
});
|
|
47
|
+
it("returns isError when API throws", async () => {
|
|
48
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Project not found"));
|
|
49
|
+
const client = createMockClient({ mcp: { getProject: { query: queryFn } } });
|
|
50
|
+
const result = await getProject.execute(client, { project: "my-org/my-project" });
|
|
51
|
+
expect(isErrorResult(result)).toBe(true);
|
|
52
|
+
expect(expectError(result)).toContain("Project not found");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=getProject.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getProject.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/getProject.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSync.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/getSync.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { getSync } from "../getSync.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockSyncData = {
|
|
6
|
+
id: "sync-123",
|
|
7
|
+
type: "source_sync",
|
|
8
|
+
status: "completed",
|
|
9
|
+
projectId: "proj-1",
|
|
10
|
+
createdAt: "2024-01-01T00:00:00Z",
|
|
11
|
+
completedAt: "2024-01-01T00:01:00Z",
|
|
12
|
+
logs: ["Imported 15 keys", "Sync completed successfully"],
|
|
13
|
+
affectedKeys: ["auth.login.title", "auth.logout.button"],
|
|
14
|
+
};
|
|
15
|
+
describe("getSync", () => {
|
|
16
|
+
it("rejects missing syncId → isError", async () => {
|
|
17
|
+
const client = createMockClient();
|
|
18
|
+
const result = await getSync.execute(client, {});
|
|
19
|
+
expect(isErrorResult(result)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it("calls API with correct syncId", async () => {
|
|
22
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncData);
|
|
23
|
+
const client = createMockClient({ mcp: { getSync: { query: queryFn } } });
|
|
24
|
+
await getSync.execute(client, { syncId: "sync-123" });
|
|
25
|
+
expect(queryFn).toHaveBeenCalledWith({ syncId: "sync-123" });
|
|
26
|
+
});
|
|
27
|
+
it("returns API response as success", async () => {
|
|
28
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncData);
|
|
29
|
+
const client = createMockClient({ mcp: { getSync: { query: queryFn } } });
|
|
30
|
+
const result = await getSync.execute(client, { syncId: "sync-123" });
|
|
31
|
+
const data = expectSuccess(result);
|
|
32
|
+
expect(data).toMatchObject({ id: "sync-123", type: "source_sync", status: "completed" });
|
|
33
|
+
});
|
|
34
|
+
it("returns isError when API throws", async () => {
|
|
35
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Sync not found"));
|
|
36
|
+
const client = createMockClient({ mcp: { getSync: { query: queryFn } } });
|
|
37
|
+
const result = await getSync.execute(client, { syncId: "sync-999" });
|
|
38
|
+
expect(isErrorResult(result)).toBe(true);
|
|
39
|
+
expect(expectError(result)).toContain("Sync not found");
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=getSync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSync.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/getSync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSyncs.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/getSyncs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { getSyncs } from "../getSyncs.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockSyncsData = {
|
|
6
|
+
syncs: [
|
|
7
|
+
{
|
|
8
|
+
id: "sync-1",
|
|
9
|
+
type: "source_sync",
|
|
10
|
+
status: "completed",
|
|
11
|
+
createdAt: "2024-01-01T00:00:00Z",
|
|
12
|
+
completedAt: "2024-01-01T00:01:00Z",
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
total: 1,
|
|
16
|
+
};
|
|
17
|
+
describe("getSyncs", () => {
|
|
18
|
+
it("rejects missing project → isError", async () => {
|
|
19
|
+
const client = createMockClient();
|
|
20
|
+
const result = await getSyncs.execute(client, {});
|
|
21
|
+
expect(isErrorResult(result)).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
it("accepts minimal input (project only)", async () => {
|
|
24
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncsData);
|
|
25
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
26
|
+
const result = await getSyncs.execute(client, { project: "my-org/my-project" });
|
|
27
|
+
expect(isErrorResult(result)).toBe(false);
|
|
28
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({
|
|
29
|
+
orgSlug: "my-org",
|
|
30
|
+
projectSlug: "my-project",
|
|
31
|
+
}));
|
|
32
|
+
});
|
|
33
|
+
it("passes optional limit filter", async () => {
|
|
34
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncsData);
|
|
35
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
36
|
+
await getSyncs.execute(client, { project: "my-org/my-project", limit: 10 });
|
|
37
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ limit: 10 }));
|
|
38
|
+
});
|
|
39
|
+
it("passes optional status filter", async () => {
|
|
40
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncsData);
|
|
41
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
42
|
+
await getSyncs.execute(client, { project: "my-org/my-project", status: "completed" });
|
|
43
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ status: "completed" }));
|
|
44
|
+
});
|
|
45
|
+
it("passes optional type filter", async () => {
|
|
46
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncsData);
|
|
47
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
48
|
+
await getSyncs.execute(client, { project: "my-org/my-project", type: "source_sync" });
|
|
49
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ type: "source_sync" }));
|
|
50
|
+
});
|
|
51
|
+
it("returns API response as success", async () => {
|
|
52
|
+
const queryFn = vi.fn().mockResolvedValue(mockSyncsData);
|
|
53
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
54
|
+
const result = await getSyncs.execute(client, { project: "my-org/my-project" });
|
|
55
|
+
const data = expectSuccess(result);
|
|
56
|
+
expect(data).toMatchObject({ total: 1 });
|
|
57
|
+
});
|
|
58
|
+
it("returns isError when API throws", async () => {
|
|
59
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Timeout"));
|
|
60
|
+
const client = createMockClient({ mcp: { getSyncs: { query: queryFn } } });
|
|
61
|
+
const result = await getSyncs.execute(client, { project: "my-org/my-project" });
|
|
62
|
+
expect(isErrorResult(result)).toBe(true);
|
|
63
|
+
expect(expectError(result)).toContain("Timeout");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=getSyncs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSyncs.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/getSyncs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTranslations.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/getTranslations.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { getTranslations } from "../getTranslations.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockTranslationsData = {
|
|
6
|
+
returned: 5,
|
|
7
|
+
total: 100,
|
|
8
|
+
hasMore: false,
|
|
9
|
+
keys: [
|
|
10
|
+
{
|
|
11
|
+
id: "key-1",
|
|
12
|
+
name: "auth.login.title",
|
|
13
|
+
namespace: "auth",
|
|
14
|
+
sourceText: "Login",
|
|
15
|
+
translations: { tr: { text: "Giriş", status: "published" } },
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
namespaceDetails: {},
|
|
19
|
+
};
|
|
20
|
+
describe("getTranslations", () => {
|
|
21
|
+
it("rejects missing project → isError", async () => {
|
|
22
|
+
const client = createMockClient();
|
|
23
|
+
const result = await getTranslations.execute(client, {});
|
|
24
|
+
expect(isErrorResult(result)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it("accepts project-only input → calls API with minimal params", async () => {
|
|
27
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
28
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
29
|
+
const result = await getTranslations.execute(client, { project: "my-org/my-project" });
|
|
30
|
+
expect(isErrorResult(result)).toBe(false);
|
|
31
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({
|
|
32
|
+
orgSlug: "my-org",
|
|
33
|
+
projectSlug: "my-project",
|
|
34
|
+
}));
|
|
35
|
+
});
|
|
36
|
+
it("passes search filter (string)", async () => {
|
|
37
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
38
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
39
|
+
await getTranslations.execute(client, {
|
|
40
|
+
project: "my-org/my-project",
|
|
41
|
+
search: "login",
|
|
42
|
+
});
|
|
43
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ search: "login" }));
|
|
44
|
+
});
|
|
45
|
+
it("passes search filter (array of strings)", async () => {
|
|
46
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
47
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
48
|
+
await getTranslations.execute(client, {
|
|
49
|
+
project: "my-org/my-project",
|
|
50
|
+
search: ["login", "signup"],
|
|
51
|
+
});
|
|
52
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ search: ["login", "signup"] }));
|
|
53
|
+
});
|
|
54
|
+
it("passes languages filter", async () => {
|
|
55
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
56
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
57
|
+
await getTranslations.execute(client, {
|
|
58
|
+
project: "my-org/my-project",
|
|
59
|
+
languages: ["tr", "de"],
|
|
60
|
+
});
|
|
61
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ languages: ["tr", "de"] }));
|
|
62
|
+
});
|
|
63
|
+
it("passes namespaces filter", async () => {
|
|
64
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
65
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
66
|
+
await getTranslations.execute(client, {
|
|
67
|
+
project: "my-org/my-project",
|
|
68
|
+
namespaces: ["auth", "common"],
|
|
69
|
+
});
|
|
70
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ namespaces: ["auth", "common"] }));
|
|
71
|
+
});
|
|
72
|
+
it("passes keys filter", async () => {
|
|
73
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
74
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
75
|
+
await getTranslations.execute(client, {
|
|
76
|
+
project: "my-org/my-project",
|
|
77
|
+
keys: ["auth.login.title", "auth.login.button"],
|
|
78
|
+
});
|
|
79
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ keys: ["auth.login.title", "auth.login.button"] }));
|
|
80
|
+
});
|
|
81
|
+
it("passes status filter", async () => {
|
|
82
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
83
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
84
|
+
await getTranslations.execute(client, {
|
|
85
|
+
project: "my-org/my-project",
|
|
86
|
+
status: "missing",
|
|
87
|
+
});
|
|
88
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ status: "missing" }));
|
|
89
|
+
});
|
|
90
|
+
it("passes limit", async () => {
|
|
91
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
92
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
93
|
+
await getTranslations.execute(client, {
|
|
94
|
+
project: "my-org/my-project",
|
|
95
|
+
limit: 50,
|
|
96
|
+
});
|
|
97
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ limit: 50 }));
|
|
98
|
+
});
|
|
99
|
+
it("returns API response as success", async () => {
|
|
100
|
+
const queryFn = vi.fn().mockResolvedValue(mockTranslationsData);
|
|
101
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
102
|
+
const result = await getTranslations.execute(client, { project: "my-org/my-project" });
|
|
103
|
+
const data = expectSuccess(result);
|
|
104
|
+
expect(data).toMatchObject({ returned: 5, total: 100, hasMore: false });
|
|
105
|
+
});
|
|
106
|
+
it("returns isError when API throws", async () => {
|
|
107
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Network error"));
|
|
108
|
+
const client = createMockClient({ mcp: { getAllTranslations: { query: queryFn } } });
|
|
109
|
+
const result = await getTranslations.execute(client, { project: "my-org/my-project" });
|
|
110
|
+
expect(isErrorResult(result)).toBe(true);
|
|
111
|
+
expect(expectError(result)).toContain("Network error");
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=getTranslations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTranslations.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/getTranslations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listKeys.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/listKeys.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { listKeys } from "../listKeys.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockListKeysData = {
|
|
6
|
+
tot: 42,
|
|
7
|
+
ret: 20,
|
|
8
|
+
has_more: true,
|
|
9
|
+
nss: ["auth", "common"],
|
|
10
|
+
k: [
|
|
11
|
+
{ k: "login.title", ns: 0, id: "key-1", src: "Login" },
|
|
12
|
+
{ k: "button.ok", ns: 1, id: "key-2", src: "OK" },
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
describe("listKeys", () => {
|
|
16
|
+
it("rejects missing project → isError", async () => {
|
|
17
|
+
const client = createMockClient();
|
|
18
|
+
const result = await listKeys.execute(client, {});
|
|
19
|
+
expect(isErrorResult(result)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it("rejects invalid project format → isError", async () => {
|
|
22
|
+
const client = createMockClient();
|
|
23
|
+
const result = await listKeys.execute(client, { project: "invalid-no-slash" });
|
|
24
|
+
expect(isErrorResult(result)).toBe(true);
|
|
25
|
+
const msg = expectError(result);
|
|
26
|
+
expect(msg).toContain("Invalid project format");
|
|
27
|
+
});
|
|
28
|
+
it("accepts minimal input (project only) → calls API with defaults", async () => {
|
|
29
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
30
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
31
|
+
const result = await listKeys.execute(client, { project: "my-org/my-project" });
|
|
32
|
+
expect(isErrorResult(result)).toBe(false);
|
|
33
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({
|
|
34
|
+
orgSlug: "my-org",
|
|
35
|
+
projectSlug: "my-project",
|
|
36
|
+
page: 1,
|
|
37
|
+
limit: 20,
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
it("passes search filter → API receives search", async () => {
|
|
41
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
42
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
43
|
+
await listKeys.execute(client, { project: "my-org/my-project", search: "login" });
|
|
44
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ search: "login" }));
|
|
45
|
+
});
|
|
46
|
+
it("passes namespaces filter → API receives namespaces", async () => {
|
|
47
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
48
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
49
|
+
await listKeys.execute(client, {
|
|
50
|
+
project: "my-org/my-project",
|
|
51
|
+
namespaces: ["auth", "common"],
|
|
52
|
+
});
|
|
53
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ namespaces: ["auth", "common"] }));
|
|
54
|
+
});
|
|
55
|
+
it("passes missingLanguage filter → API receives missingLanguage", async () => {
|
|
56
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
57
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
58
|
+
await listKeys.execute(client, {
|
|
59
|
+
project: "my-org/my-project",
|
|
60
|
+
missingLanguage: "tr",
|
|
61
|
+
});
|
|
62
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ missingLanguage: "tr" }));
|
|
63
|
+
});
|
|
64
|
+
it("passes fields filter → API receives fields", async () => {
|
|
65
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
66
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
67
|
+
await listKeys.execute(client, {
|
|
68
|
+
project: "my-org/my-project",
|
|
69
|
+
fields: ["id", "translatedLanguageCount"],
|
|
70
|
+
});
|
|
71
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ fields: ["id", "translatedLanguageCount"] }));
|
|
72
|
+
});
|
|
73
|
+
it("passes pagination params → page:2, limit:50 → API receives them", async () => {
|
|
74
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
75
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
76
|
+
await listKeys.execute(client, {
|
|
77
|
+
project: "my-org/my-project",
|
|
78
|
+
page: 2,
|
|
79
|
+
limit: 50,
|
|
80
|
+
});
|
|
81
|
+
expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ page: 2, limit: 50 }));
|
|
82
|
+
});
|
|
83
|
+
it("returns API response as success", async () => {
|
|
84
|
+
const queryFn = vi.fn().mockResolvedValue(mockListKeysData);
|
|
85
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
86
|
+
const result = await listKeys.execute(client, { project: "my-org/my-project" });
|
|
87
|
+
const data = expectSuccess(result);
|
|
88
|
+
expect(data).toMatchObject({ tot: 42, ret: 20, has_more: true });
|
|
89
|
+
});
|
|
90
|
+
it("returns isError when API throws", async () => {
|
|
91
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("API unavailable"));
|
|
92
|
+
const client = createMockClient({ mcp: { listKeys: { query: queryFn } } });
|
|
93
|
+
const result = await listKeys.execute(client, { project: "my-org/my-project" });
|
|
94
|
+
expect(isErrorResult(result)).toBe(true);
|
|
95
|
+
expect(expectError(result)).toContain("API unavailable");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=listKeys.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listKeys.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/listKeys.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProjects.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/listProjects.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { listProjects } from "../listProjects.js";
|
|
3
|
+
import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
|
|
4
|
+
import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
|
|
5
|
+
const mockProjectsData = {
|
|
6
|
+
projects: [
|
|
7
|
+
{
|
|
8
|
+
id: "proj-1",
|
|
9
|
+
slug: "my-project",
|
|
10
|
+
name: "My Project",
|
|
11
|
+
orgSlug: "my-org",
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
describe("listProjects", () => {
|
|
16
|
+
it("accepts empty object args → calls API", async () => {
|
|
17
|
+
const queryFn = vi.fn().mockResolvedValue(mockProjectsData);
|
|
18
|
+
const client = createMockClient({ mcp: { listProjects: { query: queryFn } } });
|
|
19
|
+
const result = await listProjects.execute(client, {});
|
|
20
|
+
expect(isErrorResult(result)).toBe(false);
|
|
21
|
+
expect(queryFn).toHaveBeenCalledTimes(1);
|
|
22
|
+
});
|
|
23
|
+
it("accepts {} → calls API", async () => {
|
|
24
|
+
const queryFn = vi.fn().mockResolvedValue(mockProjectsData);
|
|
25
|
+
const client = createMockClient({ mcp: { listProjects: { query: queryFn } } });
|
|
26
|
+
const result = await listProjects.execute(client, {});
|
|
27
|
+
expect(isErrorResult(result)).toBe(false);
|
|
28
|
+
expect(queryFn).toHaveBeenCalledTimes(1);
|
|
29
|
+
});
|
|
30
|
+
it("returns API response as success", async () => {
|
|
31
|
+
const queryFn = vi.fn().mockResolvedValue(mockProjectsData);
|
|
32
|
+
const client = createMockClient({ mcp: { listProjects: { query: queryFn } } });
|
|
33
|
+
const result = await listProjects.execute(client, {});
|
|
34
|
+
const data = expectSuccess(result);
|
|
35
|
+
expect(data).toMatchObject({ projects: expect.arrayContaining([expect.objectContaining({ slug: "my-project" })]) });
|
|
36
|
+
});
|
|
37
|
+
it("returns isError when API throws", async () => {
|
|
38
|
+
const queryFn = vi.fn().mockRejectedValue(new Error("Unauthorized"));
|
|
39
|
+
const client = createMockClient({ mcp: { listProjects: { query: queryFn } } });
|
|
40
|
+
const result = await listProjects.execute(client, {});
|
|
41
|
+
expect(isErrorResult(result)).toBe(true);
|
|
42
|
+
expect(expectError(result)).toContain("Unauthorized");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=listProjects.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProjects.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/listProjects.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposeLanguageEdits.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguageEdits.test.ts"],"names":[],"mappings":""}
|