()
| 255 | } |
| 256 | |
| 257 | async function validateLanguages(): Promise<void> { |
| 258 | const problems = new Problems<Language, "_additional" | "_groups">( |
| 259 | "Languages", |
| 260 | { |
| 261 | _additional: |
| 262 | "Language files present but missing in packages/schemas/src/languages.ts", |
| 263 | _groups: |
| 264 | "Problems in LanguageGroups in frontend/src/ts/constants/languages.ts", |
| 265 | }, |
| 266 | ); |
| 267 | |
| 268 | const duplicatePercentageThreshold = 0.0001; |
| 269 | for (const language of LanguageList) { |
| 270 | let languageFileData: LanguageObject; |
| 271 | try { |
| 272 | languageFileData = JSON.parse( |
| 273 | fs.readFileSync(`./static/languages/${language}.json`, { |
| 274 | encoding: "utf8", |
| 275 | flag: "r", |
| 276 | }), |
| 277 | ) as LanguageObject; |
| 278 | } catch (e) { |
| 279 | problems.add( |
| 280 | language, |
| 281 | `missing json file frontend/static/languages/${language}.json`, |
| 282 | ); |
| 283 | |
| 284 | continue; |
| 285 | } |
| 286 | problems.addValidation( |
| 287 | language, |
| 288 | LanguageObjectSchema.extend({ |
| 289 | _comment: z.string().optional(), |
| 290 | }).safeParse(languageFileData), |
| 291 | ); |
| 292 | |
| 293 | if (languageFileData.name !== language) { |
| 294 | problems.add(language, `Name is not ${language}`); |
| 295 | } |
| 296 | const duplicates = findDuplicates(languageFileData.words); |
| 297 | const duplicatePercentage = |
| 298 | (duplicates.length / languageFileData.words.length) * 100; |
| 299 | if (duplicatePercentage >= duplicatePercentageThreshold) { |
| 300 | problems.add( |
| 301 | language, |
| 302 | `contains ${duplicates.length} (${Math.round( |
| 303 | duplicatePercentage, |
| 304 | )}%) duplicates:\n ${duplicates.join(",")}`, |
| 305 | ); |
| 306 | } |
| 307 | } |
| 308 | |
| 309 | //no files not defined in LanguageList |
| 310 | fs.readdirSync("./static/languages") |
| 311 | .filter((it) => !LanguageList.some((language) => `${language}.json` === it)) |
| 312 | .forEach((it) => problems.add("_additional", it)); |
| 313 | |
| 314 | //check groups |
nothing calls this directly
no test coverage detected