diff options
| author | ST-DDT <[email protected]> | 2022-02-17 00:05:56 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-02-17 00:05:56 +0100 |
| commit | b611ca1c6f7d756f224a1a7b641e36b531d169be (patch) | |
| tree | da32458b853e6aad28fbd483ed0085f80a801a1c /scripts | |
| parent | 895cd0d5574cab06019080c15c02f8fdd22e628e (diff) | |
| download | faker-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.ts | 109 |
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 |
