{"record":{"id":"fdd068f076cd66c7","repo":"TanStack/table","slug":"globalfilterfn-string-globalfilterfn-is-not","errorCode":null,"errorMessage":"globalFilterFn '${String(globalFilterFn)}' is not registered","messagePattern":"globalFilterFn '(.+?)' is not registered","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts","lineNumber":82,"sourceCode":">(\n  table: Table_Internal<TFeatures, TData>,\n): FilterFn<TFeatures, TData> | undefined {\n  const { globalFilterFn: globalFilterFn } = table.options\n  const filterFns: Record<string, FilterFn<TFeatures, TData>> | undefined =\n    table._rowModelFns.filterFns\n\n  const filterFn = isFunction(globalFilterFn)\n    ? globalFilterFn\n    : globalFilterFn === 'auto'\n      ? table_getGlobalAutoFilterFn()\n      : filterFns?.[globalFilterFn as string]\n\n  if (\n    process.env.NODE_ENV === 'development' &&\n    !filterFn &&\n    globalFilterFn != null\n  ) {\n    console.warn(`globalFilterFn '${String(globalFilterFn)}' is not registered`)\n  }\n\n  return filterFn\n}\n\n/**\n * Routes a global filter updater through the table's global filter handler.\n *\n * The updater may be a next value or a function of the previous value, matching\n * the instance `table.setGlobalFilter` behavior.\n *\n * @example\n * ```ts\n * table_setGlobalFilter(table, 'search text')\n * ```\n */\nexport function table_setGlobalFilter<\n  TFeatures extends TableFeatures,","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/TanStack/table/blob/d01c01bedbab0ff6c2641f18b2fc9a11545d9bf6/packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts#L64-L100","documentation":"This dev-mode warning fires when `table.options.globalFilterFn` is set to a string (not 'auto', not a function) that has no matching entry in the table's filterFns registry (`table._rowModelFns.filterFns`). The library cannot resolve the named filter function, so global filtering silently becomes a no-op (the resolver returns `undefined`). It only logs in development; in production the misconfiguration is invisible except that filtering does nothing.","triggerScenarios":"Setting `globalFilterFn: 'myCustomFilter'` (or a built-in name like 'includesString') in useTable options when that name was never registered via the row-model features' filterFns registry; misspelling the filter name; registering filterFns on a different table instance or passing the registry lazily/after first render; renaming a filter fn in a library upgrade while the string option stays stale.","commonSituations":"Copying config from docs that assume a registry is pre-populated; upgrading table-core versions where built-in filter name strings changed; building filterFns dynamically and the key differs from the option string (case/typos); using a framework adapter that requires filters feature registration which was omitted.","solutions":["Check the exact string passed to `globalFilterFn` against the keys of the object passed as the filterFns registry; fix typos/case mismatches.","Register the missing filter function: add it under that exact key in the `filterFns` record provided to the table's row-model features.","If the function exists locally, pass the function itself instead of a string: `globalFilterFn: myFilterFn`.","Use `globalFilterFn: 'auto'` to fall back to the built-in `includesString` default.","Temporarily log `table._rowModelFns.filterFns` to inspect which names are actually registered in the running instance."],"exampleFix":"// before\nconst table = useTable({ globalFilterFn: 'includes_Str', filterFns: { includesString } })\n\n// after\nconst table = useTable({ globalFilterFn: 'includesString', filterFns: { includesString } })","handlingStrategy":"validation","validationCode":"const filterFns = table._rowModelFns.filterFns ?? {}\nif (\n  typeof globalFilterFn === 'string' &&\n  globalFilterFn !== 'auto' &&\n  !(globalFilterFn in filterFns)\n) {\n  throw new Error(`globalFilterFn '${globalFilterFn}' missing from registry: ${Object.keys(filterFns).join(', ')}`)\n}","typeGuard":"function isRegisteredGlobalFilterFn(\n  fn: unknown,\n  filterFns: Record<string, unknown> | undefined,\n): fn is string {\n  return (\n    typeof fn === 'string' &&\n    (fn === 'auto' || (!!filterFns && fn in filterFns))\n  )\n}","tryCatchPattern":"try {\n  const resolved = table.getGlobalFilterFn()\n  if (!resolved) console.warn('global filtering disabled: unregistered globalFilterFn')\n} catch (e) {\n  console.error('failed to resolve globalFilterFn', e)\n}","preventionTips":["Type the option with a keyof union of your registry keys so typos fail at compile time.","Keep filterFns and globalFilterFn strings co-located in one config module.","Prefer passing filter functions directly over string refs.","Run dev builds during CI; this warning only emits when NODE_ENV=development."],"tags":["filtering","unregistered-function","configuration","dev-warning"],"backgroundTag":"unregistered-function-name","analyzedSha":"d01c01bedbab0ff6c2641f18b2fc9a11545d9bf6","analyzedAt":"2026-08-28T21:52:44.679Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}