@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,87 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { proposeLanguageEdits } from "../proposeLanguageEdits.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
5
+ const mockUpdateLanguagesResult = {
6
+ success: true,
7
+ results: [{ languageCode: "tr", updated: true, status: "archived" }],
8
+ notFound: [],
9
+ };
10
+ describe("proposeLanguageEdits", () => {
11
+ it("rejects missing project → isError", async () => {
12
+ const client = createMockClient();
13
+ const result = await proposeLanguageEdits.execute(client, {
14
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
15
+ });
16
+ expect(isErrorResult(result)).toBe(true);
17
+ });
18
+ it("rejects missing edits array → isError", async () => {
19
+ const client = createMockClient();
20
+ const result = await proposeLanguageEdits.execute(client, {
21
+ project: "my-org/my-project",
22
+ });
23
+ expect(isErrorResult(result)).toBe(true);
24
+ });
25
+ it("rejects empty edits array → isError", async () => {
26
+ const client = createMockClient();
27
+ const result = await proposeLanguageEdits.execute(client, {
28
+ project: "my-org/my-project",
29
+ edits: [],
30
+ });
31
+ expect(isErrorResult(result)).toBe(true);
32
+ });
33
+ it("normalizes languageCode to lowercase", async () => {
34
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
35
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
36
+ await proposeLanguageEdits.execute(client, {
37
+ project: "my-org/my-project",
38
+ edits: [{ languageCode: "TR", newStatus: "archived" }],
39
+ });
40
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
41
+ updates: expect.arrayContaining([
42
+ expect.objectContaining({ languageCode: "tr" }),
43
+ ]),
44
+ }));
45
+ });
46
+ it("maps edits[].newStatus → updates[].status (field rename)", async () => {
47
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
48
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
49
+ await proposeLanguageEdits.execute(client, {
50
+ project: "my-org/my-project",
51
+ edits: [{ languageCode: "tr", newStatus: "draft" }],
52
+ });
53
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
54
+ updates: expect.arrayContaining([
55
+ expect.objectContaining({ languageCode: "tr", status: "draft" }),
56
+ ]),
57
+ }));
58
+ // Ensure the API is NOT called with the input field name "newStatus"
59
+ const callArg = mutateFn.mock.calls[0][0];
60
+ const update = callArg.updates[0];
61
+ expect(update).not.toHaveProperty("newStatus");
62
+ });
63
+ it("wraps response with success/results/notFound/project fields", async () => {
64
+ const mutateFn = vi.fn().mockResolvedValue(mockUpdateLanguagesResult);
65
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
66
+ const result = await proposeLanguageEdits.execute(client, {
67
+ project: "my-org/my-project",
68
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
69
+ });
70
+ const data = expectSuccess(result);
71
+ expect(data).toHaveProperty("success", true);
72
+ expect(data).toHaveProperty("results");
73
+ expect(data).toHaveProperty("notFound");
74
+ expect(data).toHaveProperty("project", "my-org/my-project");
75
+ });
76
+ it("returns isError when API throws", async () => {
77
+ const mutateFn = vi.fn().mockRejectedValue(new Error("Language not found"));
78
+ const client = createMockClient({ mcp: { updateLanguages: { mutate: mutateFn } } });
79
+ const result = await proposeLanguageEdits.execute(client, {
80
+ project: "my-org/my-project",
81
+ edits: [{ languageCode: "tr", newStatus: "archived" }],
82
+ });
83
+ expect(isErrorResult(result)).toBe(true);
84
+ expect(expectError(result)).toContain("Language not found");
85
+ });
86
+ });
87
+ //# sourceMappingURL=proposeLanguageEdits.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguageEdits.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguageEdits.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proposeLanguages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguages.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { proposeLanguages } from "../proposeLanguages.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ import { expectSuccess, expectError, isErrorResult } from "../../__tests__/helpers.js";
5
+ const mockAddLanguagesResult = {
6
+ success: true,
7
+ added: ["fr"],
8
+ skipped: [],
9
+ results: [{ languageCode: "fr", added: true }],
10
+ };
11
+ describe("proposeLanguages", () => {
12
+ it("rejects missing project → isError", async () => {
13
+ const client = createMockClient();
14
+ const result = await proposeLanguages.execute(client, {
15
+ languages: [{ languageCode: "fr" }],
16
+ });
17
+ expect(isErrorResult(result)).toBe(true);
18
+ });
19
+ it("rejects missing languages array → isError", async () => {
20
+ const client = createMockClient();
21
+ const result = await proposeLanguages.execute(client, {
22
+ project: "my-org/my-project",
23
+ });
24
+ expect(isErrorResult(result)).toBe(true);
25
+ });
26
+ it("rejects empty languages array (min 1) → isError", async () => {
27
+ const client = createMockClient();
28
+ const result = await proposeLanguages.execute(client, {
29
+ project: "my-org/my-project",
30
+ languages: [],
31
+ });
32
+ expect(isErrorResult(result)).toBe(true);
33
+ });
34
+ it("rejects languageCode shorter than 2 chars → isError", async () => {
35
+ const client = createMockClient();
36
+ const result = await proposeLanguages.execute(client, {
37
+ project: "my-org/my-project",
38
+ languages: [{ languageCode: "f" }],
39
+ });
40
+ expect(isErrorResult(result)).toBe(true);
41
+ });
42
+ it("normalizes languageCode to lowercase — 'FR' → client receives 'fr'", async () => {
43
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
44
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
45
+ await proposeLanguages.execute(client, {
46
+ project: "my-org/my-project",
47
+ languages: [{ languageCode: "FR" }],
48
+ });
49
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
50
+ languages: expect.arrayContaining([
51
+ expect.objectContaining({ languageCode: "fr" }),
52
+ ]),
53
+ }));
54
+ });
55
+ it("omits status when not provided (uses API default)", async () => {
56
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
57
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
58
+ await proposeLanguages.execute(client, {
59
+ project: "my-org/my-project",
60
+ languages: [{ languageCode: "fr" }],
61
+ });
62
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
63
+ languages: expect.arrayContaining([
64
+ expect.objectContaining({ languageCode: "fr" }),
65
+ ]),
66
+ }));
67
+ });
68
+ it("passes through explicit status 'draft'", async () => {
69
+ const mutateFn = vi.fn().mockResolvedValue({
70
+ ...mockAddLanguagesResult,
71
+ added: ["de"],
72
+ results: [{ languageCode: "de", added: true }],
73
+ });
74
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
75
+ await proposeLanguages.execute(client, {
76
+ project: "my-org/my-project",
77
+ languages: [{ languageCode: "de", status: "draft" }],
78
+ });
79
+ expect(mutateFn).toHaveBeenCalledWith(expect.objectContaining({
80
+ languages: expect.arrayContaining([
81
+ expect.objectContaining({ languageCode: "de", status: "draft" }),
82
+ ]),
83
+ }));
84
+ });
85
+ it("wraps response with success/added/skipped/project fields", async () => {
86
+ const mutateFn = vi.fn().mockResolvedValue(mockAddLanguagesResult);
87
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
88
+ const result = await proposeLanguages.execute(client, {
89
+ project: "my-org/my-project",
90
+ languages: [{ languageCode: "fr" }],
91
+ });
92
+ const data = expectSuccess(result);
93
+ expect(data).toHaveProperty("success", true);
94
+ expect(data).toHaveProperty("added");
95
+ expect(data).toHaveProperty("skipped");
96
+ expect(data).toHaveProperty("project", "my-org/my-project");
97
+ });
98
+ it("returns isError when API throws", async () => {
99
+ const mutateFn = vi.fn().mockRejectedValue(new Error("Language limit exceeded"));
100
+ const client = createMockClient({ mcp: { addLanguages: { mutate: mutateFn } } });
101
+ const result = await proposeLanguages.execute(client, {
102
+ project: "my-org/my-project",
103
+ languages: [{ languageCode: "fr" }],
104
+ });
105
+ expect(isErrorResult(result)).toBe(true);
106
+ expect(expectError(result)).toContain("Language limit exceeded");
107
+ });
108
+ });
109
+ //# sourceMappingURL=proposeLanguages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeLanguages.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/proposeLanguages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publishTranslations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishTranslations.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/publishTranslations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { publishTranslations } from "../publishTranslations.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ const VALID_KEY_ID = "550e8400-e29b-41d4-a716-446655440000";
5
+ describe("publishTranslations", () => {
6
+ describe("input validation", () => {
7
+ it("rejects missing project", async () => {
8
+ const client = createMockClient();
9
+ const result = await publishTranslations.execute(client, {
10
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "tr" }],
11
+ });
12
+ expect(result.isError).toBe(true);
13
+ });
14
+ it("accepts project-only input (publish all)", async () => {
15
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
16
+ const client = createMockClient({
17
+ mcp: { publishTranslations: { mutate: mutateMock } },
18
+ });
19
+ const result = await publishTranslations.execute(client, {
20
+ project: "org/proj",
21
+ });
22
+ expect(result.isError).toBeUndefined();
23
+ const call = mutateMock.mock.calls[0][0];
24
+ expect(call.translations).toBeUndefined();
25
+ });
26
+ });
27
+ describe("data normalization", () => {
28
+ it("normalizes languageCode to lowercase", async () => {
29
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
30
+ const client = createMockClient({
31
+ mcp: { publishTranslations: { mutate: mutateMock } },
32
+ });
33
+ await publishTranslations.execute(client, {
34
+ project: "org/proj",
35
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "TR" }],
36
+ });
37
+ const call = mutateMock.mock.calls[0][0];
38
+ expect(call.translations[0].languageCode).toBe("tr");
39
+ });
40
+ it("passes keyId through unchanged", async () => {
41
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
42
+ const client = createMockClient({
43
+ mcp: { publishTranslations: { mutate: mutateMock } },
44
+ });
45
+ await publishTranslations.execute(client, {
46
+ project: "org/proj",
47
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "de" }],
48
+ });
49
+ const call = mutateMock.mock.calls[0][0];
50
+ expect(call.translations[0].keyId).toBe(VALID_KEY_ID);
51
+ });
52
+ });
53
+ describe("API call", () => {
54
+ it("sends undefined translations for full publish", async () => {
55
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
56
+ const client = createMockClient({
57
+ mcp: { publishTranslations: { mutate: mutateMock } },
58
+ });
59
+ await publishTranslations.execute(client, { project: "org/proj" });
60
+ expect(mutateMock).toHaveBeenCalledWith({
61
+ orgSlug: "org",
62
+ projectSlug: "proj",
63
+ translations: undefined,
64
+ });
65
+ });
66
+ it("sends specific translations for selective publish", async () => {
67
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-1"] });
68
+ const client = createMockClient({
69
+ mcp: { publishTranslations: { mutate: mutateMock } },
70
+ });
71
+ const uuid2 = "660e8400-e29b-41d4-a716-446655440001";
72
+ await publishTranslations.execute(client, {
73
+ project: "org/proj",
74
+ translations: [
75
+ { keyId: VALID_KEY_ID, languageCode: "tr" },
76
+ { keyId: uuid2, languageCode: "de" },
77
+ ],
78
+ });
79
+ const call = mutateMock.mock.calls[0][0];
80
+ expect(call.translations).toHaveLength(2);
81
+ expect(call.translations[0]).toEqual({ keyId: VALID_KEY_ID, languageCode: "tr" });
82
+ expect(call.translations[1]).toEqual({ keyId: uuid2, languageCode: "de" });
83
+ });
84
+ it("calls client.mcp.publishTranslations.mutate with correct params", async () => {
85
+ const mutateMock = vi.fn().mockResolvedValue({ syncJobIds: ["job-42"] });
86
+ const client = createMockClient({
87
+ mcp: { publishTranslations: { mutate: mutateMock } },
88
+ });
89
+ await publishTranslations.execute(client, {
90
+ project: "my-org/my-proj",
91
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "fr" }],
92
+ });
93
+ expect(mutateMock).toHaveBeenCalledWith({
94
+ orgSlug: "my-org",
95
+ projectSlug: "my-proj",
96
+ translations: [{ keyId: VALID_KEY_ID, languageCode: "fr" }],
97
+ });
98
+ });
99
+ it("returns API response as success", async () => {
100
+ const apiResponse = { syncJobIds: ["job-1", "job-2"] };
101
+ const mutateMock = vi.fn().mockResolvedValue(apiResponse);
102
+ const client = createMockClient({
103
+ mcp: { publishTranslations: { mutate: mutateMock } },
104
+ });
105
+ const result = await publishTranslations.execute(client, {
106
+ project: "org/proj",
107
+ });
108
+ expect(result.isError).toBeUndefined();
109
+ const parsed = JSON.parse(result.content[0].text);
110
+ expect(parsed).toEqual(apiResponse);
111
+ });
112
+ });
113
+ describe("error handling", () => {
114
+ it("returns isError when API throws", async () => {
115
+ const mutateMock = vi.fn().mockRejectedValue(new Error("Publish failed"));
116
+ const client = createMockClient({
117
+ mcp: { publishTranslations: { mutate: mutateMock } },
118
+ });
119
+ const result = await publishTranslations.execute(client, {
120
+ project: "org/proj",
121
+ });
122
+ expect(result.isError).toBe(true);
123
+ expect(result.content[0].text).toContain("Publish failed");
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=publishTranslations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishTranslations.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/publishTranslations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=updateKeys.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateKeys.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/updateKeys.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { updateKeys } from "../updateKeys.js";
3
+ import { createMockClient } from "../../__tests__/fixtures/mock-client.js";
4
+ const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
5
+ describe("updateKeys", () => {
6
+ describe("input validation", () => {
7
+ it("rejects missing project", async () => {
8
+ const client = createMockClient();
9
+ const result = await updateKeys.execute(client, {
10
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
11
+ });
12
+ expect(result.isError).toBe(true);
13
+ });
14
+ it("rejects missing t array", async () => {
15
+ const client = createMockClient();
16
+ const result = await updateKeys.execute(client, { project: "org/proj" });
17
+ expect(result.isError).toBe(true);
18
+ });
19
+ it("rejects empty t array", async () => {
20
+ const client = createMockClient();
21
+ const result = await updateKeys.execute(client, {
22
+ project: "org/proj",
23
+ t: [],
24
+ });
25
+ expect(result.isError).toBe(true);
26
+ });
27
+ it("rejects items missing required fields", async () => {
28
+ const client = createMockClient();
29
+ // Missing l and t fields
30
+ const result = await updateKeys.execute(client, {
31
+ project: "org/proj",
32
+ t: [{ id: VALID_UUID }],
33
+ });
34
+ expect(result.isError).toBe(true);
35
+ });
36
+ });
37
+ describe("data normalization", () => {
38
+ it("normalizes language code to lowercase", async () => {
39
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 1 });
40
+ const client = createMockClient({
41
+ mcp: { updateKeys: { mutate: mutateMock } },
42
+ });
43
+ await updateKeys.execute(client, {
44
+ project: "org/proj",
45
+ t: [{ id: VALID_UUID, l: "TR", t: "Merhaba" }],
46
+ });
47
+ const call = mutateMock.mock.calls[0][0];
48
+ expect(call.t[0].l).toBe("tr");
49
+ });
50
+ it("preserves other fields", async () => {
51
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 1 });
52
+ const client = createMockClient({
53
+ mcp: { updateKeys: { mutate: mutateMock } },
54
+ });
55
+ await updateKeys.execute(client, {
56
+ project: "org/proj",
57
+ t: [{ id: VALID_UUID, l: "de", t: "Guten Tag", s: true, st: "published" }],
58
+ });
59
+ const call = mutateMock.mock.calls[0][0];
60
+ expect(call.t[0]).toMatchObject({
61
+ id: VALID_UUID,
62
+ l: "de",
63
+ t: "Guten Tag",
64
+ s: true,
65
+ st: "published",
66
+ });
67
+ });
68
+ });
69
+ describe("API call", () => {
70
+ it("calls client.mcp.updateKeys.mutate with correct params", async () => {
71
+ const mutateMock = vi.fn().mockResolvedValue({ updated: 2 });
72
+ const client = createMockClient({
73
+ mcp: { updateKeys: { mutate: mutateMock } },
74
+ });
75
+ const uuid2 = "660e8400-e29b-41d4-a716-446655440001";
76
+ await updateKeys.execute(client, {
77
+ project: "my-org/my-proj",
78
+ t: [
79
+ { id: VALID_UUID, l: "tr", t: "Merhaba" },
80
+ { id: uuid2, l: "fr", t: "Bonjour" },
81
+ ],
82
+ });
83
+ expect(mutateMock).toHaveBeenCalledWith({
84
+ orgSlug: "my-org",
85
+ projectSlug: "my-proj",
86
+ t: [
87
+ { id: VALID_UUID, l: "tr", t: "Merhaba" },
88
+ { id: uuid2, l: "fr", t: "Bonjour" },
89
+ ],
90
+ });
91
+ });
92
+ it("returns API response as success", async () => {
93
+ const apiResponse = { updated: 1 };
94
+ const mutateMock = vi.fn().mockResolvedValue(apiResponse);
95
+ const client = createMockClient({
96
+ mcp: { updateKeys: { mutate: mutateMock } },
97
+ });
98
+ const result = await updateKeys.execute(client, {
99
+ project: "org/proj",
100
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
101
+ });
102
+ expect(result.isError).toBeUndefined();
103
+ const parsed = JSON.parse(result.content[0].text);
104
+ expect(parsed).toEqual(apiResponse);
105
+ });
106
+ });
107
+ describe("error handling", () => {
108
+ it("returns isError when API throws", async () => {
109
+ const mutateMock = vi.fn().mockRejectedValue(new Error("Network error"));
110
+ const client = createMockClient({
111
+ mcp: { updateKeys: { mutate: mutateMock } },
112
+ });
113
+ const result = await updateKeys.execute(client, {
114
+ project: "org/proj",
115
+ t: [{ id: VALID_UUID, l: "tr", t: "Merhaba" }],
116
+ });
117
+ expect(result.isError).toBe(true);
118
+ expect(result.content[0].text).toContain("Network error");
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=updateKeys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateKeys.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/updateKeys.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createKeys.d.ts","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsB9C,eAAO,MAAM,UAAU,EAAE,IA+DxB,CAAC"}
1
+ {"version":3,"file":"createKeys.d.ts","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsB9C,eAAO,MAAM,UAAU,EAAE,IAuExB,CAAC"}
@@ -25,7 +25,16 @@ const inputSchema = projectSchema.extend({
25
25
  export const createKeys = {
26
26
  definition: {
27
27
  name: "createKeys",
28
- description: "Create translation keys with source text and optional translations. Don't include the source language in translations \u2014 use v (source value) instead.",
28
+ description: `Create NEW translation keys with source text and optional translations.
29
+
30
+ IMPORTANT — avoid accidental duplicates:
31
+ - Call getProject first to see existing namespaces and key count
32
+ - ns defaults to 'default'. Use the SAME namespace as existing keys
33
+ - Same key name in a different namespace creates a SEPARATE key (not a duplicate)
34
+ - To add translations to EXISTING keys, use listKeys + updateKeys instead
35
+
36
+ Response fields: 'dup' = same-namespace skips, 'warn' = cross-namespace name matches
37
+ Don't include source language in translations — use v (source value) instead.`,
29
38
  inputSchema: {
30
39
  type: "object",
31
40
  properties: {
@@ -37,7 +46,7 @@ export const createKeys = {
37
46
  type: "object",
38
47
  properties: {
39
48
  n: { type: "string", description: "Key name (e.g., 'submit_button', 'nav.home')" },
40
- ns: { type: "string", description: "Namespace (default: 'default')" },
49
+ ns: { type: "string", description: "Namespace (default: 'default'). MUST match existing keys' namespace — wrong namespace creates duplicate keys." },
41
50
  v: { type: "string", description: "Source language text" },
42
51
  t: { type: "object", description: "Target translations as {langCode: text}" },
43
52
  nc: {
@@ -1 +1 @@
1
- {"version":3,"file":"createKeys.js","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEd,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACtE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC5E,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACzD,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAClG,EAAE,EAAE,sBAAsB;KAC3B,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4JAA4J;QAC9J,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,yBAAyB;oBACtC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;4BAClF,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;4BACrE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;4BAC1D,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;4BAC7E,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,6GAA6G;gCAC1H,UAAU,EAAE;oCACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;oCAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;oCACnE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;oCACpF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;oCAChG,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE;iCAC3F;6BACF;yBACF;wBACD,QAAQ,EAAE,CAAC,GAAG,CAAC;qBAChB;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;SAC3B;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CACT,IAAI,EACJ,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,iDAAiD;QACjD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;YACvB,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC;YACxC,CAAC;YACD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACF;CACJ,CAAC"}
1
+ {"version":3,"file":"createKeys.js","sourceRoot":"","sources":["../../src/tools/createKeys.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAW9C,eAAO,MAAM,eAAe,EAAE,IAyF7B,CAAC"}
1
+ {"version":3,"file":"getTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAW9C,eAAO,MAAM,eAAe,EAAE,IA6F7B,CAAC"}
@@ -46,6 +46,10 @@ export const getTranslations = {
46
46
  USE THIS when you need actual translation text (to translate, review, or update).
47
47
  Use listKeys instead for browsing/exploring keys — it's faster and uses fewer tokens.
48
48
 
49
+ IMPORTANT: status filter REQUIRES languages parameter.
50
+ { status: "missing" } alone returns ALL keys (filter silently ignored).
51
+ Always pair: { languages: ["hr"], status: "missing" }
52
+
49
53
  SEARCH + FILTER:
50
54
  - search: Text to search for (in source text or specified languages)
51
55
  - languages: Languages to search in AND return translations for
@@ -94,7 +98,7 @@ Response includes namespaceDetails: a map of namespace metadata (name, keyCount,
94
98
  status: {
95
99
  type: "string",
96
100
  enum: ["missing", "draft", "approved", "all"],
97
- description: "Filter by translation status (default: all). Requires languages to be specified for filtering.",
101
+ description: "Filter by translation status. WARNING: ignored without languages parameter. Always use with languages: ['hr']. Default: all.",
98
102
  },
99
103
  limit: {
100
104
  type: "number",
@@ -1 +1 @@
1
- {"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"listKeys.d.ts","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,QAAQ,EAAE,IA8FtB,CAAC"}
1
+ {"version":3,"file":"listKeys.d.ts","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,QAAQ,EAAE,IA+FtB,CAAC"}
@@ -66,6 +66,7 @@ FILTER OPTIONS:
66
66
  - search: Key name search (partial match, single string or array for OR)
67
67
  - namespaces: Filter by namespace(s)
68
68
  - missingLanguage: Find keys with no translation for this language (e.g., "tr")
69
+ - Pre-flight before createKeys: check existing namespaces and key names
69
70
 
70
71
  EXAMPLES:
71
72
  - Browse all keys: { project: "org/project" }