@amplifyup/sdk 0.1.31 → 0.1.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AmplifyRenderer.js +62 -4
- package/dist/AmplifyRenderer.js.map +1 -1
- package/dist/AmplifyRenderer.mjs +62 -4
- package/dist/AmplifyRenderer.mjs.map +1 -1
- package/dist/index.d.mts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +63 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{preview-BMrIgUvp.d.mts → preview-_vHmzRen.d.mts} +6 -1
- package/dist/{preview-BMrIgUvp.d.ts → preview-_vHmzRen.d.ts} +6 -1
- package/dist/react.d.mts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +65 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +65 -5
- package/dist/react.mjs.map +1 -1
- package/dist/server.js +13 -4
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +13 -4
- package/dist/server.mjs.map +1 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -69,12 +69,17 @@ function resolveAmplifyUpUrls(target) {
|
|
|
69
69
|
|
|
70
70
|
// src/preview.ts
|
|
71
71
|
function isPreviewRequest(searchParams) {
|
|
72
|
+
return paramIsTrue(searchParams, "preview") || paramIsTrue(searchParams, "visualEditor");
|
|
73
|
+
}
|
|
74
|
+
function isWorkingContentRequest(searchParams) {
|
|
75
|
+
return paramIsTrue(searchParams, "working");
|
|
76
|
+
}
|
|
77
|
+
function paramIsTrue(searchParams, key) {
|
|
72
78
|
if (searchParams instanceof URLSearchParams) {
|
|
73
|
-
return searchParams.get(
|
|
79
|
+
return searchParams.get(key) === "true";
|
|
74
80
|
}
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
return preview === "true" || visualEditor === "true";
|
|
81
|
+
const value = searchParams[key];
|
|
82
|
+
return value === "true" || Array.isArray(value) && value[0] === "true";
|
|
78
83
|
}
|
|
79
84
|
function isComposerPreview() {
|
|
80
85
|
if (typeof window === "undefined") return false;
|
|
@@ -272,12 +277,14 @@ async function fetchPageConfigServer(route, trackingId, preview = false, options
|
|
|
272
277
|
});
|
|
273
278
|
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
274
279
|
const previewFlag = preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
280
|
+
const workingFlag = options?.searchParams ? isWorkingContentRequest(options.searchParams) : false;
|
|
275
281
|
const fetchOrchestratorPage = async (pageRoute, isPreview) => {
|
|
276
282
|
const params = new URLSearchParams({
|
|
277
283
|
route: pageRoute,
|
|
278
284
|
trackingId
|
|
279
285
|
});
|
|
280
286
|
if (isPreview) params.set("preview", "true");
|
|
287
|
+
if (workingFlag) params.set("working", "true");
|
|
281
288
|
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
282
289
|
try {
|
|
283
290
|
const res = await fetch(url, {
|
|
@@ -309,6 +316,7 @@ async function fetchContentServer(route, trackingId, options) {
|
|
|
309
316
|
});
|
|
310
317
|
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
311
318
|
const previewFlag = options?.preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
319
|
+
const workingFlag = options?.searchParams ? isWorkingContentRequest(options.searchParams) : false;
|
|
312
320
|
const result = await fetchContent({
|
|
313
321
|
route,
|
|
314
322
|
trackingId,
|
|
@@ -323,6 +331,7 @@ async function fetchContentServer(route, trackingId, options) {
|
|
|
323
331
|
trackingId
|
|
324
332
|
});
|
|
325
333
|
if (isPreview) params.set("preview", "true");
|
|
334
|
+
if (workingFlag) params.set("working", "true");
|
|
326
335
|
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
327
336
|
try {
|
|
328
337
|
const res = await fetch(url, {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/targets.ts","../src/preview.ts","../src/edge/normalizeRoute.ts","../src/edge/resolve.ts","../src/edge/mapResolvedToPageConfig.ts","../src/content/fetchContent.ts","../src/server.tsx"],"names":["orchestratorUrl"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * AmplifyUp environment targets\n *\n * Two environments only:\n * - local: apps/config from localhost + Neon; events & personalize from AWS development\n * - production: all production AmplifyUp / AWS endpoints\n *\n * Controlled via `config.target` or `NEXT_PUBLIC_AMPLIFYUP_TARGET`.\n * Legacy value `dev` is treated as `local`.\n */\n\nexport type AmplifyUpTarget = 'local' | 'production';\n\n/** Accepted env/config strings (includes legacy `dev` → local). */\nexport type AmplifyUpTargetInput = AmplifyUpTarget | 'dev';\n\nexport interface AmplifyUpUrls {\n target: AmplifyUpTarget;\n apiGatewayUrl: string;\n orchestratorUrl: string;\n decisionApiUrl: string;\n edgeUrl: string;\n}\n\nconst AWS_DEV_API = 'https://api-dev.amplifyup.ai';\nconst AWS_PROD_API = 'https://api.amplifyup.ai';\nconst PROD_ORCHESTRATOR = 'https://amplifyup.ai';\nconst PROD_EDGE = 'https://edge.amplifyup.ai';\n\nexport function isAmplifyUpTarget(value: unknown): value is AmplifyUpTargetInput {\n return value === 'local' || value === 'dev' || value === 'production';\n}\n\nexport function normalizeAmplifyUpTarget(value: AmplifyUpTargetInput): AmplifyUpTarget {\n return value === 'dev' ? 'local' : value;\n}\n\n/**\n * Resolve which target to use.\n *\n * Priority:\n * 1. explicit config.target\n * 2. config.dev === true → 'local' (local apps + AWS-dev pipeline)\n * 3. NEXT_PUBLIC_AMPLIFYUP_TARGET\n * 4. unset → 'production' (live endpoints — hosting on localhost does NOT imply local)\n *\n * Use `local` only when developing against the AmplifyUp monorepo\n * (set NEXT_PUBLIC_AMPLIFYUP_TARGET=local in .env.local).\n */\nexport function resolveAmplifyUpTarget(options?: {\n configTarget?: AmplifyUpTargetInput;\n /** @deprecated Prefer NEXT_PUBLIC_AMPLIFYUP_TARGET=local. When true, resolves to local. */\n configDev?: boolean;\n}): AmplifyUpTarget {\n if (options?.configTarget && isAmplifyUpTarget(options.configTarget)) {\n return normalizeAmplifyUpTarget(options.configTarget);\n }\n\n if (options?.configDev === true) {\n return 'local';\n }\n\n const envTarget =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_TARGET\n : undefined;\n if (isAmplifyUpTarget(envTarget)) {\n return normalizeAmplifyUpTarget(envTarget);\n }\n\n return 'production';\n}\n\n/** True when the orchestrator origin is a remote AmplifyUp deployment (not localhost). */\nexport function isRemoteOrchestratorUrl(orchestratorUrl: string): boolean {\n try {\n const host = new URL(orchestratorUrl).hostname.toLowerCase();\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '::1';\n } catch {\n return false;\n }\n}\n\nfunction localOrchestratorUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n return (fromEnv || 'http://localhost:5001').replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local→AWS-dev API base (events + personalize).\n * Defaults to https://api-dev.amplifyup.ai\n */\nfunction localAwsApiUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL\n : undefined;\n return (fromEnv || AWS_DEV_API).replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local Edge Worker URL.\n * Defaults to http://localhost:8787\n */\nfunction localEdgeUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL\n : undefined;\n return (fromEnv || 'http://localhost:8787').replace(/\\/$/, '');\n}\n\nexport function resolveAmplifyUpUrls(target: AmplifyUpTarget): AmplifyUpUrls {\n if (target === 'local') {\n const orchestratorUrl = localOrchestratorUrl();\n const apiGatewayUrl = localAwsApiUrl();\n return {\n target: 'local',\n // Layouts / site config / composer APIs → local orchestrator + Neon\n orchestratorUrl,\n // Events + personalize → AWS development stack\n apiGatewayUrl,\n decisionApiUrl: `${apiGatewayUrl}/v1/personalize`,\n edgeUrl: localEdgeUrl(),\n };\n }\n\n const resolvedApi =\n (typeof process !== 'undefined' &&\n process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL?.replace(/\\/$/, '')) ||\n AWS_PROD_API;\n\n const orchestratorFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n\n // Production: don't accidentally use a localhost orchestrator URL from a local env file\n const isLocalOrchestrator =\n !!orchestratorFromEnv &&\n (orchestratorFromEnv.includes('localhost') ||\n orchestratorFromEnv.includes('127.0.0.1'));\n\n const orchestratorUrl = isLocalOrchestrator || !orchestratorFromEnv\n ? PROD_ORCHESTRATOR\n : orchestratorFromEnv.replace(/\\/$/, '');\n\n const edgeFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL?.replace(/\\/$/, '')\n : undefined;\n const edgeUrl =\n edgeFromEnv &&\n !edgeFromEnv.includes('localhost') &&\n !edgeFromEnv.includes('127.0.0.1')\n ? edgeFromEnv\n : PROD_EDGE;\n\n return {\n target: 'production',\n apiGatewayUrl: resolvedApi,\n orchestratorUrl,\n decisionApiUrl: `${resolvedApi}/v1/personalize`,\n edgeUrl,\n };\n}\n","/**\n * Composer / visual-editor preview detection.\n * Shared by AmplifyPageContent, AmplifyUpProvider, and AmplifyRenderer.\n */\n\n/** True when `preview=true` (or legacy visualEditor) is in request search params. */\nexport function isPreviewRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n if (searchParams instanceof URLSearchParams) {\n return (\n searchParams.get('preview') === 'true' ||\n searchParams.get('visualEditor') === 'true'\n );\n }\n const preview = searchParams.preview;\n const visualEditor = searchParams.visualEditor;\n return preview === 'true' || visualEditor === 'true';\n}\n\n/**\n * Client-only: true when the page is loaded inside AmplifyUp Composer.\n * Does NOT treat every iframe as preview — only Composer referrers / query flags.\n */\nexport function isComposerPreview(): boolean {\n if (typeof window === 'undefined') return false;\n\n if ((window as any).__AMPLIFYUP_PREVIEW_MODE__ === true) return true;\n\n const params = new URLSearchParams(window.location.search);\n if (isPreviewRequest(params)) return true;\n\n if (window.self !== window.top && document.referrer) {\n try {\n const refUrl = new URL(document.referrer);\n if (\n refUrl.hostname === 'amplifyup.ai' ||\n refUrl.hostname.endsWith('.amplifyup.ai') ||\n (refUrl.hostname === 'localhost' && refUrl.port === '5001') ||\n refUrl.pathname.includes('/dashboard/composer') ||\n refUrl.pathname.includes('/dashboard/routes/')\n ) {\n return true;\n }\n } catch {\n // ignore parse error\n }\n }\n\n return false;\n}\n","/**\n * Normalize a route path for Edge resolve requests.\n * Leading slash, no trailing slash (except root), query/hash stripped.\n */\nexport function normalizeRoute(route: string): string {\n let path = String(route || '').trim();\n if (!path) return '/';\n\n try {\n if (/^https?:\\/\\//i.test(path)) {\n path = new URL(path).pathname;\n }\n } catch {\n /* keep path */\n }\n\n const q = path.indexOf('?');\n if (q >= 0) path = path.slice(0, q);\n const h = path.indexOf('#');\n if (h >= 0) path = path.slice(0, h);\n\n if (!path.startsWith('/')) path = `/${path}`;\n if (path.length > 1 && path.endsWith('/')) {\n path = path.replace(/\\/+$/, '');\n }\n return path || '/';\n}\n","import type { EventTrackingConfig } from '../types';\nimport { normalizeRoute } from './normalizeRoute';\n\n/** Mirrors Edge ResolvedComponent — SDK maps this into layoutTree nodes. */\nexport interface EdgeResolvedComponent {\n instanceId: string;\n componentId: string;\n props: Record<string, unknown>;\n children?: Record<string, EdgeResolvedComponent[]>;\n appliedRules?: string[];\n degraded?: boolean;\n}\n\nexport interface EdgeResolvedPayload {\n siteId: string;\n route: string;\n version: number;\n zones: Record<string, EdgeResolvedComponent[]>;\n tree?: EdgeResolvedComponent[];\n /** Composer event bindings baked into the published snapshot. */\n eventTracking?: EventTrackingConfig[];\n meta: {\n variantKeys: Record<string, string>;\n audienceLookup?: { status: string; durationMs: number };\n decideLookup?: { status: string; durationMs: number; checks: number };\n experiments?: Array<{ key: string; variantKey: string; bucket: number }>;\n bot?: unknown;\n resolvedAt: string;\n degraded?: boolean;\n };\n}\n\nexport class EdgeResolveError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'EdgeResolveError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function fetchEdgeResolve(options: {\n edgeUrl: string;\n trackingId: string;\n route: string;\n anonId?: string | null;\n siteId?: string | null;\n fetch?: typeof fetch;\n}): Promise<EdgeResolvedPayload> {\n const base = options.edgeUrl.replace(/\\/+$/, '');\n const route = normalizeRoute(options.route);\n const params = new URLSearchParams({\n route,\n trackingId: options.trackingId,\n });\n if (options.siteId) params.set('site', options.siteId);\n if (options.anonId) params.set('anonId', options.anonId);\n\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n const res = await fetchFn(`${base}/v1/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new EdgeResolveError(\n (body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : `Edge resolve failed (${res.status})`) ||\n `Edge resolve failed (${res.status})`,\n res.status,\n body\n );\n }\n\n return body as EdgeResolvedPayload;\n}\n","import type { PageConfig } from '../types';\nimport type { EdgeResolvedComponent, EdgeResolvedPayload } from './resolve';\n\ninterface LayoutNode {\n id: string;\n componentId: string;\n props?: Record<string, unknown>;\n slots?: Array<{\n slotId: string;\n children: LayoutNode[];\n }>;\n /** Marker so AmplifyRenderer skips client Decision API fetches. */\n _contentSource?: 'edge' | 'orchestrator';\n}\n\nfunction mapResolvedComponent(node: EdgeResolvedComponent): LayoutNode {\n const slots: LayoutNode['slots'] = [];\n if (node.children) {\n for (const [slotId, kids] of Object.entries(node.children)) {\n slots.push({\n slotId,\n children: (kids || []).map(mapResolvedComponent),\n });\n }\n }\n\n return {\n id: node.instanceId,\n componentId: node.componentId,\n props: { ...(node.props || {}) },\n ...(slots.length > 0 ? { slots } : {}),\n _contentSource: 'edge',\n };\n}\n\n/**\n * Map Edge /v1/resolve payload → PageConfig for AmplifyRenderer.\n * Prefers `tree` (full page skeleton with zones spliced in); falls back to\n * flattening zone roots when older snapshots lack structure.\n */\nexport function mapResolvedToPageConfig(\n payload: EdgeResolvedPayload\n): PageConfig {\n let layoutTree: LayoutNode[] = [];\n\n if (payload.tree && payload.tree.length > 0) {\n layoutTree = payload.tree.map(mapResolvedComponent);\n } else {\n // Legacy: zones only — render each zone's roots in stable zoneId order\n const zoneIds = Object.keys(payload.zones || {}).sort();\n for (const zoneId of zoneIds) {\n const roots = payload.zones[zoneId] || [];\n layoutTree.push(...roots.map(mapResolvedComponent));\n }\n }\n\n return {\n id: `edge:${payload.siteId}:${payload.route}:v${payload.version}`,\n route: payload.route,\n title: '',\n layoutTree,\n meta: {\n // Stash edge meta for diagnostics (not visitor-facing)\n description: payload.meta?.degraded ? 'degraded' : undefined,\n },\n ...(payload.eventTracking && payload.eventTracking.length > 0\n ? { eventTracking: payload.eventTracking }\n : {}),\n };\n}\n\nexport function collectDegraded(payload: EdgeResolvedPayload): boolean {\n if (payload.meta?.degraded) return true;\n const walk = (nodes: EdgeResolvedComponent[]): boolean =>\n nodes.some(\n (n) =>\n !!n.degraded ||\n (n.children\n ? Object.values(n.children).some((kids) => walk(kids || []))\n : false)\n );\n if (payload.tree && walk(payload.tree)) return true;\n return Object.values(payload.zones || {}).some((roots) => walk(roots || []));\n}\n","import type { AmplifyContentMeta, ContentSource, PageConfig } from '../types';\nimport { isComposerPreview } from '../preview';\nimport {\n EdgeResolveError,\n fetchEdgeResolve,\n type EdgeResolvedPayload,\n} from '../edge/resolve';\nimport {\n collectDegraded,\n mapResolvedToPageConfig,\n} from '../edge/mapResolvedToPageConfig';\n\nexport type { AmplifyContentMeta, ContentSource };\n\nexport interface FetchContentResult {\n pageConfig: PageConfig | null;\n source: ContentSource;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}\n\nexport interface FetchContentOptions {\n route: string;\n trackingId: string;\n anonId?: string | null;\n siteId?: string | null;\n /** Force preview (Composer); otherwise uses isComposerPreview() in browser. */\n preview?: boolean;\n orchestratorUrl: string;\n edgeUrl: string;\n /** Orchestrator layout fetch (SDK instance method or server helper). */\n fetchOrchestratorPage: (\n route: string,\n preview: boolean\n ) => Promise<PageConfig | null>;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Single content entry point:\n * - Composer / preview → orchestrator layout provider (drafts + live edits)\n * - Production visitors → Edge /v1/resolve (personalized + CMS-populated)\n *\n * Production never falls back to the orchestrator on Edge failure —\n * callers should render site fallback instead.\n */\nexport async function fetchContent(\n options: FetchContentOptions\n): Promise<FetchContentResult> {\n const preview =\n options.preview ??\n (typeof window !== 'undefined' ? isComposerPreview() : false);\n\n if (preview) {\n try {\n const page = await options.fetchOrchestratorPage(options.route, true);\n return {\n pageConfig: page,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: null,\n };\n } catch (err) {\n return {\n pageConfig: null,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: err instanceof Error ? err.message : 'Failed to load preview',\n };\n }\n }\n\n try {\n const payload: EdgeResolvedPayload = await fetchEdgeResolve({\n edgeUrl: options.edgeUrl,\n trackingId: options.trackingId,\n route: options.route,\n anonId: options.anonId,\n siteId: options.siteId,\n fetch: options.fetchFn,\n });\n\n const pageConfig = mapResolvedToPageConfig(payload);\n const degraded = collectDegraded(payload);\n\n return {\n pageConfig,\n source: 'edge',\n meta: {\n source: 'edge',\n version: payload.version,\n siteId: payload.siteId,\n variantKeys: payload.meta?.variantKeys,\n degraded,\n audienceLookup: payload.meta?.audienceLookup,\n decideLookup: payload.meta?.decideLookup,\n resolvedAt: payload.meta?.resolvedAt,\n },\n error: null,\n };\n } catch (err) {\n if (err instanceof EdgeResolveError && err.status === 404) {\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error: null, // unpublished → site fallback, not an error banner\n };\n }\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error:\n err instanceof Error ? err.message : \"Couldn't load page content.\",\n };\n }\n}\n","/**\n * Server-side utilities for AmplifyUp SDK\n *\n * Provides functions for fetching page config on the server\n * for SSR/SSG support (Composer preview → orchestrator; production → Edge).\n */\n\nimport type { AmplifyContentMeta, AmplifyUpTarget, PageConfig } from './types';\nimport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n} from './targets';\nimport { fetchContent } from './content/fetchContent';\nimport { isPreviewRequest } from './preview';\n\n/**\n * Fetch page configuration on the server.\n * Production visitors resolve via Edge; Composer preview uses the orchestrator.\n *\n * @param route - The route path (e.g., '/', '/about')\n * @param trackingId - The site tracking ID\n * @param preview - Whether to include draft views (default: false)\n * @param options - Optional target / anonId / siteId overrides\n */\nexport async function fetchPageConfigServer(\n route: string,\n trackingId: string,\n preview: boolean = false,\n options?: {\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n /** Raw search params — used to detect Composer preview when preview flag omitted. */\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<PageConfig | null> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n\n const previewFlag =\n preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const fetchOrchestratorPage = async (\n pageRoute: string,\n isPreview: boolean\n ): Promise<PageConfig | null> => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n };\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage,\n });\n\n return result.pageConfig;\n}\n\n/**\n * Same as fetchPageConfigServer but also returns content source meta\n * (useful for SSR that wants Edge diagnostics).\n */\nexport async function fetchContentServer(\n route: string,\n trackingId: string,\n options?: {\n preview?: boolean;\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<{\n pageConfig: PageConfig | null;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n const previewFlag =\n options?.preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage: async (pageRoute, isPreview) => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n },\n });\n\n return {\n pageConfig: result.pageConfig,\n meta: result.meta,\n error: result.error,\n };\n}\n\nexport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/targets.ts","../src/preview.ts","../src/edge/normalizeRoute.ts","../src/edge/resolve.ts","../src/edge/mapResolvedToPageConfig.ts","../src/content/fetchContent.ts","../src/server.tsx"],"names":["orchestratorUrl"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * AmplifyUp environment targets\n *\n * Two environments only:\n * - local: apps/config from localhost + Neon; events & personalize from AWS development\n * - production: all production AmplifyUp / AWS endpoints\n *\n * Controlled via `config.target` or `NEXT_PUBLIC_AMPLIFYUP_TARGET`.\n * Legacy value `dev` is treated as `local`.\n */\n\nexport type AmplifyUpTarget = 'local' | 'production';\n\n/** Accepted env/config strings (includes legacy `dev` → local). */\nexport type AmplifyUpTargetInput = AmplifyUpTarget | 'dev';\n\nexport interface AmplifyUpUrls {\n target: AmplifyUpTarget;\n apiGatewayUrl: string;\n orchestratorUrl: string;\n decisionApiUrl: string;\n edgeUrl: string;\n}\n\nconst AWS_DEV_API = 'https://api-dev.amplifyup.ai';\nconst AWS_PROD_API = 'https://api.amplifyup.ai';\nconst PROD_ORCHESTRATOR = 'https://amplifyup.ai';\nconst PROD_EDGE = 'https://edge.amplifyup.ai';\n\nexport function isAmplifyUpTarget(value: unknown): value is AmplifyUpTargetInput {\n return value === 'local' || value === 'dev' || value === 'production';\n}\n\nexport function normalizeAmplifyUpTarget(value: AmplifyUpTargetInput): AmplifyUpTarget {\n return value === 'dev' ? 'local' : value;\n}\n\n/**\n * Resolve which target to use.\n *\n * Priority:\n * 1. explicit config.target\n * 2. config.dev === true → 'local' (local apps + AWS-dev pipeline)\n * 3. NEXT_PUBLIC_AMPLIFYUP_TARGET\n * 4. unset → 'production' (live endpoints — hosting on localhost does NOT imply local)\n *\n * Use `local` only when developing against the AmplifyUp monorepo\n * (set NEXT_PUBLIC_AMPLIFYUP_TARGET=local in .env.local).\n */\nexport function resolveAmplifyUpTarget(options?: {\n configTarget?: AmplifyUpTargetInput;\n /** @deprecated Prefer NEXT_PUBLIC_AMPLIFYUP_TARGET=local. When true, resolves to local. */\n configDev?: boolean;\n}): AmplifyUpTarget {\n if (options?.configTarget && isAmplifyUpTarget(options.configTarget)) {\n return normalizeAmplifyUpTarget(options.configTarget);\n }\n\n if (options?.configDev === true) {\n return 'local';\n }\n\n const envTarget =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_TARGET\n : undefined;\n if (isAmplifyUpTarget(envTarget)) {\n return normalizeAmplifyUpTarget(envTarget);\n }\n\n return 'production';\n}\n\n/** True when the orchestrator origin is a remote AmplifyUp deployment (not localhost). */\nexport function isRemoteOrchestratorUrl(orchestratorUrl: string): boolean {\n try {\n const host = new URL(orchestratorUrl).hostname.toLowerCase();\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '::1';\n } catch {\n return false;\n }\n}\n\nfunction localOrchestratorUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n return (fromEnv || 'http://localhost:5001').replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local→AWS-dev API base (events + personalize).\n * Defaults to https://api-dev.amplifyup.ai\n */\nfunction localAwsApiUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL\n : undefined;\n return (fromEnv || AWS_DEV_API).replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local Edge Worker URL.\n * Defaults to http://localhost:8787\n */\nfunction localEdgeUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL\n : undefined;\n return (fromEnv || 'http://localhost:8787').replace(/\\/$/, '');\n}\n\nexport function resolveAmplifyUpUrls(target: AmplifyUpTarget): AmplifyUpUrls {\n if (target === 'local') {\n const orchestratorUrl = localOrchestratorUrl();\n const apiGatewayUrl = localAwsApiUrl();\n return {\n target: 'local',\n // Layouts / site config / composer APIs → local orchestrator + Neon\n orchestratorUrl,\n // Events + personalize → AWS development stack\n apiGatewayUrl,\n decisionApiUrl: `${apiGatewayUrl}/v1/personalize`,\n edgeUrl: localEdgeUrl(),\n };\n }\n\n const resolvedApi =\n (typeof process !== 'undefined' &&\n process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL?.replace(/\\/$/, '')) ||\n AWS_PROD_API;\n\n const orchestratorFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n\n // Production: don't accidentally use a localhost orchestrator URL from a local env file\n const isLocalOrchestrator =\n !!orchestratorFromEnv &&\n (orchestratorFromEnv.includes('localhost') ||\n orchestratorFromEnv.includes('127.0.0.1'));\n\n const orchestratorUrl = isLocalOrchestrator || !orchestratorFromEnv\n ? PROD_ORCHESTRATOR\n : orchestratorFromEnv.replace(/\\/$/, '');\n\n const edgeFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL?.replace(/\\/$/, '')\n : undefined;\n const edgeUrl =\n edgeFromEnv &&\n !edgeFromEnv.includes('localhost') &&\n !edgeFromEnv.includes('127.0.0.1')\n ? edgeFromEnv\n : PROD_EDGE;\n\n return {\n target: 'production',\n apiGatewayUrl: resolvedApi,\n orchestratorUrl,\n decisionApiUrl: `${resolvedApi}/v1/personalize`,\n edgeUrl,\n };\n}\n","/**\n * Composer / visual-editor preview detection.\n * Shared by AmplifyPageContent, AmplifyUpProvider, and AmplifyRenderer.\n */\n\n/** True when `preview=true` (or legacy visualEditor) is in request search params. */\nexport function isPreviewRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n return paramIsTrue(searchParams, 'preview') || paramIsTrue(searchParams, 'visualEditor');\n}\n\n/**\n * Composer Edit (not Preview toggle): overlay unpublished CMS docs.\n * Live visitors and Composer Preview omit this.\n */\nexport function isWorkingContentRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n return paramIsTrue(searchParams, 'working');\n}\n\nfunction paramIsTrue(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams,\n key: string\n): boolean {\n if (searchParams instanceof URLSearchParams) {\n return searchParams.get(key) === 'true';\n }\n const value = searchParams[key];\n return value === 'true' || (Array.isArray(value) && value[0] === 'true');\n}\n\n/**\n * Client-only: true when the page is loaded inside AmplifyUp Composer.\n * Does NOT treat every iframe as preview — only Composer referrers / query flags.\n */\nexport function isComposerPreview(): boolean {\n if (typeof window === 'undefined') return false;\n\n if ((window as any).__AMPLIFYUP_PREVIEW_MODE__ === true) return true;\n\n const params = new URLSearchParams(window.location.search);\n if (isPreviewRequest(params)) return true;\n\n if (window.self !== window.top && document.referrer) {\n try {\n const refUrl = new URL(document.referrer);\n if (\n refUrl.hostname === 'amplifyup.ai' ||\n refUrl.hostname.endsWith('.amplifyup.ai') ||\n (refUrl.hostname === 'localhost' && refUrl.port === '5001') ||\n refUrl.pathname.includes('/dashboard/composer') ||\n refUrl.pathname.includes('/dashboard/routes/')\n ) {\n return true;\n }\n } catch {\n // ignore parse error\n }\n }\n\n return false;\n}\n","/**\n * Normalize a route path for Edge resolve requests.\n * Leading slash, no trailing slash (except root), query/hash stripped.\n */\nexport function normalizeRoute(route: string): string {\n let path = String(route || '').trim();\n if (!path) return '/';\n\n try {\n if (/^https?:\\/\\//i.test(path)) {\n path = new URL(path).pathname;\n }\n } catch {\n /* keep path */\n }\n\n const q = path.indexOf('?');\n if (q >= 0) path = path.slice(0, q);\n const h = path.indexOf('#');\n if (h >= 0) path = path.slice(0, h);\n\n if (!path.startsWith('/')) path = `/${path}`;\n if (path.length > 1 && path.endsWith('/')) {\n path = path.replace(/\\/+$/, '');\n }\n return path || '/';\n}\n","import type { EventTrackingConfig } from '../types';\nimport { normalizeRoute } from './normalizeRoute';\n\n/** Mirrors Edge ResolvedComponent — SDK maps this into layoutTree nodes. */\nexport interface EdgeResolvedComponent {\n instanceId: string;\n componentId: string;\n props: Record<string, unknown>;\n children?: Record<string, EdgeResolvedComponent[]>;\n appliedRules?: string[];\n degraded?: boolean;\n}\n\nexport interface EdgeResolvedPayload {\n siteId: string;\n route: string;\n version: number;\n zones: Record<string, EdgeResolvedComponent[]>;\n tree?: EdgeResolvedComponent[];\n /** Composer event bindings baked into the published snapshot. */\n eventTracking?: EventTrackingConfig[];\n meta: {\n variantKeys: Record<string, string>;\n audienceLookup?: { status: string; durationMs: number };\n decideLookup?: { status: string; durationMs: number; checks: number };\n experiments?: Array<{ key: string; variantKey: string; bucket: number }>;\n bot?: unknown;\n resolvedAt: string;\n degraded?: boolean;\n };\n}\n\nexport class EdgeResolveError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'EdgeResolveError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function fetchEdgeResolve(options: {\n edgeUrl: string;\n trackingId: string;\n route: string;\n anonId?: string | null;\n siteId?: string | null;\n fetch?: typeof fetch;\n}): Promise<EdgeResolvedPayload> {\n const base = options.edgeUrl.replace(/\\/+$/, '');\n const route = normalizeRoute(options.route);\n const params = new URLSearchParams({\n route,\n trackingId: options.trackingId,\n });\n if (options.siteId) params.set('site', options.siteId);\n if (options.anonId) params.set('anonId', options.anonId);\n\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n const res = await fetchFn(`${base}/v1/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new EdgeResolveError(\n (body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : `Edge resolve failed (${res.status})`) ||\n `Edge resolve failed (${res.status})`,\n res.status,\n body\n );\n }\n\n return body as EdgeResolvedPayload;\n}\n","import type { PageConfig } from '../types';\nimport type { EdgeResolvedComponent, EdgeResolvedPayload } from './resolve';\n\ninterface LayoutNode {\n id: string;\n componentId: string;\n props?: Record<string, unknown>;\n slots?: Array<{\n slotId: string;\n children: LayoutNode[];\n }>;\n /** Marker so AmplifyRenderer skips client Decision API fetches. */\n _contentSource?: 'edge' | 'orchestrator';\n}\n\nfunction mapResolvedComponent(node: EdgeResolvedComponent): LayoutNode {\n const slots: LayoutNode['slots'] = [];\n if (node.children) {\n for (const [slotId, kids] of Object.entries(node.children)) {\n slots.push({\n slotId,\n children: (kids || []).map(mapResolvedComponent),\n });\n }\n }\n\n return {\n id: node.instanceId,\n componentId: node.componentId,\n props: { ...(node.props || {}) },\n ...(slots.length > 0 ? { slots } : {}),\n _contentSource: 'edge',\n };\n}\n\n/**\n * Map Edge /v1/resolve payload → PageConfig for AmplifyRenderer.\n * Prefers `tree` (full page skeleton with zones spliced in); falls back to\n * flattening zone roots when older snapshots lack structure.\n */\nexport function mapResolvedToPageConfig(\n payload: EdgeResolvedPayload\n): PageConfig {\n let layoutTree: LayoutNode[] = [];\n\n if (payload.tree && payload.tree.length > 0) {\n layoutTree = payload.tree.map(mapResolvedComponent);\n } else {\n // Legacy: zones only — render each zone's roots in stable zoneId order\n const zoneIds = Object.keys(payload.zones || {}).sort();\n for (const zoneId of zoneIds) {\n const roots = payload.zones[zoneId] || [];\n layoutTree.push(...roots.map(mapResolvedComponent));\n }\n }\n\n return {\n id: `edge:${payload.siteId}:${payload.route}:v${payload.version}`,\n route: payload.route,\n title: '',\n layoutTree,\n meta: {\n // Stash edge meta for diagnostics (not visitor-facing)\n description: payload.meta?.degraded ? 'degraded' : undefined,\n },\n ...(payload.eventTracking && payload.eventTracking.length > 0\n ? { eventTracking: payload.eventTracking }\n : {}),\n };\n}\n\nexport function collectDegraded(payload: EdgeResolvedPayload): boolean {\n if (payload.meta?.degraded) return true;\n const walk = (nodes: EdgeResolvedComponent[]): boolean =>\n nodes.some(\n (n) =>\n !!n.degraded ||\n (n.children\n ? Object.values(n.children).some((kids) => walk(kids || []))\n : false)\n );\n if (payload.tree && walk(payload.tree)) return true;\n return Object.values(payload.zones || {}).some((roots) => walk(roots || []));\n}\n","import type { AmplifyContentMeta, ContentSource, PageConfig } from '../types';\nimport { isComposerPreview } from '../preview';\nimport {\n EdgeResolveError,\n fetchEdgeResolve,\n type EdgeResolvedPayload,\n} from '../edge/resolve';\nimport {\n collectDegraded,\n mapResolvedToPageConfig,\n} from '../edge/mapResolvedToPageConfig';\n\nexport type { AmplifyContentMeta, ContentSource };\n\nexport interface FetchContentResult {\n pageConfig: PageConfig | null;\n source: ContentSource;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}\n\nexport interface FetchContentOptions {\n route: string;\n trackingId: string;\n anonId?: string | null;\n siteId?: string | null;\n /** Force preview (Composer); otherwise uses isComposerPreview() in browser. */\n preview?: boolean;\n orchestratorUrl: string;\n edgeUrl: string;\n /** Orchestrator layout fetch (SDK instance method or server helper). */\n fetchOrchestratorPage: (\n route: string,\n preview: boolean\n ) => Promise<PageConfig | null>;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Single content entry point:\n * - Composer / preview → orchestrator layout provider (drafts + live edits)\n * - Production visitors → Edge /v1/resolve (personalized + CMS-populated)\n *\n * Production never falls back to the orchestrator on Edge failure —\n * callers should render site fallback instead.\n */\nexport async function fetchContent(\n options: FetchContentOptions\n): Promise<FetchContentResult> {\n const preview =\n options.preview ??\n (typeof window !== 'undefined' ? isComposerPreview() : false);\n\n if (preview) {\n try {\n const page = await options.fetchOrchestratorPage(options.route, true);\n return {\n pageConfig: page,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: null,\n };\n } catch (err) {\n return {\n pageConfig: null,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: err instanceof Error ? err.message : 'Failed to load preview',\n };\n }\n }\n\n try {\n const payload: EdgeResolvedPayload = await fetchEdgeResolve({\n edgeUrl: options.edgeUrl,\n trackingId: options.trackingId,\n route: options.route,\n anonId: options.anonId,\n siteId: options.siteId,\n fetch: options.fetchFn,\n });\n\n const pageConfig = mapResolvedToPageConfig(payload);\n const degraded = collectDegraded(payload);\n\n return {\n pageConfig,\n source: 'edge',\n meta: {\n source: 'edge',\n version: payload.version,\n siteId: payload.siteId,\n variantKeys: payload.meta?.variantKeys,\n degraded,\n audienceLookup: payload.meta?.audienceLookup,\n decideLookup: payload.meta?.decideLookup,\n resolvedAt: payload.meta?.resolvedAt,\n },\n error: null,\n };\n } catch (err) {\n if (err instanceof EdgeResolveError && err.status === 404) {\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error: null, // unpublished → site fallback, not an error banner\n };\n }\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error:\n err instanceof Error ? err.message : \"Couldn't load page content.\",\n };\n }\n}\n","/**\n * Server-side utilities for AmplifyUp SDK\n *\n * Provides functions for fetching page config on the server\n * for SSR/SSG support (Composer preview → orchestrator; production → Edge).\n */\n\nimport type { AmplifyContentMeta, AmplifyUpTarget, PageConfig } from './types';\nimport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n} from './targets';\nimport { fetchContent } from './content/fetchContent';\nimport { isPreviewRequest, isWorkingContentRequest } from './preview';\n\n/**\n * Fetch page configuration on the server.\n * Production visitors resolve via Edge; Composer preview uses the orchestrator.\n *\n * @param route - The route path (e.g., '/', '/about')\n * @param trackingId - The site tracking ID\n * @param preview - Whether to include draft views (default: false)\n * @param options - Optional target / anonId / siteId overrides\n */\nexport async function fetchPageConfigServer(\n route: string,\n trackingId: string,\n preview: boolean = false,\n options?: {\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n /** Raw search params — used to detect Composer preview when preview flag omitted. */\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<PageConfig | null> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n\n const previewFlag =\n preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const workingFlag =\n options?.searchParams\n ? isWorkingContentRequest(options.searchParams as any)\n : false;\n\n const fetchOrchestratorPage = async (\n pageRoute: string,\n isPreview: boolean\n ): Promise<PageConfig | null> => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n if (workingFlag) params.set('working', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n };\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage,\n });\n\n return result.pageConfig;\n}\n\n/**\n * Same as fetchPageConfigServer but also returns content source meta\n * (useful for SSR that wants Edge diagnostics).\n */\nexport async function fetchContentServer(\n route: string,\n trackingId: string,\n options?: {\n preview?: boolean;\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<{\n pageConfig: PageConfig | null;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n const previewFlag =\n options?.preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n const workingFlag =\n options?.searchParams\n ? isWorkingContentRequest(options.searchParams as any)\n : false;\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage: async (pageRoute, isPreview) => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n if (workingFlag) params.set('working', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n },\n });\n\n return {\n pageConfig: result.pageConfig,\n meta: result.meta,\n error: result.error,\n };\n}\n\nexport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n};\n"]}
|
package/dist/server.mjs
CHANGED
|
@@ -67,12 +67,17 @@ function resolveAmplifyUpUrls(target) {
|
|
|
67
67
|
|
|
68
68
|
// src/preview.ts
|
|
69
69
|
function isPreviewRequest(searchParams) {
|
|
70
|
+
return paramIsTrue(searchParams, "preview") || paramIsTrue(searchParams, "visualEditor");
|
|
71
|
+
}
|
|
72
|
+
function isWorkingContentRequest(searchParams) {
|
|
73
|
+
return paramIsTrue(searchParams, "working");
|
|
74
|
+
}
|
|
75
|
+
function paramIsTrue(searchParams, key) {
|
|
70
76
|
if (searchParams instanceof URLSearchParams) {
|
|
71
|
-
return searchParams.get(
|
|
77
|
+
return searchParams.get(key) === "true";
|
|
72
78
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
return preview === "true" || visualEditor === "true";
|
|
79
|
+
const value = searchParams[key];
|
|
80
|
+
return value === "true" || Array.isArray(value) && value[0] === "true";
|
|
76
81
|
}
|
|
77
82
|
function isComposerPreview() {
|
|
78
83
|
if (typeof window === "undefined") return false;
|
|
@@ -270,12 +275,14 @@ async function fetchPageConfigServer(route, trackingId, preview = false, options
|
|
|
270
275
|
});
|
|
271
276
|
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
272
277
|
const previewFlag = preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
278
|
+
const workingFlag = options?.searchParams ? isWorkingContentRequest(options.searchParams) : false;
|
|
273
279
|
const fetchOrchestratorPage = async (pageRoute, isPreview) => {
|
|
274
280
|
const params = new URLSearchParams({
|
|
275
281
|
route: pageRoute,
|
|
276
282
|
trackingId
|
|
277
283
|
});
|
|
278
284
|
if (isPreview) params.set("preview", "true");
|
|
285
|
+
if (workingFlag) params.set("working", "true");
|
|
279
286
|
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
280
287
|
try {
|
|
281
288
|
const res = await fetch(url, {
|
|
@@ -307,6 +314,7 @@ async function fetchContentServer(route, trackingId, options) {
|
|
|
307
314
|
});
|
|
308
315
|
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
309
316
|
const previewFlag = options?.preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
317
|
+
const workingFlag = options?.searchParams ? isWorkingContentRequest(options.searchParams) : false;
|
|
310
318
|
const result = await fetchContent({
|
|
311
319
|
route,
|
|
312
320
|
trackingId,
|
|
@@ -321,6 +329,7 @@ async function fetchContentServer(route, trackingId, options) {
|
|
|
321
329
|
trackingId
|
|
322
330
|
});
|
|
323
331
|
if (isPreview) params.set("preview", "true");
|
|
332
|
+
if (workingFlag) params.set("working", "true");
|
|
324
333
|
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
325
334
|
try {
|
|
326
335
|
const res = await fetch(url, {
|
package/dist/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/targets.ts","../src/preview.ts","../src/edge/normalizeRoute.ts","../src/edge/resolve.ts","../src/edge/mapResolvedToPageConfig.ts","../src/content/fetchContent.ts","../src/server.tsx"],"names":["orchestratorUrl"],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * AmplifyUp environment targets\n *\n * Two environments only:\n * - local: apps/config from localhost + Neon; events & personalize from AWS development\n * - production: all production AmplifyUp / AWS endpoints\n *\n * Controlled via `config.target` or `NEXT_PUBLIC_AMPLIFYUP_TARGET`.\n * Legacy value `dev` is treated as `local`.\n */\n\nexport type AmplifyUpTarget = 'local' | 'production';\n\n/** Accepted env/config strings (includes legacy `dev` → local). */\nexport type AmplifyUpTargetInput = AmplifyUpTarget | 'dev';\n\nexport interface AmplifyUpUrls {\n target: AmplifyUpTarget;\n apiGatewayUrl: string;\n orchestratorUrl: string;\n decisionApiUrl: string;\n edgeUrl: string;\n}\n\nconst AWS_DEV_API = 'https://api-dev.amplifyup.ai';\nconst AWS_PROD_API = 'https://api.amplifyup.ai';\nconst PROD_ORCHESTRATOR = 'https://amplifyup.ai';\nconst PROD_EDGE = 'https://edge.amplifyup.ai';\n\nexport function isAmplifyUpTarget(value: unknown): value is AmplifyUpTargetInput {\n return value === 'local' || value === 'dev' || value === 'production';\n}\n\nexport function normalizeAmplifyUpTarget(value: AmplifyUpTargetInput): AmplifyUpTarget {\n return value === 'dev' ? 'local' : value;\n}\n\n/**\n * Resolve which target to use.\n *\n * Priority:\n * 1. explicit config.target\n * 2. config.dev === true → 'local' (local apps + AWS-dev pipeline)\n * 3. NEXT_PUBLIC_AMPLIFYUP_TARGET\n * 4. unset → 'production' (live endpoints — hosting on localhost does NOT imply local)\n *\n * Use `local` only when developing against the AmplifyUp monorepo\n * (set NEXT_PUBLIC_AMPLIFYUP_TARGET=local in .env.local).\n */\nexport function resolveAmplifyUpTarget(options?: {\n configTarget?: AmplifyUpTargetInput;\n /** @deprecated Prefer NEXT_PUBLIC_AMPLIFYUP_TARGET=local. When true, resolves to local. */\n configDev?: boolean;\n}): AmplifyUpTarget {\n if (options?.configTarget && isAmplifyUpTarget(options.configTarget)) {\n return normalizeAmplifyUpTarget(options.configTarget);\n }\n\n if (options?.configDev === true) {\n return 'local';\n }\n\n const envTarget =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_TARGET\n : undefined;\n if (isAmplifyUpTarget(envTarget)) {\n return normalizeAmplifyUpTarget(envTarget);\n }\n\n return 'production';\n}\n\n/** True when the orchestrator origin is a remote AmplifyUp deployment (not localhost). */\nexport function isRemoteOrchestratorUrl(orchestratorUrl: string): boolean {\n try {\n const host = new URL(orchestratorUrl).hostname.toLowerCase();\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '::1';\n } catch {\n return false;\n }\n}\n\nfunction localOrchestratorUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n return (fromEnv || 'http://localhost:5001').replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local→AWS-dev API base (events + personalize).\n * Defaults to https://api-dev.amplifyup.ai\n */\nfunction localAwsApiUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL\n : undefined;\n return (fromEnv || AWS_DEV_API).replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local Edge Worker URL.\n * Defaults to http://localhost:8787\n */\nfunction localEdgeUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL\n : undefined;\n return (fromEnv || 'http://localhost:8787').replace(/\\/$/, '');\n}\n\nexport function resolveAmplifyUpUrls(target: AmplifyUpTarget): AmplifyUpUrls {\n if (target === 'local') {\n const orchestratorUrl = localOrchestratorUrl();\n const apiGatewayUrl = localAwsApiUrl();\n return {\n target: 'local',\n // Layouts / site config / composer APIs → local orchestrator + Neon\n orchestratorUrl,\n // Events + personalize → AWS development stack\n apiGatewayUrl,\n decisionApiUrl: `${apiGatewayUrl}/v1/personalize`,\n edgeUrl: localEdgeUrl(),\n };\n }\n\n const resolvedApi =\n (typeof process !== 'undefined' &&\n process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL?.replace(/\\/$/, '')) ||\n AWS_PROD_API;\n\n const orchestratorFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n\n // Production: don't accidentally use a localhost orchestrator URL from a local env file\n const isLocalOrchestrator =\n !!orchestratorFromEnv &&\n (orchestratorFromEnv.includes('localhost') ||\n orchestratorFromEnv.includes('127.0.0.1'));\n\n const orchestratorUrl = isLocalOrchestrator || !orchestratorFromEnv\n ? PROD_ORCHESTRATOR\n : orchestratorFromEnv.replace(/\\/$/, '');\n\n const edgeFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL?.replace(/\\/$/, '')\n : undefined;\n const edgeUrl =\n edgeFromEnv &&\n !edgeFromEnv.includes('localhost') &&\n !edgeFromEnv.includes('127.0.0.1')\n ? edgeFromEnv\n : PROD_EDGE;\n\n return {\n target: 'production',\n apiGatewayUrl: resolvedApi,\n orchestratorUrl,\n decisionApiUrl: `${resolvedApi}/v1/personalize`,\n edgeUrl,\n };\n}\n","/**\n * Composer / visual-editor preview detection.\n * Shared by AmplifyPageContent, AmplifyUpProvider, and AmplifyRenderer.\n */\n\n/** True when `preview=true` (or legacy visualEditor) is in request search params. */\nexport function isPreviewRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n if (searchParams instanceof URLSearchParams) {\n return (\n searchParams.get('preview') === 'true' ||\n searchParams.get('visualEditor') === 'true'\n );\n }\n const preview = searchParams.preview;\n const visualEditor = searchParams.visualEditor;\n return preview === 'true' || visualEditor === 'true';\n}\n\n/**\n * Client-only: true when the page is loaded inside AmplifyUp Composer.\n * Does NOT treat every iframe as preview — only Composer referrers / query flags.\n */\nexport function isComposerPreview(): boolean {\n if (typeof window === 'undefined') return false;\n\n if ((window as any).__AMPLIFYUP_PREVIEW_MODE__ === true) return true;\n\n const params = new URLSearchParams(window.location.search);\n if (isPreviewRequest(params)) return true;\n\n if (window.self !== window.top && document.referrer) {\n try {\n const refUrl = new URL(document.referrer);\n if (\n refUrl.hostname === 'amplifyup.ai' ||\n refUrl.hostname.endsWith('.amplifyup.ai') ||\n (refUrl.hostname === 'localhost' && refUrl.port === '5001') ||\n refUrl.pathname.includes('/dashboard/composer') ||\n refUrl.pathname.includes('/dashboard/routes/')\n ) {\n return true;\n }\n } catch {\n // ignore parse error\n }\n }\n\n return false;\n}\n","/**\n * Normalize a route path for Edge resolve requests.\n * Leading slash, no trailing slash (except root), query/hash stripped.\n */\nexport function normalizeRoute(route: string): string {\n let path = String(route || '').trim();\n if (!path) return '/';\n\n try {\n if (/^https?:\\/\\//i.test(path)) {\n path = new URL(path).pathname;\n }\n } catch {\n /* keep path */\n }\n\n const q = path.indexOf('?');\n if (q >= 0) path = path.slice(0, q);\n const h = path.indexOf('#');\n if (h >= 0) path = path.slice(0, h);\n\n if (!path.startsWith('/')) path = `/${path}`;\n if (path.length > 1 && path.endsWith('/')) {\n path = path.replace(/\\/+$/, '');\n }\n return path || '/';\n}\n","import type { EventTrackingConfig } from '../types';\nimport { normalizeRoute } from './normalizeRoute';\n\n/** Mirrors Edge ResolvedComponent — SDK maps this into layoutTree nodes. */\nexport interface EdgeResolvedComponent {\n instanceId: string;\n componentId: string;\n props: Record<string, unknown>;\n children?: Record<string, EdgeResolvedComponent[]>;\n appliedRules?: string[];\n degraded?: boolean;\n}\n\nexport interface EdgeResolvedPayload {\n siteId: string;\n route: string;\n version: number;\n zones: Record<string, EdgeResolvedComponent[]>;\n tree?: EdgeResolvedComponent[];\n /** Composer event bindings baked into the published snapshot. */\n eventTracking?: EventTrackingConfig[];\n meta: {\n variantKeys: Record<string, string>;\n audienceLookup?: { status: string; durationMs: number };\n decideLookup?: { status: string; durationMs: number; checks: number };\n experiments?: Array<{ key: string; variantKey: string; bucket: number }>;\n bot?: unknown;\n resolvedAt: string;\n degraded?: boolean;\n };\n}\n\nexport class EdgeResolveError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'EdgeResolveError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function fetchEdgeResolve(options: {\n edgeUrl: string;\n trackingId: string;\n route: string;\n anonId?: string | null;\n siteId?: string | null;\n fetch?: typeof fetch;\n}): Promise<EdgeResolvedPayload> {\n const base = options.edgeUrl.replace(/\\/+$/, '');\n const route = normalizeRoute(options.route);\n const params = new URLSearchParams({\n route,\n trackingId: options.trackingId,\n });\n if (options.siteId) params.set('site', options.siteId);\n if (options.anonId) params.set('anonId', options.anonId);\n\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n const res = await fetchFn(`${base}/v1/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new EdgeResolveError(\n (body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : `Edge resolve failed (${res.status})`) ||\n `Edge resolve failed (${res.status})`,\n res.status,\n body\n );\n }\n\n return body as EdgeResolvedPayload;\n}\n","import type { PageConfig } from '../types';\nimport type { EdgeResolvedComponent, EdgeResolvedPayload } from './resolve';\n\ninterface LayoutNode {\n id: string;\n componentId: string;\n props?: Record<string, unknown>;\n slots?: Array<{\n slotId: string;\n children: LayoutNode[];\n }>;\n /** Marker so AmplifyRenderer skips client Decision API fetches. */\n _contentSource?: 'edge' | 'orchestrator';\n}\n\nfunction mapResolvedComponent(node: EdgeResolvedComponent): LayoutNode {\n const slots: LayoutNode['slots'] = [];\n if (node.children) {\n for (const [slotId, kids] of Object.entries(node.children)) {\n slots.push({\n slotId,\n children: (kids || []).map(mapResolvedComponent),\n });\n }\n }\n\n return {\n id: node.instanceId,\n componentId: node.componentId,\n props: { ...(node.props || {}) },\n ...(slots.length > 0 ? { slots } : {}),\n _contentSource: 'edge',\n };\n}\n\n/**\n * Map Edge /v1/resolve payload → PageConfig for AmplifyRenderer.\n * Prefers `tree` (full page skeleton with zones spliced in); falls back to\n * flattening zone roots when older snapshots lack structure.\n */\nexport function mapResolvedToPageConfig(\n payload: EdgeResolvedPayload\n): PageConfig {\n let layoutTree: LayoutNode[] = [];\n\n if (payload.tree && payload.tree.length > 0) {\n layoutTree = payload.tree.map(mapResolvedComponent);\n } else {\n // Legacy: zones only — render each zone's roots in stable zoneId order\n const zoneIds = Object.keys(payload.zones || {}).sort();\n for (const zoneId of zoneIds) {\n const roots = payload.zones[zoneId] || [];\n layoutTree.push(...roots.map(mapResolvedComponent));\n }\n }\n\n return {\n id: `edge:${payload.siteId}:${payload.route}:v${payload.version}`,\n route: payload.route,\n title: '',\n layoutTree,\n meta: {\n // Stash edge meta for diagnostics (not visitor-facing)\n description: payload.meta?.degraded ? 'degraded' : undefined,\n },\n ...(payload.eventTracking && payload.eventTracking.length > 0\n ? { eventTracking: payload.eventTracking }\n : {}),\n };\n}\n\nexport function collectDegraded(payload: EdgeResolvedPayload): boolean {\n if (payload.meta?.degraded) return true;\n const walk = (nodes: EdgeResolvedComponent[]): boolean =>\n nodes.some(\n (n) =>\n !!n.degraded ||\n (n.children\n ? Object.values(n.children).some((kids) => walk(kids || []))\n : false)\n );\n if (payload.tree && walk(payload.tree)) return true;\n return Object.values(payload.zones || {}).some((roots) => walk(roots || []));\n}\n","import type { AmplifyContentMeta, ContentSource, PageConfig } from '../types';\nimport { isComposerPreview } from '../preview';\nimport {\n EdgeResolveError,\n fetchEdgeResolve,\n type EdgeResolvedPayload,\n} from '../edge/resolve';\nimport {\n collectDegraded,\n mapResolvedToPageConfig,\n} from '../edge/mapResolvedToPageConfig';\n\nexport type { AmplifyContentMeta, ContentSource };\n\nexport interface FetchContentResult {\n pageConfig: PageConfig | null;\n source: ContentSource;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}\n\nexport interface FetchContentOptions {\n route: string;\n trackingId: string;\n anonId?: string | null;\n siteId?: string | null;\n /** Force preview (Composer); otherwise uses isComposerPreview() in browser. */\n preview?: boolean;\n orchestratorUrl: string;\n edgeUrl: string;\n /** Orchestrator layout fetch (SDK instance method or server helper). */\n fetchOrchestratorPage: (\n route: string,\n preview: boolean\n ) => Promise<PageConfig | null>;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Single content entry point:\n * - Composer / preview → orchestrator layout provider (drafts + live edits)\n * - Production visitors → Edge /v1/resolve (personalized + CMS-populated)\n *\n * Production never falls back to the orchestrator on Edge failure —\n * callers should render site fallback instead.\n */\nexport async function fetchContent(\n options: FetchContentOptions\n): Promise<FetchContentResult> {\n const preview =\n options.preview ??\n (typeof window !== 'undefined' ? isComposerPreview() : false);\n\n if (preview) {\n try {\n const page = await options.fetchOrchestratorPage(options.route, true);\n return {\n pageConfig: page,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: null,\n };\n } catch (err) {\n return {\n pageConfig: null,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: err instanceof Error ? err.message : 'Failed to load preview',\n };\n }\n }\n\n try {\n const payload: EdgeResolvedPayload = await fetchEdgeResolve({\n edgeUrl: options.edgeUrl,\n trackingId: options.trackingId,\n route: options.route,\n anonId: options.anonId,\n siteId: options.siteId,\n fetch: options.fetchFn,\n });\n\n const pageConfig = mapResolvedToPageConfig(payload);\n const degraded = collectDegraded(payload);\n\n return {\n pageConfig,\n source: 'edge',\n meta: {\n source: 'edge',\n version: payload.version,\n siteId: payload.siteId,\n variantKeys: payload.meta?.variantKeys,\n degraded,\n audienceLookup: payload.meta?.audienceLookup,\n decideLookup: payload.meta?.decideLookup,\n resolvedAt: payload.meta?.resolvedAt,\n },\n error: null,\n };\n } catch (err) {\n if (err instanceof EdgeResolveError && err.status === 404) {\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error: null, // unpublished → site fallback, not an error banner\n };\n }\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error:\n err instanceof Error ? err.message : \"Couldn't load page content.\",\n };\n }\n}\n","/**\n * Server-side utilities for AmplifyUp SDK\n *\n * Provides functions for fetching page config on the server\n * for SSR/SSG support (Composer preview → orchestrator; production → Edge).\n */\n\nimport type { AmplifyContentMeta, AmplifyUpTarget, PageConfig } from './types';\nimport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n} from './targets';\nimport { fetchContent } from './content/fetchContent';\nimport { isPreviewRequest } from './preview';\n\n/**\n * Fetch page configuration on the server.\n * Production visitors resolve via Edge; Composer preview uses the orchestrator.\n *\n * @param route - The route path (e.g., '/', '/about')\n * @param trackingId - The site tracking ID\n * @param preview - Whether to include draft views (default: false)\n * @param options - Optional target / anonId / siteId overrides\n */\nexport async function fetchPageConfigServer(\n route: string,\n trackingId: string,\n preview: boolean = false,\n options?: {\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n /** Raw search params — used to detect Composer preview when preview flag omitted. */\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<PageConfig | null> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n\n const previewFlag =\n preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const fetchOrchestratorPage = async (\n pageRoute: string,\n isPreview: boolean\n ): Promise<PageConfig | null> => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n };\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage,\n });\n\n return result.pageConfig;\n}\n\n/**\n * Same as fetchPageConfigServer but also returns content source meta\n * (useful for SSR that wants Edge diagnostics).\n */\nexport async function fetchContentServer(\n route: string,\n trackingId: string,\n options?: {\n preview?: boolean;\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<{\n pageConfig: PageConfig | null;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n const previewFlag =\n options?.preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage: async (pageRoute, isPreview) => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n },\n });\n\n return {\n pageConfig: result.pageConfig,\n meta: result.meta,\n error: result.error,\n };\n}\n\nexport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/targets.ts","../src/preview.ts","../src/edge/normalizeRoute.ts","../src/edge/resolve.ts","../src/edge/mapResolvedToPageConfig.ts","../src/content/fetchContent.ts","../src/server.tsx"],"names":["orchestratorUrl"],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * AmplifyUp environment targets\n *\n * Two environments only:\n * - local: apps/config from localhost + Neon; events & personalize from AWS development\n * - production: all production AmplifyUp / AWS endpoints\n *\n * Controlled via `config.target` or `NEXT_PUBLIC_AMPLIFYUP_TARGET`.\n * Legacy value `dev` is treated as `local`.\n */\n\nexport type AmplifyUpTarget = 'local' | 'production';\n\n/** Accepted env/config strings (includes legacy `dev` → local). */\nexport type AmplifyUpTargetInput = AmplifyUpTarget | 'dev';\n\nexport interface AmplifyUpUrls {\n target: AmplifyUpTarget;\n apiGatewayUrl: string;\n orchestratorUrl: string;\n decisionApiUrl: string;\n edgeUrl: string;\n}\n\nconst AWS_DEV_API = 'https://api-dev.amplifyup.ai';\nconst AWS_PROD_API = 'https://api.amplifyup.ai';\nconst PROD_ORCHESTRATOR = 'https://amplifyup.ai';\nconst PROD_EDGE = 'https://edge.amplifyup.ai';\n\nexport function isAmplifyUpTarget(value: unknown): value is AmplifyUpTargetInput {\n return value === 'local' || value === 'dev' || value === 'production';\n}\n\nexport function normalizeAmplifyUpTarget(value: AmplifyUpTargetInput): AmplifyUpTarget {\n return value === 'dev' ? 'local' : value;\n}\n\n/**\n * Resolve which target to use.\n *\n * Priority:\n * 1. explicit config.target\n * 2. config.dev === true → 'local' (local apps + AWS-dev pipeline)\n * 3. NEXT_PUBLIC_AMPLIFYUP_TARGET\n * 4. unset → 'production' (live endpoints — hosting on localhost does NOT imply local)\n *\n * Use `local` only when developing against the AmplifyUp monorepo\n * (set NEXT_PUBLIC_AMPLIFYUP_TARGET=local in .env.local).\n */\nexport function resolveAmplifyUpTarget(options?: {\n configTarget?: AmplifyUpTargetInput;\n /** @deprecated Prefer NEXT_PUBLIC_AMPLIFYUP_TARGET=local. When true, resolves to local. */\n configDev?: boolean;\n}): AmplifyUpTarget {\n if (options?.configTarget && isAmplifyUpTarget(options.configTarget)) {\n return normalizeAmplifyUpTarget(options.configTarget);\n }\n\n if (options?.configDev === true) {\n return 'local';\n }\n\n const envTarget =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_TARGET\n : undefined;\n if (isAmplifyUpTarget(envTarget)) {\n return normalizeAmplifyUpTarget(envTarget);\n }\n\n return 'production';\n}\n\n/** True when the orchestrator origin is a remote AmplifyUp deployment (not localhost). */\nexport function isRemoteOrchestratorUrl(orchestratorUrl: string): boolean {\n try {\n const host = new URL(orchestratorUrl).hostname.toLowerCase();\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '::1';\n } catch {\n return false;\n }\n}\n\nfunction localOrchestratorUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n return (fromEnv || 'http://localhost:5001').replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local→AWS-dev API base (events + personalize).\n * Defaults to https://api-dev.amplifyup.ai\n */\nfunction localAwsApiUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL\n : undefined;\n return (fromEnv || AWS_DEV_API).replace(/\\/$/, '');\n}\n\n/**\n * Optional override for the local Edge Worker URL.\n * Defaults to http://localhost:8787\n */\nfunction localEdgeUrl(): string {\n const fromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL\n : undefined;\n return (fromEnv || 'http://localhost:8787').replace(/\\/$/, '');\n}\n\nexport function resolveAmplifyUpUrls(target: AmplifyUpTarget): AmplifyUpUrls {\n if (target === 'local') {\n const orchestratorUrl = localOrchestratorUrl();\n const apiGatewayUrl = localAwsApiUrl();\n return {\n target: 'local',\n // Layouts / site config / composer APIs → local orchestrator + Neon\n orchestratorUrl,\n // Events + personalize → AWS development stack\n apiGatewayUrl,\n decisionApiUrl: `${apiGatewayUrl}/v1/personalize`,\n edgeUrl: localEdgeUrl(),\n };\n }\n\n const resolvedApi =\n (typeof process !== 'undefined' &&\n process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL?.replace(/\\/$/, '')) ||\n AWS_PROD_API;\n\n const orchestratorFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL\n : undefined;\n\n // Production: don't accidentally use a localhost orchestrator URL from a local env file\n const isLocalOrchestrator =\n !!orchestratorFromEnv &&\n (orchestratorFromEnv.includes('localhost') ||\n orchestratorFromEnv.includes('127.0.0.1'));\n\n const orchestratorUrl = isLocalOrchestrator || !orchestratorFromEnv\n ? PROD_ORCHESTRATOR\n : orchestratorFromEnv.replace(/\\/$/, '');\n\n const edgeFromEnv =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_EDGE_URL?.replace(/\\/$/, '')\n : undefined;\n const edgeUrl =\n edgeFromEnv &&\n !edgeFromEnv.includes('localhost') &&\n !edgeFromEnv.includes('127.0.0.1')\n ? edgeFromEnv\n : PROD_EDGE;\n\n return {\n target: 'production',\n apiGatewayUrl: resolvedApi,\n orchestratorUrl,\n decisionApiUrl: `${resolvedApi}/v1/personalize`,\n edgeUrl,\n };\n}\n","/**\n * Composer / visual-editor preview detection.\n * Shared by AmplifyPageContent, AmplifyUpProvider, and AmplifyRenderer.\n */\n\n/** True when `preview=true` (or legacy visualEditor) is in request search params. */\nexport function isPreviewRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n return paramIsTrue(searchParams, 'preview') || paramIsTrue(searchParams, 'visualEditor');\n}\n\n/**\n * Composer Edit (not Preview toggle): overlay unpublished CMS docs.\n * Live visitors and Composer Preview omit this.\n */\nexport function isWorkingContentRequest(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams\n): boolean {\n return paramIsTrue(searchParams, 'working');\n}\n\nfunction paramIsTrue(\n searchParams: Record<string, string | string[] | undefined> | URLSearchParams,\n key: string\n): boolean {\n if (searchParams instanceof URLSearchParams) {\n return searchParams.get(key) === 'true';\n }\n const value = searchParams[key];\n return value === 'true' || (Array.isArray(value) && value[0] === 'true');\n}\n\n/**\n * Client-only: true when the page is loaded inside AmplifyUp Composer.\n * Does NOT treat every iframe as preview — only Composer referrers / query flags.\n */\nexport function isComposerPreview(): boolean {\n if (typeof window === 'undefined') return false;\n\n if ((window as any).__AMPLIFYUP_PREVIEW_MODE__ === true) return true;\n\n const params = new URLSearchParams(window.location.search);\n if (isPreviewRequest(params)) return true;\n\n if (window.self !== window.top && document.referrer) {\n try {\n const refUrl = new URL(document.referrer);\n if (\n refUrl.hostname === 'amplifyup.ai' ||\n refUrl.hostname.endsWith('.amplifyup.ai') ||\n (refUrl.hostname === 'localhost' && refUrl.port === '5001') ||\n refUrl.pathname.includes('/dashboard/composer') ||\n refUrl.pathname.includes('/dashboard/routes/')\n ) {\n return true;\n }\n } catch {\n // ignore parse error\n }\n }\n\n return false;\n}\n","/**\n * Normalize a route path for Edge resolve requests.\n * Leading slash, no trailing slash (except root), query/hash stripped.\n */\nexport function normalizeRoute(route: string): string {\n let path = String(route || '').trim();\n if (!path) return '/';\n\n try {\n if (/^https?:\\/\\//i.test(path)) {\n path = new URL(path).pathname;\n }\n } catch {\n /* keep path */\n }\n\n const q = path.indexOf('?');\n if (q >= 0) path = path.slice(0, q);\n const h = path.indexOf('#');\n if (h >= 0) path = path.slice(0, h);\n\n if (!path.startsWith('/')) path = `/${path}`;\n if (path.length > 1 && path.endsWith('/')) {\n path = path.replace(/\\/+$/, '');\n }\n return path || '/';\n}\n","import type { EventTrackingConfig } from '../types';\nimport { normalizeRoute } from './normalizeRoute';\n\n/** Mirrors Edge ResolvedComponent — SDK maps this into layoutTree nodes. */\nexport interface EdgeResolvedComponent {\n instanceId: string;\n componentId: string;\n props: Record<string, unknown>;\n children?: Record<string, EdgeResolvedComponent[]>;\n appliedRules?: string[];\n degraded?: boolean;\n}\n\nexport interface EdgeResolvedPayload {\n siteId: string;\n route: string;\n version: number;\n zones: Record<string, EdgeResolvedComponent[]>;\n tree?: EdgeResolvedComponent[];\n /** Composer event bindings baked into the published snapshot. */\n eventTracking?: EventTrackingConfig[];\n meta: {\n variantKeys: Record<string, string>;\n audienceLookup?: { status: string; durationMs: number };\n decideLookup?: { status: string; durationMs: number; checks: number };\n experiments?: Array<{ key: string; variantKey: string; bucket: number }>;\n bot?: unknown;\n resolvedAt: string;\n degraded?: boolean;\n };\n}\n\nexport class EdgeResolveError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'EdgeResolveError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function fetchEdgeResolve(options: {\n edgeUrl: string;\n trackingId: string;\n route: string;\n anonId?: string | null;\n siteId?: string | null;\n fetch?: typeof fetch;\n}): Promise<EdgeResolvedPayload> {\n const base = options.edgeUrl.replace(/\\/+$/, '');\n const route = normalizeRoute(options.route);\n const params = new URLSearchParams({\n route,\n trackingId: options.trackingId,\n });\n if (options.siteId) params.set('site', options.siteId);\n if (options.anonId) params.set('anonId', options.anonId);\n\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n const res = await fetchFn(`${base}/v1/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new EdgeResolveError(\n (body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : `Edge resolve failed (${res.status})`) ||\n `Edge resolve failed (${res.status})`,\n res.status,\n body\n );\n }\n\n return body as EdgeResolvedPayload;\n}\n","import type { PageConfig } from '../types';\nimport type { EdgeResolvedComponent, EdgeResolvedPayload } from './resolve';\n\ninterface LayoutNode {\n id: string;\n componentId: string;\n props?: Record<string, unknown>;\n slots?: Array<{\n slotId: string;\n children: LayoutNode[];\n }>;\n /** Marker so AmplifyRenderer skips client Decision API fetches. */\n _contentSource?: 'edge' | 'orchestrator';\n}\n\nfunction mapResolvedComponent(node: EdgeResolvedComponent): LayoutNode {\n const slots: LayoutNode['slots'] = [];\n if (node.children) {\n for (const [slotId, kids] of Object.entries(node.children)) {\n slots.push({\n slotId,\n children: (kids || []).map(mapResolvedComponent),\n });\n }\n }\n\n return {\n id: node.instanceId,\n componentId: node.componentId,\n props: { ...(node.props || {}) },\n ...(slots.length > 0 ? { slots } : {}),\n _contentSource: 'edge',\n };\n}\n\n/**\n * Map Edge /v1/resolve payload → PageConfig for AmplifyRenderer.\n * Prefers `tree` (full page skeleton with zones spliced in); falls back to\n * flattening zone roots when older snapshots lack structure.\n */\nexport function mapResolvedToPageConfig(\n payload: EdgeResolvedPayload\n): PageConfig {\n let layoutTree: LayoutNode[] = [];\n\n if (payload.tree && payload.tree.length > 0) {\n layoutTree = payload.tree.map(mapResolvedComponent);\n } else {\n // Legacy: zones only — render each zone's roots in stable zoneId order\n const zoneIds = Object.keys(payload.zones || {}).sort();\n for (const zoneId of zoneIds) {\n const roots = payload.zones[zoneId] || [];\n layoutTree.push(...roots.map(mapResolvedComponent));\n }\n }\n\n return {\n id: `edge:${payload.siteId}:${payload.route}:v${payload.version}`,\n route: payload.route,\n title: '',\n layoutTree,\n meta: {\n // Stash edge meta for diagnostics (not visitor-facing)\n description: payload.meta?.degraded ? 'degraded' : undefined,\n },\n ...(payload.eventTracking && payload.eventTracking.length > 0\n ? { eventTracking: payload.eventTracking }\n : {}),\n };\n}\n\nexport function collectDegraded(payload: EdgeResolvedPayload): boolean {\n if (payload.meta?.degraded) return true;\n const walk = (nodes: EdgeResolvedComponent[]): boolean =>\n nodes.some(\n (n) =>\n !!n.degraded ||\n (n.children\n ? Object.values(n.children).some((kids) => walk(kids || []))\n : false)\n );\n if (payload.tree && walk(payload.tree)) return true;\n return Object.values(payload.zones || {}).some((roots) => walk(roots || []));\n}\n","import type { AmplifyContentMeta, ContentSource, PageConfig } from '../types';\nimport { isComposerPreview } from '../preview';\nimport {\n EdgeResolveError,\n fetchEdgeResolve,\n type EdgeResolvedPayload,\n} from '../edge/resolve';\nimport {\n collectDegraded,\n mapResolvedToPageConfig,\n} from '../edge/mapResolvedToPageConfig';\n\nexport type { AmplifyContentMeta, ContentSource };\n\nexport interface FetchContentResult {\n pageConfig: PageConfig | null;\n source: ContentSource;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}\n\nexport interface FetchContentOptions {\n route: string;\n trackingId: string;\n anonId?: string | null;\n siteId?: string | null;\n /** Force preview (Composer); otherwise uses isComposerPreview() in browser. */\n preview?: boolean;\n orchestratorUrl: string;\n edgeUrl: string;\n /** Orchestrator layout fetch (SDK instance method or server helper). */\n fetchOrchestratorPage: (\n route: string,\n preview: boolean\n ) => Promise<PageConfig | null>;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Single content entry point:\n * - Composer / preview → orchestrator layout provider (drafts + live edits)\n * - Production visitors → Edge /v1/resolve (personalized + CMS-populated)\n *\n * Production never falls back to the orchestrator on Edge failure —\n * callers should render site fallback instead.\n */\nexport async function fetchContent(\n options: FetchContentOptions\n): Promise<FetchContentResult> {\n const preview =\n options.preview ??\n (typeof window !== 'undefined' ? isComposerPreview() : false);\n\n if (preview) {\n try {\n const page = await options.fetchOrchestratorPage(options.route, true);\n return {\n pageConfig: page,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: null,\n };\n } catch (err) {\n return {\n pageConfig: null,\n source: 'orchestrator',\n meta: { source: 'orchestrator' },\n error: err instanceof Error ? err.message : 'Failed to load preview',\n };\n }\n }\n\n try {\n const payload: EdgeResolvedPayload = await fetchEdgeResolve({\n edgeUrl: options.edgeUrl,\n trackingId: options.trackingId,\n route: options.route,\n anonId: options.anonId,\n siteId: options.siteId,\n fetch: options.fetchFn,\n });\n\n const pageConfig = mapResolvedToPageConfig(payload);\n const degraded = collectDegraded(payload);\n\n return {\n pageConfig,\n source: 'edge',\n meta: {\n source: 'edge',\n version: payload.version,\n siteId: payload.siteId,\n variantKeys: payload.meta?.variantKeys,\n degraded,\n audienceLookup: payload.meta?.audienceLookup,\n decideLookup: payload.meta?.decideLookup,\n resolvedAt: payload.meta?.resolvedAt,\n },\n error: null,\n };\n } catch (err) {\n if (err instanceof EdgeResolveError && err.status === 404) {\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error: null, // unpublished → site fallback, not an error banner\n };\n }\n return {\n pageConfig: null,\n source: 'edge',\n meta: { source: 'edge' },\n error:\n err instanceof Error ? err.message : \"Couldn't load page content.\",\n };\n }\n}\n","/**\n * Server-side utilities for AmplifyUp SDK\n *\n * Provides functions for fetching page config on the server\n * for SSR/SSG support (Composer preview → orchestrator; production → Edge).\n */\n\nimport type { AmplifyContentMeta, AmplifyUpTarget, PageConfig } from './types';\nimport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n} from './targets';\nimport { fetchContent } from './content/fetchContent';\nimport { isPreviewRequest, isWorkingContentRequest } from './preview';\n\n/**\n * Fetch page configuration on the server.\n * Production visitors resolve via Edge; Composer preview uses the orchestrator.\n *\n * @param route - The route path (e.g., '/', '/about')\n * @param trackingId - The site tracking ID\n * @param preview - Whether to include draft views (default: false)\n * @param options - Optional target / anonId / siteId overrides\n */\nexport async function fetchPageConfigServer(\n route: string,\n trackingId: string,\n preview: boolean = false,\n options?: {\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n /** Raw search params — used to detect Composer preview when preview flag omitted. */\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<PageConfig | null> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n\n const previewFlag =\n preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n\n const workingFlag =\n options?.searchParams\n ? isWorkingContentRequest(options.searchParams as any)\n : false;\n\n const fetchOrchestratorPage = async (\n pageRoute: string,\n isPreview: boolean\n ): Promise<PageConfig | null> => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n if (workingFlag) params.set('working', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n };\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage,\n });\n\n return result.pageConfig;\n}\n\n/**\n * Same as fetchPageConfigServer but also returns content source meta\n * (useful for SSR that wants Edge diagnostics).\n */\nexport async function fetchContentServer(\n route: string,\n trackingId: string,\n options?: {\n preview?: boolean;\n target?: AmplifyUpTarget;\n anonId?: string | null;\n siteId?: string | null;\n searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;\n }\n): Promise<{\n pageConfig: PageConfig | null;\n meta: AmplifyContentMeta | null;\n error: string | null;\n}> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);\n const previewFlag =\n options?.preview ||\n (options?.searchParams\n ? isPreviewRequest(options.searchParams as any)\n : false);\n const workingFlag =\n options?.searchParams\n ? isWorkingContentRequest(options.searchParams as any)\n : false;\n\n const result = await fetchContent({\n route,\n trackingId,\n anonId: options?.anonId,\n siteId: options?.siteId,\n preview: previewFlag,\n orchestratorUrl,\n edgeUrl,\n fetchOrchestratorPage: async (pageRoute, isPreview) => {\n const params = new URLSearchParams({\n route: pageRoute,\n trackingId,\n });\n if (isPreview) params.set('preview', 'true');\n if (workingFlag) params.set('working', 'true');\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\n }\n },\n });\n\n return {\n pageConfig: result.pageConfig,\n meta: result.meta,\n error: result.error,\n };\n}\n\nexport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n};\n"]}
|