krisk/Fuse · error · Error

Object query syntax is not available in this build

Error message

Object query syntax is not available in this build

What it means

Object (field) query syntax like { title: { $contains: 'x' } } requires the extended-search object compiler, which is optional in some builds. When the query parser auto-detects an object query and getObjectCompiler() returns nothing (feature not bundled or not registered), it throws this error rather than failing later with an opaque message.

Solutions

  1. Import the full fuse.js entry point (which includes extended search) instead of a basic/minimal one.
  2. Enable extended search support (EXTENDED_SEARCH_ENABLED) so the compiler is registered.
  3. Rewrite the query as a plain string or logical expression supported by the current build.

Example fix

// before (basic build)
import Fuse from 'fuse.js/basic'
fuse.search({ title: { $contains: 'world' } })
// after
import Fuse from 'fuse.js'
process.env.EXTENDED_SEARCH_ENABLED = '1'
fuse.search({ title: { $contains: 'world' } })
Defensive patterns

Strategy: fallback

Validate before calling

const usesObjectQuery = (q) =>
  q !== null && typeof q === 'object' &&
  Object.values(q).some(v => v !== null && typeof v === 'object')
if (usesObjectQuery(query) && !extendedSearchAvailable()) {
  query = toPlainStringQuery(query) // degrade before calling search
}
fuse.search(query)

Type guard

const hasObjectCompiler = () => typeof getObjectCompiler() === 'function'

Try / catch

try {
  return fuse.search(query)
} catch (e) {
  if (e.message.includes('Object query syntax is not available')) {
    return fuse.search(toPlainStringQuery(query))
  }
  throw e
}

Prevention

When it happens

Trigger: Passing a query object with per-field operator values to fuse.search() in a build where the object-query compiler is unavailable (e.g. the basic/minimal entry point, or extended search not enabled).

Common situations: Using the basic Fuse build with extended-search syntax; switching from the full bundle to a tree-shaken/lite entry; copying extended-search examples into an app importing a minimal build.

Related errors


AI-assisted analysis of krisk/Fuse@edf2fb608e (2026-09-02). Data as JSON: /api/errors/ca8f5f8bb4b357d2. Report an issue: GitHub.

Appendix: source

Thrown at src/core/queryParser.ts:118

        return obj
      }

      // Object ("MongoDB-style") operator leaf. Retain the raw operator object
      // so the AST identifies the query even when searcher-free; build the
      // searcher only when `auto` (mirrors the string leaf's gating). The
      // compiler lives behind the extended-search flag: if it isn't registered
      // (dev `Fuse.parseQuery` on a minimal build), throw a clear error rather
      // than silently misbehave.
      if (isObjectLike(value) && !isArray(value)) {
        const obj: ParsedLeaf = {
          keyId: createKeyId(key),
          fieldQuery: value
        }

        if (auto) {
          const compile = getObjectCompiler()
          if (!compile) {
            throw new Error(ErrorMsg.OBJECT_QUERY_UNAVAILABLE)
          }
          const keyPath = isArray(key) ? key.join('.') : String(key)
          obj.searcher = compile(value, keyPath, options)
        }

        return obj
      }

      throw new Error(ErrorMsg.LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))
    }

    const node: ParsedOperator = {
      children: [],
      operator: keys[0]
    }

    keys.forEach((key) => {
      const value = query[key]

View on GitHub (pinned to edf2fb608e)