diff options
| author | ST-DDT <[email protected]> | 2022-02-01 18:06:20 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-02-01 18:06:20 +0100 |
| commit | df48704c818a1addb8c32140f12e592e243f4e6d (patch) | |
| tree | 3767deab4da325f1c6c0937c0192b63786240b12 /scripts | |
| parent | 5e6754da61b63019fd063fad26adbeeabd8b789b (diff) | |
| download | faker-df48704c818a1addb8c32140f12e592e243f4e6d.tar.xz faker-df48704c818a1addb8c32140f12e592e243f4e6d.zip | |
feat: auto generate/update locale files (#252)
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/generateLocales.ts | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/scripts/generateLocales.ts b/scripts/generateLocales.ts new file mode 100644 index 00000000..0d3d2fd2 --- /dev/null +++ b/scripts/generateLocales.ts @@ -0,0 +1,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); |
