@makeswift/runtime 0.23.8-canary.0 → 0.23.8
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/cjs/next/api-handler/handlers/draft-mode.js +78 -0
- package/dist/cjs/next/api-handler/handlers/draft-mode.js.map +1 -0
- package/dist/cjs/next/api-handler/handlers/manifest.js +1 -1
- package/dist/cjs/next/api-handler/handlers/preview-mode.js +71 -0
- package/dist/cjs/next/api-handler/handlers/preview-mode.js.map +1 -0
- package/dist/cjs/next/api-handler/index.js +8 -0
- package/dist/cjs/next/api-handler/index.js.map +1 -1
- package/dist/cjs/next/middleware/exceptions.js +59 -0
- package/dist/cjs/next/middleware/exceptions.js.map +1 -0
- package/dist/cjs/next/middleware/index.js +37 -0
- package/dist/cjs/next/middleware/index.js.map +1 -0
- package/dist/cjs/next/middleware/request-utils.js +167 -0
- package/dist/cjs/next/middleware/request-utils.js.map +1 -0
- package/dist/esm/next/api-handler/handlers/draft-mode.js +58 -0
- package/dist/esm/next/api-handler/handlers/draft-mode.js.map +1 -0
- package/dist/esm/next/api-handler/handlers/manifest.js +1 -1
- package/dist/esm/next/api-handler/handlers/preview-mode.js +51 -0
- package/dist/esm/next/api-handler/handlers/preview-mode.js.map +1 -0
- package/dist/esm/next/api-handler/index.js +8 -0
- package/dist/esm/next/api-handler/index.js.map +1 -1
- package/dist/esm/next/middleware/exceptions.js +29 -0
- package/dist/esm/next/middleware/exceptions.js.map +1 -0
- package/dist/esm/next/middleware/index.js +15 -0
- package/dist/esm/next/middleware/index.js.map +1 -0
- package/dist/esm/next/middleware/request-utils.js +146 -0
- package/dist/esm/next/middleware/request-utils.js.map +1 -0
- package/dist/types/next/api-handler/handlers/draft-mode.d.ts +20 -0
- package/dist/types/next/api-handler/handlers/draft-mode.d.ts.map +1 -0
- package/dist/types/next/api-handler/handlers/preview-mode.d.ts +20 -0
- package/dist/types/next/api-handler/handlers/preview-mode.d.ts.map +1 -0
- package/dist/types/next/api-handler/index.d.ts +3 -1
- package/dist/types/next/api-handler/index.d.ts.map +1 -1
- package/dist/types/next/middleware/exceptions.d.ts +16 -0
- package/dist/types/next/middleware/exceptions.d.ts.map +1 -0
- package/dist/types/next/middleware/index.d.ts +2 -0
- package/dist/types/next/middleware/index.d.ts.map +1 -0
- package/dist/types/next/middleware/request-utils.d.ts +16 -0
- package/dist/types/next/middleware/request-utils.d.ts.map +1 -0
- package/dist/types/next/middleware/request-utils.test.d.ts +2 -0
- package/dist/types/next/middleware/request-utils.test.d.ts.map +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var draft_mode_exports = {};
|
|
20
|
+
__export(draft_mode_exports, {
|
|
21
|
+
default: () => draftModeHandler
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(draft_mode_exports);
|
|
24
|
+
var import_server = require("next/server");
|
|
25
|
+
var import_ts_pattern = require("ts-pattern");
|
|
26
|
+
var import_headers = require("next/headers");
|
|
27
|
+
var import_site_version = require("../../../api/site-version");
|
|
28
|
+
const PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
|
|
29
|
+
const DRAFT_DATA_COOKIE = "x-makeswift-draft-data";
|
|
30
|
+
const routeHandlerPattern = [import_ts_pattern.P.instanceOf(Request), import_ts_pattern.P.any, import_ts_pattern.P.any];
|
|
31
|
+
const apiRoutePattern = [import_ts_pattern.P.any, import_ts_pattern.P.any, import_ts_pattern.P.any];
|
|
32
|
+
async function draftModeHandler(...args) {
|
|
33
|
+
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => draftModeRouteHandler(...args2)).with(apiRoutePattern, (args2) => draftModeApiRouteHandler(...args2)).exhaustive();
|
|
34
|
+
}
|
|
35
|
+
async function draftModeRouteHandler(request, _context, { apiKey }) {
|
|
36
|
+
const secret = request.nextUrl.searchParams.get("secret");
|
|
37
|
+
if (secret == null) {
|
|
38
|
+
return new import_server.NextResponse("Unauthorized to enable draft mode: no secret provided", {
|
|
39
|
+
status: 401
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (secret !== apiKey) {
|
|
43
|
+
return new import_server.NextResponse("Unauthorized to enable draft mode: incorrect secret", { status: 401 });
|
|
44
|
+
}
|
|
45
|
+
const draft = await (0, import_headers.draftMode)();
|
|
46
|
+
const cookieStore = await (0, import_headers.cookies)();
|
|
47
|
+
draft.enable();
|
|
48
|
+
const bypassCookie = cookieStore.get(PRERENDER_BYPASS_COOKIE);
|
|
49
|
+
if (bypassCookie?.value == null) {
|
|
50
|
+
return new import_server.NextResponse("Could not retrieve draft mode bypass cookie", { status: 500 });
|
|
51
|
+
}
|
|
52
|
+
cookieStore.set({
|
|
53
|
+
name: bypassCookie.name,
|
|
54
|
+
value: bypassCookie.value,
|
|
55
|
+
sameSite: "none",
|
|
56
|
+
secure: true,
|
|
57
|
+
partitioned: true
|
|
58
|
+
});
|
|
59
|
+
cookieStore.set({
|
|
60
|
+
name: DRAFT_DATA_COOKIE,
|
|
61
|
+
// Eventually, we can make the value dynamic using the request
|
|
62
|
+
value: JSON.stringify({ makeswift: true, siteVersion: import_site_version.MakeswiftSiteVersion.Working }),
|
|
63
|
+
sameSite: "none",
|
|
64
|
+
secure: true,
|
|
65
|
+
partitioned: true
|
|
66
|
+
});
|
|
67
|
+
const siteVersionCookie = cookieStore.get(DRAFT_DATA_COOKIE);
|
|
68
|
+
if (siteVersionCookie?.value == null) {
|
|
69
|
+
return new import_server.NextResponse("Could not retrieve draft mode site version cookie", { status: 500 });
|
|
70
|
+
}
|
|
71
|
+
return import_server.NextResponse.json({ __brand: "DraftModeResponse" });
|
|
72
|
+
}
|
|
73
|
+
async function draftModeApiRouteHandler(_req, res, {}) {
|
|
74
|
+
const message = "Cannot request draft endpoint from an API handler registered in `pages`. Move your Makeswift API handler to the `app` directory";
|
|
75
|
+
console.error(message);
|
|
76
|
+
return res.status(500).send(message);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=draft-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/next/api-handler/handlers/draft-mode.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { cookies, draftMode } from 'next/headers'\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\n\nconst PRERENDER_BYPASS_COOKIE = '__prerender_bypass'\nconst DRAFT_DATA_COOKIE = 'x-makeswift-draft-data'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype DraftModeError = string\n\ntype Response = { __brand: 'DraftModeResponse' }\n\nexport type DraftModeResponse = DraftModeError | Response\n\ntype DraftModeHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<DraftModeResponse>, params: { apiKey: string }]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nexport default async function draftModeHandler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<DraftModeResponse>>\nexport default async function draftModeHandler(\n req: NextApiRequest,\n res: NextApiResponse<DraftModeResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function draftModeHandler(\n ...args: DraftModeHandlerArgs\n): Promise<NextResponse<DraftModeResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, args => draftModeRouteHandler(...args))\n .with(apiRoutePattern, args => draftModeApiRouteHandler(...args))\n .exhaustive()\n}\n\nasync function draftModeRouteHandler(\n request: NextRequest,\n _context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<DraftModeResponse>> {\n const secret = request.nextUrl.searchParams.get('secret')\n\n if (secret == null) {\n return new NextResponse('Unauthorized to enable draft mode: no secret provided', {\n status: 401,\n })\n }\n if (secret !== apiKey) {\n return new NextResponse('Unauthorized to enable draft mode: incorrect secret', { status: 401 })\n }\n\n const draft = await draftMode()\n const cookieStore = await cookies()\n\n draft.enable()\n\n const bypassCookie = cookieStore.get(PRERENDER_BYPASS_COOKIE)\n\n if (bypassCookie?.value == null) {\n return new NextResponse('Could not retrieve draft mode bypass cookie', { status: 500 })\n }\n\n cookieStore.set({\n name: bypassCookie.name,\n value: bypassCookie.value,\n sameSite: 'none',\n secure: true,\n partitioned: true,\n })\n\n cookieStore.set({\n name: DRAFT_DATA_COOKIE,\n // Eventually, we can make the value dynamic using the request\n value: JSON.stringify({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working }),\n sameSite: 'none',\n secure: true,\n partitioned: true,\n })\n\n const siteVersionCookie = cookieStore.get(DRAFT_DATA_COOKIE)\n\n if (siteVersionCookie?.value == null) {\n return new NextResponse('Could not retrieve draft mode site version cookie', { status: 500 })\n }\n\n return NextResponse.json({ __brand: 'DraftModeResponse' })\n}\n\nasync function draftModeApiRouteHandler(\n _req: NextApiRequest,\n res: NextApiResponse<DraftModeResponse>,\n {}: { apiKey: string },\n): Promise<void> {\n const message =\n 'Cannot request draft endpoint from an API handler registered in `pages`. Move your Makeswift API handler to the `app` directory'\n console.error(message)\n return res.status(500).send(message)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA0C;AAC1C,wBAAyB;AACzB,qBAAmC;AACnC,0BAAqC;AAErC,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAc1B,MAAM,sBAAsB,CAAC,oBAAE,WAAW,OAAO,GAAG,oBAAE,KAAK,oBAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,oBAAE,KAAK,oBAAE,KAAK,oBAAE,GAAG;AAY5C,eAAO,oBACF,MAC8C;AACjD,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAAA,UAAQ,sBAAsB,GAAGA,KAAI,CAAC,EAChE,KAAK,iBAAiB,CAAAA,UAAQ,yBAAyB,GAAGA,KAAI,CAAC,EAC/D,WAAW;AAChB;AAEA,eAAe,sBACb,SACA,UACA,EAAE,OAAO,GACiC;AAC1C,QAAM,SAAS,QAAQ,QAAQ,aAAa,IAAI,QAAQ;AAExD,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,2BAAa,yDAAyD;AAAA,MAC/E,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,2BAAa,uDAAuD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAChG;AAEA,QAAM,QAAQ,UAAM,0BAAU;AAC9B,QAAM,cAAc,UAAM,wBAAQ;AAElC,QAAM,OAAO;AAEb,QAAM,eAAe,YAAY,IAAI,uBAAuB;AAE5D,MAAI,cAAc,SAAS,MAAM;AAC/B,WAAO,IAAI,2BAAa,+CAA+C,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxF;AAEA,cAAY,IAAI;AAAA,IACd,MAAM,aAAa;AAAA,IACnB,OAAO,aAAa;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AAED,cAAY,IAAI;AAAA,IACd,MAAM;AAAA;AAAA,IAEN,OAAO,KAAK,UAAU,EAAE,WAAW,MAAM,aAAa,yCAAqB,QAAQ,CAAC;AAAA,IACpF,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AAED,QAAM,oBAAoB,YAAY,IAAI,iBAAiB;AAE3D,MAAI,mBAAmB,SAAS,MAAM;AACpC,WAAO,IAAI,2BAAa,qDAAqD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9F;AAEA,SAAO,2BAAa,KAAK,EAAE,SAAS,oBAAoB,CAAC;AAC3D;AAEA,eAAe,yBACb,MACA,KACA,CAAC,GACc;AACf,QAAM,UACJ;AACF,UAAQ,MAAM,OAAO;AACrB,SAAO,IAAI,OAAO,GAAG,EAAE,KAAK,OAAO;AACrC;","names":["args"]}
|
|
@@ -37,7 +37,7 @@ async function handler(...args) {
|
|
|
37
37
|
const supportsDraftMode = (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
|
|
38
38
|
const supportsWebhook = (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
|
|
39
39
|
const body = {
|
|
40
|
-
version: "0.23.8
|
|
40
|
+
version: "0.23.8",
|
|
41
41
|
previewMode: supportsPreviewMode,
|
|
42
42
|
draftMode: supportsDraftMode,
|
|
43
43
|
interactionMode: true,
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var preview_mode_exports = {};
|
|
20
|
+
__export(preview_mode_exports, {
|
|
21
|
+
default: () => previewModeHandler
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(preview_mode_exports);
|
|
24
|
+
var import_server = require("next/server");
|
|
25
|
+
var import_ts_pattern = require("ts-pattern");
|
|
26
|
+
var import_set_cookie_parser = require("set-cookie-parser");
|
|
27
|
+
var import_cookie = require("cookie");
|
|
28
|
+
var import_site_version = require("../../../api/site-version");
|
|
29
|
+
const SET_COOKIE_HEADER = "set-cookie";
|
|
30
|
+
const PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
|
|
31
|
+
const PREVIEW_DATA_COOKIE = "__next_preview_data";
|
|
32
|
+
const routeHandlerPattern = [import_ts_pattern.P.instanceOf(Request), import_ts_pattern.P.any, import_ts_pattern.P.any];
|
|
33
|
+
const apiRoutePattern = [import_ts_pattern.P.any, import_ts_pattern.P.any, import_ts_pattern.P.any];
|
|
34
|
+
async function previewModeHandler(...args) {
|
|
35
|
+
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => previewModeRouteHandler(...args2)).with(apiRoutePattern, (args2) => previewModeApiRouteHandler(...args2)).exhaustive();
|
|
36
|
+
}
|
|
37
|
+
async function previewModeRouteHandler(_request, _context, {}) {
|
|
38
|
+
const message = "Cannot request preview endpoint from an API handler registered in `app`. Move your Makeswift API handler to the `pages/api` directory";
|
|
39
|
+
console.error(message);
|
|
40
|
+
return import_server.NextResponse.json(message, { status: 500 });
|
|
41
|
+
}
|
|
42
|
+
async function previewModeApiRouteHandler(req, res, { apiKey }) {
|
|
43
|
+
const secret = req.query.secret;
|
|
44
|
+
if (secret == null) {
|
|
45
|
+
return res.status(401).send("Unauthorized to enable preview mode: no secret provided");
|
|
46
|
+
}
|
|
47
|
+
if (secret !== apiKey) {
|
|
48
|
+
return res.status(401).send("Unauthorized to enable preview mode: secret is incorrect");
|
|
49
|
+
}
|
|
50
|
+
const setCookie = res.setPreviewData({ makeswift: true, siteVersion: import_site_version.MakeswiftSiteVersion.Working }).getHeader(SET_COOKIE_HEADER);
|
|
51
|
+
res.removeHeader(SET_COOKIE_HEADER);
|
|
52
|
+
const parsedCookies = (0, import_set_cookie_parser.parse)(Array.isArray(setCookie) ? setCookie : "");
|
|
53
|
+
const prerenderBypassCookie = parsedCookies.find((c) => c.name === PRERENDER_BYPASS_COOKIE);
|
|
54
|
+
const previewDataCookie = parsedCookies.find((c) => c.name === PREVIEW_DATA_COOKIE);
|
|
55
|
+
if (prerenderBypassCookie?.value == null || previewDataCookie?.value == null) {
|
|
56
|
+
return res.status(500).send("Could not retrieve preview mode cookies");
|
|
57
|
+
}
|
|
58
|
+
const patchedCookies = [prerenderBypassCookie, previewDataCookie].map(
|
|
59
|
+
({ name, value, ...options }) => {
|
|
60
|
+
return (0, import_cookie.serialize)(name, value, {
|
|
61
|
+
...options,
|
|
62
|
+
sameSite: "none",
|
|
63
|
+
secure: true,
|
|
64
|
+
partitioned: true
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
res.setHeader(SET_COOKIE_HEADER, patchedCookies);
|
|
69
|
+
return res.json({ __brand: "PreviewModeResponse" });
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=preview-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/next/api-handler/handlers/preview-mode.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { parse as parseSetCookie } from 'set-cookie-parser'\nimport { serialize as serializeCookie } from 'cookie'\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\n\nconst SET_COOKIE_HEADER = 'set-cookie'\nconst PRERENDER_BYPASS_COOKIE = '__prerender_bypass'\nconst PREVIEW_DATA_COOKIE = '__next_preview_data'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype PreviewModeError = string\n\ntype Response = { __brand: 'PreviewModeResponse' }\n\nexport type PreviewModeResponse = PreviewModeError | Response\n\ntype PreviewModeHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<PreviewModeResponse>, params: { apiKey: string }]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nexport default async function previewModeHandler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<PreviewModeResponse>>\nexport default async function previewModeHandler(\n req: NextApiRequest,\n res: NextApiResponse<PreviewModeResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function previewModeHandler(\n ...args: PreviewModeHandlerArgs\n): Promise<NextResponse<PreviewModeResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, args => previewModeRouteHandler(...args))\n .with(apiRoutePattern, args => previewModeApiRouteHandler(...args))\n .exhaustive()\n}\n\nasync function previewModeRouteHandler(\n _request: NextRequest,\n _context: Context,\n {}: { apiKey: string },\n): Promise<NextResponse<PreviewModeResponse>> {\n const message =\n 'Cannot request preview endpoint from an API handler registered in `app`. Move your Makeswift API handler to the `pages/api` directory'\n console.error(message)\n return NextResponse.json(message, { status: 500 })\n}\n\nasync function previewModeApiRouteHandler(\n req: NextApiRequest,\n res: NextApiResponse<PreviewModeResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void> {\n const secret = req.query.secret\n\n if (secret == null) {\n return res.status(401).send('Unauthorized to enable preview mode: no secret provided')\n }\n if (secret !== apiKey) {\n return res.status(401).send('Unauthorized to enable preview mode: secret is incorrect')\n }\n\n // Eventually, we can make the preview data value dynamic using the request\n const setCookie = res\n .setPreviewData({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working })\n .getHeader(SET_COOKIE_HEADER)\n\n res.removeHeader(SET_COOKIE_HEADER)\n\n const parsedCookies = parseSetCookie(Array.isArray(setCookie) ? setCookie : '')\n\n const prerenderBypassCookie = parsedCookies.find(c => c.name === PRERENDER_BYPASS_COOKIE)\n const previewDataCookie = parsedCookies.find(c => c.name === PREVIEW_DATA_COOKIE)\n\n if (prerenderBypassCookie?.value == null || previewDataCookie?.value == null) {\n return res.status(500).send('Could not retrieve preview mode cookies')\n }\n\n const patchedCookies = [prerenderBypassCookie, previewDataCookie].map(\n ({ name, value, ...options }) => {\n return serializeCookie(name, value, {\n ...options,\n sameSite: 'none',\n secure: true,\n partitioned: true,\n })\n },\n )\n\n res.setHeader(SET_COOKIE_HEADER, patchedCookies)\n\n return res.json({ __brand: 'PreviewModeResponse' })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA0C;AAC1C,wBAAyB;AACzB,+BAAwC;AACxC,oBAA6C;AAC7C,0BAAqC;AAErC,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAChC,MAAM,sBAAsB;AAc5B,MAAM,sBAAsB,CAAC,oBAAE,WAAW,OAAO,GAAG,oBAAE,KAAK,oBAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,oBAAE,KAAK,oBAAE,KAAK,oBAAE,GAAG;AAY5C,eAAO,sBACF,MACgD;AACnD,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAAA,UAAQ,wBAAwB,GAAGA,KAAI,CAAC,EAClE,KAAK,iBAAiB,CAAAA,UAAQ,2BAA2B,GAAGA,KAAI,CAAC,EACjE,WAAW;AAChB;AAEA,eAAe,wBACb,UACA,UACA,CAAC,GAC2C;AAC5C,QAAM,UACJ;AACF,UAAQ,MAAM,OAAO;AACrB,SAAO,2BAAa,KAAK,SAAS,EAAE,QAAQ,IAAI,CAAC;AACnD;AAEA,eAAe,2BACb,KACA,KACA,EAAE,OAAO,GACM;AACf,QAAM,SAAS,IAAI,MAAM;AAEzB,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yDAAyD;AAAA,EACvF;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,0DAA0D;AAAA,EACxF;AAGA,QAAM,YAAY,IACf,eAAe,EAAE,WAAW,MAAM,aAAa,yCAAqB,QAAQ,CAAC,EAC7E,UAAU,iBAAiB;AAE9B,MAAI,aAAa,iBAAiB;AAElC,QAAM,oBAAgB,yBAAAC,OAAe,MAAM,QAAQ,SAAS,IAAI,YAAY,EAAE;AAE9E,QAAM,wBAAwB,cAAc,KAAK,OAAK,EAAE,SAAS,uBAAuB;AACxF,QAAM,oBAAoB,cAAc,KAAK,OAAK,EAAE,SAAS,mBAAmB;AAEhF,MAAI,uBAAuB,SAAS,QAAQ,mBAAmB,SAAS,MAAM;AAC5E,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yCAAyC;AAAA,EACvE;AAEA,QAAM,iBAAiB,CAAC,uBAAuB,iBAAiB,EAAE;AAAA,IAChE,CAAC,EAAE,MAAM,OAAO,GAAG,QAAQ,MAAM;AAC/B,iBAAO,cAAAC,WAAgB,MAAM,OAAO;AAAA,QAClC,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,mBAAmB,cAAc;AAE/C,SAAO,IAAI,KAAK,EAAE,SAAS,sBAAsB,CAAC;AACpD;","names":["args","parseSetCookie","serializeCookie"]}
|
|
@@ -40,6 +40,8 @@ var import_fonts = __toESM(require("./handlers/fonts"));
|
|
|
40
40
|
var import_manifest = __toESM(require("./handlers/manifest"));
|
|
41
41
|
var import_proxy_preview_mode = __toESM(require("./handlers/proxy-preview-mode"));
|
|
42
42
|
var import_proxy_draft_mode = __toESM(require("./handlers/proxy-draft-mode"));
|
|
43
|
+
var import_draft_mode = __toESM(require("./handlers/draft-mode"));
|
|
44
|
+
var import_preview_mode = __toESM(require("./handlers/preview-mode"));
|
|
43
45
|
var import_revalidate = require("./handlers/revalidate");
|
|
44
46
|
var import_translatable_data = __toESM(require("./handlers/translatable-data"));
|
|
45
47
|
var import_merge_translated_data = __toESM(require("./handlers/merge-translated-data"));
|
|
@@ -121,6 +123,12 @@ Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/d
|
|
|
121
123
|
if (matches("/proxy-draft-mode")) {
|
|
122
124
|
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_proxy_draft_mode.default)(...args2, { apiKey })).with(apiRoutePattern, (args2) => (0, import_proxy_draft_mode.default)(...args2, { apiKey })).exhaustive();
|
|
123
125
|
}
|
|
126
|
+
if (matches("/draft-mode")) {
|
|
127
|
+
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_draft_mode.default)(...args2, { apiKey })).with(apiRoutePattern, (args2) => (0, import_draft_mode.default)(...args2, { apiKey })).exhaustive();
|
|
128
|
+
}
|
|
129
|
+
if (matches("/preview-mode")) {
|
|
130
|
+
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_preview_mode.default)(...args2, { apiKey })).with(apiRoutePattern, (args2) => (0, import_preview_mode.default)(...args2, { apiKey })).exhaustive();
|
|
131
|
+
}
|
|
124
132
|
if (matches("/fonts")) {
|
|
125
133
|
return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_fonts.default)(...args2, { getFonts })).with(apiRoutePattern, (args2) => (0, import_fonts.default)(...args2, { getFonts })).exhaustive();
|
|
126
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/next/api-handler/index.ts"],"sourcesContent":["import Cors from 'cors'\nimport { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { Match, match as matchPattern } from 'path-to-regexp'\nimport { APIResource } from '../../api'\nimport { Makeswift } from '../client'\n\nimport elementTree, { ElementTreeResponse } from './handlers/element-tree'\nimport fonts, { Font, FontsResponse, GetFonts } from './handlers/fonts'\nimport manifest, { Manifest, ManifestResponse } from './handlers/manifest'\nimport proxyPreviewMode, { ProxyPreviewModeResponse } from './handlers/proxy-preview-mode'\nimport proxyDraftMode, { ProxyDraftModeResponse } from './handlers/proxy-draft-mode'\nimport { revalidate, RevalidationResponse } from './handlers/revalidate'\nimport translatableData, { TranslatableDataResponse } from './handlers/translatable-data'\nimport mergeTranslatedData, { TranslatedDataResponse } from './handlers/merge-translated-data'\nimport webhook from './handlers/webhook'\nimport { WebhookResponseBody } from './handlers/webhook/types'\nimport { ReactRuntime } from '../../react'\nimport { P, match } from 'ts-pattern'\nimport {\n API_HANDLER_SITE_VERSION_HEADER,\n MakeswiftSiteVersion,\n makeswiftSiteVersionSchema,\n} from '../../api/site-version'\n\nexport type { Manifest, Font }\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype MakeswiftApiHandlerConfig = {\n appOrigin?: string\n apiOrigin?: string\n getFonts?: GetFonts\n runtime: ReactRuntime\n}\n\ntype NotFoundError = { message: string }\n\nexport type MakeswiftApiHandlerResponse =\n | ManifestResponse\n | RevalidationResponse\n | ProxyPreviewModeResponse\n | ProxyDraftModeResponse\n | FontsResponse\n | ElementTreeResponse\n | TranslatableDataResponse\n | TranslatedDataResponse\n | APIResource\n | NotFoundError\n | WebhookResponseBody\n\ntype MakeswiftApiHandlerArgs =\n | [NextRequest, Context]\n | [NextApiRequest, NextApiResponse<MakeswiftApiHandlerResponse>]\n\nfunction apiRequestParams(request: NextApiRequest): Promise<NextApiRequest['query']> {\n // `NextApiRequest.query` prop became async in Next.js 15, but it's not reflected in the type definition;\n // force-casting it to a `Promise` manually\n return Promise.resolve(request.query)\n}\n\nexport function MakeswiftApiHandler(\n apiKey: string,\n {\n appOrigin = 'https://app.makeswift.com',\n apiOrigin = 'https://api.makeswift.com',\n getFonts,\n runtime,\n }: MakeswiftApiHandlerConfig,\n): (...args: MakeswiftApiHandlerArgs) => Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n const cors = Cors({ origin: appOrigin })\n\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift Next.js API handler must be passed a valid Makeswift site API key: ' +\n \"`MakeswiftApiHandler('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n const routeHandlerPattern = [P.instanceOf(Request), P.any] as const\n const apiRoutePattern = [P.any, P.any] as const\n\n return function handler(\n ...args: MakeswiftApiHandlerArgs\n ): Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, async args => {\n const response = await makeswiftApiHandler(...args)\n\n response.headers.append('Access-Control-Allow-Origin', appOrigin)\n response.headers.append('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')\n response.headers.append('Access-Control-Allow-Headers', 'Content-Type, Authorization')\n\n return response\n })\n .with(apiRoutePattern, async args => {\n const [req, res] = args\n\n await new Promise<void>((resolve, reject) => {\n cors(req, res, err => {\n if (err instanceof Error) reject(err)\n else resolve()\n })\n })\n\n return await makeswiftApiHandler(...args)\n })\n .exhaustive()\n }\n\n function getSiteVersionFromRequest(args: MakeswiftApiHandlerArgs): MakeswiftSiteVersion {\n const header = match(args)\n .with(routeHandlerPattern, ([request]) =>\n request.headers.get(API_HANDLER_SITE_VERSION_HEADER),\n )\n .with(apiRoutePattern, ([req]) => req.headers[API_HANDLER_SITE_VERSION_HEADER.toLowerCase()])\n .exhaustive()\n\n const parsed = makeswiftSiteVersionSchema.safeParse(header)\n if (!parsed.success) return MakeswiftSiteVersion.Live\n return parsed.data\n }\n\n async function makeswiftApiHandler(\n request: NextRequest,\n context: Context,\n ): Promise<NextResponse<MakeswiftApiHandlerResponse>>\n async function makeswiftApiHandler(\n req: NextApiRequest,\n res: NextApiResponse<MakeswiftApiHandlerResponse>,\n ): Promise<void>\n async function makeswiftApiHandler(\n ...args: MakeswiftApiHandlerArgs\n ): Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n const params = match(args)\n .with(routeHandlerPattern, ([, context]) => context.params)\n .with(apiRoutePattern, ([req]) => apiRequestParams(req))\n .exhaustive()\n\n const { makeswift } = await params\n\n if (!Array.isArray(makeswift)) {\n throw new Error(\n 'The Makeswift Next.js API handler must be used in a dynamic catch-all route named `[...makeswift]`.\\n' +\n `Received \"${makeswift}\" for the \\`makeswift\\` param instead.\\n` +\n 'Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes',\n )\n }\n\n const client = new Makeswift(apiKey, { apiOrigin, runtime })\n const siteVersion = getSiteVersionFromRequest(args)\n const action = '/' + makeswift.join('/')\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(action)\n\n let m\n\n if (matches('/manifest')) {\n return match(args)\n .with(routeHandlerPattern, args => manifest(...args, { apiKey }))\n .with(apiRoutePattern, args => manifest(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/revalidate')) {\n return match(args)\n .with(routeHandlerPattern, args => revalidate(...args, { apiKey }))\n .with(apiRoutePattern, args => revalidate(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/proxy-preview-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => proxyPreviewMode(...args, { apiKey }))\n .with(apiRoutePattern, args => proxyPreviewMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/proxy-draft-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => proxyDraftMode(...args, { apiKey }))\n .with(apiRoutePattern, args => proxyDraftMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/fonts')) {\n return match(args)\n .with(routeHandlerPattern, args => fonts(...args, { getFonts }))\n .with(apiRoutePattern, args => fonts(...args, { getFonts }))\n .exhaustive()\n }\n\n if (matches('/element-tree')) {\n return match(args)\n .with(routeHandlerPattern, args => elementTree(...args, runtime))\n .with(apiRoutePattern, args => elementTree(...args, runtime))\n .exhaustive()\n }\n\n if (matches('/translatable-data')) {\n return match(args)\n .with(routeHandlerPattern, args => translatableData(...args, client))\n .with(apiRoutePattern, args => translatableData(...args, client))\n .exhaustive()\n }\n\n if (matches('/merge-translated-data')) {\n return match(args)\n .with(routeHandlerPattern, args => mergeTranslatedData(...args, client))\n .with(apiRoutePattern, args => mergeTranslatedData(...args, client))\n .exhaustive()\n }\n\n if (matches('/webhook')) {\n return match(args)\n .with(routeHandlerPattern, args => webhook(...args, { apiKey }))\n .with(apiRoutePattern, args => webhook(...args, { apiKey }))\n .exhaustive()\n }\n\n const handleResource = <T extends APIResource>(\n resource: T | null,\n ): NextResponse<MakeswiftApiHandlerResponse> | void => {\n const status = resource === null ? 404 : 200\n const body = resource === null ? { message: 'Not Found' } : resource\n\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(body, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status).json(body))\n .exhaustive()\n }\n\n if ((m = matches<{ id: string }>('/swatches/:id'))) {\n return client.getSwatch(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/files/:id'))) {\n return client.getFile(m.params.id).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/typographies/:id'))) {\n return client.getTypography(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/global-elements/:id'))) {\n return client.getGlobalElement(m.params.id, siteVersion).then(handleResource)\n }\n\n if (\n (m = matches<{ globalElementId: string; locale: string }>(\n '/localized-global-elements/:globalElementId/:locale',\n ))\n ) {\n return client\n .getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion)\n .then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/page-pathname-slices/:id'))) {\n const localeParam = match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('locale'))\n .with(apiRoutePattern, ([req]) => req.query.locale)\n .exhaustive()\n const locale = typeof localeParam === 'string' ? localeParam : undefined\n\n return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/tables/:id'))) {\n return client.getTable(m.params.id).then(handleResource)\n }\n\n const status = 404\n const body = { message: 'Not Found' }\n\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(body, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status).json(body))\n .exhaustive()\n }\n}\n"],"mappings":"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","names":["Cors","args","matchPattern","manifest","proxyPreviewMode","proxyDraftMode","fonts","elementTree","translatableData","mergeTranslatedData","webhook","status","body"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/next/api-handler/index.ts"],"sourcesContent":["import Cors from 'cors'\nimport { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { Match, match as matchPattern } from 'path-to-regexp'\nimport { APIResource } from '../../api'\nimport { Makeswift } from '../client'\n\nimport elementTree, { ElementTreeResponse } from './handlers/element-tree'\nimport fonts, { Font, FontsResponse, GetFonts } from './handlers/fonts'\nimport manifest, { Manifest, ManifestResponse } from './handlers/manifest'\nimport proxyPreviewMode, { ProxyPreviewModeResponse } from './handlers/proxy-preview-mode'\nimport proxyDraftMode, { ProxyDraftModeResponse } from './handlers/proxy-draft-mode'\nimport draftMode, { type DraftModeResponse } from './handlers/draft-mode'\nimport previewMode, { type PreviewModeResponse } from './handlers/preview-mode'\nimport { revalidate, RevalidationResponse } from './handlers/revalidate'\nimport translatableData, { TranslatableDataResponse } from './handlers/translatable-data'\nimport mergeTranslatedData, { TranslatedDataResponse } from './handlers/merge-translated-data'\nimport webhook from './handlers/webhook'\nimport { WebhookResponseBody } from './handlers/webhook/types'\nimport { ReactRuntime } from '../../react'\nimport { P, match } from 'ts-pattern'\nimport {\n API_HANDLER_SITE_VERSION_HEADER,\n MakeswiftSiteVersion,\n makeswiftSiteVersionSchema,\n} from '../../api/site-version'\n\nexport type { Manifest, Font }\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype MakeswiftApiHandlerConfig = {\n appOrigin?: string\n apiOrigin?: string\n getFonts?: GetFonts\n runtime: ReactRuntime\n}\n\ntype NotFoundError = { message: string }\n\nexport type MakeswiftApiHandlerResponse =\n | ManifestResponse\n | RevalidationResponse\n | ProxyPreviewModeResponse\n | ProxyDraftModeResponse\n | DraftModeResponse\n | PreviewModeResponse\n | FontsResponse\n | ElementTreeResponse\n | TranslatableDataResponse\n | TranslatedDataResponse\n | APIResource\n | NotFoundError\n | WebhookResponseBody\n\ntype MakeswiftApiHandlerArgs =\n | [NextRequest, Context]\n | [NextApiRequest, NextApiResponse<MakeswiftApiHandlerResponse>]\n\nfunction apiRequestParams(request: NextApiRequest): Promise<NextApiRequest['query']> {\n // `NextApiRequest.query` prop became async in Next.js 15, but it's not reflected in the type definition;\n // force-casting it to a `Promise` manually\n return Promise.resolve(request.query)\n}\n\nexport function MakeswiftApiHandler(\n apiKey: string,\n {\n appOrigin = 'https://app.makeswift.com',\n apiOrigin = 'https://api.makeswift.com',\n getFonts,\n runtime,\n }: MakeswiftApiHandlerConfig,\n): (...args: MakeswiftApiHandlerArgs) => Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n const cors = Cors({ origin: appOrigin })\n\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift Next.js API handler must be passed a valid Makeswift site API key: ' +\n \"`MakeswiftApiHandler('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n const routeHandlerPattern = [P.instanceOf(Request), P.any] as const\n const apiRoutePattern = [P.any, P.any] as const\n\n return function handler(\n ...args: MakeswiftApiHandlerArgs\n ): Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, async args => {\n const response = await makeswiftApiHandler(...args)\n\n response.headers.append('Access-Control-Allow-Origin', appOrigin)\n response.headers.append('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')\n response.headers.append('Access-Control-Allow-Headers', 'Content-Type, Authorization')\n\n return response\n })\n .with(apiRoutePattern, async args => {\n const [req, res] = args\n\n await new Promise<void>((resolve, reject) => {\n cors(req, res, err => {\n if (err instanceof Error) reject(err)\n else resolve()\n })\n })\n\n return await makeswiftApiHandler(...args)\n })\n .exhaustive()\n }\n\n function getSiteVersionFromRequest(args: MakeswiftApiHandlerArgs): MakeswiftSiteVersion {\n const header = match(args)\n .with(routeHandlerPattern, ([request]) =>\n request.headers.get(API_HANDLER_SITE_VERSION_HEADER),\n )\n .with(apiRoutePattern, ([req]) => req.headers[API_HANDLER_SITE_VERSION_HEADER.toLowerCase()])\n .exhaustive()\n\n const parsed = makeswiftSiteVersionSchema.safeParse(header)\n if (!parsed.success) return MakeswiftSiteVersion.Live\n return parsed.data\n }\n\n async function makeswiftApiHandler(\n request: NextRequest,\n context: Context,\n ): Promise<NextResponse<MakeswiftApiHandlerResponse>>\n async function makeswiftApiHandler(\n req: NextApiRequest,\n res: NextApiResponse<MakeswiftApiHandlerResponse>,\n ): Promise<void>\n async function makeswiftApiHandler(\n ...args: MakeswiftApiHandlerArgs\n ): Promise<NextResponse<MakeswiftApiHandlerResponse> | void> {\n const params = match(args)\n .with(routeHandlerPattern, ([, context]) => context.params)\n .with(apiRoutePattern, ([req]) => apiRequestParams(req))\n .exhaustive()\n\n const { makeswift } = await params\n\n if (!Array.isArray(makeswift)) {\n throw new Error(\n 'The Makeswift Next.js API handler must be used in a dynamic catch-all route named `[...makeswift]`.\\n' +\n `Received \"${makeswift}\" for the \\`makeswift\\` param instead.\\n` +\n 'Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes',\n )\n }\n\n const client = new Makeswift(apiKey, { apiOrigin, runtime })\n const siteVersion = getSiteVersionFromRequest(args)\n const action = '/' + makeswift.join('/')\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(action)\n\n let m\n\n if (matches('/manifest')) {\n return match(args)\n .with(routeHandlerPattern, args => manifest(...args, { apiKey }))\n .with(apiRoutePattern, args => manifest(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/revalidate')) {\n return match(args)\n .with(routeHandlerPattern, args => revalidate(...args, { apiKey }))\n .with(apiRoutePattern, args => revalidate(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/proxy-preview-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => proxyPreviewMode(...args, { apiKey }))\n .with(apiRoutePattern, args => proxyPreviewMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/proxy-draft-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => proxyDraftMode(...args, { apiKey }))\n .with(apiRoutePattern, args => proxyDraftMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/draft-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => draftMode(...args, { apiKey }))\n .with(apiRoutePattern, args => draftMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/preview-mode')) {\n return match(args)\n .with(routeHandlerPattern, args => previewMode(...args, { apiKey }))\n .with(apiRoutePattern, args => previewMode(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/fonts')) {\n return match(args)\n .with(routeHandlerPattern, args => fonts(...args, { getFonts }))\n .with(apiRoutePattern, args => fonts(...args, { getFonts }))\n .exhaustive()\n }\n\n if (matches('/element-tree')) {\n return match(args)\n .with(routeHandlerPattern, args => elementTree(...args, runtime))\n .with(apiRoutePattern, args => elementTree(...args, runtime))\n .exhaustive()\n }\n\n if (matches('/translatable-data')) {\n return match(args)\n .with(routeHandlerPattern, args => translatableData(...args, client))\n .with(apiRoutePattern, args => translatableData(...args, client))\n .exhaustive()\n }\n\n if (matches('/merge-translated-data')) {\n return match(args)\n .with(routeHandlerPattern, args => mergeTranslatedData(...args, client))\n .with(apiRoutePattern, args => mergeTranslatedData(...args, client))\n .exhaustive()\n }\n\n if (matches('/webhook')) {\n return match(args)\n .with(routeHandlerPattern, args => webhook(...args, { apiKey }))\n .with(apiRoutePattern, args => webhook(...args, { apiKey }))\n .exhaustive()\n }\n\n const handleResource = <T extends APIResource>(\n resource: T | null,\n ): NextResponse<MakeswiftApiHandlerResponse> | void => {\n const status = resource === null ? 404 : 200\n const body = resource === null ? { message: 'Not Found' } : resource\n\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(body, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status).json(body))\n .exhaustive()\n }\n\n if ((m = matches<{ id: string }>('/swatches/:id'))) {\n return client.getSwatch(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/files/:id'))) {\n return client.getFile(m.params.id).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/typographies/:id'))) {\n return client.getTypography(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/global-elements/:id'))) {\n return client.getGlobalElement(m.params.id, siteVersion).then(handleResource)\n }\n\n if (\n (m = matches<{ globalElementId: string; locale: string }>(\n '/localized-global-elements/:globalElementId/:locale',\n ))\n ) {\n return client\n .getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion)\n .then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/page-pathname-slices/:id'))) {\n const localeParam = match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('locale'))\n .with(apiRoutePattern, ([req]) => req.query.locale)\n .exhaustive()\n const locale = typeof localeParam === 'string' ? localeParam : undefined\n\n return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/tables/:id'))) {\n return client.getTable(m.params.id).then(handleResource)\n }\n\n const status = 404\n const body = { message: 'Not Found' }\n\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(body, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status).json(body))\n .exhaustive()\n }\n}\n"],"mappings":"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","names":["Cors","args","matchPattern","manifest","proxyPreviewMode","proxyDraftMode","draftMode","previewMode","fonts","elementTree","translatableData","mergeTranslatedData","webhook","status","body"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var exceptions_exports = {};
|
|
20
|
+
__export(exceptions_exports, {
|
|
21
|
+
InvalidProxyRequestInputError: () => InvalidProxyRequestInputError,
|
|
22
|
+
InvariantDraftRequestError: () => InvariantDraftRequestError,
|
|
23
|
+
MiddlewareError: () => MiddlewareError,
|
|
24
|
+
MissingDraftEndpointError: () => MissingDraftEndpointError,
|
|
25
|
+
UnauthorizedDraftRequestError: () => UnauthorizedDraftRequestError,
|
|
26
|
+
UnknownDraftFetchRequestError: () => UnknownDraftFetchRequestError,
|
|
27
|
+
UnparseableDraftCookieResponseError: () => UnparseableDraftCookieResponseError
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(exceptions_exports);
|
|
30
|
+
class MiddlewareError extends Error {
|
|
31
|
+
constructor(message, options) {
|
|
32
|
+
super(message, options);
|
|
33
|
+
this.name = this.constructor.name;
|
|
34
|
+
Error.captureStackTrace(this, this.constructor);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
class InvariantDraftRequestError extends MiddlewareError {
|
|
38
|
+
}
|
|
39
|
+
class UnauthorizedDraftRequestError extends MiddlewareError {
|
|
40
|
+
}
|
|
41
|
+
class UnparseableDraftCookieResponseError extends MiddlewareError {
|
|
42
|
+
}
|
|
43
|
+
class MissingDraftEndpointError extends MiddlewareError {
|
|
44
|
+
}
|
|
45
|
+
class UnknownDraftFetchRequestError extends MiddlewareError {
|
|
46
|
+
}
|
|
47
|
+
class InvalidProxyRequestInputError extends MiddlewareError {
|
|
48
|
+
}
|
|
49
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
50
|
+
0 && (module.exports = {
|
|
51
|
+
InvalidProxyRequestInputError,
|
|
52
|
+
InvariantDraftRequestError,
|
|
53
|
+
MiddlewareError,
|
|
54
|
+
MissingDraftEndpointError,
|
|
55
|
+
UnauthorizedDraftRequestError,
|
|
56
|
+
UnknownDraftFetchRequestError,
|
|
57
|
+
UnparseableDraftCookieResponseError
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/next/middleware/exceptions.ts"],"sourcesContent":["export class MiddlewareError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = this.constructor.name\n\n Error.captureStackTrace(this, this.constructor)\n }\n}\n\nexport class InvariantDraftRequestError extends MiddlewareError {}\n\nexport class UnauthorizedDraftRequestError extends MiddlewareError {}\n\nexport class UnparseableDraftCookieResponseError extends MiddlewareError {}\n\nexport class MissingDraftEndpointError extends MiddlewareError {}\n\nexport class UnknownDraftFetchRequestError extends MiddlewareError {}\n\nexport class InvalidProxyRequestInputError extends MiddlewareError {}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,wBAAwB,MAAM;AAAA,EACzC,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO,KAAK,YAAY;AAE7B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAChD;AACF;AAEO,MAAM,mCAAmC,gBAAgB;AAAC;AAE1D,MAAM,sCAAsC,gBAAgB;AAAC;AAE7D,MAAM,4CAA4C,gBAAgB;AAAC;AAEnE,MAAM,kCAAkC,gBAAgB;AAAC;AAEzD,MAAM,sCAAsC,gBAAgB;AAAC;AAE7D,MAAM,sCAAsC,gBAAgB;AAAC;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var middleware_exports = {};
|
|
20
|
+
__export(middleware_exports, {
|
|
21
|
+
unstable_createMakeswiftDraftRequest: () => import_request_utils.createDraftRequest,
|
|
22
|
+
unstable_fetchMakeswiftDraftProxyResponse: () => import_request_utils.fetchDraftProxyResponse,
|
|
23
|
+
unstable_getMakeswiftDraftSecret: () => import_request_utils.getDraftSecret,
|
|
24
|
+
unstable_isDraftModeRequest: () => import_request_utils.isDraftModeRequest,
|
|
25
|
+
unstable_isPreviewModeRequest: () => import_request_utils.isPreviewModeRequest
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(middleware_exports);
|
|
28
|
+
var import_request_utils = require("./request-utils");
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
unstable_createMakeswiftDraftRequest,
|
|
32
|
+
unstable_fetchMakeswiftDraftProxyResponse,
|
|
33
|
+
unstable_getMakeswiftDraftSecret,
|
|
34
|
+
unstable_isDraftModeRequest,
|
|
35
|
+
unstable_isPreviewModeRequest
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/next/middleware/index.ts"],"sourcesContent":["export {\n isDraftModeRequest as unstable_isDraftModeRequest,\n isPreviewModeRequest as unstable_isPreviewModeRequest,\n getDraftSecret as unstable_getMakeswiftDraftSecret,\n createDraftRequest as unstable_createMakeswiftDraftRequest,\n fetchDraftProxyResponse as unstable_fetchMakeswiftDraftProxyResponse,\n} from './request-utils'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAMO;","names":[]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var request_utils_exports = {};
|
|
20
|
+
__export(request_utils_exports, {
|
|
21
|
+
createDraftRequest: () => createDraftRequest,
|
|
22
|
+
fetchDraftProxyResponse: () => fetchDraftProxyResponse,
|
|
23
|
+
getDraftSecret: () => getDraftSecret,
|
|
24
|
+
isDraftModeRequest: () => isDraftModeRequest,
|
|
25
|
+
isDraftRequest: () => isDraftRequest,
|
|
26
|
+
isPreviewModeRequest: () => isPreviewModeRequest
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(request_utils_exports);
|
|
29
|
+
var import_server = require("next/server");
|
|
30
|
+
var import_exceptions = require("./exceptions");
|
|
31
|
+
var import_set_cookie_parser = require("set-cookie-parser");
|
|
32
|
+
const HeaderNames = {
|
|
33
|
+
DraftMode: "X-Makeswift-Draft-Mode",
|
|
34
|
+
PreviewMode: "X-Makeswift-Preview-Mode"
|
|
35
|
+
};
|
|
36
|
+
const SearchParams = {
|
|
37
|
+
DraftMode: "x-makeswift-draft-mode",
|
|
38
|
+
PreviewMode: "x-makeswift-preview-mode"
|
|
39
|
+
};
|
|
40
|
+
const CookieRequestEndpoints = {
|
|
41
|
+
DraftMode: "/api/makeswift/draft-mode",
|
|
42
|
+
PreviewMode: "/api/makeswift/preview-mode"
|
|
43
|
+
};
|
|
44
|
+
function getDraftModeSecret(request) {
|
|
45
|
+
return request.nextUrl.searchParams.get(SearchParams.DraftMode) ?? request.headers.get(HeaderNames.DraftMode) ?? null;
|
|
46
|
+
}
|
|
47
|
+
function getPreviewModeSecret(request) {
|
|
48
|
+
return request.nextUrl.searchParams.get(SearchParams.PreviewMode) ?? request.headers.get(HeaderNames.PreviewMode) ?? null;
|
|
49
|
+
}
|
|
50
|
+
function isDraftModeRequest(request) {
|
|
51
|
+
return getDraftModeSecret(request) != null;
|
|
52
|
+
}
|
|
53
|
+
function isPreviewModeRequest(request) {
|
|
54
|
+
return getPreviewModeSecret(request) != null;
|
|
55
|
+
}
|
|
56
|
+
function isDraftRequest(request) {
|
|
57
|
+
return isDraftModeRequest(request) || isPreviewModeRequest(request);
|
|
58
|
+
}
|
|
59
|
+
function getDraftSecret(request) {
|
|
60
|
+
const draftSecret = getDraftModeSecret(request);
|
|
61
|
+
const previewSecret = getPreviewModeSecret(request);
|
|
62
|
+
if (draftSecret != null && previewSecret != null) {
|
|
63
|
+
throw new import_exceptions.InvariantDraftRequestError(
|
|
64
|
+
"Request can't include draft mode and preview mode secrets"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
return draftSecret ?? previewSecret;
|
|
68
|
+
}
|
|
69
|
+
async function fetchCookies(url, draftSecret) {
|
|
70
|
+
const requestUrl = new URL(url);
|
|
71
|
+
requestUrl.searchParams.set("secret", draftSecret);
|
|
72
|
+
const response = await fetch(requestUrl).then((res) => {
|
|
73
|
+
if (res.ok)
|
|
74
|
+
return res;
|
|
75
|
+
if (res.status === 401) {
|
|
76
|
+
throw new import_exceptions.UnauthorizedDraftRequestError(`Unauthorized draft request to ${url}`);
|
|
77
|
+
}
|
|
78
|
+
if (res.status === 404) {
|
|
79
|
+
throw new import_exceptions.MissingDraftEndpointError(
|
|
80
|
+
`Could not find draft endpoint at ${url}. Please make sure you properly registered a \`MakeswiftApiHandler\``
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
throw new import_exceptions.UnknownDraftFetchRequestError(
|
|
84
|
+
"Encountered unknown error while fetching draft cookies"
|
|
85
|
+
);
|
|
86
|
+
}).catch((err) => {
|
|
87
|
+
if (err instanceof import_exceptions.MiddlewareError)
|
|
88
|
+
throw err;
|
|
89
|
+
throw new import_exceptions.UnknownDraftFetchRequestError(
|
|
90
|
+
"Encountered unknown error while fetching draft cookies",
|
|
91
|
+
{ cause: err }
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
const setCookieHeader = response.headers.getSetCookie();
|
|
95
|
+
if (setCookieHeader.length <= 0) {
|
|
96
|
+
throw new import_exceptions.UnparseableDraftCookieResponseError(
|
|
97
|
+
"Received empty draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift"
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
return (0, import_set_cookie_parser.parse)(setCookieHeader);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
throw new import_exceptions.UnparseableDraftCookieResponseError(
|
|
104
|
+
"Could not parse draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift",
|
|
105
|
+
{ cause: err }
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function fetchDraftModeCookies(origin, draftSecret) {
|
|
110
|
+
return await fetchCookies(new URL(CookieRequestEndpoints.DraftMode, origin), draftSecret);
|
|
111
|
+
}
|
|
112
|
+
async function fetchPreviewModeCookies(origin, draftSecret) {
|
|
113
|
+
return await fetchCookies(new URL(CookieRequestEndpoints.PreviewMode, origin), draftSecret);
|
|
114
|
+
}
|
|
115
|
+
async function fetchDraftCookies(request, draftSecret) {
|
|
116
|
+
if (isDraftModeRequest(request)) {
|
|
117
|
+
return await fetchDraftModeCookies(request.nextUrl.origin, draftSecret);
|
|
118
|
+
} else if (isPreviewModeRequest(request)) {
|
|
119
|
+
return await fetchPreviewModeCookies(request.nextUrl.origin, draftSecret);
|
|
120
|
+
}
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
class MakeswiftDraftRequest extends import_server.NextRequest {
|
|
124
|
+
}
|
|
125
|
+
async function createDraftRequest(requestInit, apiKey) {
|
|
126
|
+
const requestSecret = getDraftSecret(requestInit);
|
|
127
|
+
if (requestSecret == null || requestSecret !== apiKey)
|
|
128
|
+
return null;
|
|
129
|
+
const draftCookies = await fetchDraftCookies(requestInit, requestSecret);
|
|
130
|
+
const draftRequest = new MakeswiftDraftRequest(requestInit, requestInit);
|
|
131
|
+
draftCookies.forEach(({ name, value }) => {
|
|
132
|
+
draftRequest.cookies.set(name, value);
|
|
133
|
+
});
|
|
134
|
+
draftRequest.nextUrl.searchParams.delete(SearchParams.DraftMode);
|
|
135
|
+
draftRequest.nextUrl.searchParams.delete(SearchParams.PreviewMode);
|
|
136
|
+
draftRequest.headers.delete(HeaderNames.DraftMode);
|
|
137
|
+
draftRequest.headers.delete(HeaderNames.PreviewMode);
|
|
138
|
+
return draftRequest;
|
|
139
|
+
}
|
|
140
|
+
async function fetchDraftProxyResponse(draftRequest) {
|
|
141
|
+
if (!(draftRequest instanceof MakeswiftDraftRequest)) {
|
|
142
|
+
throw new import_exceptions.InvalidProxyRequestInputError(
|
|
143
|
+
"Draft request must be instance of `MakeswiftDraftRequest`"
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
const proxyUrl = new URL(draftRequest.nextUrl, draftRequest.nextUrl.origin);
|
|
147
|
+
const proxyResponse = await fetch(proxyUrl, { headers: draftRequest.headers });
|
|
148
|
+
const response = new import_server.NextResponse(proxyResponse.body, {
|
|
149
|
+
headers: proxyResponse.headers,
|
|
150
|
+
status: proxyResponse.status
|
|
151
|
+
});
|
|
152
|
+
if (response.headers.has("content-encoding")) {
|
|
153
|
+
response.headers.delete("content-encoding");
|
|
154
|
+
response.headers.delete("content-length");
|
|
155
|
+
}
|
|
156
|
+
return response;
|
|
157
|
+
}
|
|
158
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
159
|
+
0 && (module.exports = {
|
|
160
|
+
createDraftRequest,
|
|
161
|
+
fetchDraftProxyResponse,
|
|
162
|
+
getDraftSecret,
|
|
163
|
+
isDraftModeRequest,
|
|
164
|
+
isDraftRequest,
|
|
165
|
+
isPreviewModeRequest
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=request-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/next/middleware/request-utils.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport {\n InvalidProxyRequestInputError,\n InvariantDraftRequestError,\n MiddlewareError,\n MissingDraftEndpointError,\n UnauthorizedDraftRequestError,\n UnknownDraftFetchRequestError,\n UnparseableDraftCookieResponseError,\n} from './exceptions'\n\nimport { type Cookie, parse as parseSetCookie } from 'set-cookie-parser'\n\nconst HeaderNames = {\n DraftMode: 'X-Makeswift-Draft-Mode',\n PreviewMode: 'X-Makeswift-Preview-Mode',\n} as const\n\nconst SearchParams = {\n DraftMode: 'x-makeswift-draft-mode',\n PreviewMode: 'x-makeswift-preview-mode',\n} as const\n\nconst CookieRequestEndpoints = {\n DraftMode: '/api/makeswift/draft-mode',\n PreviewMode: '/api/makeswift/preview-mode',\n} as const\n\nfunction getDraftModeSecret(request: NextRequest): string | null {\n return (\n request.nextUrl.searchParams.get(SearchParams.DraftMode) ??\n request.headers.get(HeaderNames.DraftMode) ??\n null\n )\n}\n\nfunction getPreviewModeSecret(request: NextRequest): string | null {\n return (\n request.nextUrl.searchParams.get(SearchParams.PreviewMode) ??\n request.headers.get(HeaderNames.PreviewMode) ??\n null\n )\n}\n\nexport function isDraftModeRequest(request: NextRequest): boolean {\n return getDraftModeSecret(request) != null\n}\n\nexport function isPreviewModeRequest(request: NextRequest): boolean {\n return getPreviewModeSecret(request) != null\n}\n\nexport function isDraftRequest(request: NextRequest): boolean {\n return isDraftModeRequest(request) || isPreviewModeRequest(request)\n}\n\nexport function getDraftSecret(request: NextRequest): string | null {\n const draftSecret = getDraftModeSecret(request)\n const previewSecret = getPreviewModeSecret(request)\n if (draftSecret != null && previewSecret != null) {\n throw new InvariantDraftRequestError(\n \"Request can't include draft mode and preview mode secrets\",\n )\n }\n return draftSecret ?? previewSecret\n}\n\nasync function fetchCookies(url: URL, draftSecret: string): Promise<Cookie[]> {\n const requestUrl = new URL(url)\n requestUrl.searchParams.set('secret', draftSecret)\n\n const response = await fetch(requestUrl)\n .then(res => {\n if (res.ok) return res\n if (res.status === 401) {\n throw new UnauthorizedDraftRequestError(`Unauthorized draft request to ${url}`)\n }\n if (res.status === 404) {\n throw new MissingDraftEndpointError(\n `Could not find draft endpoint at ${url}. Please make sure you properly registered a \\`MakeswiftApiHandler\\``,\n )\n }\n throw new UnknownDraftFetchRequestError(\n 'Encountered unknown error while fetching draft cookies',\n )\n })\n .catch((err: unknown) => {\n if (err instanceof MiddlewareError) throw err\n throw new UnknownDraftFetchRequestError(\n 'Encountered unknown error while fetching draft cookies',\n { cause: err },\n )\n })\n\n const setCookieHeader = response.headers.getSetCookie()\n\n if (setCookieHeader.length <= 0) {\n throw new UnparseableDraftCookieResponseError(\n \"Received empty draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift\",\n )\n }\n\n try {\n return parseSetCookie(setCookieHeader)\n } catch (err) {\n throw new UnparseableDraftCookieResponseError(\n \"Could not parse draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift\",\n { cause: err },\n )\n }\n}\n\nasync function fetchDraftModeCookies(origin: string, draftSecret: string): Promise<Cookie[]> {\n return await fetchCookies(new URL(CookieRequestEndpoints.DraftMode, origin), draftSecret)\n}\n\nasync function fetchPreviewModeCookies(origin: string, draftSecret: string): Promise<Cookie[]> {\n return await fetchCookies(new URL(CookieRequestEndpoints.PreviewMode, origin), draftSecret)\n}\n\nasync function fetchDraftCookies(request: NextRequest, draftSecret: string): Promise<Cookie[]> {\n if (isDraftModeRequest(request)) {\n return await fetchDraftModeCookies(request.nextUrl.origin, draftSecret)\n } else if (isPreviewModeRequest(request)) {\n return await fetchPreviewModeCookies(request.nextUrl.origin, draftSecret)\n }\n\n return []\n}\n\nclass MakeswiftDraftRequest extends NextRequest {}\n\n/**\n * Creates a new `NextRequest` that can be used for fetching a working version\n * of the page (that will also bypass the Vercel cache). Returns `null` if the\n * given request does not have a draft secret that matches the `apiKey`.\n */\nexport async function createDraftRequest(\n requestInit: NextRequest,\n apiKey: string,\n): Promise<MakeswiftDraftRequest | null> {\n const requestSecret = getDraftSecret(requestInit)\n\n if (requestSecret == null || requestSecret !== apiKey) return null\n\n const draftCookies = await fetchDraftCookies(requestInit, requestSecret)\n\n // https://github.com/vercel/next.js/issues/52967#issuecomment-1644675602\n // if we don't pass request twice, headers are stripped\n const draftRequest = new MakeswiftDraftRequest(requestInit, requestInit)\n\n draftCookies.forEach(({ name, value }) => {\n draftRequest.cookies.set(name, value)\n })\n\n draftRequest.nextUrl.searchParams.delete(SearchParams.DraftMode)\n draftRequest.nextUrl.searchParams.delete(SearchParams.PreviewMode)\n draftRequest.headers.delete(HeaderNames.DraftMode)\n draftRequest.headers.delete(HeaderNames.PreviewMode)\n\n return draftRequest\n}\n\nexport async function fetchDraftProxyResponse(\n draftRequest: MakeswiftDraftRequest,\n): Promise<NextResponse> {\n if (!(draftRequest instanceof MakeswiftDraftRequest)) {\n throw new InvalidProxyRequestInputError(\n 'Draft request must be instance of `MakeswiftDraftRequest`',\n )\n }\n // Passing `draftRequest.nextUrl` to fetch directly won't work when deployed\n // on Vercel - it results in a `TypeError: Invalid URL` error. Constructing\n // the URL works.\n const proxyUrl = new URL(draftRequest.nextUrl, draftRequest.nextUrl.origin)\n const proxyResponse = await fetch(proxyUrl, { headers: draftRequest.headers })\n\n const response = new NextResponse(proxyResponse.body, {\n headers: proxyResponse.headers,\n status: proxyResponse.status,\n })\n\n // `fetch` automatically decompresses the response, but the response headers\n // will keep the `content-encoding` and `content-length` headers. This will\n // cause decoding issues if the client attempts to decompress the response\n // again. To prevent this, we remove these headers.\n //\n // See https://github.com/nodejs/undici/issues/2514.\n if (response.headers.has('content-encoding')) {\n response.headers.delete('content-encoding')\n response.headers.delete('content-length')\n }\n\n return response\n}\n"],"mappings":"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","names":["parseSetCookie"]}
|