aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2022-02-17 00:05:56 +0100
committerGitHub <[email protected]>2022-02-17 00:05:56 +0100
commitb611ca1c6f7d756f224a1a7b641e36b531d169be (patch)
treeda32458b853e6aad28fbd483ed0085f80a801a1c /scripts
parent895cd0d5574cab06019080c15c02f8fdd22e628e (diff)
downloadfaker-b611ca1c6f7d756f224a1a7b641e36b531d169be.tar.xz
faker-b611ca1c6f7d756f224a1a7b641e36b531d169be.zip
feat(types): generate all locales index files with non-any types (#494)
Diffstat (limited to 'scripts')
-rw-r--r--scripts/generateLocales.ts109
1 files changed, 66 insertions, 43 deletions
diff --git a/scripts/generateLocales.ts b/scripts/generateLocales.ts
index eab91b43..68a5130a 100644
--- a/scripts/generateLocales.ts
+++ b/scripts/generateLocales.ts
@@ -1,4 +1,4 @@
-import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
+import { lstatSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
import type { Options } from 'prettier';
import { format } from 'prettier';
@@ -44,20 +44,16 @@ function removeTsSuffix(files: string[]): string[] {
}
function escapeImport(module: string): string {
- if (module === 'name') {
- return 'name_';
- } else if (module === 'type') {
- return 'type_';
+ if (['name', 'type', 'switch'].includes(module)) {
+ return `${module}_`;
} else {
return module;
}
}
function escapeField(module: string): string {
- if (module === 'name') {
- return 'name: name_';
- } else if (module === 'type') {
- return 'type: type_';
+ if (['name', 'type', 'switch'].includes(module)) {
+ return `${module}: ${module}_`;
} else {
return module;
}
@@ -70,7 +66,7 @@ function containsAll(checked?: string[], expected?: string[]): boolean {
return expected.every((c) => checked.includes(c));
}
-function generateLocaleFile(locale: string) {
+function generateLocaleFile(locale: string): void {
let content = `
${autoGeneratedCommentHeader}
@@ -129,7 +125,7 @@ function generateLocalesIndexFile(
depth: number,
extra: string = '',
expected?: string[]
-) {
+): void {
let modules = readdirSync(path);
modules = removeIndexTs(modules);
modules = removeTsSuffix(modules);
@@ -141,14 +137,19 @@ function generateLocalesIndexFile(
let asType = '';
if (!containsAll(expected, modules)) {
asType = ` as ${type}`;
- } else {
+ } else if (type !== 'any') {
fieldType = `: ${type}`;
}
- let content = `${autoGeneratedCommentHeader}
- import type { ${importType} } from '..${'/..'.repeat(depth)}';
- ${modules
- .map((module) => `import ${escapeImport(module)} from './${module}';`)
- .join('\n')}
+ let content = `${autoGeneratedCommentHeader}\n`;
+ if (type !== 'any') {
+ content += ` import type { ${importType.replace(
+ /\[.*/,
+ ''
+ )} } from '..${'/..'.repeat(depth)}';\n`;
+ }
+ content += ` ${modules
+ .map((module) => `import ${escapeImport(module)} from './${module}';`)
+ .join('\n')}
const ${name}${fieldType} = {
${extra}
@@ -161,6 +162,51 @@ function generateLocalesIndexFile(
writeFileSync(resolve(path, 'index.ts'), content);
}
+function generateRecursiveModuleIndexes(
+ path: string,
+ name: string,
+ definition: string,
+ depth: number,
+ extra?: string,
+ moduleFiles?: string[]
+): void {
+ generateLocalesIndexFile(path, name, definition, depth, extra, moduleFiles);
+
+ let submodules = readdirSync(path);
+ submodules = removeIndexTs(submodules);
+ for (const submodule of submodules) {
+ const pathModule = resolve(path, submodule);
+ // Only process sub folders recursively
+ if (lstatSync(pathModule).isDirectory()) {
+ let moduleDefinition =
+ definition === 'any' ? 'any' : `${definition}['${submodule}']`;
+ let moduleFiles: string[];
+
+ // Overwrite types of src/locales/<locale>/<module>/index.ts for known DEFINITIONS
+ if (depth === 1) {
+ moduleFiles = DEFINITIONS[submodule];
+ if (typeof moduleFiles === 'undefined') {
+ moduleDefinition = 'any';
+ } else {
+ moduleDefinition = `${submodule.replace(/(^|_)([a-z])/g, (s) =>
+ s.replace('_', '').toUpperCase()
+ )}Definitions`;
+ }
+ }
+
+ // Recursive
+ generateRecursiveModuleIndexes(
+ pathModule,
+ submodule,
+ moduleDefinition,
+ depth + 1,
+ undefined,
+ moduleFiles
+ );
+ }
+ }
+}
+
// Start of actual logic
const locales = readdirSync(pathLocales);
@@ -188,38 +234,15 @@ for (const locale of locales) {
// src/locale/<locale>.ts
generateLocaleFile(locale);
- // src/locales/<locale>/index.ts
- generateLocalesIndexFile(
+ // src/locales/**/index.ts
+ generateRecursiveModuleIndexes(
pathModules,
locale,
'LocaleDefinition',
1,
`title: '${localeTitle}',` +
- (localeSeparator ? `\nseparator: '${localeSeparator}',` : ''),
- undefined
+ (localeSeparator ? `\nseparator: '${localeSeparator}',` : '')
);
-
- let modules = readdirSync(pathModules);
- modules = removeIndexTs(modules);
- modules = removeTsSuffix(modules);
- for (const module of modules) {
- // src/locales/<locale>/<module>/index.ts
- const pathModule = resolve(pathModules, module);
- const moduleFiles: string[] = DEFINITIONS[module];
- if (typeof moduleFiles === 'undefined') {
- continue;
- }
- generateLocalesIndexFile(
- pathModule,
- module,
- `${module.replace(/(^|_)([a-z])/g, (s) =>
- s.replace('_', '').toUpperCase()
- )}Definitions`,
- 2,
- '',
- moduleFiles
- );
- }
}
// src/locales/index.ts