@dr.pogodin/react-helmet
Version:
Thread-safe Helmet for React 19+ and friends
150 lines (149 loc) • 5.3 kB
TypeScript
import type { BaseHTMLAttributes, HtmlHTMLAttributes, HTMLAttributes, LinkHTMLAttributes, MetaHTMLAttributes, ReactNode, ScriptHTMLAttributes, StyleHTMLAttributes } from 'react';
export type BaseProps = BaseHTMLAttributes<HTMLBaseElement>;
export type BodyProps = HTMLAttributes<HTMLBodyElement>;
export type HtmlProps = HtmlHTMLAttributes<HTMLHtmlElement>;
export type LinkProps = LinkHTMLAttributes<HTMLLinkElement>;
export type MetaProps = MetaHTMLAttributes<HTMLMetaElement>;
export type NoscriptProps = HTMLAttributes<HTMLElement> & {
innerHTML?: string;
};
export type ScriptProps = ScriptHTMLAttributes<HTMLScriptElement> & {
innerHTML?: string;
};
export type StyleProps = StyleHTMLAttributes<HTMLStyleElement> & {
cssText?: string;
};
export type TitleProps = HTMLAttributes<HTMLTitleElement>;
export type HelmetChildProps = BaseProps | BodyProps | HtmlProps | LinkProps | MetaProps | NoscriptProps | ScriptProps | StyleProps | TitleProps;
/**
* String data for title.
*/
export type StringData = {
title?: string;
titleTemplate?: string;
};
export type HelmetTags = {
baseTag: HTMLBaseElement[];
linkTags: HTMLLinkElement[];
metaTags: HTMLMetaElement[];
noscriptTags: HTMLElement[];
scriptTags: HTMLScriptElement[];
styleTags: HTMLStyleElement[];
};
export type HelmetDatum<T = ReactNode> = {
toString(): string;
toComponent(): T;
};
export type HelmetHTMLBodyDatum = HelmetDatum<HTMLAttributes<HTMLBodyElement>>;
export type HelmetHTMLElementDatum = HelmetDatum<HTMLAttributes<HTMLHtmlElement>>;
export type HelmetServerState = {
base: HelmetDatum;
bodyAttributes: HelmetHTMLBodyDatum;
htmlAttributes: HelmetHTMLElementDatum;
link: HelmetDatum;
meta: HelmetDatum;
noscript: HelmetDatum;
script: HelmetDatum;
style: HelmetDatum;
title: HelmetDatum;
titleAttributes?: HelmetDatum;
priority: HelmetDatum;
};
export type StateUpdate = HelmetTags & {
bodyAttributes: BodyProps;
defer: boolean;
htmlAttributes: HtmlProps;
onChangeClientState: (newState: StateUpdate, addedTags: Partial<HelmetTags>, removedTags: Partial<HelmetTags>) => void;
title: string;
titleAttributes: TitleProps;
};
export type OnChangeClientState = (newState: StateUpdate, addedTags: Partial<HelmetTags>, removedTags: Partial<HelmetTags>) => void;
/**
* A subset of <Helmet> properties, corresponding to prop arrays for
* elements that may be present in DOM multiple times.
*/
export type HelmetPropArrays = {
link?: LinkProps[];
meta?: MetaProps[];
noscript?: NoscriptProps[];
script?: ScriptProps[];
style?: StyleProps[];
};
export type PropArrayItem<T extends keyof HelmetPropArrays> = Exclude<HelmetPropArrays[T], undefined>[number];
/**
* A subset of <Helmet> properties, corresponding to props for elements
* that may be present in DOM a single time at most.
*/
export type HelmetPropObjects = {
bodyAttributes?: BodyProps;
htmlAttributes?: HtmlProps;
titleAttributes?: TitleProps;
};
export type HelmetPropBooleans = {
prioritizeSeoTags?: boolean;
};
/**
* Properties accepted by <Helmet> components.
*/
export type HelmetProps = HelmetPropArrays & HelmetPropObjects & HelmetPropBooleans & {
base?: BaseProps;
children?: ReactNode;
defaultTitle?: string;
defer?: boolean;
encodeSpecialCharacters?: boolean;
onChangeClientState?: OnChangeClientState;
title?: string;
titleTemplate?: string;
};
export type RegisteredHelmetPropsArray = Array<[id: string, props: HelmetProps]>;
/**
* The overall Helmet state, aggregated from props of all <Helmet> instances
* registered with the Helmet context provider.
*/
export type AggregatedState = {
base: BaseProps | undefined;
bodyAttributes: BodyProps | undefined;
defer: boolean | undefined;
encodeSpecialCharacters: boolean;
htmlAttributes: HtmlProps | undefined;
links: LinkProps[] | undefined;
meta: MetaProps[] | undefined;
noscript: NoscriptProps[] | undefined;
onChangeClientState: OnChangeClientState | undefined;
priority: {
links: LinkProps[] | undefined;
meta: MetaProps[] | undefined;
script: ScriptProps[] | undefined;
} | undefined;
script: ScriptProps[] | undefined;
style: StyleProps[] | undefined;
title: string | undefined;
titleAttributes: TitleProps | undefined;
};
export type MappedServerState = HelmetTags & {
encode?: boolean;
};
/**
* Server-side rendering context.
*/
export type HelmetDataContext = {
helmet?: HelmetServerState;
};
/**
* The value of internal context used by Helmet to communicate between its
* context provider and <Helmet> components within its children tree.
*/
export type ContextValue = {
clientApply: () => void;
/** One function to register, update, and un-register <Helmet> instances
* (or, more precisely their current aggregated props, aggregated between
* the actual props of <Helmet> instance and its children). */
update: (id: string, props: HelmetProps | undefined) => void;
};
export type HelmetProviderHeap = {
firstRender: boolean;
helmets: RegisteredHelmetPropsArray;
nextAnimFrameId?: number;
serverState?: HelmetServerState;
state: AggregatedState | undefined;
};