GoogleChrome/lighthouse · error · Error

onlyAudits cannot be an empty array.

Error message

onlyAudits cannot be an empty array.

What it means

Thrown by filterConfigByExplicitFilters in filters.js. settings.onlyAudits is allowed to be null/undefined (meaning 'all') but, if it is an array, it must be non-empty. An empty array is treated as a configuration mistake (requesting zero audits) rather than 'all', so Lighthouse fails fast.

Source

Thrown at core/config/filters.js:266

    ...resolvedConfig,
    artifacts,
    audits,
    categories,
  };
}

/**
 * Filters a config's artifacts, audits, and categories down to the requested set.
 * Skip audits overrides inclusion via `onlyAudits`/`onlyCategories`.
 *
 * @param {LH.Config.ResolvedConfig} resolvedConfig
 * @param {Pick<LH.Config.Settings, 'onlyAudits'|'onlyCategories'|'skipAudits'>} filters
 * @return {LH.Config.ResolvedConfig}
 */
function filterConfigByExplicitFilters(resolvedConfig, filters) {
  const {onlyAudits, onlyCategories, skipAudits} = filters;
  if (onlyAudits && !onlyAudits.length) {
    throw new Error(`onlyAudits cannot be an empty array.`);
  }
  if (onlyCategories && !onlyCategories.length) {
    throw new Error(`onlyCategories cannot be an empty array.`);
  }

  errorOnUnknownOnlyCategories(resolvedConfig.categories, onlyCategories);

  let baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, undefined);
  if (onlyCategories) {
    baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, onlyCategories);
  } else if (onlyAudits) {
    baseAuditIds = new Set();
  } else if (!resolvedConfig.categories || !Object.keys(resolvedConfig.categories).length) {
    baseAuditIds = new Set(resolvedConfig.audits?.map(audit => audit.implementation.meta.id));
  }

  const auditIdsToKeep = new Set(
    [

View on GitHub (pinned to 9515cd4e58)

Solutions

  1. Pass undefined/null instead of [] when no specific audits are requested.
  2. Guard before the run: const onlyAudits = list.length ? list : undefined.
  3. Validate user input and require at least one selection, or fall back to 'all'.

Example fix

// before
const flags = {onlyAudits: selectedAudits}; // selectedAudits === []
// after
const flags = {onlyAudits: selectedAudits.length ? selectedAudits : undefined};
Defensive patterns

Strategy: validation

Validate before calling

if (Array.isArray(flags.onlyAudits) && flags.onlyAudits.length === 0) {
  flags.onlyAudits = undefined; // or reject user input
}

Type guard

function onlyAuditsIsValid(v) { return v == null || (Array.isArray(v) && v.length > 0); }

Try / catch

try { await lighthouse(url, flags); }
catch (e) { if (/onlyAudits cannot be an empty array/.test(e.message)) { flags.onlyAudits = undefined; } throw e; }

Prevention

When it happens

Trigger: flags.onlyCategories/onlyAudits set to [] (e.g. computed from an empty user selection). onlyAudits && !onlyAudits.length is true, so filters.js:266 throws.

Common situations: Dynamically building onlyAudits from a UI checkbox list where nothing was selected. Spreading an empty array. Conditional logic that defaults to [] instead of undefined.

Related errors


AI-assisted analysis of GoogleChrome/lighthouse@9515cd4e58 (2026-08-13). Data as JSON: /api/errors/d37310657e74ed5d. Report an issue: GitHub.