@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.
Files changed (41) hide show
  1. package/dist/cjs/next/api-handler/handlers/draft-mode.js +78 -0
  2. package/dist/cjs/next/api-handler/handlers/draft-mode.js.map +1 -0
  3. package/dist/cjs/next/api-handler/handlers/manifest.js +1 -1
  4. package/dist/cjs/next/api-handler/handlers/preview-mode.js +71 -0
  5. package/dist/cjs/next/api-handler/handlers/preview-mode.js.map +1 -0
  6. package/dist/cjs/next/api-handler/index.js +8 -0
  7. package/dist/cjs/next/api-handler/index.js.map +1 -1
  8. package/dist/cjs/next/middleware/exceptions.js +59 -0
  9. package/dist/cjs/next/middleware/exceptions.js.map +1 -0
  10. package/dist/cjs/next/middleware/index.js +37 -0
  11. package/dist/cjs/next/middleware/index.js.map +1 -0
  12. package/dist/cjs/next/middleware/request-utils.js +167 -0
  13. package/dist/cjs/next/middleware/request-utils.js.map +1 -0
  14. package/dist/esm/next/api-handler/handlers/draft-mode.js +58 -0
  15. package/dist/esm/next/api-handler/handlers/draft-mode.js.map +1 -0
  16. package/dist/esm/next/api-handler/handlers/manifest.js +1 -1
  17. package/dist/esm/next/api-handler/handlers/preview-mode.js +51 -0
  18. package/dist/esm/next/api-handler/handlers/preview-mode.js.map +1 -0
  19. package/dist/esm/next/api-handler/index.js +8 -0
  20. package/dist/esm/next/api-handler/index.js.map +1 -1
  21. package/dist/esm/next/middleware/exceptions.js +29 -0
  22. package/dist/esm/next/middleware/exceptions.js.map +1 -0
  23. package/dist/esm/next/middleware/index.js +15 -0
  24. package/dist/esm/next/middleware/index.js.map +1 -0
  25. package/dist/esm/next/middleware/request-utils.js +146 -0
  26. package/dist/esm/next/middleware/request-utils.js.map +1 -0
  27. package/dist/types/next/api-handler/handlers/draft-mode.d.ts +20 -0
  28. package/dist/types/next/api-handler/handlers/draft-mode.d.ts.map +1 -0
  29. package/dist/types/next/api-handler/handlers/preview-mode.d.ts +20 -0
  30. package/dist/types/next/api-handler/handlers/preview-mode.d.ts.map +1 -0
  31. package/dist/types/next/api-handler/index.d.ts +3 -1
  32. package/dist/types/next/api-handler/index.d.ts.map +1 -1
  33. package/dist/types/next/middleware/exceptions.d.ts +16 -0
  34. package/dist/types/next/middleware/exceptions.d.ts.map +1 -0
  35. package/dist/types/next/middleware/index.d.ts +2 -0
  36. package/dist/types/next/middleware/index.d.ts.map +1 -0
  37. package/dist/types/next/middleware/request-utils.d.ts +16 -0
  38. package/dist/types/next/middleware/request-utils.d.ts.map +1 -0
  39. package/dist/types/next/middleware/request-utils.test.d.ts +2 -0
  40. package/dist/types/next/middleware/request-utils.test.d.ts.map +1 -0
  41. package/package.json +11 -2
@@ -0,0 +1,58 @@
1
+ import { NextResponse } from "next/server";
2
+ import { P, match } from "ts-pattern";
3
+ import { cookies, draftMode } from "next/headers";
4
+ import { MakeswiftSiteVersion } from "../../../api/site-version";
5
+ const PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
6
+ const DRAFT_DATA_COOKIE = "x-makeswift-draft-data";
7
+ const routeHandlerPattern = [P.instanceOf(Request), P.any, P.any];
8
+ const apiRoutePattern = [P.any, P.any, P.any];
9
+ async function draftModeHandler(...args) {
10
+ return match(args).with(routeHandlerPattern, (args2) => draftModeRouteHandler(...args2)).with(apiRoutePattern, (args2) => draftModeApiRouteHandler(...args2)).exhaustive();
11
+ }
12
+ async function draftModeRouteHandler(request, _context, { apiKey }) {
13
+ const secret = request.nextUrl.searchParams.get("secret");
14
+ if (secret == null) {
15
+ return new NextResponse("Unauthorized to enable draft mode: no secret provided", {
16
+ status: 401
17
+ });
18
+ }
19
+ if (secret !== apiKey) {
20
+ return new NextResponse("Unauthorized to enable draft mode: incorrect secret", { status: 401 });
21
+ }
22
+ const draft = await draftMode();
23
+ const cookieStore = await cookies();
24
+ draft.enable();
25
+ const bypassCookie = cookieStore.get(PRERENDER_BYPASS_COOKIE);
26
+ if (bypassCookie?.value == null) {
27
+ return new NextResponse("Could not retrieve draft mode bypass cookie", { status: 500 });
28
+ }
29
+ cookieStore.set({
30
+ name: bypassCookie.name,
31
+ value: bypassCookie.value,
32
+ sameSite: "none",
33
+ secure: true,
34
+ partitioned: true
35
+ });
36
+ cookieStore.set({
37
+ name: DRAFT_DATA_COOKIE,
38
+ // Eventually, we can make the value dynamic using the request
39
+ value: JSON.stringify({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working }),
40
+ sameSite: "none",
41
+ secure: true,
42
+ partitioned: true
43
+ });
44
+ const siteVersionCookie = cookieStore.get(DRAFT_DATA_COOKIE);
45
+ if (siteVersionCookie?.value == null) {
46
+ return new NextResponse("Could not retrieve draft mode site version cookie", { status: 500 });
47
+ }
48
+ return NextResponse.json({ __brand: "DraftModeResponse" });
49
+ }
50
+ async function draftModeApiRouteHandler(_req, res, {}) {
51
+ const message = "Cannot request draft endpoint from an API handler registered in `pages`. Move your Makeswift API handler to the `app` directory";
52
+ console.error(message);
53
+ return res.status(500).send(message);
54
+ }
55
+ export {
56
+ draftModeHandler as default
57
+ };
58
+ //# 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":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AACzB,SAAS,SAAS,iBAAiB;AACnC,SAAS,4BAA4B;AAErC,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAc1B,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAY5C,eAAO,oBACF,MAC8C;AACjD,SAAO,MAAM,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,aAAa,yDAAyD;AAAA,MAC/E,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,aAAa,uDAAuD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAChG;AAEA,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,cAAc,MAAM,QAAQ;AAElC,QAAM,OAAO;AAEb,QAAM,eAAe,YAAY,IAAI,uBAAuB;AAE5D,MAAI,cAAc,SAAS,MAAM;AAC/B,WAAO,IAAI,aAAa,+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,qBAAqB,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,aAAa,qDAAqD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9F;AAEA,SAAO,aAAa,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"]}
@@ -14,7 +14,7 @@ async function handler(...args) {
14
14
  const supportsDraftMode = match(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
15
15
  const supportsWebhook = match(args).with(routeHandlerPattern, () => true).with(apiRoutePattern, () => false).exhaustive();
16
16
  const body = {
17
- version: "0.23.8-canary.0",
17
+ version: "0.23.8",
18
18
  previewMode: supportsPreviewMode,
19
19
  draftMode: supportsDraftMode,
20
20
  interactionMode: true,
@@ -0,0 +1,51 @@
1
+ import { NextResponse } from "next/server";
2
+ import { P, match } from "ts-pattern";
3
+ import { parse as parseSetCookie } from "set-cookie-parser";
4
+ import { serialize as serializeCookie } from "cookie";
5
+ import { MakeswiftSiteVersion } from "../../../api/site-version";
6
+ const SET_COOKIE_HEADER = "set-cookie";
7
+ const PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
8
+ const PREVIEW_DATA_COOKIE = "__next_preview_data";
9
+ const routeHandlerPattern = [P.instanceOf(Request), P.any, P.any];
10
+ const apiRoutePattern = [P.any, P.any, P.any];
11
+ async function previewModeHandler(...args) {
12
+ return match(args).with(routeHandlerPattern, (args2) => previewModeRouteHandler(...args2)).with(apiRoutePattern, (args2) => previewModeApiRouteHandler(...args2)).exhaustive();
13
+ }
14
+ async function previewModeRouteHandler(_request, _context, {}) {
15
+ const message = "Cannot request preview endpoint from an API handler registered in `app`. Move your Makeswift API handler to the `pages/api` directory";
16
+ console.error(message);
17
+ return NextResponse.json(message, { status: 500 });
18
+ }
19
+ async function previewModeApiRouteHandler(req, res, { apiKey }) {
20
+ const secret = req.query.secret;
21
+ if (secret == null) {
22
+ return res.status(401).send("Unauthorized to enable preview mode: no secret provided");
23
+ }
24
+ if (secret !== apiKey) {
25
+ return res.status(401).send("Unauthorized to enable preview mode: secret is incorrect");
26
+ }
27
+ const setCookie = res.setPreviewData({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working }).getHeader(SET_COOKIE_HEADER);
28
+ res.removeHeader(SET_COOKIE_HEADER);
29
+ const parsedCookies = parseSetCookie(Array.isArray(setCookie) ? setCookie : "");
30
+ const prerenderBypassCookie = parsedCookies.find((c) => c.name === PRERENDER_BYPASS_COOKIE);
31
+ const previewDataCookie = parsedCookies.find((c) => c.name === PREVIEW_DATA_COOKIE);
32
+ if (prerenderBypassCookie?.value == null || previewDataCookie?.value == null) {
33
+ return res.status(500).send("Could not retrieve preview mode cookies");
34
+ }
35
+ const patchedCookies = [prerenderBypassCookie, previewDataCookie].map(
36
+ ({ name, value, ...options }) => {
37
+ return serializeCookie(name, value, {
38
+ ...options,
39
+ sameSite: "none",
40
+ secure: true,
41
+ partitioned: true
42
+ });
43
+ }
44
+ );
45
+ res.setHeader(SET_COOKIE_HEADER, patchedCookies);
46
+ return res.json({ __brand: "PreviewModeResponse" });
47
+ }
48
+ export {
49
+ previewModeHandler as default
50
+ };
51
+ //# 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":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AACzB,SAAS,SAAS,sBAAsB;AACxC,SAAS,aAAa,uBAAuB;AAC7C,SAAS,4BAA4B;AAErC,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAChC,MAAM,sBAAsB;AAc5B,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAY5C,eAAO,sBACF,MACgD;AACnD,SAAO,MAAM,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,aAAa,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,qBAAqB,QAAQ,CAAC,EAC7E,UAAU,iBAAiB;AAE9B,MAAI,aAAa,iBAAiB;AAElC,QAAM,gBAAgB,eAAe,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,aAAO,gBAAgB,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"]}
@@ -7,6 +7,8 @@ import fonts from "./handlers/fonts";
7
7
  import manifest from "./handlers/manifest";
8
8
  import proxyPreviewMode from "./handlers/proxy-preview-mode";
9
9
  import proxyDraftMode from "./handlers/proxy-draft-mode";
10
+ import draftMode from "./handlers/draft-mode";
11
+ import previewMode from "./handlers/preview-mode";
10
12
  import { revalidate } from "./handlers/revalidate";
11
13
  import translatableData from "./handlers/translatable-data";
12
14
  import mergeTranslatedData from "./handlers/merge-translated-data";
@@ -92,6 +94,12 @@ Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/d
92
94
  if (matches("/proxy-draft-mode")) {
93
95
  return match(args).with(routeHandlerPattern, (args2) => proxyDraftMode(...args2, { apiKey })).with(apiRoutePattern, (args2) => proxyDraftMode(...args2, { apiKey })).exhaustive();
94
96
  }
97
+ if (matches("/draft-mode")) {
98
+ return match(args).with(routeHandlerPattern, (args2) => draftMode(...args2, { apiKey })).with(apiRoutePattern, (args2) => draftMode(...args2, { apiKey })).exhaustive();
99
+ }
100
+ if (matches("/preview-mode")) {
101
+ return match(args).with(routeHandlerPattern, (args2) => previewMode(...args2, { apiKey })).with(apiRoutePattern, (args2) => previewMode(...args2, { apiKey })).exhaustive();
102
+ }
95
103
  if (matches("/fonts")) {
96
104
  return match(args).with(routeHandlerPattern, (args2) => fonts(...args2, { getFonts })).with(apiRoutePattern, (args2) => fonts(...args2, { getFonts })).exhaustive();
97
105
  }
@@ -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":["args","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":["args","status","body"]}
@@ -0,0 +1,29 @@
1
+ class MiddlewareError extends Error {
2
+ constructor(message, options) {
3
+ super(message, options);
4
+ this.name = this.constructor.name;
5
+ Error.captureStackTrace(this, this.constructor);
6
+ }
7
+ }
8
+ class InvariantDraftRequestError extends MiddlewareError {
9
+ }
10
+ class UnauthorizedDraftRequestError extends MiddlewareError {
11
+ }
12
+ class UnparseableDraftCookieResponseError extends MiddlewareError {
13
+ }
14
+ class MissingDraftEndpointError extends MiddlewareError {
15
+ }
16
+ class UnknownDraftFetchRequestError extends MiddlewareError {
17
+ }
18
+ class InvalidProxyRequestInputError extends MiddlewareError {
19
+ }
20
+ export {
21
+ InvalidProxyRequestInputError,
22
+ InvariantDraftRequestError,
23
+ MiddlewareError,
24
+ MissingDraftEndpointError,
25
+ UnauthorizedDraftRequestError,
26
+ UnknownDraftFetchRequestError,
27
+ UnparseableDraftCookieResponseError
28
+ };
29
+ //# 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":"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,15 @@
1
+ import {
2
+ isDraftModeRequest,
3
+ isPreviewModeRequest,
4
+ getDraftSecret,
5
+ createDraftRequest,
6
+ fetchDraftProxyResponse
7
+ } from "./request-utils";
8
+ export {
9
+ createDraftRequest as unstable_createMakeswiftDraftRequest,
10
+ fetchDraftProxyResponse as unstable_fetchMakeswiftDraftProxyResponse,
11
+ getDraftSecret as unstable_getMakeswiftDraftSecret,
12
+ isDraftModeRequest as unstable_isDraftModeRequest,
13
+ isPreviewModeRequest as unstable_isPreviewModeRequest
14
+ };
15
+ //# 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,EACwB;AAAA,EACE;AAAA,EACN;AAAA,EACI;AAAA,EACK;AAAA,OACtB;","names":[]}
@@ -0,0 +1,146 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ import {
3
+ InvalidProxyRequestInputError,
4
+ InvariantDraftRequestError,
5
+ MiddlewareError,
6
+ MissingDraftEndpointError,
7
+ UnauthorizedDraftRequestError,
8
+ UnknownDraftFetchRequestError,
9
+ UnparseableDraftCookieResponseError
10
+ } from "./exceptions";
11
+ import { parse as parseSetCookie } from "set-cookie-parser";
12
+ const HeaderNames = {
13
+ DraftMode: "X-Makeswift-Draft-Mode",
14
+ PreviewMode: "X-Makeswift-Preview-Mode"
15
+ };
16
+ const SearchParams = {
17
+ DraftMode: "x-makeswift-draft-mode",
18
+ PreviewMode: "x-makeswift-preview-mode"
19
+ };
20
+ const CookieRequestEndpoints = {
21
+ DraftMode: "/api/makeswift/draft-mode",
22
+ PreviewMode: "/api/makeswift/preview-mode"
23
+ };
24
+ function getDraftModeSecret(request) {
25
+ return request.nextUrl.searchParams.get(SearchParams.DraftMode) ?? request.headers.get(HeaderNames.DraftMode) ?? null;
26
+ }
27
+ function getPreviewModeSecret(request) {
28
+ return request.nextUrl.searchParams.get(SearchParams.PreviewMode) ?? request.headers.get(HeaderNames.PreviewMode) ?? null;
29
+ }
30
+ function isDraftModeRequest(request) {
31
+ return getDraftModeSecret(request) != null;
32
+ }
33
+ function isPreviewModeRequest(request) {
34
+ return getPreviewModeSecret(request) != null;
35
+ }
36
+ function isDraftRequest(request) {
37
+ return isDraftModeRequest(request) || isPreviewModeRequest(request);
38
+ }
39
+ function getDraftSecret(request) {
40
+ const draftSecret = getDraftModeSecret(request);
41
+ const previewSecret = getPreviewModeSecret(request);
42
+ if (draftSecret != null && previewSecret != null) {
43
+ throw new InvariantDraftRequestError(
44
+ "Request can't include draft mode and preview mode secrets"
45
+ );
46
+ }
47
+ return draftSecret ?? previewSecret;
48
+ }
49
+ async function fetchCookies(url, draftSecret) {
50
+ const requestUrl = new URL(url);
51
+ requestUrl.searchParams.set("secret", draftSecret);
52
+ const response = await fetch(requestUrl).then((res) => {
53
+ if (res.ok)
54
+ return res;
55
+ if (res.status === 401) {
56
+ throw new UnauthorizedDraftRequestError(`Unauthorized draft request to ${url}`);
57
+ }
58
+ if (res.status === 404) {
59
+ throw new MissingDraftEndpointError(
60
+ `Could not find draft endpoint at ${url}. Please make sure you properly registered a \`MakeswiftApiHandler\``
61
+ );
62
+ }
63
+ throw new UnknownDraftFetchRequestError(
64
+ "Encountered unknown error while fetching draft cookies"
65
+ );
66
+ }).catch((err) => {
67
+ if (err instanceof MiddlewareError)
68
+ throw err;
69
+ throw new UnknownDraftFetchRequestError(
70
+ "Encountered unknown error while fetching draft cookies",
71
+ { cause: err }
72
+ );
73
+ });
74
+ const setCookieHeader = response.headers.getSetCookie();
75
+ if (setCookieHeader.length <= 0) {
76
+ throw new UnparseableDraftCookieResponseError(
77
+ "Received empty draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift"
78
+ );
79
+ }
80
+ try {
81
+ return parseSetCookie(setCookieHeader);
82
+ } catch (err) {
83
+ throw new UnparseableDraftCookieResponseError(
84
+ "Could not parse draft cookies. If you're seeing this error, please report a bug to https://github.com/makeswift/makeswift",
85
+ { cause: err }
86
+ );
87
+ }
88
+ }
89
+ async function fetchDraftModeCookies(origin, draftSecret) {
90
+ return await fetchCookies(new URL(CookieRequestEndpoints.DraftMode, origin), draftSecret);
91
+ }
92
+ async function fetchPreviewModeCookies(origin, draftSecret) {
93
+ return await fetchCookies(new URL(CookieRequestEndpoints.PreviewMode, origin), draftSecret);
94
+ }
95
+ async function fetchDraftCookies(request, draftSecret) {
96
+ if (isDraftModeRequest(request)) {
97
+ return await fetchDraftModeCookies(request.nextUrl.origin, draftSecret);
98
+ } else if (isPreviewModeRequest(request)) {
99
+ return await fetchPreviewModeCookies(request.nextUrl.origin, draftSecret);
100
+ }
101
+ return [];
102
+ }
103
+ class MakeswiftDraftRequest extends NextRequest {
104
+ }
105
+ async function createDraftRequest(requestInit, apiKey) {
106
+ const requestSecret = getDraftSecret(requestInit);
107
+ if (requestSecret == null || requestSecret !== apiKey)
108
+ return null;
109
+ const draftCookies = await fetchDraftCookies(requestInit, requestSecret);
110
+ const draftRequest = new MakeswiftDraftRequest(requestInit, requestInit);
111
+ draftCookies.forEach(({ name, value }) => {
112
+ draftRequest.cookies.set(name, value);
113
+ });
114
+ draftRequest.nextUrl.searchParams.delete(SearchParams.DraftMode);
115
+ draftRequest.nextUrl.searchParams.delete(SearchParams.PreviewMode);
116
+ draftRequest.headers.delete(HeaderNames.DraftMode);
117
+ draftRequest.headers.delete(HeaderNames.PreviewMode);
118
+ return draftRequest;
119
+ }
120
+ async function fetchDraftProxyResponse(draftRequest) {
121
+ if (!(draftRequest instanceof MakeswiftDraftRequest)) {
122
+ throw new InvalidProxyRequestInputError(
123
+ "Draft request must be instance of `MakeswiftDraftRequest`"
124
+ );
125
+ }
126
+ const proxyUrl = new URL(draftRequest.nextUrl, draftRequest.nextUrl.origin);
127
+ const proxyResponse = await fetch(proxyUrl, { headers: draftRequest.headers });
128
+ const response = new NextResponse(proxyResponse.body, {
129
+ headers: proxyResponse.headers,
130
+ status: proxyResponse.status
131
+ });
132
+ if (response.headers.has("content-encoding")) {
133
+ response.headers.delete("content-encoding");
134
+ response.headers.delete("content-length");
135
+ }
136
+ return response;
137
+ }
138
+ export {
139
+ createDraftRequest,
140
+ fetchDraftProxyResponse,
141
+ getDraftSecret,
142
+ isDraftModeRequest,
143
+ isDraftRequest,
144
+ isPreviewModeRequest
145
+ };
146
+ //# 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":[]}
@@ -0,0 +1,20 @@
1
+ import { NextApiRequest, NextApiResponse } from 'next';
2
+ import { NextRequest, NextResponse } from 'next/server';
3
+ type Context = {
4
+ params: {
5
+ [key: string]: string | string[];
6
+ };
7
+ };
8
+ type DraftModeError = string;
9
+ type Response = {
10
+ __brand: 'DraftModeResponse';
11
+ };
12
+ export type DraftModeResponse = DraftModeError | Response;
13
+ export default function draftModeHandler(request: NextRequest, context: Context, { apiKey }: {
14
+ apiKey: string;
15
+ }): Promise<NextResponse<DraftModeResponse>>;
16
+ export default function draftModeHandler(req: NextApiRequest, res: NextApiResponse<DraftModeResponse>, { apiKey }: {
17
+ apiKey: string;
18
+ }): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=draft-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-mode.d.ts","sourceRoot":"","sources":["../../../../../src/next/api-handler/handlers/draft-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAQvD,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,KAAK,cAAc,GAAG,MAAM,CAAA;AAE5B,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAEhD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,QAAQ,CAAA;AASzD,wBAA8B,gBAAgB,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAC3C,wBAA8B,gBAAgB,CAC5C,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,CAAC,iBAAiB,CAAC,EACvC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { NextApiRequest, NextApiResponse } from 'next';
2
+ import { NextRequest, NextResponse } from 'next/server';
3
+ type Context = {
4
+ params: {
5
+ [key: string]: string | string[];
6
+ };
7
+ };
8
+ type PreviewModeError = string;
9
+ type Response = {
10
+ __brand: 'PreviewModeResponse';
11
+ };
12
+ export type PreviewModeResponse = PreviewModeError | Response;
13
+ export default function previewModeHandler(request: NextRequest, context: Context, { apiKey }: {
14
+ apiKey: string;
15
+ }): Promise<NextResponse<PreviewModeResponse>>;
16
+ export default function previewModeHandler(req: NextApiRequest, res: NextApiResponse<PreviewModeResponse>, { apiKey }: {
17
+ apiKey: string;
18
+ }): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=preview-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-mode.d.ts","sourceRoot":"","sources":["../../../../../src/next/api-handler/handlers/preview-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAUvD,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,KAAK,gBAAgB,GAAG,MAAM,CAAA;AAE9B,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,qBAAqB,CAAA;CAAE,CAAA;AAElD,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,QAAQ,CAAA;AAS7D,wBAA8B,kBAAkB,CAC9C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAA;AAC7C,wBAA8B,kBAAkB,CAC9C,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,CAAC,mBAAmB,CAAC,EACzC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -6,6 +6,8 @@ import { Font, FontsResponse, GetFonts } from './handlers/fonts';
6
6
  import { Manifest, ManifestResponse } from './handlers/manifest';
7
7
  import { ProxyPreviewModeResponse } from './handlers/proxy-preview-mode';
8
8
  import { ProxyDraftModeResponse } from './handlers/proxy-draft-mode';
9
+ import { type DraftModeResponse } from './handlers/draft-mode';
10
+ import { type PreviewModeResponse } from './handlers/preview-mode';
9
11
  import { RevalidationResponse } from './handlers/revalidate';
10
12
  import { TranslatableDataResponse } from './handlers/translatable-data';
11
13
  import { TranslatedDataResponse } from './handlers/merge-translated-data';
@@ -26,7 +28,7 @@ type MakeswiftApiHandlerConfig = {
26
28
  type NotFoundError = {
27
29
  message: string;
28
30
  };
29
- export type MakeswiftApiHandlerResponse = ManifestResponse | RevalidationResponse | ProxyPreviewModeResponse | ProxyDraftModeResponse | FontsResponse | ElementTreeResponse | TranslatableDataResponse | TranslatedDataResponse | APIResource | NotFoundError | WebhookResponseBody;
31
+ export type MakeswiftApiHandlerResponse = ManifestResponse | RevalidationResponse | ProxyPreviewModeResponse | ProxyDraftModeResponse | DraftModeResponse | PreviewModeResponse | FontsResponse | ElementTreeResponse | TranslatableDataResponse | TranslatedDataResponse | APIResource | NotFoundError | WebhookResponseBody;
30
32
  type MakeswiftApiHandlerArgs = [NextRequest, Context] | [NextApiRequest, NextApiResponse<MakeswiftApiHandlerResponse>];
31
33
  export declare function MakeswiftApiHandler(apiKey: string, { appOrigin, apiOrigin, getFonts, runtime, }: MakeswiftApiHandlerConfig): (...args: MakeswiftApiHandlerArgs) => Promise<NextResponse<MakeswiftApiHandlerResponse> | void>;
32
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/next/api-handler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGvC,OAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAc,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAyB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC1F,OAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAO,EAAc,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAyB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACzF,OAA4B,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAE9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAQ1C,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAE9B,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,KAAK,yBAAyB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,OAAO,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,KAAK,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAExC,MAAM,MAAM,2BAA2B,GACnC,gBAAgB,GAChB,oBAAoB,GACpB,wBAAwB,GACxB,sBAAsB,GACtB,aAAa,GACb,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,WAAW,GACX,aAAa,GACb,mBAAmB,CAAA;AAEvB,KAAK,uBAAuB,GACxB,CAAC,WAAW,EAAE,OAAO,CAAC,GACtB,CAAC,cAAc,EAAE,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAA;AAQlE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,EACE,SAAuC,EACvC,SAAuC,EACvC,QAAQ,EACR,OAAO,GACR,EAAE,yBAAyB,GAC3B,CAAC,GAAG,IAAI,EAAE,uBAAuB,KAAK,OAAO,CAAC,YAAY,CAAC,2BAA2B,CAAC,GAAG,IAAI,CAAC,CAoNjG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/next/api-handler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGvC,OAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAc,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAyB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC1F,OAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAc,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAyB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACzF,OAA4B,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAE9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAQ1C,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAE9B,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,KAAK,yBAAyB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,OAAO,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,KAAK,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAExC,MAAM,MAAM,2BAA2B,GACnC,gBAAgB,GAChB,oBAAoB,GACpB,wBAAwB,GACxB,sBAAsB,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,aAAa,GACb,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,WAAW,GACX,aAAa,GACb,mBAAmB,CAAA;AAEvB,KAAK,uBAAuB,GACxB,CAAC,WAAW,EAAE,OAAO,CAAC,GACtB,CAAC,cAAc,EAAE,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAA;AAQlE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,EACE,SAAuC,EACvC,SAAuC,EACvC,QAAQ,EACR,OAAO,GACR,EAAE,yBAAyB,GAC3B,CAAC,GAAG,IAAI,EAAE,uBAAuB,KAAK,OAAO,CAAC,YAAY,CAAC,2BAA2B,CAAC,GAAG,IAAI,CAAC,CAkOjG"}
@@ -0,0 +1,16 @@
1
+ export declare class MiddlewareError extends Error {
2
+ constructor(message: string, options?: ErrorOptions);
3
+ }
4
+ export declare class InvariantDraftRequestError extends MiddlewareError {
5
+ }
6
+ export declare class UnauthorizedDraftRequestError extends MiddlewareError {
7
+ }
8
+ export declare class UnparseableDraftCookieResponseError extends MiddlewareError {
9
+ }
10
+ export declare class MissingDraftEndpointError extends MiddlewareError {
11
+ }
12
+ export declare class UnknownDraftFetchRequestError extends MiddlewareError {
13
+ }
14
+ export declare class InvalidProxyRequestInputError extends MiddlewareError {
15
+ }
16
+ //# sourceMappingURL=exceptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../../../src/next/middleware/exceptions.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAMpD;AAED,qBAAa,0BAA2B,SAAQ,eAAe;CAAG;AAElE,qBAAa,6BAA8B,SAAQ,eAAe;CAAG;AAErE,qBAAa,mCAAoC,SAAQ,eAAe;CAAG;AAE3E,qBAAa,yBAA0B,SAAQ,eAAe;CAAG;AAEjE,qBAAa,6BAA8B,SAAQ,eAAe;CAAG;AAErE,qBAAa,6BAA8B,SAAQ,eAAe;CAAG"}
@@ -0,0 +1,2 @@
1
+ export { isDraftModeRequest as unstable_isDraftModeRequest, isPreviewModeRequest as unstable_isPreviewModeRequest, getDraftSecret as unstable_getMakeswiftDraftSecret, createDraftRequest as unstable_createMakeswiftDraftRequest, fetchDraftProxyResponse as unstable_fetchMakeswiftDraftProxyResponse, } from './request-utils';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/next/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,IAAI,2BAA2B,EACjD,oBAAoB,IAAI,6BAA6B,EACrD,cAAc,IAAI,gCAAgC,EAClD,kBAAkB,IAAI,oCAAoC,EAC1D,uBAAuB,IAAI,yCAAyC,GACrE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ export declare function isDraftModeRequest(request: NextRequest): boolean;
3
+ export declare function isPreviewModeRequest(request: NextRequest): boolean;
4
+ export declare function isDraftRequest(request: NextRequest): boolean;
5
+ export declare function getDraftSecret(request: NextRequest): string | null;
6
+ declare class MakeswiftDraftRequest extends NextRequest {
7
+ }
8
+ /**
9
+ * Creates a new `NextRequest` that can be used for fetching a working version
10
+ * of the page (that will also bypass the Vercel cache). Returns `null` if the
11
+ * given request does not have a draft secret that matches the `apiKey`.
12
+ */
13
+ export declare function createDraftRequest(requestInit: NextRequest, apiKey: string): Promise<MakeswiftDraftRequest | null>;
14
+ export declare function fetchDraftProxyResponse(draftRequest: MakeswiftDraftRequest): Promise<NextResponse>;
15
+ export {};
16
+ //# sourceMappingURL=request-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-utils.d.ts","sourceRoot":"","sources":["../../../../src/next/middleware/request-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA4CvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAElE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CASlE;AAiED,cAAM,qBAAsB,SAAQ,WAAW;CAAG;AAElD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAqBvC;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=request-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-utils.test.d.ts","sourceRoot":"","sources":["../../../../src/next/middleware/request-utils.test.ts"],"names":[],"mappings":""}