@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.
Files changed (93) hide show
  1. package/dist/__tests__/base-tool.test.d.ts +2 -0
  2. package/dist/__tests__/base-tool.test.d.ts.map +1 -0
  3. package/dist/__tests__/base-tool.test.js +193 -0
  4. package/dist/__tests__/base-tool.test.js.map +1 -0
  5. package/dist/__tests__/contract.test.d.ts +24 -0
  6. package/dist/__tests__/contract.test.d.ts.map +1 -0
  7. package/dist/__tests__/contract.test.js +919 -0
  8. package/dist/__tests__/contract.test.js.map +1 -0
  9. package/dist/__tests__/fixtures/mock-client.d.ts +11 -0
  10. package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
  11. package/dist/__tests__/fixtures/mock-client.js +33 -0
  12. package/dist/__tests__/fixtures/mock-client.js.map +1 -0
  13. package/dist/__tests__/helpers.d.ts +10 -0
  14. package/dist/__tests__/helpers.d.ts.map +1 -0
  15. package/dist/__tests__/helpers.js +27 -0
  16. package/dist/__tests__/helpers.js.map +1 -0
  17. package/dist/__tests__/schema-alignment.test.d.ts +15 -0
  18. package/dist/__tests__/schema-alignment.test.d.ts.map +1 -0
  19. package/dist/__tests__/schema-alignment.test.js +1011 -0
  20. package/dist/__tests__/schema-alignment.test.js.map +1 -0
  21. package/dist/__tests__/server-dispatch.test.d.ts +10 -0
  22. package/dist/__tests__/server-dispatch.test.d.ts.map +1 -0
  23. package/dist/__tests__/server-dispatch.test.js +202 -0
  24. package/dist/__tests__/server-dispatch.test.js.map +1 -0
  25. package/dist/tools/__tests__/createKeys.test.d.ts +2 -0
  26. package/dist/tools/__tests__/createKeys.test.d.ts.map +1 -0
  27. package/dist/tools/__tests__/createKeys.test.js +139 -0
  28. package/dist/tools/__tests__/createKeys.test.js.map +1 -0
  29. package/dist/tools/__tests__/deleteKeys.test.d.ts +2 -0
  30. package/dist/tools/__tests__/deleteKeys.test.d.ts.map +1 -0
  31. package/dist/tools/__tests__/deleteKeys.test.js +91 -0
  32. package/dist/tools/__tests__/deleteKeys.test.js.map +1 -0
  33. package/dist/tools/__tests__/getPendingChanges.test.d.ts +2 -0
  34. package/dist/tools/__tests__/getPendingChanges.test.d.ts.map +1 -0
  35. package/dist/tools/__tests__/getPendingChanges.test.js +50 -0
  36. package/dist/tools/__tests__/getPendingChanges.test.js.map +1 -0
  37. package/dist/tools/__tests__/getProject.test.d.ts +2 -0
  38. package/dist/tools/__tests__/getProject.test.d.ts.map +1 -0
  39. package/dist/tools/__tests__/getProject.test.js +55 -0
  40. package/dist/tools/__tests__/getProject.test.js.map +1 -0
  41. package/dist/tools/__tests__/getSync.test.d.ts +2 -0
  42. package/dist/tools/__tests__/getSync.test.d.ts.map +1 -0
  43. package/dist/tools/__tests__/getSync.test.js +42 -0
  44. package/dist/tools/__tests__/getSync.test.js.map +1 -0
  45. package/dist/tools/__tests__/getSyncs.test.d.ts +2 -0
  46. package/dist/tools/__tests__/getSyncs.test.d.ts.map +1 -0
  47. package/dist/tools/__tests__/getSyncs.test.js +66 -0
  48. package/dist/tools/__tests__/getSyncs.test.js.map +1 -0
  49. package/dist/tools/__tests__/getTranslations.test.d.ts +2 -0
  50. package/dist/tools/__tests__/getTranslations.test.d.ts.map +1 -0
  51. package/dist/tools/__tests__/getTranslations.test.js +114 -0
  52. package/dist/tools/__tests__/getTranslations.test.js.map +1 -0
  53. package/dist/tools/__tests__/listKeys.test.d.ts +2 -0
  54. package/dist/tools/__tests__/listKeys.test.d.ts.map +1 -0
  55. package/dist/tools/__tests__/listKeys.test.js +98 -0
  56. package/dist/tools/__tests__/listKeys.test.js.map +1 -0
  57. package/dist/tools/__tests__/listProjects.test.d.ts +2 -0
  58. package/dist/tools/__tests__/listProjects.test.d.ts.map +1 -0
  59. package/dist/tools/__tests__/listProjects.test.js +45 -0
  60. package/dist/tools/__tests__/listProjects.test.js.map +1 -0
  61. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts +2 -0
  62. package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts.map +1 -0
  63. package/dist/tools/__tests__/proposeLanguageEdits.test.js +87 -0
  64. package/dist/tools/__tests__/proposeLanguageEdits.test.js.map +1 -0
  65. package/dist/tools/__tests__/proposeLanguages.test.d.ts +2 -0
  66. package/dist/tools/__tests__/proposeLanguages.test.d.ts.map +1 -0
  67. package/dist/tools/__tests__/proposeLanguages.test.js +109 -0
  68. package/dist/tools/__tests__/proposeLanguages.test.js.map +1 -0
  69. package/dist/tools/__tests__/publishTranslations.test.d.ts +2 -0
  70. package/dist/tools/__tests__/publishTranslations.test.d.ts.map +1 -0
  71. package/dist/tools/__tests__/publishTranslations.test.js +127 -0
  72. package/dist/tools/__tests__/publishTranslations.test.js.map +1 -0
  73. package/dist/tools/__tests__/updateKeys.test.d.ts +2 -0
  74. package/dist/tools/__tests__/updateKeys.test.d.ts.map +1 -0
  75. package/dist/tools/__tests__/updateKeys.test.js +122 -0
  76. package/dist/tools/__tests__/updateKeys.test.js.map +1 -0
  77. package/dist/tools/createKeys.d.ts.map +1 -1
  78. package/dist/tools/createKeys.js +11 -2
  79. package/dist/tools/createKeys.js.map +1 -1
  80. package/dist/tools/getTranslations.d.ts.map +1 -1
  81. package/dist/tools/getTranslations.js +5 -1
  82. package/dist/tools/getTranslations.js.map +1 -1
  83. package/dist/tools/listKeys.d.ts.map +1 -1
  84. package/dist/tools/listKeys.js +1 -0
  85. package/dist/tools/listKeys.js.map +1 -1
  86. package/dist/tools/updateKeys.d.ts.map +1 -1
  87. package/dist/tools/updateKeys.js +9 -3
  88. package/dist/tools/updateKeys.js.map +1 -1
  89. package/dist/worker.test.d.ts +16 -0
  90. package/dist/worker.test.d.ts.map +1 -0
  91. package/dist/worker.test.js +244 -0
  92. package/dist/worker.test.js.map +1 -0
  93. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getProject.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,eAAe,GAAG;IACtB,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5C,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7C,QAAQ,EAAE,EAAE;IACZ,GAAG,EAAE;QACH,OAAO,EAAE,+CAA+C;QACxD,OAAO,EAAE,yEAAyE;KACnF;CACF,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7E,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC;YACnC,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,YAAY;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAElF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAElF,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getSync.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getSyncs.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getTranslations.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=listKeys.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=listProjects.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proposeLanguageEdits.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguageEdits.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguageEdits.test.ts"],"names":[],"mappings":""}