{"record":{"id":"d37310657e74ed5d","repo":"GoogleChrome/lighthouse","slug":"onlyaudits-cannot-be-an-empty-array","errorCode":null,"errorMessage":"onlyAudits cannot be an empty array.","messagePattern":"onlyAudits cannot be an empty array\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"core/config/filters.js","lineNumber":266,"sourceCode":"    ...resolvedConfig,\n    artifacts,\n    audits,\n    categories,\n  };\n}\n\n/**\n * Filters a config's artifacts, audits, and categories down to the requested set.\n * Skip audits overrides inclusion via `onlyAudits`/`onlyCategories`.\n *\n * @param {LH.Config.ResolvedConfig} resolvedConfig\n * @param {Pick<LH.Config.Settings, 'onlyAudits'|'onlyCategories'|'skipAudits'>} filters\n * @return {LH.Config.ResolvedConfig}\n */\nfunction filterConfigByExplicitFilters(resolvedConfig, filters) {\n  const {onlyAudits, onlyCategories, skipAudits} = filters;\n  if (onlyAudits && !onlyAudits.length) {\n    throw new Error(`onlyAudits cannot be an empty array.`);\n  }\n  if (onlyCategories && !onlyCategories.length) {\n    throw new Error(`onlyCategories cannot be an empty array.`);\n  }\n\n  errorOnUnknownOnlyCategories(resolvedConfig.categories, onlyCategories);\n\n  let baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, undefined);\n  if (onlyCategories) {\n    baseAuditIds = getAuditIdsInCategories(resolvedConfig.categories, onlyCategories);\n  } else if (onlyAudits) {\n    baseAuditIds = new Set();\n  } else if (!resolvedConfig.categories || !Object.keys(resolvedConfig.categories).length) {\n    baseAuditIds = new Set(resolvedConfig.audits?.map(audit => audit.implementation.meta.id));\n  }\n\n  const auditIdsToKeep = new Set(\n    [","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/config/filters.js#L248-L284","documentation":"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.","triggerScenarios":"flags.onlyCategories/onlyAudits set to [] (e.g. computed from an empty user selection). onlyAudits && !onlyAudits.length is true, so filters.js:266 throws.","commonSituations":"Dynamically building onlyAudits from a UI checkbox list where nothing was selected. Spreading an empty array. Conditional logic that defaults to [] instead of undefined.","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'."],"exampleFix":"// before\nconst flags = {onlyAudits: selectedAudits}; // selectedAudits === []\n// after\nconst flags = {onlyAudits: selectedAudits.length ? selectedAudits : undefined};","handlingStrategy":"validation","validationCode":"if (Array.isArray(flags.onlyAudits) && flags.onlyAudits.length === 0) {\n  flags.onlyAudits = undefined; // or reject user input\n}","typeGuard":"function onlyAuditsIsValid(v) { return v == null || (Array.isArray(v) && v.length > 0); }","tryCatchPattern":"try { await lighthouse(url, flags); }\ncatch (e) { if (/onlyAudits cannot be an empty array/.test(e.message)) { flags.onlyAudits = undefined; } throw e; }","preventionTips":["Coerce empty selections to undefined, not [].","Validate UI selections require at least one item."],"tags":["config","lighthouse","filters","validation","audits"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}