{"id":"e9d50f9f803e3533","repo":"jestjs/jest","slug":"resolver-located-at-resolver-does-not-export-an","errorCode":null,"errorMessage":"Resolver located at ${resolver} does not export anything","messagePattern":"Resolver located at (.+?) does not export anything","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/jest-resolve/src/resolver.ts","lineNumber":945,"sourceCode":"\n  return error;\n};\n\ntype ResolverSyncObject = {sync: SyncResolver; async?: AsyncResolver};\ntype ResolverAsyncObject = {sync?: SyncResolver; async: AsyncResolver};\nexport type ResolverObject = ResolverSyncObject | ResolverAsyncObject;\n\nfunction loadResolver(\n  resolver: string | undefined | null,\n): SyncResolver | ResolverObject {\n  if (resolver == null) {\n    return defaultResolver;\n  }\n\n  const loadedResolver = require(resolver);\n\n  if (loadedResolver == null) {\n    throw new Error(`Resolver located at ${resolver} does not export anything`);\n  }\n\n  if (typeof loadedResolver === 'function') {\n    return loadedResolver as SyncResolver;\n  }\n\n  if (\n    typeof loadedResolver === 'object' &&\n    (loadedResolver.sync != null || loadedResolver.async != null)\n  ) {\n    return loadedResolver as ResolverObject;\n  }\n\n  throw new Error(\n    `Resolver located at ${resolver} does not export a function or an object with \"sync\" and \"async\" props`,\n  );\n}\n","sourceCodeStart":927,"sourceCodeEnd":963,"githubUrl":"https://github.com/jestjs/jest/blob/f49721c78e195558b40913977c9230f5b7f559d8/packages/jest-resolve/src/resolver.ts#L927-L963","documentation":"Thrown inside loadResolver when `require(resolver)` returns null or undefined, meaning the user-configured resolver module has no exports at all. Jest cannot use a resolver that exports nothing, so it aborts before any resolution is attempted.","triggerScenarios":"Setting `resolver: './my-resolver.js'` in jest config where that file has no `module.exports` / `export` statement, or where it only declares side effects. Also occurs if the file exports via a default ESM `export default` that the CJS `require()` wraps in `{ default: ... }` leaving the namespace itself non-null but the named export empty in some toolchains — though strictly this branch fires when the required value itself is null/undefined.","commonSituations":"Writing a resolver in ESM/TypeScript and forgetting to compile to CJS before pointing Jest at it; a resolver file that only does `module.exports = undefined` via a bad conditional; pointing at the wrong path (a `.d.ts` or a barrel that re-exports nothing).","solutions":["Confirm the resolver file has an export: `module.exports = (path, options) => ...` or `export default function(...) {...}`.","If using TypeScript, build the resolver to JS first and point `resolver` at the compiled output.","Print the actual export: `node -e \"console.log(require('./my-resolver.js'))\"` and ensure it is not null/undefined."],"exampleFix":"// before — my-resolver.js (no exports)\nconst { defaultResolver } = require('jest-resolve/build/defaultResolver');\n// forgot to export\n\n// after\nmodule.exports = (path, options) => defaultResolver(path, options);","handlingStrategy":"validation","validationCode":"function assertResolverExportsSomething(resolverPath) {\n  const mod = require(resolverPath);\n  if (mod == null) {\n    throw new Error(`Resolver ${resolverPath} exports nothing — add module.exports`);\n  }\n  return mod;\n}","typeGuard":"function isNonNullableExport(m: unknown): boolean {\n  return m != null;\n}","tryCatchPattern":null,"preventionTips":["Always end a resolver file with an explicit `module.exports = ...`.","Build TypeScript resolvers to JS before pointing Jest at them.","Add a unit test that requires the resolver and asserts it is non-null."],"tags":["resolver","config","exports"],"analyzedSha":"f49721c78e195558b40913977c9230f5b7f559d8","analyzedAt":"2026-08-03T20:16:28.571Z","schemaVersion":2}