import { describe, test, expect } from "vitest"; import fs from "fs"; import path from "path"; import { parse } from "smol-toml"; const LOCALES_DIR = path.join(__dirname, "../../../public/locales"); const getLocaleDirectories = () => { if (!fs.existsSync(LOCALES_DIR)) { return []; } return fs .readdirSync(LOCALES_DIR, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) .map((dirent) => dirent.name); }; const findDottedKeys = (node: unknown, segments: string[] = []): string[] => { if (!node || typeof node !== "object") { return []; } const issues: string[] = []; for (const [key, value] of Object.entries(node as Record)) { if (key.includes(".")) { issues.push([...segments, key].join(".")); } issues.push(...findDottedKeys(value, [...segments, key])); } return issues; }; const localeDirectories = getLocaleDirectories(); describe("Translation key structure", () => { test("should locate locales directory", () => { expect(fs.existsSync(LOCALES_DIR)).toBe(true); }); test("should have at least one locale directory", () => { expect(localeDirectories.length).toBeGreaterThan(0); }); test.each(localeDirectories)("should not contain dotted keys in %s/translation.toml", (localeDir) => { const translationFile = path.join(LOCALES_DIR, localeDir, "translation.toml"); expect(fs.existsSync(translationFile)).toBe(true); const data = parse(fs.readFileSync(translationFile, "utf8")); const dottedKeys = findDottedKeys(data); expect(dottedKeys, `Dotted keys found in ${localeDir}: ${dottedKeys.join(", ")}`).toHaveLength(0); }); });