import type {
TrustedHTML,
TrustedTypesWindow,
} from 'trusted-types/lib/index.js';
import type { Config } from './config';
export interface DOMPurify {
/**
* Creates a DOMPurify instance using the given window-like object. Defaults to `window`.
*/
(root?: WindowLike): DOMPurify;
/**
* Version label, exposed for easier checks
* if DOMPurify is up to date or not
*/
version: string;
/**
* Array of elements that DOMPurify removed during sanitation.
* Empty if nothing was removed.
*/
removed: Array;
/**
* Expose whether this browser supports running the full DOMPurify.
*/
isSupported: boolean;
/**
* Set the configuration once.
*
* @param cfg configuration object
*/
setConfig(cfg?: Config): void;
/**
* Removes the configuration.
*/
clearConfig(): void;
/**
* Provides core sanitation functionality.
*
* @param dirty string or DOM node
* @param cfg object
* @returns Sanitized TrustedHTML.
*/
sanitize(
dirty: string | Node,
cfg: Config & { RETURN_TRUSTED_TYPE: true }
): TrustedHTML;
/**
* Provides core sanitation functionality.
*
* @param dirty DOM node
* @param cfg object
* @returns Sanitized DOM node.
*/
sanitize(dirty: Node, cfg: Config & { IN_PLACE: true }): Node;
/**
* Provides core sanitation functionality.
*
* @param dirty string or DOM node
* @param cfg object
* @returns Sanitized DOM node.
*/
sanitize(dirty: string | Node, cfg: Config & { RETURN_DOM: true }): Node;
/**
* Provides core sanitation functionality.
*
* @param dirty string or DOM node
* @param cfg object
* @returns Sanitized document fragment.
*/
sanitize(
dirty: string | Node,
cfg: Config & { RETURN_DOM_FRAGMENT: true }
): DocumentFragment;
/**
* Provides core sanitation functionality.
*
* @param dirty string or DOM node
* @param cfg object
* @returns Sanitized string.
*/
sanitize(dirty: string | Node, cfg?: Config): string;
/**
* Checks if an attribute value is valid.
* Uses last set config, if any. Otherwise, uses config defaults.
*
* @param tag Tag name of containing element.
* @param attr Attribute name.
* @param value Attribute value.
* @returns Returns true if `value` is valid. Otherwise, returns false.
*/
isValidAttribute(tag: string, attr: string, value: string): boolean;
/**
* Adds a DOMPurify hook.
*
* @param entryPoint entry point for the hook to add
* @param hookFunction function to execute
*/
addHook(entryPoint: BasicHookName, hookFunction: NodeHook): void;
/**
* Adds a DOMPurify hook.
*
* @param entryPoint entry point for the hook to add
* @param hookFunction function to execute
*/
addHook(entryPoint: ElementHookName, hookFunction: ElementHook): void;
/**
* Adds a DOMPurify hook.
*
* @param entryPoint entry point for the hook to add
* @param hookFunction function to execute
*/
addHook(
entryPoint: DocumentFragmentHookName,
hookFunction: DocumentFragmentHook
): void;
/**
* Adds a DOMPurify hook.
*
* @param entryPoint entry point for the hook to add
* @param hookFunction function to execute
*/
addHook(
entryPoint: 'uponSanitizeElement',
hookFunction: UponSanitizeElementHook
): void;
/**
* Adds a DOMPurify hook.
*
* @param entryPoint entry point for the hook to add
* @param hookFunction function to execute
*/
addHook(
entryPoint: 'uponSanitizeAttribute',
hookFunction: UponSanitizeAttributeHook
): void;
/**
* Remove a DOMPurify hook at a given entryPoint
* (pops it from the stack of hooks if hook not specified)
*
* @param entryPoint entry point for the hook to remove
* @param hookFunction optional specific hook to remove
* @returns removed hook
*/
removeHook(
entryPoint: BasicHookName,
hookFunction?: NodeHook
): NodeHook | undefined;
/**
* Remove a DOMPurify hook at a given entryPoint
* (pops it from the stack of hooks if hook not specified)
*
* @param entryPoint entry point for the hook to remove
* @param hookFunction optional specific hook to remove
* @returns removed hook
*/
removeHook(
entryPoint: ElementHookName,
hookFunction?: ElementHook
): ElementHook | undefined;
/**
* Remove a DOMPurify hook at a given entryPoint
* (pops it from the stack of hooks if hook not specified)
*
* @param entryPoint entry point for the hook to remove
* @param hookFunction optional specific hook to remove
* @returns removed hook
*/
removeHook(
entryPoint: DocumentFragmentHookName,
hookFunction?: DocumentFragmentHook
): DocumentFragmentHook | undefined;
/**
* Remove a DOMPurify hook at a given entryPoint
* (pops it from the stack of hooks if hook not specified)
*
* @param entryPoint entry point for the hook to remove
* @param hookFunction optional specific hook to remove
* @returns removed hook
*/
removeHook(
entryPoint: 'uponSanitizeElement',
hookFunction?: UponSanitizeElementHook
): UponSanitizeElementHook | undefined;
/**
* Remove a DOMPurify hook at a given entryPoint
* (pops it from the stack of hooks if hook not specified)
*
* @param entryPoint entry point for the hook to remove
* @param hookFunction optional specific hook to remove
* @returns removed hook
*/
removeHook(
entryPoint: 'uponSanitizeAttribute',
hookFunction?: UponSanitizeAttributeHook
): UponSanitizeAttributeHook | undefined;
/**
* Removes all DOMPurify hooks at a given entryPoint
*
* @param entryPoint entry point for the hooks to remove
*/
removeHooks(entryPoint: HookName): void;
/**
* Removes all DOMPurify hooks.
*/
removeAllHooks(): void;
}
/**
* An element removed by DOMPurify.
*/
export interface RemovedElement {
/**
* The element that was removed.
*/
element: Node;
}
/**
* An element removed by DOMPurify.
*/
export interface RemovedAttribute {
/**
* The attribute that was removed.
*/
attribute: Attr | null;
/**
* The element that the attribute was removed.
*/
from: Node;
}
type BasicHookName =
| 'beforeSanitizeElements'
| 'afterSanitizeElements'
| 'uponSanitizeShadowNode';
type ElementHookName = 'beforeSanitizeAttributes' | 'afterSanitizeAttributes';
type DocumentFragmentHookName =
| 'beforeSanitizeShadowDOM'
| 'afterSanitizeShadowDOM';
type UponSanitizeElementHookName = 'uponSanitizeElement';
type UponSanitizeAttributeHookName = 'uponSanitizeAttribute';
export interface HooksMap {
beforeSanitizeElements: NodeHook[];
afterSanitizeElements: NodeHook[];
beforeSanitizeShadowDOM: DocumentFragmentHook[];
uponSanitizeShadowNode: NodeHook[];
afterSanitizeShadowDOM: DocumentFragmentHook[];
beforeSanitizeAttributes: ElementHook[];
afterSanitizeAttributes: ElementHook[];
uponSanitizeElement: UponSanitizeElementHook[];
uponSanitizeAttribute: UponSanitizeAttributeHook[];
}
type ArrayElement = T extends Array ? U : never;
export type HookFunction = ArrayElement;
export type HookName =
| BasicHookName
| ElementHookName
| DocumentFragmentHookName
| UponSanitizeElementHookName
| UponSanitizeAttributeHookName;
export type NodeHook = (
this: DOMPurify,
currentNode: Node,
hookEvent: null,
config: Config
) => void;
export type ElementHook = (
this: DOMPurify,
currentNode: Element,
hookEvent: null,
config: Config
) => void;
export type DocumentFragmentHook = (
this: DOMPurify,
currentNode: DocumentFragment,
hookEvent: null,
config: Config
) => void;
export type UponSanitizeElementHook = (
this: DOMPurify,
currentNode: Node,
hookEvent: UponSanitizeElementHookEvent,
config: Config
) => void;
export type UponSanitizeAttributeHook = (
this: DOMPurify,
currentNode: Element,
hookEvent: UponSanitizeAttributeHookEvent,
config: Config
) => void;
export interface UponSanitizeElementHookEvent {
tagName: string;
allowedTags: Record;
}
export interface UponSanitizeAttributeHookEvent {
attrName: string;
attrValue: string;
keepAttr: boolean;
allowedAttributes: Record;
forceKeepAttr: boolean | undefined;
}
/**
* A `Window`-like object containing the properties and types that DOMPurify requires.
*/
export type WindowLike = Pick<
typeof globalThis,
| 'DocumentFragment'
| 'HTMLTemplateElement'
| 'Node'
| 'Element'
| 'NodeFilter'
| 'NamedNodeMap'
| 'HTMLFormElement'
| 'DOMParser'
> & {
document?: Document;
MozNamedAttrMap?: typeof window.NamedNodeMap;
} & Pick;