import { urlSearchParamPreviewPathname, urlSearchParamPreviewPerspective, urlSearchParamPreviewSecret, urlSearchParamPreviewVariant, } from './constants' import type { PreviewUrlResolver, PreviewUrlResolverContext, PreviewUrlResolverOptions, } from './types' /** * @internal */ export function definePreviewUrl( options: PreviewUrlResolverOptions, ): PreviewUrlResolver { const { // oxlint-disable-next-line typescript/no-deprecated draftMode, previewMode, origin = typeof location === 'undefined' ? 'https://localhost' : location.origin, } = options // oxlint-disable-next-line typescript/no-deprecated const enableUrl = previewMode?.enable || draftMode?.enable let {preview = '/'} = options const productionUrl = new URL(preview, origin) const enablePreviewModeUrl = enableUrl ? new URL(enableUrl, origin) : undefined return async (context): Promise => { try { if (context.previewSearchParam) { const restoredUrl = new URL(context.previewSearchParam, productionUrl) if (restoredUrl.origin === productionUrl.origin) { preview = `${restoredUrl.pathname}${restoredUrl.search}` } } } catch { // ignore } // Prevent infinite recursion if ( typeof location !== 'undefined' && location.origin === productionUrl.origin && context.studioBasePath && (preview.startsWith(`${context.studioBasePath}/`) || preview === context.studioBasePath) ) { preview = options.preview || '/' } const previewUrl = new URL(preview, productionUrl) if (enablePreviewModeUrl) { const enablePreviewModeRequestUrl = new URL(enablePreviewModeUrl) const {searchParams} = enablePreviewModeRequestUrl searchParams.set(urlSearchParamPreviewSecret, context.previewUrlSecret) searchParams.set(urlSearchParamPreviewPerspective, context.studioPreviewPerspective) if (context.studioPreviewVariant) { searchParams.set(urlSearchParamPreviewVariant, context.studioPreviewVariant) } else { searchParams.delete(urlSearchParamPreviewVariant) } if (previewUrl.pathname !== enablePreviewModeRequestUrl.pathname) { searchParams.set( urlSearchParamPreviewPathname, `${previewUrl.pathname}${previewUrl.search}`, ) } return enablePreviewModeRequestUrl.toString() } return previewUrl.toString() } } export type {PreviewUrlResolver, PreviewUrlResolverContext, PreviewUrlResolverOptions}