@uniformdev/canvas-next-rsc 19.69.0 → 19.73.0
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/UniformComposition-38e22896.d.ts +61 -0
- package/dist/component.d.mts +76 -0
- package/dist/component.d.ts +76 -0
- package/dist/component.js +218 -0
- package/dist/component.mjs +182 -0
- package/dist/config.d.mts +6 -0
- package/dist/config.d.ts +6 -1
- package/dist/config.js +56 -29
- package/dist/config.mjs +41 -0
- package/dist/handler.d.mts +12 -0
- package/dist/handler.d.ts +12 -2
- package/dist/handler.js +703 -2
- package/dist/handler.mjs +682 -0
- package/dist/{client/manifestClient.d.ts → index.d.mts} +100 -18
- package/dist/index.d.ts +243 -23
- package/dist/index.esm.js +977 -0
- package/dist/index.js +1013 -29
- package/dist/index.mjs +977 -0
- package/package.json +23 -15
- package/dist/actions/updateContext.d.ts +0 -2
- package/dist/actions/updateContext.js +0 -17
- package/dist/client/canvasClient.d.ts +0 -5
- package/dist/client/canvasClient.js +0 -53
- package/dist/client/manifestClient.js +0 -33
- package/dist/client/projectMapClient.d.ts +0 -5
- package/dist/client/projectMapClient.js +0 -17
- package/dist/client/routeClient.d.ts +0 -5
- package/dist/client/routeClient.js +0 -68
- package/dist/components/DefaultNotImplementedComponent.d.ts +0 -2
- package/dist/components/DefaultNotImplementedComponent.js +0 -45
- package/dist/components/GoogleTagManagerAnalytics.d.ts +0 -3
- package/dist/components/GoogleTagManagerAnalytics.js +0 -44
- package/dist/components/UniformComponent.d.ts +0 -25
- package/dist/components/UniformComponent.js +0 -14
- package/dist/components/UniformComposition.d.ts +0 -40
- package/dist/components/UniformComposition.js +0 -35
- package/dist/components/UniformContext.d.ts +0 -8
- package/dist/components/UniformContext.js +0 -19
- package/dist/components/UniformRichText.d.ts +0 -38
- package/dist/components/UniformRichText.js +0 -15
- package/dist/components/UniformRichTextNode.d.ts +0 -10
- package/dist/components/UniformRichTextNode.js +0 -49
- package/dist/components/UniformScript.d.ts +0 -3
- package/dist/components/UniformScript.js +0 -49
- package/dist/components/UniformSlot.d.ts +0 -40
- package/dist/components/UniformSlot.js +0 -38
- package/dist/components/UniformText.d.ts +0 -6
- package/dist/components/UniformText.js +0 -5
- package/dist/components/__tests__/evaluateComposition.spec.d.ts +0 -1
- package/dist/components/__tests__/evaluateComposition.spec.js +0 -80
- package/dist/components/convertComponentToProps.d.ts +0 -14
- package/dist/components/convertComponentToProps.js +0 -22
- package/dist/components/evaluateComposition.d.ts +0 -22
- package/dist/components/evaluateComposition.js +0 -183
- package/dist/components/getEnrichmentTags.d.ts +0 -3
- package/dist/components/getEnrichmentTags.js +0 -13
- package/dist/components/getUniformContext.d.ts +0 -6
- package/dist/components/getUniformContext.js +0 -17
- package/dist/components/nodes/HeadingRichTextNode.d.ts +0 -2
- package/dist/components/nodes/HeadingRichTextNode.js +0 -6
- package/dist/components/nodes/LinebreakRichTextNode.d.ts +0 -2
- package/dist/components/nodes/LinebreakRichTextNode.js +0 -4
- package/dist/components/nodes/LinkRichTextNode.d.ts +0 -2
- package/dist/components/nodes/LinkRichTextNode.js +0 -6
- package/dist/components/nodes/ListItemRichTextNode.d.ts +0 -2
- package/dist/components/nodes/ListItemRichTextNode.js +0 -5
- package/dist/components/nodes/ListRichTextNode.d.ts +0 -2
- package/dist/components/nodes/ListRichTextNode.js +0 -6
- package/dist/components/nodes/ParagraphRichTextNode.d.ts +0 -2
- package/dist/components/nodes/ParagraphRichTextNode.js +0 -6
- package/dist/components/nodes/TabRichTextNode.d.ts +0 -2
- package/dist/components/nodes/TabRichTextNode.js +0 -4
- package/dist/components/nodes/TextRichTextNode.d.ts +0 -2
- package/dist/components/nodes/TextRichTextNode.js +0 -9
- package/dist/components/renderComponent.d.ts +0 -15
- package/dist/components/renderComponent.js +0 -52
- package/dist/components/resolvePath.d.ts +0 -5
- package/dist/components/resolvePath.js +0 -34
- package/dist/components/retrieveRoute.d.ts +0 -141
- package/dist/components/retrieveRoute.js +0 -146
- package/dist/components/types.d.ts +0 -11
- package/dist/components/types.js +0 -1
- package/dist/config/helpers.d.ts +0 -17
- package/dist/config/helpers.js +0 -34
- package/dist/config/models.d.ts +0 -51
- package/dist/config/models.js +0 -1
- package/dist/cookie/index.d.ts +0 -12
- package/dist/cookie/index.js +0 -21
- package/dist/handler/createPreviewGETRouteHandler.d.ts +0 -1
- package/dist/handler/createPreviewGETRouteHandler.js +0 -43
- package/dist/handler/createPreviewPOSTRouteHandler.d.ts +0 -1
- package/dist/handler/createPreviewPOSTRouteHandler.js +0 -88
- package/dist/handler/createUniformRouteHandler.d.ts +0 -4
- package/dist/handler/createUniformRouteHandler.js +0 -10
- package/dist/handler/helpers.d.ts +0 -19
- package/dist/handler/helpers.js +0 -148
- package/dist/handler/messages/handleCompositionChanged.d.ts +0 -2
- package/dist/handler/messages/handleCompositionChanged.js +0 -9
- package/dist/handler/messages/handleCompositionDeleted.d.ts +0 -2
- package/dist/handler/messages/handleCompositionDeleted.js +0 -9
- package/dist/handler/messages/handleCompositionPublished.d.ts +0 -2
- package/dist/handler/messages/handleCompositionPublished.js +0 -9
- package/dist/handler/messages/handleManifestPublished.d.ts +0 -2
- package/dist/handler/messages/handleManifestPublished.js +0 -10
- package/dist/handler/messages/handleProjectMapNodeDelete.d.ts +0 -2
- package/dist/handler/messages/handleProjectMapNodeDelete.js +0 -21
- package/dist/handler/messages/handleProjectMapNodeInsert.d.ts +0 -2
- package/dist/handler/messages/handleProjectMapNodeInsert.js +0 -21
- package/dist/handler/messages/handleProjectMapNodeUpdate.d.ts +0 -2
- package/dist/handler/messages/handleProjectMapNodeUpdate.js +0 -22
- package/dist/handler/messages/handleRedirectDelete.d.ts +0 -2
- package/dist/handler/messages/handleRedirectDelete.js +0 -15
- package/dist/handler/messages/handleRedirectInsert.d.ts +0 -2
- package/dist/handler/messages/handleRedirectInsert.js +0 -15
- package/dist/handler/messages/handleRedirectUpdate.d.ts +0 -2
- package/dist/handler/messages/handleRedirectUpdate.js +0 -15
- package/dist/hooks/useForgetMe.d.ts +0 -4
- package/dist/hooks/useForgetMe.js +0 -10
- package/dist/hooks/useToggleConsent.d.ts +0 -7
- package/dist/hooks/useToggleConsent.js +0 -22
- package/dist/hooks/useUniformContext.d.ts +0 -1
- package/dist/hooks/useUniformContext.js +0 -3
- package/dist/models/index.d.ts +0 -30
- package/dist/models/index.js +0 -1
- package/dist/register/componentStore.d.ts +0 -1
- package/dist/register/componentStore.js +0 -2
- package/dist/register/componentStoreResolver.d.ts +0 -2
- package/dist/register/componentStoreResolver.js +0 -5
- package/dist/register/createComponentStore.d.ts +0 -12
- package/dist/register/createComponentStore.js +0 -13
- package/dist/register/createComponentStoreResolver.d.ts +0 -9
- package/dist/register/createComponentStoreResolver.js +0 -9
- package/dist/register/getTypeWithVariant.d.ts +0 -1
- package/dist/register/getTypeWithVariant.js +0 -1
- package/dist/register/registerUniformComponent.d.ts +0 -6
- package/dist/register/registerUniformComponent.js +0 -8
- package/dist/resolve/resolveChildren.d.ts +0 -10
- package/dist/resolve/resolveChildren.js +0 -20
- package/dist/score/index.d.ts +0 -3
- package/dist/score/index.js +0 -114
- package/dist/utils/__tests__/apply.spec.d.ts +0 -1
- package/dist/utils/__tests__/apply.spec.js +0 -358
- package/dist/utils/__tests__/diff.spec.d.ts +0 -1
- package/dist/utils/__tests__/diff.spec.js +0 -394
- package/dist/utils/apply.d.ts +0 -6
- package/dist/utils/apply.js +0 -124
- package/dist/utils/comp.d.ts +0 -16
- package/dist/utils/comp.js +0 -65
- package/dist/utils/diff.d.ts +0 -44
- package/dist/utils/diff.js +0 -144
- package/dist/utils/draft.d.ts +0 -12
- package/dist/utils/draft.js +0 -22
- package/dist/utils/tag.d.ts +0 -2
- package/dist/utils/tag.js +0 -7
- package/dist/utils/url.d.ts +0 -1
- package/dist/utils/url.js +0 -10
package/dist/handler.mjs
ADDED
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
// src/handler/createPreviewGETRouteHandler.ts
|
|
2
|
+
import {
|
|
3
|
+
CANVAS_DRAFT_STATE as CANVAS_DRAFT_STATE2,
|
|
4
|
+
IN_CONTEXT_EDITOR_PLAYGROUND_QUERY_STRING_PARAM,
|
|
5
|
+
IN_CONTEXT_EDITOR_QUERY_STRING_PARAM as IN_CONTEXT_EDITOR_QUERY_STRING_PARAM2
|
|
6
|
+
} from "@uniformdev/canvas";
|
|
7
|
+
import { draftMode as draftMode2 } from "next/headers";
|
|
8
|
+
import { redirect } from "next/navigation";
|
|
9
|
+
|
|
10
|
+
// src/utils/route.ts
|
|
11
|
+
import {
|
|
12
|
+
CANVAS_DRAFT_STATE,
|
|
13
|
+
CANVAS_EDITOR_STATE,
|
|
14
|
+
CANVAS_PUBLISHED_STATE
|
|
15
|
+
} from "@uniformdev/canvas";
|
|
16
|
+
import { getBaseUrl, getServerConfig as getServerConfig2, resolvePath } from "@uniformdev/canvas-next-rsc-shared";
|
|
17
|
+
import { getTargetVariableExpandedUrl } from "@uniformdev/redirect";
|
|
18
|
+
|
|
19
|
+
// src/config/helpers.ts
|
|
20
|
+
import { getServerConfig } from "@uniformdev/canvas-next-rsc-shared";
|
|
21
|
+
|
|
22
|
+
// src/utils/draft.ts
|
|
23
|
+
import { IN_CONTEXT_EDITOR_QUERY_STRING_PARAM } from "@uniformdev/canvas";
|
|
24
|
+
import { draftMode } from "next/headers";
|
|
25
|
+
var isDraftModeEnabled = ({
|
|
26
|
+
searchParams
|
|
27
|
+
}) => {
|
|
28
|
+
if (isDevelopmentEnvironment()) {
|
|
29
|
+
return isIncontextEditingEnabled({ searchParams });
|
|
30
|
+
}
|
|
31
|
+
let draftModeEnabled = false;
|
|
32
|
+
try {
|
|
33
|
+
draftModeEnabled = draftMode().isEnabled;
|
|
34
|
+
} catch (e) {
|
|
35
|
+
}
|
|
36
|
+
return draftModeEnabled || isIncontextEditingEnabled({ searchParams });
|
|
37
|
+
};
|
|
38
|
+
var isIncontextEditingEnabled = ({
|
|
39
|
+
searchParams
|
|
40
|
+
}) => {
|
|
41
|
+
const containsKey = typeof (searchParams == null ? void 0 : searchParams[IN_CONTEXT_EDITOR_QUERY_STRING_PARAM]) !== "undefined";
|
|
42
|
+
return containsKey;
|
|
43
|
+
};
|
|
44
|
+
var isOnVercelPreviewEnvironment = () => {
|
|
45
|
+
return process.env.VERCEL_ENV === "preview";
|
|
46
|
+
};
|
|
47
|
+
var isDevelopmentEnvironment = () => {
|
|
48
|
+
return process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test";
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/config/helpers.ts
|
|
52
|
+
var shouldCacheBeDisabled = (options) => {
|
|
53
|
+
if (isDraftModeEnabled(options)) {
|
|
54
|
+
return { disabled: true, reason: "DRAFT" };
|
|
55
|
+
}
|
|
56
|
+
if (isIncontextEditingEnabled(options)) {
|
|
57
|
+
return { disabled: true, reason: "INCONTEXT" };
|
|
58
|
+
}
|
|
59
|
+
if (isDevelopmentEnvironment()) {
|
|
60
|
+
return { disabled: true, reason: "DEV" };
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
disabled: false,
|
|
64
|
+
reason: void 0
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
var getCanvasCacheStrategy = (options) => {
|
|
68
|
+
const { disabled, reason } = shouldCacheBeDisabled(options);
|
|
69
|
+
const config = getServerConfig();
|
|
70
|
+
if (disabled) {
|
|
71
|
+
if (reason === "DEV" && config.canvasCache) {
|
|
72
|
+
console.warn("Canvas cache (disabled) has been overridden by canvasCache config.");
|
|
73
|
+
return config.canvasCache;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
type: "no-cache"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (config.canvasCache) {
|
|
80
|
+
return config.canvasCache;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
type: "force-cache"
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// src/env/index.ts
|
|
88
|
+
var env = {
|
|
89
|
+
getProjectId: () => {
|
|
90
|
+
return process.env.UNIFORM_PROJECT_ID;
|
|
91
|
+
},
|
|
92
|
+
getApiKey: () => {
|
|
93
|
+
return process.env.UNIFORM_API_KEY;
|
|
94
|
+
},
|
|
95
|
+
getApiHost: () => {
|
|
96
|
+
return process.env.UNIFORM_API_HOST || process.env.UNIFORM_CLI_BASE_URL;
|
|
97
|
+
},
|
|
98
|
+
getEdgeApiHost: () => {
|
|
99
|
+
return process.env.UNIFORM_EDGE_API_HOST || process.env.UNIFORM_CLI_BASE_EDGE_URL;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// src/utils/tag.ts
|
|
104
|
+
var buildPathTag = (path) => {
|
|
105
|
+
const actualPath = path.startsWith("/") ? path : `/${path}`;
|
|
106
|
+
return `path:${actualPath}`.toLowerCase();
|
|
107
|
+
};
|
|
108
|
+
var buildCompositionTag = (compositionId) => {
|
|
109
|
+
return `composition:${compositionId}`.toLowerCase();
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/clients/shared.ts
|
|
113
|
+
var determineFetchCacheOptions = (mode) => {
|
|
114
|
+
let cache = void 0;
|
|
115
|
+
let revalidate = void 0;
|
|
116
|
+
if (mode.type === "revalidate") {
|
|
117
|
+
cache = void 0;
|
|
118
|
+
revalidate = mode.interval;
|
|
119
|
+
} else {
|
|
120
|
+
cache = mode.type;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
cache,
|
|
124
|
+
revalidate
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// src/clients/routeClient.ts
|
|
129
|
+
import { RouteClient } from "@uniformdev/canvas";
|
|
130
|
+
var getRouteClient = (options) => {
|
|
131
|
+
const client = new RouteClient({
|
|
132
|
+
projectId: env.getProjectId(),
|
|
133
|
+
apiKey: env.getApiKey(),
|
|
134
|
+
edgeApiHost: env.getEdgeApiHost(),
|
|
135
|
+
fetch: (req, init) => {
|
|
136
|
+
let requestedUrl;
|
|
137
|
+
if (typeof req === "string") {
|
|
138
|
+
requestedUrl = new URL(req);
|
|
139
|
+
} else if (req instanceof URL) {
|
|
140
|
+
requestedUrl = req;
|
|
141
|
+
} else {
|
|
142
|
+
requestedUrl = new URL(req.url);
|
|
143
|
+
}
|
|
144
|
+
const tags = [];
|
|
145
|
+
if (requestedUrl) {
|
|
146
|
+
const pathKey = "path";
|
|
147
|
+
const path = requestedUrl.searchParams.get(pathKey);
|
|
148
|
+
if (path) {
|
|
149
|
+
const pieces = path.split("/");
|
|
150
|
+
for (let i = 0; i < pieces.length; i++) {
|
|
151
|
+
const segmentPieces = pieces.slice(0, i + 1);
|
|
152
|
+
const segment = segmentPieces.join("/");
|
|
153
|
+
tags.push(buildPathTag(segment));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const { cache, revalidate } = determineFetchCacheOptions(options.cache);
|
|
158
|
+
return fetch(req, {
|
|
159
|
+
...init,
|
|
160
|
+
headers: {
|
|
161
|
+
...init == null ? void 0 : init.headers,
|
|
162
|
+
"x-bypass-cache": "true"
|
|
163
|
+
},
|
|
164
|
+
cache,
|
|
165
|
+
next: {
|
|
166
|
+
revalidate,
|
|
167
|
+
tags: tags.length ? tags : void 0
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return client;
|
|
173
|
+
};
|
|
174
|
+
var getDefaultRouteClient = ({ searchParams }) => {
|
|
175
|
+
return getRouteClient({
|
|
176
|
+
cache: getCanvasCacheStrategy({
|
|
177
|
+
searchParams
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// src/utils/route.ts
|
|
183
|
+
var retrieveRouteByPath = async ({
|
|
184
|
+
path,
|
|
185
|
+
state,
|
|
186
|
+
searchParams
|
|
187
|
+
}) => {
|
|
188
|
+
var _a;
|
|
189
|
+
const client = getDefaultRouteClient({
|
|
190
|
+
searchParams
|
|
191
|
+
});
|
|
192
|
+
return await client.getRoute({
|
|
193
|
+
path,
|
|
194
|
+
state,
|
|
195
|
+
withComponentIDs: true,
|
|
196
|
+
withContentSourceMap: isOnVercelPreviewEnvironment() && ((_a = getServerConfig2().experimental) == null ? void 0 : _a.vercelVisualEditing)
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
var resolveRedirectHref = (resolveResult, path) => {
|
|
200
|
+
let href;
|
|
201
|
+
if (resolveResult.redirect.targetProjectMapNodeId) {
|
|
202
|
+
const requestUrl = `${getBaseUrl()}${path}`;
|
|
203
|
+
const expandedUrl = getTargetVariableExpandedUrl(requestUrl, resolveResult.redirect);
|
|
204
|
+
const url = new URL(expandedUrl);
|
|
205
|
+
href = url.pathname;
|
|
206
|
+
} else {
|
|
207
|
+
href = resolveResult.redirect.targetUrl;
|
|
208
|
+
}
|
|
209
|
+
return href;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// src/handler/createPreviewGETRouteHandler.ts
|
|
213
|
+
var getQueryParam = (req, paramName) => {
|
|
214
|
+
const value = req.nextUrl.searchParams.get(paramName);
|
|
215
|
+
if (typeof value === "undefined") {
|
|
216
|
+
return void 0;
|
|
217
|
+
}
|
|
218
|
+
return Array.isArray(value) ? value[0] : value;
|
|
219
|
+
};
|
|
220
|
+
var createPreviewGETRouteHandler = (options) => {
|
|
221
|
+
return async (request) => {
|
|
222
|
+
const isConfigCheck = getQueryParam(request, "is_config_check") === "true";
|
|
223
|
+
if (isConfigCheck) {
|
|
224
|
+
return Response.json(
|
|
225
|
+
{
|
|
226
|
+
hasPlayground: Boolean(options == null ? void 0 : options.playgroundPath),
|
|
227
|
+
isUsingCustomFullPathResolver: false
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
headers: {
|
|
231
|
+
"Access-Control-Allow-Origin": process.env.UNIFORM_CLI_BASE_URL || "http://uniform.app"
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
if (request.headers.get("sec-fetch-mode") === "no-cors") {
|
|
237
|
+
return new Response(null, { status: 204 });
|
|
238
|
+
}
|
|
239
|
+
if (!process.env.UNIFORM_PREVIEW_SECRET) {
|
|
240
|
+
return new Response("No preview secret is configured", { status: 401 });
|
|
241
|
+
}
|
|
242
|
+
const { searchParams } = new URL(request.url);
|
|
243
|
+
const secret = searchParams.get("secret");
|
|
244
|
+
const path = searchParams.get("path");
|
|
245
|
+
const isPlayground = searchParams.get(IN_CONTEXT_EDITOR_PLAYGROUND_QUERY_STRING_PARAM) === "true";
|
|
246
|
+
const id = searchParams.get("id");
|
|
247
|
+
if (secret !== process.env.UNIFORM_PREVIEW_SECRET) {
|
|
248
|
+
return new Response("Invalid preview secret", { status: 401 });
|
|
249
|
+
}
|
|
250
|
+
if (!isPlayground) {
|
|
251
|
+
if (!path) {
|
|
252
|
+
return new Response("Path not provided", { status: 401 });
|
|
253
|
+
}
|
|
254
|
+
const resolveResult = await retrieveRouteByPath({
|
|
255
|
+
path,
|
|
256
|
+
state: CANVAS_DRAFT_STATE2,
|
|
257
|
+
searchParams: {
|
|
258
|
+
// about to be in draft mode so pretend for now.
|
|
259
|
+
[IN_CONTEXT_EDITOR_QUERY_STRING_PARAM2]: "true"
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
draftMode2().enable();
|
|
263
|
+
if (resolveResult.type === "redirect") {
|
|
264
|
+
const href = resolveRedirectHref(resolveResult, path);
|
|
265
|
+
if (resolveResult.redirect.targetProjectMapNodeId) {
|
|
266
|
+
redirect(`${href}?${IN_CONTEXT_EDITOR_QUERY_STRING_PARAM2}=true`);
|
|
267
|
+
} else {
|
|
268
|
+
redirect(href);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (resolveResult.type === "notFound") {
|
|
272
|
+
return new Response("Invalid path", { status: 401 });
|
|
273
|
+
}
|
|
274
|
+
redirect(`${path}?${IN_CONTEXT_EDITOR_QUERY_STRING_PARAM2}=true`);
|
|
275
|
+
} else {
|
|
276
|
+
if (!(options == null ? void 0 : options.playgroundPath)) {
|
|
277
|
+
return new Response("No playground path is configured", { status: 401 });
|
|
278
|
+
}
|
|
279
|
+
draftMode2().enable();
|
|
280
|
+
redirect(`${options.playgroundPath}?id=${id}&${IN_CONTEXT_EDITOR_QUERY_STRING_PARAM2}=true`);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
// src/handler/createPreviewOPTIONSRouteHandler.ts
|
|
286
|
+
var createPreviewOPTIONSRouteHandler = () => {
|
|
287
|
+
return async () => {
|
|
288
|
+
return new Response(null, {
|
|
289
|
+
headers: {
|
|
290
|
+
"Access-Control-Allow-Origin": process.env.UNIFORM_CLI_BASE_URL || "http://uniform.app",
|
|
291
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
292
|
+
"Access-Control-Allow-Headers": "*"
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// src/handler/createPreviewPOSTRouteHandler.ts
|
|
299
|
+
import { revalidateTag } from "next/cache";
|
|
300
|
+
|
|
301
|
+
// src/handler/helpers.ts
|
|
302
|
+
import { getServerConfig as getServerConfig3 } from "@uniformdev/canvas-next-rsc-shared";
|
|
303
|
+
import { parseConnectionString } from "@vercel/edge-config";
|
|
304
|
+
import { Webhook } from "svix";
|
|
305
|
+
|
|
306
|
+
// src/clients/projectMapClient.ts
|
|
307
|
+
import { ProjectMapClient } from "@uniformdev/project-map";
|
|
308
|
+
var getProjectMapClient = (options) => {
|
|
309
|
+
const manifestClient = new ProjectMapClient({
|
|
310
|
+
apiHost: env.getApiHost(),
|
|
311
|
+
apiKey: env.getApiKey(),
|
|
312
|
+
projectId: env.getProjectId(),
|
|
313
|
+
fetch: (req, init) => {
|
|
314
|
+
const { cache, revalidate } = determineFetchCacheOptions(options.cache);
|
|
315
|
+
return fetch(req, {
|
|
316
|
+
...init,
|
|
317
|
+
headers: {
|
|
318
|
+
...init == null ? void 0 : init.headers,
|
|
319
|
+
"x-bypass-cache": "true"
|
|
320
|
+
},
|
|
321
|
+
cache,
|
|
322
|
+
next: {
|
|
323
|
+
revalidate
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
return manifestClient;
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// src/handler/helpers.ts
|
|
332
|
+
var isSvixMessage = async (request) => {
|
|
333
|
+
const requiredHeaders = ["svix-id", "svix-timestamp", "svix-signature"];
|
|
334
|
+
const hasAllRequiredHeaders = requiredHeaders.every((header) => request.headers.has(header));
|
|
335
|
+
if (!hasAllRequiredHeaders) {
|
|
336
|
+
return {
|
|
337
|
+
looksLikeMessage: false,
|
|
338
|
+
validation: false
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
if (typeof process.env.UNIFORM_WEBHOOK_SECRET !== "undefined") {
|
|
342
|
+
const payload = await request.clone().text();
|
|
343
|
+
const headers = Object.fromEntries(request.headers.entries());
|
|
344
|
+
const wh = new Webhook(process.env.UNIFORM_WEBHOOK_SECRET);
|
|
345
|
+
try {
|
|
346
|
+
wh.verify(payload, headers);
|
|
347
|
+
} catch (err) {
|
|
348
|
+
return {
|
|
349
|
+
looksLikeMessage: true,
|
|
350
|
+
validation: false
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
looksLikeMessage: true,
|
|
356
|
+
validation: true
|
|
357
|
+
};
|
|
358
|
+
};
|
|
359
|
+
var processCompositionChange = async (compositionId) => {
|
|
360
|
+
const projectMapClient = getProjectMapClient({
|
|
361
|
+
cache: {
|
|
362
|
+
type: "no-cache"
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
const { nodes } = await projectMapClient.getNodes({
|
|
366
|
+
compositionId
|
|
367
|
+
});
|
|
368
|
+
const tags = [];
|
|
369
|
+
if (nodes) {
|
|
370
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
371
|
+
const node = nodes[i];
|
|
372
|
+
await processEdgeConfigChange({
|
|
373
|
+
source_url: node.path
|
|
374
|
+
});
|
|
375
|
+
tags.push(...buildProjectMapNodePaths(node.path));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
tags.push(buildCompositionTag(compositionId));
|
|
379
|
+
return {
|
|
380
|
+
tags
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
var buildProjectMapNodePaths = (path) => {
|
|
384
|
+
const tags = [];
|
|
385
|
+
const isDynamic = path.includes(":");
|
|
386
|
+
if (!isDynamic) {
|
|
387
|
+
tags.push(buildPathTag(path));
|
|
388
|
+
} else {
|
|
389
|
+
const pieces = path.split("/");
|
|
390
|
+
const invalidatePieces = [];
|
|
391
|
+
for (let j = 0; j < pieces.length; j++) {
|
|
392
|
+
const piece = pieces[j];
|
|
393
|
+
if (piece.startsWith(":")) {
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
invalidatePieces.push(piece);
|
|
397
|
+
}
|
|
398
|
+
const toInvalidate = invalidatePieces.join("/");
|
|
399
|
+
tags.push(buildPathTag(toInvalidate));
|
|
400
|
+
}
|
|
401
|
+
return tags;
|
|
402
|
+
};
|
|
403
|
+
var getPathName = (url) => {
|
|
404
|
+
try {
|
|
405
|
+
const { pathname } = new URL(url);
|
|
406
|
+
return pathname;
|
|
407
|
+
} catch (e) {
|
|
408
|
+
return url;
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
var processRedirectChange = async (sourceUrl) => {
|
|
412
|
+
const tags = [];
|
|
413
|
+
const pathName = getPathName(sourceUrl);
|
|
414
|
+
tags.push(buildPathTag(pathName));
|
|
415
|
+
return {
|
|
416
|
+
tags
|
|
417
|
+
};
|
|
418
|
+
};
|
|
419
|
+
var processEdgeConfigChange = async ({ source_url }) => {
|
|
420
|
+
var _a, _b;
|
|
421
|
+
if (!process.env.UNIFORM_VERCEL_EDGE_CONFIG_TOKEN) {
|
|
422
|
+
console.warn("UNIFORM_VERCEL_EDGE_CONFIG_TOKEN is not set, skipping edge redirect upsert");
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
const config = getServerConfig3();
|
|
426
|
+
const routeClient = getRouteClient({
|
|
427
|
+
cache: {
|
|
428
|
+
type: "no-cache"
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
const route = await routeClient.getRoute({
|
|
432
|
+
path: source_url
|
|
433
|
+
});
|
|
434
|
+
let valueToStore = void 0;
|
|
435
|
+
const shouldSaveRedirect = route.type === "redirect" && ((_a = config.experimental) == null ? void 0 : _a.edgeRedirects);
|
|
436
|
+
const shouldSaveComposition = route.type === "composition" && ((_b = config.experimental) == null ? void 0 : _b.edgeCompositions);
|
|
437
|
+
if (shouldSaveRedirect || shouldSaveComposition) {
|
|
438
|
+
valueToStore = route;
|
|
439
|
+
}
|
|
440
|
+
const sourcePath = getPathName(source_url);
|
|
441
|
+
const soucrcePathKey = buildPathTag(sourcePath);
|
|
442
|
+
const { id } = parseConnectionString(process.env.EDGE_CONFIG) || {};
|
|
443
|
+
if (!id) {
|
|
444
|
+
console.warn("EDGE_CONFIG is not set or not a connection string, skipping edge redirect upsert");
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
const url = new URL(`https://api.vercel.com/v1/edge-config/${id}/items`);
|
|
448
|
+
if (process.env.UNIFORM_VERCEL_EDGE_CONFIG_TEAM_ID) {
|
|
449
|
+
url.searchParams.set("teamId", process.env.UNIFORM_VERCEL_EDGE_CONFIG_TEAM_ID);
|
|
450
|
+
}
|
|
451
|
+
const response = await fetch(url.toString(), {
|
|
452
|
+
method: "PATCH",
|
|
453
|
+
headers: {
|
|
454
|
+
"Content-Type": "application/json",
|
|
455
|
+
Authorization: `Bearer ${process.env.UNIFORM_VERCEL_EDGE_CONFIG_TOKEN}`
|
|
456
|
+
},
|
|
457
|
+
body: JSON.stringify({
|
|
458
|
+
items: [
|
|
459
|
+
{
|
|
460
|
+
operation: valueToStore ? "upsert" : "delete",
|
|
461
|
+
key: soucrcePathKey.replace(/\W+/g, ""),
|
|
462
|
+
value: valueToStore != null ? valueToStore : null
|
|
463
|
+
}
|
|
464
|
+
]
|
|
465
|
+
})
|
|
466
|
+
});
|
|
467
|
+
if (!response.ok) {
|
|
468
|
+
console.warn(`Failed to upsert edge redirect for ${source_url}`, await response.text());
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// src/handler/messages/handleCompositionChanged.ts
|
|
473
|
+
import { CompositionChangedDefinition } from "@uniformdev/webhooks";
|
|
474
|
+
var handleCompositionChanged = async (body) => {
|
|
475
|
+
const parsed = CompositionChangedDefinition.schema.safeParse(body);
|
|
476
|
+
if (!parsed.success) {
|
|
477
|
+
return void 0;
|
|
478
|
+
}
|
|
479
|
+
return processCompositionChange(parsed.data.id);
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
// src/handler/messages/handleCompositionDeleted.ts
|
|
483
|
+
import { CompositionDeletedDefinition } from "@uniformdev/webhooks";
|
|
484
|
+
var handleCompositionDeleted = async (body) => {
|
|
485
|
+
const parsed = CompositionDeletedDefinition.schema.safeParse(body);
|
|
486
|
+
if (!parsed.success) {
|
|
487
|
+
return void 0;
|
|
488
|
+
}
|
|
489
|
+
return processCompositionChange(parsed.data.id);
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
// src/handler/messages/handleCompositionPublished.ts
|
|
493
|
+
import { CompositionPublishedDefinition } from "@uniformdev/webhooks";
|
|
494
|
+
var handleCompositionPublished = async (body) => {
|
|
495
|
+
const parsed = CompositionPublishedDefinition.schema.safeParse(body);
|
|
496
|
+
if (!parsed.success) {
|
|
497
|
+
return void 0;
|
|
498
|
+
}
|
|
499
|
+
return processCompositionChange(parsed.data.id);
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
// src/handler/messages/handleManifestPublished.ts
|
|
503
|
+
import { ManifestPublishedDefinition } from "@uniformdev/webhooks";
|
|
504
|
+
var handleManifestPublished = async (body) => {
|
|
505
|
+
const parsed = ManifestPublishedDefinition.schema.safeParse(body);
|
|
506
|
+
if (!parsed.success) {
|
|
507
|
+
return void 0;
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
tags: ["manifest"]
|
|
511
|
+
};
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
// src/handler/messages/handleProjectMapNodeDelete.ts
|
|
515
|
+
import { getServerConfig as getServerConfig4 } from "@uniformdev/canvas-next-rsc-shared";
|
|
516
|
+
import { ProjectMapNodeDeleteDefinition } from "@uniformdev/webhooks";
|
|
517
|
+
var handleProjectMapNodeDelete = async (body) => {
|
|
518
|
+
var _a;
|
|
519
|
+
const parsed = ProjectMapNodeDeleteDefinition.schema.safeParse(body);
|
|
520
|
+
if (!parsed.success) {
|
|
521
|
+
return void 0;
|
|
522
|
+
}
|
|
523
|
+
const tags = [];
|
|
524
|
+
tags.push(...buildProjectMapNodePaths(parsed.data.path));
|
|
525
|
+
const config = getServerConfig4();
|
|
526
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeCompositions) {
|
|
527
|
+
await processEdgeConfigChange({
|
|
528
|
+
source_url: parsed.data.path
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
return {
|
|
532
|
+
tags
|
|
533
|
+
};
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
// src/handler/messages/handleProjectMapNodeInsert.ts
|
|
537
|
+
import { getServerConfig as getServerConfig5 } from "@uniformdev/canvas-next-rsc-shared";
|
|
538
|
+
import { ProjectMapNodeInsertDefinition } from "@uniformdev/webhooks";
|
|
539
|
+
var handleProjectMapNodeInsert = async (body) => {
|
|
540
|
+
var _a;
|
|
541
|
+
const parsed = ProjectMapNodeInsertDefinition.schema.safeParse(body);
|
|
542
|
+
if (!parsed.success) {
|
|
543
|
+
return void 0;
|
|
544
|
+
}
|
|
545
|
+
const tags = [];
|
|
546
|
+
tags.push(...buildProjectMapNodePaths(parsed.data.path));
|
|
547
|
+
const config = getServerConfig5();
|
|
548
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeCompositions) {
|
|
549
|
+
await processEdgeConfigChange({
|
|
550
|
+
source_url: parsed.data.path
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
tags
|
|
555
|
+
};
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
// src/handler/messages/handleProjectMapNodeUpdate.ts
|
|
559
|
+
import { getServerConfig as getServerConfig6 } from "@uniformdev/canvas-next-rsc-shared";
|
|
560
|
+
import { ProjectMapNodeUpdateDefinition } from "@uniformdev/webhooks";
|
|
561
|
+
var handleProjectMapNodeUpdate = async (body) => {
|
|
562
|
+
var _a;
|
|
563
|
+
const parsed = ProjectMapNodeUpdateDefinition.schema.safeParse(body);
|
|
564
|
+
if (!parsed.success) {
|
|
565
|
+
return void 0;
|
|
566
|
+
}
|
|
567
|
+
const tags = [];
|
|
568
|
+
tags.push(...buildProjectMapNodePaths(parsed.data.path));
|
|
569
|
+
tags.push(...buildProjectMapNodePaths(parsed.data.previous_path));
|
|
570
|
+
const config = getServerConfig6();
|
|
571
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeCompositions) {
|
|
572
|
+
await processEdgeConfigChange({
|
|
573
|
+
source_url: parsed.data.path
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
return {
|
|
577
|
+
tags
|
|
578
|
+
};
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
// src/handler/messages/handleRedirectDelete.ts
|
|
582
|
+
import { getServerConfig as getServerConfig7 } from "@uniformdev/canvas-next-rsc-shared";
|
|
583
|
+
import { RedirectDeleteDefinition } from "@uniformdev/webhooks";
|
|
584
|
+
var handleRedirectDelete = async (body) => {
|
|
585
|
+
var _a;
|
|
586
|
+
const parsed = RedirectDeleteDefinition.schema.safeParse(body);
|
|
587
|
+
if (!parsed.success) {
|
|
588
|
+
return void 0;
|
|
589
|
+
}
|
|
590
|
+
const config = getServerConfig7();
|
|
591
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeRedirects) {
|
|
592
|
+
await processEdgeConfigChange(parsed.data);
|
|
593
|
+
}
|
|
594
|
+
return processRedirectChange(parsed.data.source_url);
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
// src/handler/messages/handleRedirectInsert.ts
|
|
598
|
+
import { getServerConfig as getServerConfig8 } from "@uniformdev/canvas-next-rsc-shared";
|
|
599
|
+
import { RedirectInsertDefinition } from "@uniformdev/webhooks";
|
|
600
|
+
var handleRedirectInsert = async (body) => {
|
|
601
|
+
var _a;
|
|
602
|
+
const parsed = RedirectInsertDefinition.schema.safeParse(body);
|
|
603
|
+
if (!parsed.success) {
|
|
604
|
+
return void 0;
|
|
605
|
+
}
|
|
606
|
+
const config = getServerConfig8();
|
|
607
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeRedirects) {
|
|
608
|
+
await processEdgeConfigChange(parsed.data);
|
|
609
|
+
}
|
|
610
|
+
return processRedirectChange(parsed.data.source_url);
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
// src/handler/messages/handleRedirectUpdate.ts
|
|
614
|
+
import { getServerConfig as getServerConfig9 } from "@uniformdev/canvas-next-rsc-shared";
|
|
615
|
+
import { RedirectUpdateDefinition } from "@uniformdev/webhooks";
|
|
616
|
+
var handleRedirectUpdate = async (body) => {
|
|
617
|
+
var _a;
|
|
618
|
+
const parsed = RedirectUpdateDefinition.schema.safeParse(body);
|
|
619
|
+
if (!parsed.success) {
|
|
620
|
+
return void 0;
|
|
621
|
+
}
|
|
622
|
+
const config = getServerConfig9();
|
|
623
|
+
if ((_a = config.experimental) == null ? void 0 : _a.edgeRedirects) {
|
|
624
|
+
await processEdgeConfigChange(parsed.data);
|
|
625
|
+
}
|
|
626
|
+
return processRedirectChange(parsed.data.source_url);
|
|
627
|
+
};
|
|
628
|
+
|
|
629
|
+
// src/handler/createPreviewPOSTRouteHandler.ts
|
|
630
|
+
var createPreviewPOSTRouteHandler = () => {
|
|
631
|
+
return async (request) => {
|
|
632
|
+
const { looksLikeMessage, validation } = await isSvixMessage(request);
|
|
633
|
+
if (looksLikeMessage) {
|
|
634
|
+
if (!validation) {
|
|
635
|
+
return new Response("This looks like a webhook request but the validation failed.", { status: 401 });
|
|
636
|
+
}
|
|
637
|
+
return handleSvixMessage(request);
|
|
638
|
+
}
|
|
639
|
+
return new Response("This is not a webhook request.", { status: 401 });
|
|
640
|
+
};
|
|
641
|
+
};
|
|
642
|
+
var handleSvixMessage = async (request) => {
|
|
643
|
+
const handlers = [
|
|
644
|
+
handleProjectMapNodeUpdate,
|
|
645
|
+
handleProjectMapNodeInsert,
|
|
646
|
+
handleProjectMapNodeDelete,
|
|
647
|
+
handleCompositionDeleted,
|
|
648
|
+
handleCompositionChanged,
|
|
649
|
+
handleCompositionPublished,
|
|
650
|
+
handleRedirectInsert,
|
|
651
|
+
handleRedirectUpdate,
|
|
652
|
+
handleRedirectDelete,
|
|
653
|
+
handleManifestPublished
|
|
654
|
+
];
|
|
655
|
+
let tags = void 0;
|
|
656
|
+
const jsonBody = await request.json();
|
|
657
|
+
for (let i = 0; i < handlers.length; i++) {
|
|
658
|
+
const handler = handlers[i];
|
|
659
|
+
const result = await handler(jsonBody);
|
|
660
|
+
if (result) {
|
|
661
|
+
tags = result.tags;
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
if (tags == null ? void 0 : tags.length) {
|
|
666
|
+
for (let i = 0; i < tags.length; i++) {
|
|
667
|
+
const tag = tags[i];
|
|
668
|
+
revalidateTag(tag);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
return new Response(
|
|
672
|
+
JSON.stringify({
|
|
673
|
+
handled: typeof tags !== "undefined",
|
|
674
|
+
tags
|
|
675
|
+
})
|
|
676
|
+
);
|
|
677
|
+
};
|
|
678
|
+
export {
|
|
679
|
+
createPreviewGETRouteHandler,
|
|
680
|
+
createPreviewOPTIONSRouteHandler,
|
|
681
|
+
createPreviewPOSTRouteHandler
|
|
682
|
+
};
|