aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2023-11-07 17:26:27 +0100
committerGitHub <[email protected]>2023-11-07 16:26:27 +0000
commit8542ef30bd4eda3d9f04db2c4a79abf0369d57c3 (patch)
tree94f768aa2c1c48faedddb745843f6d0b34b19988
parent9498203190e37a96114ddc8e861b02ccd94e517b (diff)
downloadfaker-8542ef30bd4eda3d9f04db2c4a79abf0369d57c3.tar.xz
faker-8542ef30bd4eda3d9f04db2c4a79abf0369d57c3.zip
infra(unicorn): no-array-reduce (#2479)
-rw-r--r--.eslintrc.js1
-rw-r--r--scripts/apidoc/writer.ts23
-rw-r--r--src/internal/group-by.ts25
-rw-r--r--src/modules/word/filter-word-list-by-length.ts10
-rw-r--r--test/all-functional.spec.ts59
-rw-r--r--test/scripts/apidoc/verify-jsdoc-tags.spec.ts18
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 {