import { readFileSync, writeFileSync } from 'fs'; import readStrings from '../src/util/data/readStrings'; const TOP_COMMENT = '// This file is generated by dev/generateLangTypes.ts. Do not edit it manually.\n'; const LANG_KEY_TYPE = 'export type LangKey = keyof LangPair;'; const data = readFileSync('./src/assets/localization/fallback.strings', 'utf8'); const parsed = readStrings(data); const keysWithVars = Object.entries(parsed).reduce((acc, [keyWithSuffix, value]) => { const key = keyWithSuffix.split('_')[0]; const variables = extractVariables(value); const previousVariables = acc[key] || []; if (!previousVariables.length) { acc[key] = variables; } else { acc[key] = Array.from(new Set([...previousVariables, ...variables])); } return acc; }, {} as Record); let entries = ''; Object.entries(keysWithVars).forEach(([key, variables]) => { const varString = variables.length ? `{\n ${variables.map((v) => `${wrapInQuotes(v)}: string | number;`).join('\n ')}\n };\n` : 'undefined;\n'; entries += ` ${wrapInQuotes(key)}: ${varString}`; }); const langPair = `export interface LangPair {\n${entries}\n}\n`; const text = `${TOP_COMMENT}\n${langPair}\n${LANG_KEY_TYPE}\n`; writeFileSync('./src/types/language.d.ts', text, 'utf8'); // eslint-disable-next-line no-console console.log(`Language types generated: ${Object.keys(keysWithVars).length} keys`); function extractVariables(value: string) { const matches = value.match(/(? match.slice(1, -1)); } function wrapInQuotes(value: string) { return `'${value}'`; }