From 3a0f3c439f0f9283dffbc8b6f94c0a84ddff1ee1 Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Mon, 9 Sep 2024 10:27:21 +1200 Subject: [PATCH] =?UTF-8?q?refactor(betterer=20=F0=9F=94=A7):=20fix=20test?= =?UTF-8?q?=20mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 157 +++++++++++++++++- package.json | 3 +- packages/betterer/src/config/validate.ts | 6 +- packages/betterer/src/context/config.ts | 4 +- packages/betterer/src/globals.ts | 2 +- .../config-validation.spec.ts.snap | 6 +- 6 files changed, 161 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2d58727b..c719ed580 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@phenomnomnominal/commitlint-plugin": "^1.1.1", "@types/eslint": "^9.6.1", "@types/node": "^18.19.50", + "@typescript-eslint/parser": "^8.4.0", "@vitest/coverage-v8": "^1.5.0", "@vitest/ui": "^1.5.0", "cz-conventional-changelog": "^3.3.0", @@ -5150,15 +5151,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", - "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", + "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.3.0", - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/typescript-estree": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", "debug": "^4.3.4" }, "engines": { @@ -5177,6 +5178,120 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", + "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", + "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", + "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", + "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", @@ -17446,6 +17561,34 @@ } } }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ufo": { "version": "1.5.3", "dev": true, diff --git a/package.json b/package.json index 9078e15e5..b8233b18e 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@phenomnomnominal/commitlint-plugin": "^1.1.1", "@types/eslint": "^9.6.1", "@types/node": "^18.19.50", + "@typescript-eslint/parser": "^8.4.0", "@vitest/coverage-v8": "^1.5.0", "@vitest/ui": "^1.5.0", "cz-conventional-changelog": "^3.3.0", @@ -86,4 +87,4 @@ "path": "cz-conventional-changelog" } } -} +} \ No newline at end of file diff --git a/packages/betterer/src/config/validate.ts b/packages/betterer/src/config/validate.ts index 4958405f7..cef251af3 100644 --- a/packages/betterer/src/config/validate.ts +++ b/packages/betterer/src/config/validate.ts @@ -1,5 +1,4 @@ import assert from 'node:assert'; -import os from 'node:os'; import { BettererError } from '@betterer/errors'; @@ -68,8 +67,9 @@ export function validateStringRegExpArray(config: Config) return config; } -export function validateWorkers(workers: number | boolean = true): number { - const totalCPUs = os.cpus().length; +export async function validateWorkers(workers: number | boolean = true): Promise { + const { cpus } = await import('node:os'); + const totalCPUs = cpus().length; if (workers === true || isUndefined(workers)) { workers = totalCPUs >= 4 ? totalCPUs - 2 : false; diff --git a/packages/betterer/src/context/config.ts b/packages/betterer/src/context/config.ts index fe535ba26..01123ff58 100644 --- a/packages/betterer/src/context/config.ts +++ b/packages/betterer/src/context/config.ts @@ -10,7 +10,7 @@ import { validateWorkers } from '../config/index.js'; -export function createContextConfig(options: BettererOptionsContext): BettererConfigContext { +export async function createContextConfig(options: BettererOptionsContext): Promise { const ci = options.ci ?? false; const filters = toRegExps(toArray(options.filters)); const excludes = toRegExps(toArray(options.excludes)); @@ -27,7 +27,7 @@ export function createContextConfig(options: BettererOptionsContext): BettererCo validateStringRegExpArray({ filters }); validateStringArray({ includes }); - const workers = validateWorkers(options.workers); + const workers = await validateWorkers(options.workers); return { ci, diff --git a/packages/betterer/src/globals.ts b/packages/betterer/src/globals.ts index 7c59df6bb..fb1145677 100644 --- a/packages/betterer/src/globals.ts +++ b/packages/betterer/src/globals.ts @@ -44,7 +44,7 @@ export async function createGlobals( let reporter = await loadDefaultReporter(); try { - const configContext = createContextConfig(options); + const configContext = await createContextConfig(options); const configFS = await createFSConfig(options); const configReporter = await createReporterConfig(configFS, options); const configWatcher = createWatcherConfig(configFS, optionsWatch); diff --git a/test/__snapshots__/config-validation.spec.ts.snap b/test/__snapshots__/config-validation.spec.ts.snap index 2d00500fe..da5cfeacf 100644 --- a/test/__snapshots__/config-validation.spec.ts.snap +++ b/test/__snapshots__/config-validation.spec.ts.snap @@ -315,7 +315,7 @@ Error: "workers" must be a number. Received \`{}\`. exports[`betterer > should throw when there is invalid config: { workers: -1 } 1`] = ` [ " -Error: "workers" must be more than zero and not more than the number of available CPUs (10). To disable workers, set to \`false\`. Received \`-1\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`-1\`. ", ] `; @@ -323,7 +323,7 @@ Error: "workers" must be more than zero and not more than the number of availabl exports[`betterer > should throw when there is invalid config: { workers: 1000 } 1`] = ` [ " -Error: "workers" must be more than zero and not more than the number of available CPUs (10). To disable workers, set to \`false\`. Received \`1000\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`1000\`. ", ] `; @@ -331,7 +331,7 @@ Error: "workers" must be more than zero and not more than the number of availabl exports[`betterer > should throw when there is invalid config: { workers: NaN } 1`] = ` [ " -Error: "workers" must be more than zero and not more than the number of available CPUs (10). To disable workers, set to \`false\`. Received \`null\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`null\`. ", ] `;