import { BuildManifest, BuildTarget } from "../schemas/build.js"; import type { Plugin } from "esbuild"; import { ResolvedConfig } from "./resolvedConfig.js"; export declare function esbuildPlugin(plugin: Plugin, options?: RegisterPluginOptions): BuildExtension; export interface BuildExtension { name: string; externalsForTarget?: (target: BuildTarget) => string[] | undefined; /** * Package names this extension installs into the deployed image for the * given target. Diagnostics only: the bundler ignores this, it just tells * build warnings (e.g. the createRequire scan) the package will be * available at runtime. Extensions that install no packages don't need to * implement this. */ installedPackagesForTarget?: (target: BuildTarget) => string[] | undefined; onBuildStart?: (context: BuildContext) => Promise | void; onBuildComplete?: (context: BuildContext, manifest: BuildManifest) => Promise | undefined | void; } export interface BuildSpinner { stop: (message: string, code?: number) => void; message: (message: string) => void; } export interface BuildLogger { debug: (...args: unknown[]) => void; log: (...args: unknown[]) => void; warn: (...args: unknown[]) => void; progress: (message: string) => void; spinner: (message: string) => BuildSpinner; } export interface BuildContext { target: BuildTarget; config: ResolvedConfig; workingDir: string; logger: BuildLogger; addLayer(layer: BuildLayer): void; registerPlugin(plugin: Plugin, options?: RegisterPluginOptions): void; resolvePath(path: string): Promise; } export interface BuildLayer { id: string; commands?: string[]; files?: Record; image?: { pkgs?: string[]; instructions?: string[]; }; build?: { env?: Record; }; deploy?: { env?: Record; parentEnv?: Record; secretEnv?: Record; secretParentEnv?: Record; override?: boolean; }; dependencies?: Record; conditions?: string[]; } export type PluginPlacement = "first" | "last"; export type RegisterPluginOptions = { target?: BuildTarget; placement?: PluginPlacement; }; export type RegisteredPlugin = RegisterPluginOptions & { plugin: Plugin; };