{"record":{"id":"35cb325322428130","repo":"evanw/esbuild","slug":"onresolve-call-is-missing-a-filter","errorCode":null,"errorMessage":"onResolve() call is missing a filter","messagePattern":"onResolve\\(\\) call is missing a filter","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/shared/common.ts","lineNumber":1314,"sourceCode":"          onStartCallbacks.push({ name: name!, callback, note: registeredNote })\n          plugin.onStart = true\n        },\n\n        onEnd(callback) {\n          let registeredText = `This error came from the \"onEnd\" callback registered here:`\n          let registeredNote = extractCallerV8(new Error(registeredText), streamIn, 'onEnd')\n          onEndCallbacks.push({ name: name!, callback, note: registeredNote })\n          plugin.onEnd = true\n        },\n\n        onResolve(options, callback) {\n          let registeredText = `This error came from the \"onResolve\" callback registered here:`\n          let registeredNote = extractCallerV8(new Error(registeredText), streamIn, 'onResolve')\n          let keys: OptionKeys = {}\n          let filter = getFlag(options, keys, 'filter', mustBeRegExp)\n          let namespace = getFlag(options, keys, 'namespace', mustBeString)\n          checkForInvalidFlags(options, keys, `in onResolve() call for plugin ${quote(name)}`)\n          if (filter == null) throw new Error(`onResolve() call is missing a filter`)\n          let id = nextCallbackID++\n          onResolveCallbacks[id] = { name: name!, callback, note: registeredNote }\n          plugin.onResolve.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || '' })\n        },\n\n        onLoad(options, callback) {\n          let registeredText = `This error came from the \"onLoad\" callback registered here:`\n          let registeredNote = extractCallerV8(new Error(registeredText), streamIn, 'onLoad')\n          let keys: OptionKeys = {}\n          let filter = getFlag(options, keys, 'filter', mustBeRegExp)\n          let namespace = getFlag(options, keys, 'namespace', mustBeString)\n          checkForInvalidFlags(options, keys, `in onLoad() call for plugin ${quote(name)}`)\n          if (filter == null) throw new Error(`onLoad() call is missing a filter`)\n          let id = nextCallbackID++\n          onLoadCallbacks[id] = { name: name!, callback, note: registeredNote }\n          plugin.onLoad.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || '' })\n        },\n","sourceCodeStart":1296,"sourceCodeEnd":1332,"githubUrl":"https://github.com/evanw/esbuild/blob/f6058f8364fe7ab91ca57a83e02577ed74c9cae4/lib/shared/common.ts#L1296-L1332","documentation":"When a plugin registers an `onResolve` callback (lib/shared/common.ts:1314), esbuild reads `options.filter` with `mustBeRegExp` and throws if it is null/undefined. The filter is a RegExp that limits which import paths this callback handles; it is required because the resolver is performance-sensitive and must avoid invoking every plugin for every path.","triggerScenarios":"Calling `build.onResolve({}, callback)` or `build.onResolve({ namespace: 'x' }, callback)` without supplying a `filter` RegExp.","commonSituations":"Forgetting the filter; passing a string filter instead of a RegExp; assuming esbuild matches everything by default.","solutions":["Pass a `filter` RegExp, e.g. `build.onResolve({ filter: /^node:path$/ }, cb)`.","To match all paths use `/.*/`, but prefer a tighter filter for performance.","Ensure the value is a RegExp literal or `new RegExp(...)`, not a string."],"exampleFix":"// before\nbuild.onResolve({ namespace: 'ns' }, args => { ... });\n// after\nbuild.onResolve({ filter: /.*/, namespace: 'ns' }, args => { ... });","handlingStrategy":"validation","validationCode":"function registerOnResolve(build, opts, cb) {\n  if (!(opts.filter instanceof RegExp)) throw new Error('onResolve requires a filter RegExp');\n  build.onResolve(opts, cb);\n}","typeGuard":"function hasOnResolveFilter(o: any): o is { filter: RegExp } {\n  return !!o && o.filter instanceof RegExp;\n}","tryCatchPattern":null,"preventionTips":["Always pass a RegExp literal as filter.","Tighten filters to improve build performance."],"tags":["plugins","onresolve","validation","api-misuse"],"backgroundTag":null,"analyzedSha":"f6058f8364fe7ab91ca57a83e02577ed74c9cae4","analyzedAt":"2026-08-09T18:37:22.223Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}