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
- Pass undefined/null instead of [] when no specific audits are requested.
- Guard before the run: const onlyAudits = list.length ? list : undefined.
- 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
- Coerce empty selections to undefined, not [].
- Validate UI selections require at least one item.
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
- unrecognized category in 'onlyCategories': ${unknown.join(',
- onlyCategories cannot be an empty array.
- ${pluginName} has an invalid category description.
- ${pluginName} has an invalid category manualDescription.
- ${pluginName} supportedModes must be an array, valid array v
AI-assisted analysis of GoogleChrome/lighthouse@9515cd4e58 (2026-08-13).
Data as JSON: /api/errors/d37310657e74ed5d.
Report an issue: GitHub.