export const WEBSITE_PAGE_KINDS = [ 'home', 'portfolio_list', 'portfolio_detail', 'product_list', 'product_detail', 'store_item_list', 'store_item_detail', 'blog_list', 'blog_detail', 'video_list', 'video_detail', ] as const; export type WebsitePageKind = (typeof WEBSITE_PAGE_KINDS)[number]; /** @deprecated Prefer WebsitePageKind — kept for dashboard chart query aliases. */ export type WebsiteViewKind = WebsitePageKind | 'website' | 'product' | 'portfolio' | 'blog'; const DETAIL_KINDS = new Set([ 'portfolio_detail', 'product_detail', 'store_item_detail', 'blog_detail', 'video_detail', ]); /** Legacy chart / POST aliases → canonical page kinds. */ const KIND_ALIASES: Record = { website: 'home', product: 'product_detail', portfolio: 'portfolio_detail', blog: 'blog_detail', }; export function isWebsitePageKind(value: unknown): value is WebsitePageKind { return ( typeof value === 'string' && (WEBSITE_PAGE_KINDS as readonly string[]).includes(value) ); } export function normalizeWebsitePageKind(value: string): WebsitePageKind | null { if (isWebsitePageKind(value)) return value; const aliased = KIND_ALIASES[value]; return aliased ?? null; } export function pageKindRequiresEntity(kind: WebsitePageKind): boolean { return DETAIL_KINDS.has(kind); } /** Maps home dashboard chart ids to analytics page kinds (`all` = every storefront page). */ export const HOME_CHART_VIEW_KIND: Partial> = { website_views_30d: 'all', product_views_30d: 'product_detail', portfolio_views_30d: 'portfolio_detail', blog_views_30d: 'blog_detail', };