1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
import type { Options } from 'prettier';
import { format } from 'prettier';
import options from '../.prettierrc.cjs';
import type { LocaleDefinition } from '../src';
const pathRoot = resolve(__dirname, '..');
const pathLocale = resolve(pathRoot, 'src', 'locale');
const pathLocales = resolve(pathRoot, 'src', 'locales');
const pathLocalesIndex = resolve(pathLocales, 'index.ts');
const pathDocsApiLocalization = resolve(
pathRoot,
'docs',
'api',
'localization.md'
);
const scriptCommand = 'pnpm run generate:locales';
const prettierTsOptions: Options = { ...options, parser: 'typescript' };
const prettierMdOptions: Options = { ...options, parser: 'markdown' };
const locales = readdirSync(pathLocales);
locales.splice(locales.indexOf('index.ts'), 1);
let localeIndexImports = "import type { LocaleDefinition } from '..';\n";
let localeIndexType = 'export type KnownLocale =\n';
let localeIndexLocales = 'const locales: KnownLocales = {\n';
let localizationLocales = '| Locale | Name |\n| :--- | :--- |\n';
const autoGeneratedCommentHeader = `/*
* This file is automatically generated.
* Run '${scriptCommand}' to update.
*/`;
for (const locale of locales) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const localeDef: LocaleDefinition = require('../src/locales/' +
locale).default;
const localeTitle = localeDef.title;
localeIndexImports += `import ${locale} from './${locale}';\n`;
localeIndexType += ` | '${locale}'\n`;
localeIndexLocales += ` ${locale},\n`;
localizationLocales += `| ${locale} | ${localeTitle} |\n`;
// src/locale/<locale>.ts
let content = `
${autoGeneratedCommentHeader}
import { Faker } from '..';
import ${locale} from '../locales/${locale}';
${locale !== 'en' ? "import en from '../locales/en';" : ''}
const faker = new Faker({
locale: '${locale}',
localeFallback: 'en',
locales: {
${locale},
${locale !== 'en' ? 'en,' : ''}
},
});
export = faker;
`;
content = format(content, prettierTsOptions);
writeFileSync(resolve(pathLocale, locale + '.ts'), content);
}
// src/locales/index.ts
let indexContent = `
${autoGeneratedCommentHeader}
${localeIndexImports}
${localeIndexType};
export type KnownLocales = Record<KnownLocale, LocaleDefinition>;
${localeIndexLocales}};
export default locales;
`;
indexContent = format(indexContent, prettierTsOptions);
writeFileSync(pathLocalesIndex, indexContent);
// docs/api/localization.md
localizationLocales = format(localizationLocales, prettierMdOptions);
let localizationContent = readFileSync(pathDocsApiLocalization, 'utf-8');
localizationContent = localizationContent.replace(
/(^<!-- LOCALES-AUTO-GENERATED-START -->$).*(^<!-- LOCALES-AUTO-GENERATED-END -->$)/gms,
`$1\n\n<!-- Run '${scriptCommand}' to update. -->\n\n${localizationLocales}\n$2`
);
writeFileSync(pathDocsApiLocalization, localizationContent);
|