d3-no-dom
Version:
Fully use d3 in environments without DOM
37 lines (36 loc) • 1.52 kB
TypeScript
import type { PartialDeep, Promisable } from "type-fest";
import type { BaseType as D3BaseType } from "d3";
type WindowLike = {
document: Document & {
body: HTMLElement;
};
} & Record<string, unknown>;
type DomWithBody = {
window: WindowLike;
};
type DomProvider<T extends DomWithBody> = new (html: string) => T;
type PrepareSvgServerSideRendererParams<T extends DomWithBody> = {
domProvider: DomProvider<T>;
d3Instance: typeof import("d3");
};
type D3Selection<T extends D3BaseType> = import("d3").Selection<T, unknown, null, undefined>;
type PrepareSvgServerSideRender<T extends DomWithBody> = ({ currentDom, d3Selection, svgNode, }: {
currentDom: T;
d3Selection: D3Selection<SVGSVGElement>;
svgNode: SVGSVGElement;
}) => Promisable<void> | Promisable<string>;
type NumericString = `${number}` | `${number}e${number}` | `${number}E${number}`;
type SvgViewbox = `${NumericString},${NumericString},${NumericString},${NumericString}` | `${NumericString} ${NumericString} ${NumericString} ${NumericString}`;
type PrepareSvgServerSideRenderOptions = PartialDeep<{
svg: {
width: number;
height: number;
viewBox: SvgViewbox;
};
safe: boolean;
asBase64: boolean;
}>;
export declare function prepareSvgServerSideRenderer<T extends DomWithBody>({ d3Instance, domProvider, }: PrepareSvgServerSideRendererParams<T>): {
render: (fn: PrepareSvgServerSideRender<T>, options?: PrepareSvgServerSideRenderOptions) => Promise<string>;
};
export {};