@amplifyup/sdk 0.1.22 → 0.1.24
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/README.md +65 -38
- package/dist/AmplifyRenderer.d.mts +1 -1
- package/dist/AmplifyRenderer.d.ts +1 -1
- package/dist/AmplifyRenderer.js +172 -18
- package/dist/AmplifyRenderer.js.map +1 -1
- package/dist/AmplifyRenderer.mjs +173 -19
- package/dist/AmplifyRenderer.mjs.map +1 -1
- package/dist/index.d.mts +117 -6
- package/dist/index.d.ts +117 -6
- package/dist/index.js +285 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +280 -15
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +24 -3
- package/dist/react.d.ts +24 -3
- package/dist/react.js +476 -47
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +477 -49
- package/dist/react.mjs.map +1 -1
- package/dist/server.d.mts +26 -8
- package/dist/server.d.ts +26 -8
- package/dist/server.js +277 -20
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +277 -21
- package/dist/server.mjs.map +1 -1
- package/dist/{types-Cy5aWQ5c.d.mts → types-BxpG9Gsy.d.mts} +37 -2
- package/dist/{types-Cy5aWQ5c.d.ts → types-BxpG9Gsy.d.ts} +37 -2
- package/package.json +6 -3
package/dist/server.d.mts
CHANGED
|
@@ -1,25 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { r as resolveAmplifyUpTarget,
|
|
1
|
+
import { e as AmplifyUpTarget, P as PageConfig, A as AmplifyContentMeta } from './types-BxpG9Gsy.mjs';
|
|
2
|
+
export { r as resolveAmplifyUpTarget, g as resolveAmplifyUpUrls } from './types-BxpG9Gsy.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Server-side utilities for AmplifyUp SDK
|
|
6
6
|
*
|
|
7
7
|
* Provides functions for fetching page config on the server
|
|
8
|
-
* for SSR/SSG support
|
|
8
|
+
* for SSR/SSG support (Composer preview → orchestrator; production → Edge).
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Fetch page configuration on the server
|
|
13
|
-
*
|
|
12
|
+
* Fetch page configuration on the server.
|
|
13
|
+
* Production visitors resolve via Edge; Composer preview uses the orchestrator.
|
|
14
14
|
*
|
|
15
15
|
* @param route - The route path (e.g., '/', '/about')
|
|
16
16
|
* @param trackingId - The site tracking ID
|
|
17
17
|
* @param preview - Whether to include draft views (default: false)
|
|
18
|
-
* @param options - Optional target
|
|
19
|
-
* @returns Page configuration or null if not found
|
|
18
|
+
* @param options - Optional target / anonId / siteId overrides
|
|
20
19
|
*/
|
|
21
20
|
declare function fetchPageConfigServer(route: string, trackingId: string, preview?: boolean, options?: {
|
|
22
21
|
target?: AmplifyUpTarget;
|
|
22
|
+
anonId?: string | null;
|
|
23
|
+
siteId?: string | null;
|
|
24
|
+
/** Raw search params — used to detect Composer preview when preview flag omitted. */
|
|
25
|
+
searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;
|
|
23
26
|
}): Promise<PageConfig | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Same as fetchPageConfigServer but also returns content source meta
|
|
29
|
+
* (useful for SSR that wants Edge diagnostics).
|
|
30
|
+
*/
|
|
31
|
+
declare function fetchContentServer(route: string, trackingId: string, options?: {
|
|
32
|
+
preview?: boolean;
|
|
33
|
+
target?: AmplifyUpTarget;
|
|
34
|
+
anonId?: string | null;
|
|
35
|
+
siteId?: string | null;
|
|
36
|
+
searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
pageConfig: PageConfig | null;
|
|
39
|
+
meta: AmplifyContentMeta | null;
|
|
40
|
+
error: string | null;
|
|
41
|
+
}>;
|
|
24
42
|
|
|
25
|
-
export { fetchPageConfigServer };
|
|
43
|
+
export { fetchContentServer, fetchPageConfigServer };
|
package/dist/server.d.ts
CHANGED
|
@@ -1,25 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { r as resolveAmplifyUpTarget,
|
|
1
|
+
import { e as AmplifyUpTarget, P as PageConfig, A as AmplifyContentMeta } from './types-BxpG9Gsy.js';
|
|
2
|
+
export { r as resolveAmplifyUpTarget, g as resolveAmplifyUpUrls } from './types-BxpG9Gsy.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Server-side utilities for AmplifyUp SDK
|
|
6
6
|
*
|
|
7
7
|
* Provides functions for fetching page config on the server
|
|
8
|
-
* for SSR/SSG support
|
|
8
|
+
* for SSR/SSG support (Composer preview → orchestrator; production → Edge).
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Fetch page configuration on the server
|
|
13
|
-
*
|
|
12
|
+
* Fetch page configuration on the server.
|
|
13
|
+
* Production visitors resolve via Edge; Composer preview uses the orchestrator.
|
|
14
14
|
*
|
|
15
15
|
* @param route - The route path (e.g., '/', '/about')
|
|
16
16
|
* @param trackingId - The site tracking ID
|
|
17
17
|
* @param preview - Whether to include draft views (default: false)
|
|
18
|
-
* @param options - Optional target
|
|
19
|
-
* @returns Page configuration or null if not found
|
|
18
|
+
* @param options - Optional target / anonId / siteId overrides
|
|
20
19
|
*/
|
|
21
20
|
declare function fetchPageConfigServer(route: string, trackingId: string, preview?: boolean, options?: {
|
|
22
21
|
target?: AmplifyUpTarget;
|
|
22
|
+
anonId?: string | null;
|
|
23
|
+
siteId?: string | null;
|
|
24
|
+
/** Raw search params — used to detect Composer preview when preview flag omitted. */
|
|
25
|
+
searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;
|
|
23
26
|
}): Promise<PageConfig | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Same as fetchPageConfigServer but also returns content source meta
|
|
29
|
+
* (useful for SSR that wants Edge diagnostics).
|
|
30
|
+
*/
|
|
31
|
+
declare function fetchContentServer(route: string, trackingId: string, options?: {
|
|
32
|
+
preview?: boolean;
|
|
33
|
+
target?: AmplifyUpTarget;
|
|
34
|
+
anonId?: string | null;
|
|
35
|
+
siteId?: string | null;
|
|
36
|
+
searchParams?: URLSearchParams | Record<string, string | string[] | undefined>;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
pageConfig: PageConfig | null;
|
|
39
|
+
meta: AmplifyContentMeta | null;
|
|
40
|
+
error: string | null;
|
|
41
|
+
}>;
|
|
24
42
|
|
|
25
|
-
export { fetchPageConfigServer };
|
|
43
|
+
export { fetchContentServer, fetchPageConfigServer };
|
package/dist/server.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
var AWS_DEV_API = "https://api-dev.amplifyup.ai";
|
|
7
7
|
var AWS_PROD_API = "https://api.amplifyup.ai";
|
|
8
8
|
var PROD_ORCHESTRATOR = "https://amplifyup.ai";
|
|
9
|
+
var PROD_EDGE = "https://edge.amplifyup.ai";
|
|
9
10
|
function isAmplifyUpTarget(value) {
|
|
10
11
|
return value === "local" || value === "dev" || value === "production";
|
|
11
12
|
}
|
|
@@ -33,6 +34,10 @@ function localAwsApiUrl() {
|
|
|
33
34
|
const fromEnv = typeof process !== "undefined" ? process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL : void 0;
|
|
34
35
|
return (fromEnv || AWS_DEV_API).replace(/\/$/, "");
|
|
35
36
|
}
|
|
37
|
+
function localEdgeUrl() {
|
|
38
|
+
const fromEnv = typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EDGE_URL : void 0;
|
|
39
|
+
return (fromEnv || "http://localhost:8787").replace(/\/$/, "");
|
|
40
|
+
}
|
|
36
41
|
function resolveAmplifyUpUrls(target) {
|
|
37
42
|
if (target === "local") {
|
|
38
43
|
const orchestratorUrl2 = localOrchestratorUrl();
|
|
@@ -43,50 +48,302 @@ function resolveAmplifyUpUrls(target) {
|
|
|
43
48
|
orchestratorUrl: orchestratorUrl2,
|
|
44
49
|
// Events + personalize → AWS development stack
|
|
45
50
|
apiGatewayUrl,
|
|
46
|
-
decisionApiUrl: `${apiGatewayUrl}/v1/personalize
|
|
51
|
+
decisionApiUrl: `${apiGatewayUrl}/v1/personalize`,
|
|
52
|
+
edgeUrl: localEdgeUrl()
|
|
47
53
|
};
|
|
48
54
|
}
|
|
49
55
|
const resolvedApi = typeof process !== "undefined" && process.env.NEXT_PUBLIC_AMPLIFYUP_API_URL?.replace(/\/$/, "") || AWS_PROD_API;
|
|
50
56
|
const orchestratorFromEnv = typeof process !== "undefined" ? process.env.NEXT_PUBLIC_ORCHESTRATOR_URL : void 0;
|
|
51
57
|
const isLocalOrchestrator = !!orchestratorFromEnv && (orchestratorFromEnv.includes("localhost") || orchestratorFromEnv.includes("127.0.0.1"));
|
|
52
58
|
const orchestratorUrl = isLocalOrchestrator || !orchestratorFromEnv ? PROD_ORCHESTRATOR : orchestratorFromEnv.replace(/\/$/, "");
|
|
59
|
+
const edgeFromEnv = typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EDGE_URL?.replace(/\/$/, "") : void 0;
|
|
60
|
+
const edgeUrl = edgeFromEnv && !edgeFromEnv.includes("localhost") && !edgeFromEnv.includes("127.0.0.1") ? edgeFromEnv : PROD_EDGE;
|
|
53
61
|
return {
|
|
54
62
|
target: "production",
|
|
55
63
|
apiGatewayUrl: resolvedApi,
|
|
56
64
|
orchestratorUrl,
|
|
57
|
-
decisionApiUrl: `${resolvedApi}/v1/personalize
|
|
65
|
+
decisionApiUrl: `${resolvedApi}/v1/personalize`,
|
|
66
|
+
edgeUrl
|
|
58
67
|
};
|
|
59
68
|
}
|
|
60
69
|
|
|
61
|
-
// src/
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
const
|
|
70
|
+
// src/preview.ts
|
|
71
|
+
function isPreviewRequest(searchParams) {
|
|
72
|
+
if (searchParams instanceof URLSearchParams) {
|
|
73
|
+
return searchParams.get("preview") === "true" || searchParams.get("visualEditor") === "true";
|
|
74
|
+
}
|
|
75
|
+
const preview = searchParams.preview;
|
|
76
|
+
const visualEditor = searchParams.visualEditor;
|
|
77
|
+
return preview === "true" || visualEditor === "true";
|
|
78
|
+
}
|
|
79
|
+
function isComposerPreview() {
|
|
80
|
+
if (typeof window === "undefined") return false;
|
|
81
|
+
if (window.__AMPLIFYUP_PREVIEW_MODE__ === true) return true;
|
|
82
|
+
const params = new URLSearchParams(window.location.search);
|
|
83
|
+
if (isPreviewRequest(params)) return true;
|
|
84
|
+
if (window.self !== window.top && document.referrer) {
|
|
85
|
+
try {
|
|
86
|
+
const refUrl = new URL(document.referrer);
|
|
87
|
+
if (refUrl.hostname === "amplifyup.ai" || refUrl.hostname.endsWith(".amplifyup.ai") || refUrl.hostname === "localhost" && refUrl.port === "5001" || refUrl.pathname.includes("/dashboard/composer") || refUrl.pathname.includes("/dashboard/routes/")) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/edge/normalizeRoute.ts
|
|
97
|
+
function normalizeRoute(route) {
|
|
98
|
+
let path = String(route || "").trim();
|
|
99
|
+
if (!path) return "/";
|
|
100
|
+
try {
|
|
101
|
+
if (/^https?:\/\//i.test(path)) {
|
|
102
|
+
path = new URL(path).pathname;
|
|
103
|
+
}
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
106
|
+
const q = path.indexOf("?");
|
|
107
|
+
if (q >= 0) path = path.slice(0, q);
|
|
108
|
+
const h = path.indexOf("#");
|
|
109
|
+
if (h >= 0) path = path.slice(0, h);
|
|
110
|
+
if (!path.startsWith("/")) path = `/${path}`;
|
|
111
|
+
if (path.length > 1 && path.endsWith("/")) {
|
|
112
|
+
path = path.replace(/\/+$/, "");
|
|
113
|
+
}
|
|
114
|
+
return path || "/";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/edge/resolve.ts
|
|
118
|
+
var EdgeResolveError = class extends Error {
|
|
119
|
+
constructor(message, status, body) {
|
|
120
|
+
super(message);
|
|
121
|
+
this.name = "EdgeResolveError";
|
|
122
|
+
this.status = status;
|
|
123
|
+
this.body = body;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
async function fetchEdgeResolve(options) {
|
|
127
|
+
const base = options.edgeUrl.replace(/\/+$/, "");
|
|
128
|
+
const route = normalizeRoute(options.route);
|
|
67
129
|
const params = new URLSearchParams({
|
|
68
130
|
route,
|
|
69
|
-
trackingId
|
|
131
|
+
trackingId: options.trackingId
|
|
70
132
|
});
|
|
133
|
+
if (options.siteId) params.set("site", options.siteId);
|
|
134
|
+
if (options.anonId) params.set("anonId", options.anonId);
|
|
135
|
+
const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
136
|
+
const res = await fetchFn(`${base}/v1/resolve?${params.toString()}`, {
|
|
137
|
+
method: "GET",
|
|
138
|
+
headers: { Accept: "application/json" }
|
|
139
|
+
});
|
|
140
|
+
const body = await res.json().catch(() => ({}));
|
|
141
|
+
if (!res.ok) {
|
|
142
|
+
throw new EdgeResolveError(
|
|
143
|
+
(body && typeof body === "object" && "error" in body ? String(body.error) : `Edge resolve failed (${res.status})`) || `Edge resolve failed (${res.status})`,
|
|
144
|
+
res.status,
|
|
145
|
+
body
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return body;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/edge/mapResolvedToPageConfig.ts
|
|
152
|
+
function mapResolvedComponent(node) {
|
|
153
|
+
const slots = [];
|
|
154
|
+
if (node.children) {
|
|
155
|
+
for (const [slotId, kids] of Object.entries(node.children)) {
|
|
156
|
+
slots.push({
|
|
157
|
+
slotId,
|
|
158
|
+
children: (kids || []).map(mapResolvedComponent)
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
id: node.instanceId,
|
|
164
|
+
componentId: node.componentId,
|
|
165
|
+
props: { ...node.props || {} },
|
|
166
|
+
...slots.length > 0 ? { slots } : {},
|
|
167
|
+
_contentSource: "edge"
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function mapResolvedToPageConfig(payload) {
|
|
171
|
+
let layoutTree = [];
|
|
172
|
+
if (payload.tree && payload.tree.length > 0) {
|
|
173
|
+
layoutTree = payload.tree.map(mapResolvedComponent);
|
|
174
|
+
} else {
|
|
175
|
+
const zoneIds = Object.keys(payload.zones || {}).sort();
|
|
176
|
+
for (const zoneId of zoneIds) {
|
|
177
|
+
const roots = payload.zones[zoneId] || [];
|
|
178
|
+
layoutTree.push(...roots.map(mapResolvedComponent));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
id: `edge:${payload.siteId}:${payload.route}:v${payload.version}`,
|
|
183
|
+
route: payload.route,
|
|
184
|
+
title: "",
|
|
185
|
+
layoutTree,
|
|
186
|
+
meta: {
|
|
187
|
+
// Stash edge meta for diagnostics (not visitor-facing)
|
|
188
|
+
description: payload.meta?.degraded ? "degraded" : void 0
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function collectDegraded(payload) {
|
|
193
|
+
if (payload.meta?.degraded) return true;
|
|
194
|
+
const walk = (nodes) => nodes.some(
|
|
195
|
+
(n) => !!n.degraded || (n.children ? Object.values(n.children).some((kids) => walk(kids || [])) : false)
|
|
196
|
+
);
|
|
197
|
+
if (payload.tree && walk(payload.tree)) return true;
|
|
198
|
+
return Object.values(payload.zones || {}).some((roots) => walk(roots || []));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// src/content/fetchContent.ts
|
|
202
|
+
async function fetchContent(options) {
|
|
203
|
+
const preview = options.preview ?? (typeof window !== "undefined" ? isComposerPreview() : false);
|
|
71
204
|
if (preview) {
|
|
72
|
-
|
|
205
|
+
try {
|
|
206
|
+
const page = await options.fetchOrchestratorPage(options.route, true);
|
|
207
|
+
return {
|
|
208
|
+
pageConfig: page,
|
|
209
|
+
source: "orchestrator",
|
|
210
|
+
meta: { source: "orchestrator" },
|
|
211
|
+
error: null
|
|
212
|
+
};
|
|
213
|
+
} catch (err) {
|
|
214
|
+
return {
|
|
215
|
+
pageConfig: null,
|
|
216
|
+
source: "orchestrator",
|
|
217
|
+
meta: { source: "orchestrator" },
|
|
218
|
+
error: err instanceof Error ? err.message : "Failed to load preview"
|
|
219
|
+
};
|
|
220
|
+
}
|
|
73
221
|
}
|
|
74
|
-
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
75
222
|
try {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
223
|
+
const payload = await fetchEdgeResolve({
|
|
224
|
+
edgeUrl: options.edgeUrl,
|
|
225
|
+
trackingId: options.trackingId,
|
|
226
|
+
route: options.route,
|
|
227
|
+
anonId: options.anonId,
|
|
228
|
+
siteId: options.siteId,
|
|
229
|
+
fetch: options.fetchFn
|
|
79
230
|
});
|
|
80
|
-
|
|
81
|
-
|
|
231
|
+
const pageConfig = mapResolvedToPageConfig(payload);
|
|
232
|
+
const degraded = collectDegraded(payload);
|
|
233
|
+
return {
|
|
234
|
+
pageConfig,
|
|
235
|
+
source: "edge",
|
|
236
|
+
meta: {
|
|
237
|
+
source: "edge",
|
|
238
|
+
version: payload.version,
|
|
239
|
+
siteId: payload.siteId,
|
|
240
|
+
variantKeys: payload.meta?.variantKeys,
|
|
241
|
+
degraded,
|
|
242
|
+
audienceLookup: payload.meta?.audienceLookup,
|
|
243
|
+
decideLookup: payload.meta?.decideLookup,
|
|
244
|
+
resolvedAt: payload.meta?.resolvedAt
|
|
245
|
+
},
|
|
246
|
+
error: null
|
|
247
|
+
};
|
|
248
|
+
} catch (err) {
|
|
249
|
+
if (err instanceof EdgeResolveError && err.status === 404) {
|
|
250
|
+
return {
|
|
251
|
+
pageConfig: null,
|
|
252
|
+
source: "edge",
|
|
253
|
+
meta: { source: "edge" },
|
|
254
|
+
error: null
|
|
255
|
+
// unpublished → site fallback, not an error banner
|
|
256
|
+
};
|
|
82
257
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
258
|
+
return {
|
|
259
|
+
pageConfig: null,
|
|
260
|
+
source: "edge",
|
|
261
|
+
meta: { source: "edge" },
|
|
262
|
+
error: err instanceof Error ? err.message : "Couldn't load page content."
|
|
263
|
+
};
|
|
87
264
|
}
|
|
88
265
|
}
|
|
89
266
|
|
|
267
|
+
// src/server.tsx
|
|
268
|
+
async function fetchPageConfigServer(route, trackingId, preview = false, options) {
|
|
269
|
+
const target = resolveAmplifyUpTarget({
|
|
270
|
+
configTarget: options?.target
|
|
271
|
+
});
|
|
272
|
+
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
273
|
+
const previewFlag = preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
274
|
+
const fetchOrchestratorPage = async (pageRoute, isPreview) => {
|
|
275
|
+
const params = new URLSearchParams({
|
|
276
|
+
route: pageRoute,
|
|
277
|
+
trackingId
|
|
278
|
+
});
|
|
279
|
+
if (isPreview) params.set("preview", "true");
|
|
280
|
+
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
281
|
+
try {
|
|
282
|
+
const res = await fetch(url, {
|
|
283
|
+
cache: "no-store",
|
|
284
|
+
headers: { Accept: "application/json" }
|
|
285
|
+
});
|
|
286
|
+
if (!res.ok) return null;
|
|
287
|
+
const data = await res.json();
|
|
288
|
+
return data.page || null;
|
|
289
|
+
} catch {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
const result = await fetchContent({
|
|
294
|
+
route,
|
|
295
|
+
trackingId,
|
|
296
|
+
anonId: options?.anonId,
|
|
297
|
+
siteId: options?.siteId,
|
|
298
|
+
preview: previewFlag,
|
|
299
|
+
orchestratorUrl,
|
|
300
|
+
edgeUrl,
|
|
301
|
+
fetchOrchestratorPage
|
|
302
|
+
});
|
|
303
|
+
return result.pageConfig;
|
|
304
|
+
}
|
|
305
|
+
async function fetchContentServer(route, trackingId, options) {
|
|
306
|
+
const target = resolveAmplifyUpTarget({
|
|
307
|
+
configTarget: options?.target
|
|
308
|
+
});
|
|
309
|
+
const { orchestratorUrl, edgeUrl } = resolveAmplifyUpUrls(target);
|
|
310
|
+
const previewFlag = options?.preview || (options?.searchParams ? isPreviewRequest(options.searchParams) : false);
|
|
311
|
+
const result = await fetchContent({
|
|
312
|
+
route,
|
|
313
|
+
trackingId,
|
|
314
|
+
anonId: options?.anonId,
|
|
315
|
+
siteId: options?.siteId,
|
|
316
|
+
preview: previewFlag,
|
|
317
|
+
orchestratorUrl,
|
|
318
|
+
edgeUrl,
|
|
319
|
+
fetchOrchestratorPage: async (pageRoute, isPreview) => {
|
|
320
|
+
const params = new URLSearchParams({
|
|
321
|
+
route: pageRoute,
|
|
322
|
+
trackingId
|
|
323
|
+
});
|
|
324
|
+
if (isPreview) params.set("preview", "true");
|
|
325
|
+
const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;
|
|
326
|
+
try {
|
|
327
|
+
const res = await fetch(url, {
|
|
328
|
+
cache: "no-store",
|
|
329
|
+
headers: { Accept: "application/json" }
|
|
330
|
+
});
|
|
331
|
+
if (!res.ok) return null;
|
|
332
|
+
const data = await res.json();
|
|
333
|
+
return data.page || null;
|
|
334
|
+
} catch {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
return {
|
|
340
|
+
pageConfig: result.pageConfig,
|
|
341
|
+
meta: result.meta,
|
|
342
|
+
error: result.error
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
exports.fetchContentServer = fetchContentServer;
|
|
90
347
|
exports.fetchPageConfigServer = fetchPageConfigServer;
|
|
91
348
|
exports.resolveAmplifyUpTarget = resolveAmplifyUpTarget;
|
|
92
349
|
exports.resolveAmplifyUpUrls = resolveAmplifyUpUrls;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/targets.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}\n\nconst AWS_DEV_API = 'https://api-dev.amplifyup.ai';\nconst AWS_PROD_API = 'https://api.amplifyup.ai';\nconst PROD_ORCHESTRATOR = 'https://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\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 };\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 return {\n target: 'production',\n apiGatewayUrl: resolvedApi,\n orchestratorUrl,\n decisionApiUrl: `${resolvedApi}/v1/personalize`,\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\n */\n\nimport type { PageConfig, AmplifyUpTarget } from './types';\nimport {\n resolveAmplifyUpTarget,\n resolveAmplifyUpUrls,\n} from './targets';\n\n/**\n * Fetch page configuration on the server\n * Use this in Next.js Server Components or API routes\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 override (otherwise uses NEXT_PUBLIC_AMPLIFYUP_TARGET)\n * @returns Page configuration or null if not found\n */\nexport async function fetchPageConfigServer(\n route: string,\n trackingId: string,\n preview: boolean = false,\n options?: {\n target?: AmplifyUpTarget;\n }\n): Promise<PageConfig | null> {\n const target = resolveAmplifyUpTarget({\n configTarget: options?.target,\n });\n const { orchestratorUrl } = resolveAmplifyUpUrls(target);\n\n const params = new URLSearchParams({\n route,\n trackingId,\n });\n if (preview) {\n params.set('preview', 'true');\n }\n\n const url = `${orchestratorUrl}/api/layout/provider?${params.toString()}`;\n\n try {\n const res = await fetch(url, {\n cache: 'no-store',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) {\n return null;\n }\n const data = await res.json();\n return (data.page as PageConfig) || null;\n } catch {\n return null;\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 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 { 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 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 };\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"]}
|