UNPKG

lighthouse

Version:

Automated auditing, performance metrics, and best practices for the web.

147 lines (126 loc) 4.68 kB
/* eslint-disable strict */ /** * @license * Copyright 2018 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import {Audit} from '../core/audits/audit.js'; import {SharedFlagsSettings, ConfigSettings} from './lhr/settings.js'; import Gatherer from './gatherer.js'; import {IcuMessage} from './lhr/i18n.js'; import Result from './lhr/lhr.js'; interface ClassOf<T> { new (): T; } /** * The Lighthouse Config format. */ interface Config { extends?: 'lighthouse:default' | string; settings?: SharedFlagsSettings; artifacts?: Config.ArtifactJson[] | null; audits?: Config.AuditJson[] | null; categories?: Record<string, Config.CategoryJson> | null; groups?: Record<string, Config.GroupJson> | null; plugins?: Array<string>; } declare module Config { /** * The normalized and fully resolved config. */ interface ResolvedConfig { settings: Settings; artifacts: AnyArtifactDefn[] | null; audits: AuditDefn[] | null; categories: Record<string, Category> | null; groups: Record<string, Group> | null; } interface ArtifactJson { id: string; gatherer: GathererJson; } type GathererJson = { path: string; } | { implementation: ClassOf<Gatherer.GathererInstance>; } | { instance: Gatherer.GathererInstance; } | Gatherer.GathererInstance | ClassOf<Gatherer.GathererInstance> | string; interface CategoryJson { title: string | IcuMessage; auditRefs: AuditRefJson[]; description?: string | IcuMessage; manualDescription?: string | IcuMessage; supportedModes?: Gatherer.GatherMode[]; } interface GroupJson { title: string | IcuMessage; description?: string | IcuMessage; } type AuditJson = { path: string, options?: {}; } | { implementation: typeof Audit; options?: {}; } | typeof Audit | string; /** * Reference to an audit member of a category and how its score should be * weighted and how its results grouped with other members. */ interface AuditRefJson { id: string; weight: number; group?: string; acronym?: string; } type Settings = ConfigSettings; interface ArtifactDefn<TDependencies extends Gatherer.DependencyKey = Gatherer.DependencyKey> { id: string; gatherer: GathererDefn<TDependencies>; dependencies?: TDependencies extends Gatherer.DefaultDependenciesKey ? undefined : Record<Exclude<TDependencies, Gatherer.DefaultDependenciesKey>, {id: string}>; } type ArtifactDefnExpander<TDependencies extends Gatherer.DependencyKey> = // Lack of brackets intentional here to convert to the union of all individual dependencies. TDependencies extends Gatherer.DefaultDependenciesKey ? ArtifactDefn<Gatherer.DefaultDependenciesKey> : ArtifactDefn<TDependencies> type AnyArtifactDefn = ArtifactDefnExpander<Gatherer.DefaultDependenciesKey>|ArtifactDefnExpander<Gatherer.DependencyKey> interface GathererDefn<TDependencies extends Gatherer.DependencyKey = Gatherer.DependencyKey> { implementation?: ClassOf<Gatherer.GathererInstance<TDependencies>>; instance: Gatherer.GathererInstance<TDependencies>; path?: string; } type GathererDefnExpander<TDependencies extends Gatherer.DependencyKey> = // Lack of brackets intentional here to convert to the union of all individual dependencies. TDependencies extends Gatherer.DefaultDependenciesKey ? GathererDefn<Gatherer.DefaultDependenciesKey> : GathererDefn<TDependencies> type AnyGathererDefn = GathererDefnExpander<Gatherer.DefaultDependenciesKey>|GathererDefnExpander<Gatherer.DependencyKey> interface AuditDefn { implementation: typeof Audit; path?: string; options: {}; } // TODO: For now, these are unchanged from JSON and Result versions. Need to harmonize. interface AuditRef extends AuditRefJson {} interface Category extends CategoryJson { auditRefs: AuditRef[]; } interface Group extends GroupJson {} interface Plugin { /** Optionally provide more audits to run in addition to those specified by the base config. */ audits?: Array<{path: string}>; /** Provide a category to display the plugin results in the report. */ category: Config.Category; /** Optionally provide more groups in addition to those specified by the base config. */ groups?: Record<string, Config.GroupJson>; } type Merge = { <T extends Record<string, any>, U extends Record<string, any>>(base: T|null|undefined, extension: U, overwriteArrays?: boolean): T & U; <T extends Array<any>, U extends Array<any>>(base: T|null|undefined, extension: T, overwriteArrays?: boolean): T & U; } } export default Config;