ja-settings-small-modules-quality.test.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import fs from "node:fs";
  2. import path from "node:path";
  3. import { describe, expect, test } from "vitest";
  4. const readJson = (relPath: string) => {
  5. const filePath = path.join(process.cwd(), relPath);
  6. const text = fs.readFileSync(filePath, "utf8");
  7. return JSON.parse(text) as unknown;
  8. };
  9. const flattenStrings = (value: unknown): string[] => {
  10. if (typeof value === "string") return [value];
  11. if (!value || typeof value !== "object") return [];
  12. if (Array.isArray(value)) return value.flatMap(flattenStrings);
  13. return Object.values(value).flatMap(flattenStrings);
  14. };
  15. describe("ja settings small modules", () => {
  16. test("do not contain placeholder markers, emoji, or fullwidth parentheses", () => {
  17. const files = [
  18. "messages/ja/settings/common.json",
  19. "messages/ja/settings/requestFilters.json",
  20. "messages/ja/settings/prices.json",
  21. ] as const;
  22. for (const file of files) {
  23. const data = readJson(file);
  24. for (const text of flattenStrings(data)) {
  25. expect(text, file).not.toContain("(繁)");
  26. expect(text, file).not.toContain("[JA]");
  27. expect(text, file).not.toContain("(TW)");
  28. expect(text, file).not.toContain("(繁)");
  29. expect(text, file).not.toContain("(TW)");
  30. // Non zh/zh-TW should use halfwidth parentheses only
  31. expect(text, file).not.toContain("(");
  32. expect(text, file).not.toContain(")");
  33. expect(text, file).not.toMatch(/[1-4]\uFE0F\u20E3/);
  34. }
  35. }
  36. });
  37. });