diff options
| author | ST-DDT <[email protected]> | 2023-11-07 17:26:27 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-11-07 16:26:27 +0000 |
| commit | 8542ef30bd4eda3d9f04db2c4a79abf0369d57c3 (patch) | |
| tree | 94f768aa2c1c48faedddb745843f6d0b34b19988 | |
| parent | 9498203190e37a96114ddc8e861b02ccd94e517b (diff) | |
| download | faker-8542ef30bd4eda3d9f04db2c4a79abf0369d57c3.tar.xz faker-8542ef30bd4eda3d9f04db2c4a79abf0369d57c3.zip | |
infra(unicorn): no-array-reduce (#2479)
| -rw-r--r-- | .eslintrc.js | 1 | ||||
| -rw-r--r-- | scripts/apidoc/writer.ts | 23 | ||||
| -rw-r--r-- | src/internal/group-by.ts | 25 | ||||
| -rw-r--r-- | src/modules/word/filter-word-list-by-length.ts | 10 | ||||
| -rw-r--r-- | test/all-functional.spec.ts | 59 | ||||
| -rw-r--r-- | test/scripts/apidoc/verify-jsdoc-tags.spec.ts | 18 |
6 files changed, 76 insertions, 60 deletions
diff --git a/.eslintrc.js b/.eslintrc.js index 7e60b795..16d720b9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -50,7 +50,6 @@ module.exports = defineConfig({ 'unicorn/consistent-function-scoping': 'off', 'unicorn/import-style': 'off', 'unicorn/no-array-callback-reference': 'off', - 'unicorn/no-array-reduce': 'off', 'unicorn/no-await-expression-member': 'off', 'unicorn/no-object-as-default-parameter': 'off', 'unicorn/no-useless-switch-case': 'off', diff --git a/scripts/apidoc/writer.ts b/scripts/apidoc/writer.ts index b5fa5806..0fc7ae78 100644 --- a/scripts/apidoc/writer.ts +++ b/scripts/apidoc/writer.ts @@ -63,20 +63,17 @@ export async function writeApiDocsModule( text: moduleName, link: `/api/${lowerModuleName}.html`, methods, - diff: methods.reduce( - (data, method) => ({ - ...data, - [method.name]: methodDiffHash(method), + diff: { + moduleHash: diffHash({ + name: moduleName, + field: lowerModuleName, + deprecated, + comment, }), - { - moduleHash: diffHash({ - name: moduleName, - field: lowerModuleName, - deprecated, - comment, - }), - } - ), + ...Object.fromEntries( + methods.map((method) => [method.name, methodDiffHash(method)]) + ), + }, }; } diff --git a/src/internal/group-by.ts b/src/internal/group-by.ts new file mode 100644 index 00000000..ff3242c9 --- /dev/null +++ b/src/internal/group-by.ts @@ -0,0 +1,25 @@ +/** + * Groups the values by the key function. + * + * @internal + * + * @param values The values to group. + * @param keyFunction The function to get the key from the value. + */ +export function groupBy<TValue>( + values: ReadonlyArray<TValue>, + keyFunction: (value: TValue) => string | number +): Record<string, TValue[]> { + const result: Record<string, TValue[]> = {}; + + for (const value of values) { + const key = keyFunction(value); + if (result[key] === undefined) { + result[key] = []; + } + + result[key].push(value); + } + + return result; +} diff --git a/src/modules/word/filter-word-list-by-length.ts b/src/modules/word/filter-word-list-by-length.ts index 60c6fae9..f3fcd5ab 100644 --- a/src/modules/word/filter-word-list-by-length.ts +++ b/src/modules/word/filter-word-list-by-length.ts @@ -1,4 +1,5 @@ import { FakerError } from '../../errors/faker-error'; +import { groupBy } from '../../internal/group-by'; /** * The error handling strategies for the `filterWordListByLength` function. @@ -13,14 +14,7 @@ const STRATEGIES = { wordList: ReadonlyArray<string>, length: { min: number; max: number } ): string[] => { - const wordsByLength = wordList.reduce<Record<number, string[]>>( - (data, word) => { - (data[word.length] = data[word.length] ?? []).push(word); - return data; - }, - {} - ); - + const wordsByLength = groupBy(wordList, (word) => word.length); const lengths = Object.keys(wordsByLength).map(Number); const min = Math.min(...lengths); const max = Math.max(...lengths); diff --git a/test/all-functional.spec.ts b/test/all-functional.spec.ts index 91c310b2..c5bef114 100644 --- a/test/all-functional.spec.ts +++ b/test/all-functional.spec.ts @@ -10,12 +10,36 @@ const IGNORED_MODULES = new Set([ '_defaultRefDate', ]); -function isTestableModule(mod: string) { - return !IGNORED_MODULES.has(mod); +function getMethodNamesByModules(faker: Faker): { [module: string]: string[] } { + return Object.fromEntries( + Object.keys(faker) + .filter(isTestableModule) + .sort() + .map<[string, string[]]>((moduleName) => [ + moduleName, + getMethodNamesOf(faker[moduleName]), + ]) + .filter(([module, methods]) => { + if (methods.length === 0) { + console.log(`Skipping ${module} - No testable methods`); + return false; + } + + return true; + }) + ); +} + +function isTestableModule(moduleName: string): moduleName is keyof Faker { + return !IGNORED_MODULES.has(moduleName); +} + +function getMethodNamesOf(module: object): string[] { + return Object.keys(module).filter(isMethodOf(module)); } -function isMethodOf(mod: string) { - return (meth: string) => typeof fakerEN[mod][meth] === 'function'; +function isMethodOf(module: object): (method: string) => boolean { + return (method: string) => typeof module[method] === 'function'; } type SkipConfig<TModule> = Partial< @@ -53,36 +77,17 @@ const BROKEN_LOCALE_METHODS = { }; function isWorkingLocaleForMethod( - mod: string, - meth: string, + module: string, + method: string, locale: string ): boolean { - const broken = BROKEN_LOCALE_METHODS[mod]?.[meth] ?? []; + const broken = BROKEN_LOCALE_METHODS[module]?.[method] ?? []; return broken !== '*' && !broken.includes(locale); } // Basic smoke tests to make sure each method is at least implemented and returns a value. -function modulesList(): { [module: string]: string[] } { - const modules = Object.keys(fakerEN) - .sort() - .filter(isTestableModule) - .reduce((result, mod) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const methods = Object.keys(fakerEN[mod]).filter(isMethodOf(mod)); - if (methods.length > 0) { - result[mod] = methods; - } else { - console.log(`Skipping ${mod} - No testable methods`); - } - - return result; - }, {}); - - return modules; -} - -const modules = modulesList(); +const modules = getMethodNamesByModules(fakerEN); describe('BROKEN_LOCALE_METHODS test', () => { it('should not contain obsolete configuration (modules)', () => { diff --git a/test/scripts/apidoc/verify-jsdoc-tags.spec.ts b/test/scripts/apidoc/verify-jsdoc-tags.spec.ts index a924c268..47eca926 100644 --- a/test/scripts/apidoc/verify-jsdoc-tags.spec.ts +++ b/test/scripts/apidoc/verify-jsdoc-tags.spec.ts @@ -47,28 +47,24 @@ describe('verify JSDoc tags', () => { } const allowedReferences = new Set( - Object.values(modules).reduce<string[]>((acc, [module, methods]) => { + Object.values(modules).flatMap(([module, methods]) => { const moduleFieldName = extractModuleFieldName(module); - return [ - ...acc, - ...Object.keys(methods).map( - (methodName) => `faker.${moduleFieldName}.${methodName}` - ), - ]; - }, []) + return Object.keys(methods).map( + (methodName) => `faker.${moduleFieldName}.${methodName}` + ); + }) ); const allowedLinks = new Set( - Object.values(modules).reduce<string[]>((acc, [module, methods]) => { + Object.values(modules).flatMap(([module, methods]) => { const moduleFieldName = extractModuleFieldName(module); return [ - ...acc, `/api/${moduleFieldName}.html`, ...Object.keys(methods).map( (methodName) => `/api/${moduleFieldName}.html#${methodName.toLowerCase()}` ), ]; - }, []) + }) ); function assertDescription(description: string, isHtml: boolean): void { |
