aboutsummaryrefslogtreecommitdiff
path: root/scripts/generateLocales.ts
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2022-02-01 18:06:20 +0100
committerGitHub <[email protected]>2022-02-01 18:06:20 +0100
commitdf48704c818a1addb8c32140f12e592e243f4e6d (patch)
tree3767deab4da325f1c6c0937c0192b63786240b12 /scripts/generateLocales.ts
parent5e6754da61b63019fd063fad26adbeeabd8b789b (diff)
downloadfaker-df48704c818a1addb8c32140f12e592e243f4e6d.tar.xz
faker-df48704c818a1addb8c32140f12e592e243f4e6d.zip
feat: auto generate/update locale files (#252)
Diffstat (limited to 'scripts/generateLocales.ts')
-rw-r--r--scripts/generateLocales.ts101
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);