@nutrient-sdk/document-authoring
Version: 
A web SDK for word processing and rich text capabilities.
467 lines (437 loc) • 14.3 kB
text/typescript
/**
 * @public
 */
export declare type Assets = {
    /**
     * The base path to the Document Authoring assets.
     * If not set, assets will be fetched from a public CDN.
     * To self-host the assets, consult the `README.md`.
     */
    base?: string;
};
/**
 * @public
 */
export declare type BlobInput = Promise<Response | Blob | ArrayBuffer> | Response | Blob | ArrayBuffer;
/**
 * Creates an instance of the Document Authoring system which can be shared between different tasks
 * like creating editors, importing Word documents or creating PDFs.
 *
 * This loads the JavaScript and WASM code and manages the font cache.
 * @public
 */
export declare const createDocAuthSystem: (options?: CreateDocAuthSystemOptions) => Promise<DocAuthSystem>;
/**
 * @public
 */
export declare type CreateDocAuthSystemOptions = {
    licenseKey?: string;
    /**
     * Assets configuration. If unset the system will use the assets from a CDN.
     */
    assets?: Assets;
    /**
     * Font configuration.
     */
    fontConfig?: FontConfig;
};
/**
 * @public
 */
export declare type CreateDocumentFromPlaintextOptions = {
    /**
     * Defines the size of the document pages.
     * Can be custom dimensions or standard sizes ('Letter', 'A4', 'A5', 'A6').
     */
    pageSize?: {
        width: number;
        height: number;
    } | 'Letter' | 'A4' | 'A5' | 'A6';
    /**
     * Defines the margins of the document pages.
     */
    pageMargins?: {
        left: number;
        right: number;
        bottom: number;
        top: number;
        header?: number;
        footer?: number;
    };
};
/**
 * @public
 */
export declare type CreateEditorOptions = {
    /**
     * The document to attach to this editor.
     * If no document is provided, an empty document will be created.
     * @see {@link DocAuthEditor.setCurrentDocument}
     */
    document?: DocAuthDocument;
    /**
     * Allows toggling/changing various UI options.
     *
     * See {@link UIOptions}
     */
    ui?: UIOptions;
};
/**
 * @hidden
 */
declare const _default: {
    createDocAuthSystem: (options?: CreateDocAuthSystemOptions) => Promise<DocAuthSystem>;
    defaultFontIndex: DefaultFontIndex;
};
export default _default;
/**
 * The default font index that is part of the Document Authoring SDK bundle.
 *
 * See {@link FontConfig} for how to customize the set of fonts used by the SDK.
 *
 * @public
 */
export declare type DefaultFontIndex = {
    type: 'default-index';
};
/**
 * The default font index that is part of the Document Authoring SDK bundle.
 *
 * See {@link FontConfig} for how to customize the set of fonts used by the SDK.
 *
 * @public
 */
export declare const defaultFontIndex: DefaultFontIndex;
/**
 * @public
 */
export declare type DocAuthDocument = {
    /**
     * Returns the current document in the Document Authoring format as a JavaScript object.
     * This object can be safely persisted.
     */
    saveDocument(): Promise<object>;
    /**
     * Returns the current document in the Document Authoring format as a JSON string.
     * This string can be safely persisted.
     * @see {@link DocAuthDocument.saveDocument}
     */
    saveDocumentJSONString(): Promise<string>;
    /**
     * Exports a snapshot of the current document as a PDF file.
     */
    exportPDF(options?: ExportPDFOptions): Promise<ArrayBuffer>;
    /**
     * Exports a snapshot of the current document as a DOCX file.
     */
    exportDOCX(options?: ExportDOCXOptions): Promise<ArrayBuffer>;
    /**
     * The `DocAuthSystem` this document is bound to.
     */
    docAuthSystem(): DocAuthSystem;
};
/**
 * A `string` will be treated as a document authoring document in JSON format and loaded.
 * An `object` will be treated as a JavaScript representation of a Document Authoring document
 * (e.g. the result of `JSON.parse` on a Document Authoring JSON string).
 *
 * @public
 */
export declare type DocAuthDocumentInput = string | object | Blob | Response | Promise<string | object | Blob | Response>;
/**
 * @public
 */
export declare type DocAuthEditor = {
    /**
     * Attaches the provided document as the current document to the editor.
     */
    setCurrentDocument(doc: DocAuthDocument): void;
    /**
     * Returns a reference to the currently attached document.
     */
    currentDocument(): DocAuthDocument;
    /**
     * Removes all DOM elements and releases resources held by the editor.
     * Note: This does not release the underlying `DocAuthSystem`. Use `DocAuthSystem.destroy` after calling `DocAuthEditor.destroy` for a complete teardown.
     */
    destroy(): void;
    /**
     * Retrieves the `DocAuthSystem` instance this editor is bound to.
     */
    docAuthSystem(): DocAuthSystem;
    /**
     * Adds an event listener that will be called every time the specified event is emitted.
     *
     * @param event - The event name to listen for
     * @param handler - The function to call when the event is emitted
     * @returns The editor instance for method chaining
     *
     * @example
     * ```typescript
     * // Get the latest document content
     * editor.on('content.change', async () => console.log(await editor.currentDocument().saveDocument()));
     * ```
     *
     * @eventMap DocAuthEditorEvents
     */
    on: <EventName extends keyof DocAuthEditorEvents>(event: EventName, handler: DocAuthEditorEventHandler<EventName>) => DocAuthEditor;
    /**
     * Removes an event listener. If no handler is provided, removes all listeners for the event.
     *
     * @param event - The event name to remove listeners from
     * @param handler - The specific handler to remove (optional)
     * @returns The editor instance for method chaining
     *
     * @example
     * ```typescript
     * // Remove specific handler
     * editor.off('content.change', myHandler);
     *
     * // Remove all handlers for an event
     * editor.off('content.change');
     * ```
     *
     * @eventMap DocAuthEditorEvents
     */
    off: <EventName extends keyof DocAuthEditorEvents>(event: EventName, handler?: DocAuthEditorEventHandler<EventName>) => DocAuthEditor;
    /**
     * Adds an event listener that will be called only once when the specified event is emitted.
     * The listener is automatically removed after being called.
     *
     * @param event - The event name to listen for
     * @param handler - The function to call when the event is emitted
     * @returns The editor instance for method chaining
     *
     * @example
     * ```typescript
     * editor.once('document.load', () => {
     *   console.log('Document loaded for the first time');
     * });
     * ```
     *
     * @eventMap DocAuthEditorEvents
     */
    once: <EventName extends keyof DocAuthEditorEvents>(event: EventName, handler: DocAuthEditorEventHandler<EventName>) => DocAuthEditor;
};
/**
 * @public
 * @excludeFromDocs
 */
export declare type DocAuthEditorEventHandler<EventName extends keyof DocAuthEditorEvents> = DocAuthEditorEvents[EventName] extends void ? () => void : (payload: DocAuthEditorEvents[EventName]) => void;
/**
 * @public
 * @excludeFromDocs
 */
export declare type DocAuthEditorEvents = {
    /**
     * Fired when a document is initially loaded into the editor.
     * This event is triggered once per document load, including when switching documents.
     */
    'document.load': void;
    /**
     * Fired when the document content has changed due to user editing or programmatic modifications.
     * Use this event to react to document changes, such as saving drafts or updating UI state.
     */
    'content.change': void;
};
/**
 * A `DocAuthSystem` instance holds the internal WASM engine and loaded fonts.
 * It is used to load or import documents and create `DocAuthEditor` instances.
 *
 * @public
 */
export declare type DocAuthSystem = {
    /**
     * Loads a document stored in the Document Authoring format.
     * The document can be provided as a JSON string or a JavaScript object.
     */
    loadDocument(documentInput: DocAuthDocumentInput): Promise<DocAuthDocument>;
    /**
     * Imports a DOCX document.
     */
    importDOCX(docx: BlobInput, options?: ImportDOCXOptions): Promise<DocAuthDocument>;
    /**
     * Creates an editor in the specified HTML element.
     * **IMPORTANT**: The `position` of the target element cannot be `static` or unset. If unsure, use `relative`.
     */
    createEditor(target: HTMLElement, options?: CreateEditorOptions): Promise<DocAuthEditor>;
    /**
     * Creates a document from plain text by interpreting patterns and replacing characters.
     * E.g.:
     * - `\n` creates a line break in a paragraph
     * - `\n\n` separates paragraphs
     * - `\t` is replaced with spaces
     */
    createDocumentFromPlaintext(text: string, options?: CreateDocumentFromPlaintextOptions): Promise<DocAuthDocument>;
    /**
     * Releases resources held by the system.
     * **IMPORTANT**: The system and any editors created by this system can no longer be used after calling this.
     */
    destroy(): void;
};
/**
 * @public
 */
export declare type ExportDOCXOptions = {
    /**
     * An optional signal to abort the export operation.
     */
    abortSignal?: AbortSignal;
};
/**
 * @public
 */
export declare type ExportPDFOptions = {
    /**
     * An optional signal to abort the export operation.
     */
    abortSignal?: AbortSignal;
    /**
     * Generate a PDF/A compliant PDF. Defaults to `false`.
     */
    PDF_A?: boolean;
};
/**
 * @public
 */
export declare type FontConfig = {
    /**
     * The set of fonts available to the Document Authoring system.
     * If unset the {@link DefaultFontIndex} is used.
     *
     * Individual fonts can be added directly using a {@link FontFile} or loaded by the system as they are needed using
     * a pre-built {@link FontIndex} that all lists all available fonts. A {@link FontIndex} is the recommended way to provide
     * a set of fonts to the system in a production environment.
     *
     * @example
     * Providing two additional fonts next to the built-in default fonts. In this scenario the system will load both fonts during initialization:
     * ```TypeScript
     * fonts: [
     *   DocAuth.defaultFontIndex,
     *   { type: 'file', blob: fetch('/fonts/awesome.ttf') },
     *   { type: 'file', blob: fetch('/fonts/more-awesome.ttf') },
     * ],
     * ```
     *
     * @example
     * Providing multiple additional fonts using a font index in addition to the built-in default fonts. In this scenario the system will only load the fonts that are actually needed:
     * ```TypeScript
     * fonts: [
     *   DocAuth.defaultFontIndex,
     *   {
     *     type: 'index',
     *     index: fetch('/fonts/font-index.json'),
     *     loadFn: (name) => fetch(`/fonts/${name}`),
     *   },
     * ],
     * ```
     */
    fonts?: (DefaultFontIndex | FontIndex | FontFile)[];
};
/**
 * `FontFile` provides a quick way to add a single additional font to the system. The system will load and scan
 * all provided `FontFile`s to extract all the required metadata during initialization.
 *
 * For a production system we recommend building a {@link FontIndex} of all available fonts, which enables
 * the system to load only fonts that are actually needed.
 *
 * @example
 * ```TypeScript
 * { type:'file', blob: fetch('/fonts/awesome.ttf') }
 * ```
 *
 * @public
 */
export declare type FontFile = {
    type: 'file';
    blob: BlobInput;
};
/**
 * A `FontIndex` is the preferred way to add additional fonts to the system.
 *
 * Document Authoring can efficiently load a single `index` of available fonts, and will then only load the actually
 * required fonts as they are needed by calling `loadFn` with the font name. `loadFn` must return a `BlobInput` for
 * the font file requested.
 *
 * In order to generate a font index from a set of fonts you want to provide to your users, use the Document Authoring CLI utility:
 *
 * ```shell
 * npx document-authoring create-font-index --scan-directory path-to-fonts --write-to font-index.json
 * ```
 *
 * This will generate a `font-index.json` file that you can then host and load using the `FontIndex` configuration.
 *
 * @example
 * ```TypeScript
 * {
 *   type: 'index',
 *   index: fetch('/fonts/font-index.json'),
 *   loadFn: (name) => fetch(`/fonts/${name}`),
 * }
 * ```
 *
 * @public
 */
export declare type FontIndex = {
    type: 'index';
    index: BlobInput;
    loadFn: (name: string) => BlobInput;
};
/**
 * @public
 */
export declare type ImportDOCXOptions = {
    /**
     * An optional signal to abort the export operation.
     */
    abortSignal?: AbortSignal;
};
/**
 * English, French and German are currently supported (two-letter ISO 639-1 codes).
 *
 * See {@link UIOptions | UIOptions.locale}
 *
 * @public
 */
export declare type Locale = 'en' | 'fr' | 'de';
/**
 * Configuration options for the user interface.
 *
 * @public
 */
export declare type UIOptions = {
    /**
     * The locale to use for displaying text, formatting numbers etc.
     *
     * `auto` will automatically detect the user's locale based on their browser settings. If this doesn't match a supported locale, it will fall back to `en`.
     *
     * @defaultValue `auto`
     */
    locale?: Locale | 'auto';
    /**
     * The unit system for measurements shown in the UI.
     *
     * @defaultValue `pt`
     */
    unit?: Unit;
    /**
     * Configuration for the ruler feature.
     */
    ruler?: {
        /**
         * Controls whether the ruler is shown by default when the editor loads.
         *
         * @defaultValue `true`
         */
        enabled: boolean;
    };
};
/**
 * The list of supported units in Document Authoring.
 *
 * See {@link UIOptions | UIOptions.unit}
 *
 * @public
 */
export declare type Unit = 'cm' | 'in' | 'pt' | 'pc' | 'mm';
export { }