Skip to content
Apexify.jsDocs
Apexify.js version v5.4.5

class export

ApexPainter

Primary server-side rendering and media façade for the current Apexify.js package.

apexify.jsCURRENTnode22node24node26
Source: lib-next/apex-painter/main.ts (opens in a new tab)

Signature

TypeScript
export declare class ApexPainter {
    private readonly _outputFormat;
    private readonly canvasCreator;
    private readonly imageCreator;
    private readonly textCreator;
    private readonly textMetricsCreator;
    private readonly path2DCreator;
    private readonly hitDetectionCreator;
    private readonly pixelDataCreator;
    private readonly gifCreator;
    private readonly chartCreator;
    private readonly sceneCreator;
    private readonly canvasCreate;
    private readonly imageTextCreate;
    private readonly sceneCreate;
    private readonly chartCreate;
    private readonly gifCreate;
    private readonly videoCreate;
    private readonly audioCreate;
    private readonly templateCreate;
    private readonly outputSaveCreate;
    /**
     * Shared FFmpeg session + {@link VideoCreator}. Prefer {@link createVideo}, {@link getVideoInfo},
     * {@link extractFrameAtTime}, etc.; use `video` when you need the stack object itself.
     */
    readonly video: VideoStack;
    /**
     * Named composition assets for `$id` / dotted-path resolution. Duplicate registrations are rejected unless
     * an explicit `replace*` method is used.
     */
    readonly assets: AssetManager;
    /**
     * Optional extension APIs registered with {@link ApexPainter.plugins.use}.
     */
    readonly plugins: PluginHost;
    /**
     * Reusable scene fragments (**`badge`**, **`progressBar`**, **`avatar`**, **`card`**, **`watermark`**) returning {@link SceneLayer}[].
     */
    readonly components: PainterComponents;
    /**
     * Stitch, collage, compress, palette, resize, convert, filters, blend, crop, mask, gradient, hex check.
     */
    readonly image: PainterImageUtils;
    /**
     * Procedural sound synthesis (WAV buffers for {@link createVideo} `mixAudio`, games, UI SFX).
     * `painter.createAudio.preset('laser')`, `.synth({ layers })`, `.sequence({ events })`, `.mix([...])`.
     */
    readonly createAudio: PainterCreateAudio;
    private _detect;
    private _path2d;
    private _pixels;
    private _output;
    private readonly _saveSession;
    constructor({ type }?: OutputFormat);
    get outputFormat(): OutputFormat;
    get detect(): PainterHitDetect;
    get path2d(): PainterPath2D;
    get pixels(): PainterPixels;
    get output(): PainterOutput;
    private maybeResolveRefs;
    /**
     * Deep-resolves `$name` / `$value.path` leaves across composition data, using {@link assets}.
     * Escape a literal dollar sign as `$$`.
     */
    prepareForRender<T>(value: T): T;
    createCanvas(canvas: CanvasConfig, painterOpts?: PainterAssetRefsOptions): Promise<CanvasResults>;
    createImage(images: ImageProperties | ImageProperties[], canvasBuffer: CanvasResults | Buffer, options?: CreateImageOptions, painterOpts?: PainterAssetRefsOptions): Promise<Buffer>;
    createText(textArray: TextProperties | TextProperties[], canvasBuffer: CanvasResults | Buffer, painterOpts?: PainterAssetRefsOptions): Promise<Buffer>;
    measureText(textProps: TextProperties, painterOpts?: PainterAssetRefsOptions): Promise<TextMetrics>;
    /**
     * Layered scene composition (chart / image / text / path / surface). Layer array order is stable bottom-to-top.
     * Builder inputs are copied on ingress and render snapshots are isolated from later caller mutation.
     */
    createScene(config: {
        width: number;
        height: number;
        background?: SceneRenderInput["background"];
        layers?: SceneLayer[];
    }): SceneBuilder;
    createScene(width: number, height: number): SceneBuilder;
    /**
     * Reusable immutable scene design: native-value `{{placeholders}}`, `$namedAssets`, flex/grid layout nodes,
     * precise `visible` conditionals, unique `id` overrides, and deterministic render-time insertions.
     */
    createTemplate(definition: TemplateSceneDefinition, options?: TemplateOptions): TemplateHandle;
    /**
     * Installs one named plugin transactionally. Installation is serialized and may be asynchronous; callers must await it.
     */
    use(plugin: ApexifyPlugin<ApexPainter>): Promise<this>;
    renderScene(input: SceneRenderInput, options?: SceneRenderOptions): Promise<Buffer>;
    /**
     * Validates scene dimensions, aggregate composition budgets, nested surfaces, text/image/chart counts, remote assets,
     * and finite transforms. Validation is mandatory before rendering.
     */
    validateSceneRenderInput(input: SceneRenderInput, options?: Pick<SceneRenderOptions, "maxSurfaceDepth">): void;
    renderSceneToGIF(scene: SceneRenderInput, gif: {
        options: GIFOptions;
        gifFrames?: SceneGifInputFrame[];
        prependComposedRaster?: boolean;
        composedFrameDuration?: number;
        composedFrameRepeat?: number;
        sceneRender?: SceneRenderOptions;
    }): Promise<Awaited<ReturnType<GIFCreator["createGIF"]>>>;
    renderSceneToVideoFrames(scene: SceneRenderInput, video: {
        options: VideoCreationOptions;
        prependComposedToFrames?: boolean;
        framesWithRepeats?: SceneVideoFrameSlot[];
        sceneRender?: SceneRenderOptions;
    }): Promise<SceneToVideoResult>;
    createVideo(options: VideoCreationOptions, painterOpts?: PainterAssetRefsOptions): Promise<SceneToVideoResult>;
    /**
     * Declarative video edit pipeline (trim, splice, text, audio + synth). Layer `id` upserts — no duplicate ops.
     */
    videoPipeline(source?: string | Buffer, initialLayers?: import("../types/video-pipeline.js").VideoPipelineLayer[]): import("../video/video-pipeline-builder.js").VideoPipeline;
    getVideoInfo(source: string | Buffer, skipFfmpegCheck?: boolean): Promise<import("../index.js").VideoProbeMetadata>;
    extractFrames(videoSource: string | Buffer, options: ExtractFramesOptions): Promise<{
        source: string;
        isRemote: boolean;
    }[]>;
    extractAllFrames(videoSource: string | Buffer, options?: ExtractAllFramesOptions): Promise<{
        source: string;
        frameNumber: number;
        time: number;
    }[]>;
    extractFrameAtTime(videoSource: string | Buffer, timeSeconds: number, outputFormat?: "jpg" | "png", quality?: number): Promise<Buffer<ArrayBufferLike>>;
    extractFrameByNumber(videoSource: string | Buffer, frameNumber: number, outputFormat?: "jpg" | "png", quality?: number): Promise<Buffer<ArrayBufferLike>>;
    extractMultipleFrames(videoSource: string | Buffer, times: number[], outputFormat?: "jpg" | "png", quality?: number): Promise<Buffer<ArrayBufferLike>[]>;
    createChart<T extends "pie" | "bar" | "horizontalBar" | "line" | "scatter" | "radar" | "polarArea">(chartType: T, data: T extends "pie" ? PieSlice[] : T extends "bar" ? BarChartData[] : T extends "horizontalBar" ? HorizontalBarChartData[] : T extends "line" ? LineSeries[] : T extends "scatter" ? ScatterSeries[] : T extends "radar" ? RadarSeries[] : T extends "polarArea" ? PolarAreaSlice[] : never, options?: T extends "pie" ? PieChartOptions : T extends "bar" ? BarChartOptions : T extends "horizontalBar" ? HorizontalBarChartOptions : T extends "line" ? LineChartOptions : T extends "scatter" ? ScatterChartOptions : T extends "radar" ? RadarChartOptions : T extends "polarArea" ? PolarAreaChartOptions : never, painterOpts?: PainterAssetRefsOptions): Promise<Buffer>;
    createComparisonChart(options: import("../chart/impl/comparisonchart.js").ComparisonChartOptions, painterOpts?: PainterAssetRefsOptions): Promise<Buffer>;
    createComboChart(options: import("../chart/impl/combochart.js").ComboChartOptions, painterOpts?: PainterAssetRefsOptions): Promise<Buffer>;
    createGIF(gifFrames: GIFInputFrame[] | undefined, options: GIFOptions, painterOpts?: PainterAssetRefsOptions): Promise<Awaited<ReturnType<GIFCreator["createGIF"]>>>;
    animate(frames: Frame[], defaultDuration: number, defaultWidth?: number, defaultHeight?: number, options?: import("../gif/animate-frames.js").AnimateOptions, painterOpts?: PainterAssetRefsOptions): Promise<Buffer[] | undefined>;
    batch(operations: BatchOperation[], opts?: BatchChainAssetOpts): Promise<Buffer[]>;
    chain(operations: ChainOperation[], opts?: BatchChainAssetOpts): Promise<Buffer>;
    /** Convert a rendered buffer to this painter instance's configured output representation. */
    toOutput(results: Buffer): Promise<Buffer | string | Blob | ArrayBuffer>;
    /** @deprecated Use {@link toOutput} instead. Retained for Apexify.js 5.x/6.x compatibility. */
    outPut(results: Buffer): Promise<Buffer | string | Blob | ArrayBuffer>;
    save(buffer: Buffer, options?: SaveOptions): Promise<SaveResult>;
    saveMultiple(buffers: Buffer[], options?: SaveOptions): Promise<SaveResult[]>;
}

Members

Related APIs

No explicit related API metadata.

Verified examples

Next steps