diff --git a/CHANGELOG.md b/CHANGELOG.md index 47287e70c43a..f50ca289d9af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - `[jest-jasmine2]` Convert `PCancelable` to TypeScript ([#10215](https://github.com/facebook/jest/pull/10215)) - `[jest-jasmine2]` Refine typings of `queueRunner` ([#10215](https://github.com/facebook/jest/pull/10215)) +- `[jest-resolve]` Improve types ([#10239](https://github.com/facebook/jest/pull/10239)) ### Performance diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index 88a80f3a3e76..699e8d38612f 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -41,7 +41,7 @@ FAIL __tests__/index.js 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:553:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:552:17) at Object.require (index.js:10:1) `; @@ -70,6 +70,6 @@ FAIL __tests__/index.js 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:553:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:552:17) at Object.require (index.js:10:1) `; diff --git a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap index 5b14d65aaa83..05fe96e8e68e 100644 --- a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap +++ b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap @@ -37,6 +37,6 @@ FAIL __tests__/test.js | ^ 9 | - at Resolver.resolveModule (../../packages/jest-resolve/build/index.js:308:11) + at Resolver.resolveModule (../../packages/jest-resolve/build/index.js:307:11) at Object.require (index.js:8:18) `; diff --git a/packages/jest-resolve/src/ModuleNotFoundError.ts b/packages/jest-resolve/src/ModuleNotFoundError.ts index 064d07c4a9ae..723d1303b5ae 100644 --- a/packages/jest-resolve/src/ModuleNotFoundError.ts +++ b/packages/jest-resolve/src/ModuleNotFoundError.ts @@ -10,7 +10,7 @@ import type {Config} from '@jest/types'; import slash = require('slash'); export default class ModuleNotFoundError extends Error { - code = 'MODULE_NOT_FOUND'; + public code = 'MODULE_NOT_FOUND'; public hint?: string; public requireStack?: Array; public siblingWithSimilarExtensionFound?: boolean; @@ -31,11 +31,11 @@ export default class ModuleNotFoundError extends Error { let message = this._originalMessage; - if (this?.requireStack?.length && this!.requireStack!.length > 1) { + if (this.requireStack?.length && this.requireStack.length > 1) { message += ` Require stack: - ${(this.requireStack as Array) + ${this.requireStack .map(p => p.replace(`${rootDir}${path.sep}`, '')) .map(slash) .join('\n ')} diff --git a/packages/jest-resolve/src/__mocks__/userResolver.d.ts b/packages/jest-resolve/src/__mocks__/userResolver.d.ts new file mode 100644 index 000000000000..155346eca132 --- /dev/null +++ b/packages/jest-resolve/src/__mocks__/userResolver.d.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import defaultResolver from '../defaultResolver'; + +// todo: can be replaced with jest.MockedFunction +declare const userResolver: jest.MockInstance< + ReturnType, + Parameters +>; + +export default userResolver; diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index c7d985a0b523..75f1125697fb 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -10,11 +10,10 @@ import * as path from 'path'; import * as fs from 'graceful-fs'; import {ModuleMap} from 'jest-haste-map'; import Resolver = require('../'); -// @ts-expect-error: js file import userResolver from '../__mocks__/userResolver'; import nodeModulesPaths from '../nodeModulesPaths'; import defaultResolver from '../defaultResolver'; -import {ResolverConfig} from '../types'; +import type {ResolverConfig} from '../types'; jest.mock('../__mocks__/userResolver'); diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index b62270dab5c3..0aeeccda09b7 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -21,11 +21,19 @@ type ResolverOptions = { rootDir?: Config.Path; }; +declare global { + namespace NodeJS { + export interface ProcessVersions { + // the "pnp" version named isn't in DefinitelyTyped + pnp?: unknown; + } + } +} + export default function defaultResolver( path: Config.Path, options: ResolverOptions, ): Config.Path { - // @ts-expect-error: the "pnp" version named isn't in DefinitelyTyped if (process.versions.pnp) { return pnpResolver(path, options); } diff --git a/packages/jest-resolve/src/index.ts b/packages/jest-resolve/src/index.ts index 42d4bf44afca..7588ded4b93c 100644 --- a/packages/jest-resolve/src/index.ts +++ b/packages/jest-resolve/src/index.ts @@ -192,7 +192,6 @@ class Resolver { }); if (!skipResolution) { - // @ts-expect-error: the "pnp" version named isn't in DefinitelyTyped module = resolveNodeModule(moduleName, Boolean(process.versions.pnp)); if (module) { @@ -471,7 +470,7 @@ const createNoMappedModuleFoundError = ( mapModuleName: (moduleName: string) => string, mappedModuleName: string | Array, regex: RegExp, - resolver?: Function | string | null, + resolver?: ((...args: Array) => unknown) | string | null, ) => { const mappedAs = Array.isArray(mappedModuleName) ? JSON.stringify(mappedModuleName.map(mapModuleName), null, 2) diff --git a/packages/jest-resolve/src/isBuiltinModule.ts b/packages/jest-resolve/src/isBuiltinModule.ts index 63e16aeb59a1..83363fb33f4a 100644 --- a/packages/jest-resolve/src/isBuiltinModule.ts +++ b/packages/jest-resolve/src/isBuiltinModule.ts @@ -8,9 +8,7 @@ import module = require('module'); // "private" api -declare const process: { - binding(type: string): {}; -}; +declare const process: NodeJS.Process & {binding(type: string): {}}; const EXPERIMENTAL_MODULES = ['worker_threads'];