import type { I18nConfig, LocalizedSlugs } from '../i18n/index.js'; import type { TitleOrder } from './composeTitle.js'; import type { SeoMeta } from './types.js'; /** * Subset of Next.js `Metadata` this helper produces. Kept local so the plugin * doesn't depend on `next` types; the shape is assignable to Next's Metadata. */ export type PageMetadata = { alternates?: { canonical?: string; languages?: Record; }; description?: string; openGraph?: { description?: string; images?: { url: string; }[]; locale?: string; /** Site/brand name for the OG card. */ siteName?: string; title: string; /** 'website' | 'article' etc. Defaults to 'website'. */ type?: string; /** Canonical URL of this page. */ url?: string; }; /** * robots directives. Indexed pages get generous snippet/preview limits by * default (Google shows richer results); noindex pages get index:false. */ robots?: { follow: boolean; index: boolean; /** 'none' | 'standard' | 'large' — image preview size in results. */ 'max-image-preview'?: 'large' | 'none' | 'standard'; /** Max text snippet length; -1 = no limit. Next maps to max-snippet. */ 'max-snippet'?: number; /** Max video preview seconds; -1 = no limit. */ 'max-video-preview'?: number; }; title: string; }; type BuildMetadataArgs = { /** Absolute site origin, e.g. 'https://example.com'. */ baseUrl?: string; config: I18nConfig; /** Home slug that collapses to the locale root. Defaults to 'home'. */ homeSlug?: Record | string; /** Resolved OG image URL (page image or site defaultShareImage). */ imageUrl?: null | string; /** Current locale being rendered. */ locale: string; /** SEO meta from the document (plugin-seo group). */ meta?: null | SeoMeta; /** Page title or site name first. Defaults to 'page-first'. */ order?: TitleOrder; /** * The document's own title (e.g. page.title = 'Sprzątanie biur'). Used as the * page-title source when meta.title is empty — the browser tab and search * result should show the page name, not go blank, when an editor didn't fill * the SEO title. Priority: titleOverride > meta.title > pageTitle. */ pageTitle?: null | string; /** * Localized segment the document lives under (an archive page's slugs). * Feeds both canonical and hreflang, so /pl/artykuly/moj-post and * /en/articles/my-post point at each other correctly. */ prefix?: LocalizedSlugs; /** * Query string appended to canonical and every hreflang, e.g. '?page=2'. * * A paginated listing must be canonical to itself — pointing page 2 at page 1 * tells Google the entries on it don't exist. Alternates carry the same page, * since /pl/artykuly?page=2 corresponds to /en/articles?page=2. */ query?: string; /** Separator between page title and site name. Defaults to ' | '. */ separator?: string; /** * Global fallback description (from SiteSettings.siteDescription). Used when a * page has no meta.description — better than emitting no description at all * (Google would then scrape random on-page text for the snippet). */ siteDescription?: null | string; /** Site name for title composition and OG. */ siteName?: null | string; /** slug per locale for this document — drives canonical + hreflang. */ slugs: LocalizedSlugs; }; /** * Assembles a Next.js-compatible Metadata object from document SEO fields and * site-level data. Locale-aware: canonical points at the current locale's * path, and hreflang alternates cover every locale the document exists in. * * Designed for use inside Next.js `generateMetadata`. The caller resolves the * pieces (meta group, site name, image URL, localized slugs) and passes them * in — the plugin composes, it doesn't fetch. */ export declare function buildMetadata({ baseUrl, config, homeSlug, imageUrl, locale, meta, order, pageTitle, prefix, query, separator, siteDescription, siteName, slugs, }: BuildMetadataArgs): PageMetadata; export {};