type Brand<T, TBrand extends string> = T & {
    readonly __brand: TBrand;
};
export type AbsoluteUrl = Brand<string, 'AbsoluteUrl'>;
export type IsoDateTime = Brand<string, 'IsoDateTime'>;
export type CurrencyCode = Brand<string, 'CurrencyCode'>;
export type SchemaAvailability = 'https://schema.org/InStock' | 'https://schema.org/OutOfStock' | 'https://schema.org/PreOrder';
export type SchemaSiteIdentity = Readonly<{
    name: string;
    url: AbsoluteUrl;
}>;
export type SchemaPageIdentity = Readonly<{
    title: string;
    url: AbsoluteUrl;
    description?: string;
}>;
export type SchemaBreadcrumb = Readonly<{
    name: string;
    url?: AbsoluteUrl;
}>;
export type WebsiteSchemaSubject = Readonly<{
    kind: 'website';
    site: SchemaSiteIdentity;
}>;
export type WebPageSchemaSubject = Readonly<{
    kind: 'webpage';
    site: SchemaSiteIdentity;
    page: SchemaPageIdentity;
    breadcrumbs?: readonly SchemaBreadcrumb[];
}>;
export type ArticleSchemaSubject = Readonly<{
    kind: 'article';
    site: SchemaSiteIdentity;
    page: SchemaPageIdentity;
    breadcrumbs?: readonly SchemaBreadcrumb[];
    article: Readonly<{
        headline: string;
        publishedAt: IsoDateTime;
        modifiedAt?: IsoDateTime;
        authorName: string;
        description?: string;
        imageUrls?: readonly AbsoluteUrl[];
    }>;
}>;
export type EventSchemaSubject = Readonly<{
    kind: 'event';
    site: SchemaSiteIdentity;
    page: SchemaPageIdentity;
    breadcrumbs?: readonly SchemaBreadcrumb[];
    event: Readonly<{
        name: string;
        startDate: IsoDateTime;
        endDate?: IsoDateTime;
        locationName: string;
        locationAddress?: string;
        description?: string;
        imageUrls?: readonly AbsoluteUrl[];
        offer?: Readonly<{
            price: string;
            currency: CurrencyCode;
            availability: SchemaAvailability;
        }>;
    }>;
}>;
export type ProductSchemaSubject = Readonly<{
    kind: 'product';
    site: SchemaSiteIdentity;
    page: SchemaPageIdentity;
    breadcrumbs?: readonly SchemaBreadcrumb[];
    product: Readonly<{
        name: string;
        description?: string;
        imageUrls: readonly [AbsoluteUrl, ...AbsoluteUrl[]];
        offer: Readonly<{
            price: string;
            currency: CurrencyCode;
            availability: SchemaAvailability;
        }>;
    }>;
}>;
export type SchemaSubject = WebsiteSchemaSubject | WebPageSchemaSubject | ArticleSchemaSubject | EventSchemaSubject | ProductSchemaSubject;
type JsonLdNodeBase = {
    '@context': 'https://schema.org';
    '@type': string;
};
export type WebSiteSchemaNode = JsonLdNodeBase & {
    '@type': 'WebSite';
    name: string;
    url: AbsoluteUrl;
};
export type WebPageSchemaNode = JsonLdNodeBase & {
    '@type': 'WebPage';
    name: string;
    url: AbsoluteUrl;
    description?: string;
    isPartOf: {
        '@type': 'WebSite';
        name: string;
        url: AbsoluteUrl;
    };
};
export type BreadcrumbListSchemaNode = JsonLdNodeBase & {
    '@type': 'BreadcrumbList';
    itemListElement: Array<{
        '@type': 'ListItem';
        position: number;
        name: string;
        item?: AbsoluteUrl;
    }>;
};
export type ArticleSchemaNode = JsonLdNodeBase & {
    '@type': 'Article';
    headline: string;
    mainEntityOfPage: AbsoluteUrl;
    url: AbsoluteUrl;
    datePublished: IsoDateTime;
    dateModified?: IsoDateTime;
    description?: string;
    image?: readonly AbsoluteUrl[];
    author: {
        '@type': 'Organization';
        name: string;
    };
    publisher: {
        '@type': 'Organization';
        name: string;
        url: AbsoluteUrl;
    };
};
export type EventSchemaNode = JsonLdNodeBase & {
    '@type': 'Event';
    name: string;
    url: AbsoluteUrl;
    startDate: IsoDateTime;
    endDate?: IsoDateTime;
    description?: string;
    image?: readonly AbsoluteUrl[];
    location: {
        '@type': 'Place';
        name: string;
        address?: string;
    };
    offers?: {
        '@type': 'Offer';
        price: string;
        priceCurrency: CurrencyCode;
        availability: SchemaAvailability;
        url: AbsoluteUrl;
    };
};
export type ProductSchemaNode = JsonLdNodeBase & {
    '@type': 'Product';
    name: string;
    url: AbsoluteUrl;
    description?: string;
    image: readonly [AbsoluteUrl, ...AbsoluteUrl[]];
    offers: {
        '@type': 'Offer';
        price: string;
        priceCurrency: CurrencyCode;
        availability: SchemaAvailability;
        url: AbsoluteUrl;
    };
};
export type SchemaNode = WebSiteSchemaNode | WebPageSchemaNode | BreadcrumbListSchemaNode | ArticleSchemaNode | EventSchemaNode | ProductSchemaNode;
export declare function toAbsoluteUrl(value: string | null | undefined): AbsoluteUrl | null;
export declare function toIsoDateTime(value: string | null | undefined): IsoDateTime | null;
export declare function toCurrencyCode(value: string | null | undefined): CurrencyCode | null;
export declare function deriveSchemaNodes(subject: SchemaSubject): readonly SchemaNode[];
export {};
