/// /// /// /// import { ParentNode } from '@web/parse5-utils'; import { EventEmitter } from 'events'; import http from 'http'; import lightningCss from 'lightningcss'; import { Promisable } from 'type-fest'; import { UrlWithStringQuery } from 'url'; import { Config, WebExtension } from '../config.mjs'; import { Flags } from './bundle.mjs'; import { RelativeStyle } from './css.mjs'; import { RelativeScript } from './esbuild.mjs'; export interface Plugin { (config: Config, flags: Flags): Promisable; } export interface PluginInstance { cssPlugins?: CssPlugin[]; buildEnd?(wasRebuild: boolean): Promisable; hmr?(clients: Plugin.ClientSet): Plugin.HmrInstance | void; /** * Must return `true` if changes are made to the `manifest` object. */ webext?(manifest: any, webextConfig: WebExtension.Config): Promisable; serve?(request: Plugin.Request, response: http.ServerResponse): Promisable; document?(root: ParentNode, file: string, meta: { scripts: RelativeScript[]; styles: RelativeStyle[]; }): void; } export declare namespace Plugin { interface Request extends http.IncomingMessage, UrlWithStringQuery { url: string; path: string; pathname: string; searchParams: URLSearchParams; } interface HmrInstance { /** * Return true to prevent full reload. */ accept(file: string): boolean | void; update(files: string[]): Promise; } interface ClientSet extends ReadonlySet { on(type: 'connect', handler: (event: ClientEvent) => void): void; on(type: string, handler: (event: ClientEvent) => void): void; } interface Client extends EventEmitter { evaluate: (expr: string) => Promise; evaluateModule: (file: string, args: any[]) => Promise; getURL: () => Promise; reload: () => void; } interface ClientEvent extends Record { type: string; client: Client; } type VirtualFileData = { path?: string; mtime?: number; headers?: Record; data: string | Buffer; }; type VirtualFile = ((request: Plugin.Request) => Promisable) | Promisable; } export interface ServePlugin { serve: Exclude; } export interface HmrPlugin { hmr: Exclude; } export interface CssPlugin { visitor: (importer: URL) => lightningCss.Visitor | null; }