@makeswift/runtime 0.23.12-canary.4 → 0.23.12

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 (33) hide show
  1. package/dist/cjs/next/api-handler/handlers/manifest.js +1 -1
  2. package/dist/cjs/next/api-handler/handlers/webhook/index.js +3 -3
  3. package/dist/cjs/next/api-handler/handlers/webhook/index.js.map +1 -1
  4. package/dist/cjs/next/api-handler/handlers/webhook/site-published.js +6 -1
  5. package/dist/cjs/next/api-handler/handlers/webhook/site-published.js.map +1 -1
  6. package/dist/cjs/next/api-handler/handlers/webhook/types.js.map +1 -1
  7. package/dist/cjs/next/api-handler/index.js +2 -1
  8. package/dist/cjs/next/api-handler/index.js.map +1 -1
  9. package/dist/cjs/next/tests/test-utils.js +61 -0
  10. package/dist/cjs/next/tests/test-utils.js.map +1 -0
  11. package/dist/esm/next/api-handler/handlers/manifest.js +1 -1
  12. package/dist/esm/next/api-handler/handlers/webhook/index.js +3 -3
  13. package/dist/esm/next/api-handler/handlers/webhook/index.js.map +1 -1
  14. package/dist/esm/next/api-handler/handlers/webhook/site-published.js +6 -1
  15. package/dist/esm/next/api-handler/handlers/webhook/site-published.js.map +1 -1
  16. package/dist/esm/next/api-handler/handlers/webhook/types.js.map +1 -1
  17. package/dist/esm/next/api-handler/index.js +2 -1
  18. package/dist/esm/next/api-handler/index.js.map +1 -1
  19. package/dist/esm/next/tests/test-utils.js +37 -0
  20. package/dist/esm/next/tests/test-utils.js.map +1 -0
  21. package/dist/types/next/api-handler/handlers/webhook/index.d.ts +9 -11
  22. package/dist/types/next/api-handler/handlers/webhook/index.d.ts.map +1 -1
  23. package/dist/types/next/api-handler/handlers/webhook/site-published.d.ts +6 -2
  24. package/dist/types/next/api-handler/handlers/webhook/site-published.d.ts.map +1 -1
  25. package/dist/types/next/api-handler/handlers/webhook/types.d.ts +1 -0
  26. package/dist/types/next/api-handler/handlers/webhook/types.d.ts.map +1 -1
  27. package/dist/types/next/api-handler/index.d.ts +6 -2
  28. package/dist/types/next/api-handler/index.d.ts.map +1 -1
  29. package/dist/types/next/tests/server.makeswift-api-handler.test.d.ts +2 -0
  30. package/dist/types/next/tests/server.makeswift-api-handler.test.d.ts.map +1 -0
  31. package/dist/types/next/tests/test-utils.d.ts +8 -0
  32. package/dist/types/next/tests/test-utils.d.ts.map +1 -0
  33. package/package.json +4 -3
@@ -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.12-canary.4",
40
+ version: "0.23.12",
41
41
  previewMode: supportsPreviewMode,
42
42
  draftMode: supportsDraftMode,
43
43
  interactionMode: true,
@@ -34,10 +34,10 @@ function getRequestBody(args) {
34
34
  return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, ([request]) => request.json()).with(apiRoutePattern, ([req]) => req.body).exhaustive();
35
35
  }
36
36
  function respond(args, response, status) {
37
- return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => import_server.NextResponse.json(response, { status })).with(apiRoutePattern, ([, res]) => res.json(response)).exhaustive();
37
+ return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, () => import_server.NextResponse.json(response, { status })).with(apiRoutePattern, ([, res]) => res.status(status ?? 200).json(response)).exhaustive();
38
38
  }
39
39
  async function handler(...args) {
40
- const [, , { apiKey }] = args;
40
+ const [, , { apiKey, events }] = args;
41
41
  const secret = getSecret(args);
42
42
  if (secret !== apiKey)
43
43
  return respond(args, { message: "Unauthorized" }, 401);
@@ -49,7 +49,7 @@ async function handler(...args) {
49
49
  console.error(error);
50
50
  return respond(args, { message: "Invalid request body" }, 400);
51
51
  }
52
- const result = (0, import_ts_pattern.match)(payload.type).with(import_types.WebhookEventType.SITE_PUBLISHED, () => (0, import_site_published.handleSitePublished)(payload)).exhaustive();
52
+ const result = await (0, import_ts_pattern.match)(payload.type).with(import_types.WebhookEventType.SITE_PUBLISHED, () => (0, import_site_published.handleSitePublished)(payload, { onPublish: events?.onPublish })).exhaustive();
53
53
  return respond(args, result.body, result.status);
54
54
  }
55
55
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { handleSitePublished } from './site-published'\nimport {\n sitePublishedWebhookPayloadSchema,\n WebhookEventType,\n WebhookPayloadSchema,\n WebhookResponseBody,\n} from './types'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\nexport type WebhookHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, 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\nfunction getSecret(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('secret'))\n .with(apiRoutePattern, ([req]) => req.query.secret)\n .exhaustive()\n}\n\nfunction getRequestBody(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.json())\n .with(apiRoutePattern, ([req]) => req.body)\n .exhaustive()\n}\n\nfunction respond(args: WebhookHandlerArgs, response: WebhookResponseBody, status?: number) {\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(response, { status }))\n .with(apiRoutePattern, ([, res]) => res.json(response))\n .exhaustive()\n}\n\nexport default async function handler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<WebhookResponseBody>>\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse<WebhookResponseBody>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function handler(\n ...args: WebhookHandlerArgs\n): Promise<NextResponse<WebhookResponseBody> | void> {\n const [, , { apiKey }] = args\n const secret = getSecret(args)\n\n if (secret !== apiKey) return respond(args, { message: 'Unauthorized' }, 401)\n\n let payload: WebhookPayloadSchema\n\n try {\n const body = await getRequestBody(args)\n payload = sitePublishedWebhookPayloadSchema.parse(body)\n } catch (error) {\n console.error(error)\n return respond(args, { message: 'Invalid request body' }, 400)\n }\n\n const result = match(payload.type)\n .with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload))\n .exhaustive()\n\n return respond(args, result.body, result.status)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA0C;AAC1C,wBAAyB;AACzB,4BAAoC;AACpC,mBAKO;AAQP,MAAM,sBAAsB,CAAC,oBAAE,WAAW,OAAO,GAAG,oBAAE,KAAK,oBAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,oBAAE,KAAK,oBAAE,KAAK,oBAAE,GAAG;AAE5C,SAAS,UAAU,MAA0B;AAC3C,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ,CAAC,EACnF,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,MAAM,EACjD,WAAW;AAChB;AAEA,SAAS,eAAe,MAA0B;AAChD,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,CAAC,EACvD,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EACzC,WAAW;AAChB;AAEA,SAAS,QAAQ,MAA0B,UAA+B,QAAiB;AACzF,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,MAAM,2BAAa,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,EACvE,KAAK,iBAAiB,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,KAAK,QAAQ,CAAC,EACrD,WAAW;AAChB;AAYA,eAAO,WACF,MACgD;AACnD,QAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI;AACzB,QAAM,SAAS,UAAU,IAAI;AAE7B,MAAI,WAAW;AAAQ,WAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,GAAG,GAAG;AAE5E,MAAI;AAEJ,MAAI;AACF,UAAM,OAAO,MAAM,eAAe,IAAI;AACtC,cAAU,+CAAkC,MAAM,IAAI;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AACnB,WAAO,QAAQ,MAAM,EAAE,SAAS,uBAAuB,GAAG,GAAG;AAAA,EAC/D;AAEA,QAAM,aAAS,yBAAM,QAAQ,IAAI,EAC9B,KAAK,8BAAiB,gBAAgB,UAAM,2CAAoB,OAAO,CAAC,EACxE,WAAW;AAEd,SAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { handleSitePublished } from './site-published'\nimport {\n OnPublish,\n sitePublishedWebhookPayloadSchema,\n WebhookEventType,\n WebhookPayloadSchema,\n WebhookResponseBody,\n} from './types'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype WebhookParams = {\n apiKey: string,\n events?: { onPublish?: OnPublish },\n}\n\nexport type WebhookHandlerArgs =\n | [request: NextRequest, context: Context, params: WebhookParams]\n | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, params: WebhookParams]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nfunction getSecret(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('secret'))\n .with(apiRoutePattern, ([req]) => req.query.secret)\n .exhaustive()\n}\n\nfunction getRequestBody(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.json())\n .with(apiRoutePattern, ([req]) => req.body)\n .exhaustive()\n}\n\nfunction respond(args: WebhookHandlerArgs, response: WebhookResponseBody, status?: number) {\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(response, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status ?? 200).json(response))\n .exhaustive()\n}\n\nexport default async function handler(\n request: NextRequest,\n context: Context,\n { apiKey, events }: WebhookParams,\n): Promise<NextResponse<WebhookResponseBody>>\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse<WebhookResponseBody>,\n { apiKey, events }: WebhookParams,\n): Promise<void>\nexport default async function handler(\n ...args: WebhookHandlerArgs\n): Promise<NextResponse<WebhookResponseBody> | void> {\n const [, , { apiKey, events }] = args\n const secret = getSecret(args)\n\n if (secret !== apiKey) return respond(args, { message: 'Unauthorized' }, 401)\n\n let payload: WebhookPayloadSchema\n\n try {\n const body = await getRequestBody(args)\n payload = sitePublishedWebhookPayloadSchema.parse(body)\n } catch (error) {\n console.error(error)\n return respond(args, { message: 'Invalid request body' }, 400)\n }\n\n const result = await match(payload.type)\n .with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload, { onPublish: events?.onPublish }))\n .exhaustive()\n\n return respond(args, result.body, result.status)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA0C;AAC1C,wBAAyB;AACzB,4BAAoC;AACpC,mBAMO;AAaP,MAAM,sBAAsB,CAAC,oBAAE,WAAW,OAAO,GAAG,oBAAE,KAAK,oBAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,oBAAE,KAAK,oBAAE,KAAK,oBAAE,GAAG;AAE5C,SAAS,UAAU,MAA0B;AAC3C,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ,CAAC,EACnF,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,MAAM,EACjD,WAAW;AAChB;AAEA,SAAS,eAAe,MAA0B;AAChD,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,CAAC,EACvD,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EACzC,WAAW;AAChB;AAEA,SAAS,QAAQ,MAA0B,UAA+B,QAAiB;AACzF,aAAO,yBAAM,IAAI,EACd,KAAK,qBAAqB,MAAM,2BAAa,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,EACvE,KAAK,iBAAiB,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,KAAK,QAAQ,CAAC,EAC3E,WAAW;AAChB;AAYA,eAAO,WACF,MACgD;AACnD,QAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,OAAO,CAAC,IAAI;AACjC,QAAM,SAAS,UAAU,IAAI;AAE7B,MAAI,WAAW;AAAQ,WAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,GAAG,GAAG;AAE5E,MAAI;AAEJ,MAAI;AACF,UAAM,OAAO,MAAM,eAAe,IAAI;AACtC,cAAU,+CAAkC,MAAM,IAAI;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AACnB,WAAO,QAAQ,MAAM,EAAE,SAAS,uBAAuB,GAAG,GAAG;AAAA,EAC/D;AAEA,QAAM,SAAS,UAAM,yBAAM,QAAQ,IAAI,EACpC,KAAK,8BAAiB,gBAAgB,UAAM,2CAAoB,SAAS,EAAE,WAAW,QAAQ,UAAU,CAAC,CAAC,EAC1G,WAAW;AAEd,SAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;AACjD;","names":[]}
@@ -23,8 +23,13 @@ __export(site_published_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(site_published_exports);
25
25
  var import_cache = require("next/cache");
26
- function handleSitePublished(_payload) {
26
+ async function handleSitePublished(_payload, { onPublish }) {
27
27
  (0, import_cache.revalidateTag)(MAKESWIFT_CACHE_TAG);
28
+ try {
29
+ await onPublish?.();
30
+ } catch (error) {
31
+ console.error("Unhandled exception in the 'onPublish' callback:", error);
32
+ }
28
33
  return { body: { success: true }, status: 200 };
29
34
  }
30
35
  const MAKESWIFT_CACHE_TAG = "@@makeswift";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"sourcesContent":["import { revalidateTag } from 'next/cache'\nimport { SitePublishedWebhookPayload, WebhookHandlerResult } from './types'\n\nexport function handleSitePublished(_payload: SitePublishedWebhookPayload): WebhookHandlerResult {\n revalidateTag(MAKESWIFT_CACHE_TAG)\n\n return { body: { success: true }, status: 200 }\n}\n\nexport const MAKESWIFT_CACHE_TAG = '@@makeswift'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAGvB,SAAS,oBAAoB,UAA6D;AAC/F,kCAAc,mBAAmB;AAEjC,SAAO,EAAE,MAAM,EAAE,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD;AAEO,MAAM,sBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"sourcesContent":["import { revalidateTag } from 'next/cache'\nimport { OnPublish, SitePublishedWebhookPayload, WebhookHandlerResult } from './types'\n\ntype SitePublishedParams = {\n onPublish?: OnPublish\n}\n\nexport async function handleSitePublished(\n _payload: SitePublishedWebhookPayload,\n { onPublish }: SitePublishedParams\n): Promise<WebhookHandlerResult> {\n revalidateTag(MAKESWIFT_CACHE_TAG)\n\n try {\n await onPublish?.()\n } catch (error) {\n // log and ignore any error in user-provided onPublish\n console.error(\"Unhandled exception in the 'onPublish' callback:\", error)\n }\n\n return { body: { success: true }, status: 200 }\n}\n\nexport const MAKESWIFT_CACHE_TAG = '@@makeswift'\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAO9B,eAAsB,oBACpB,UACA,EAAE,UAAU,GACmB;AAC/B,kCAAc,mBAAmB;AAEjC,MAAI;AACF,UAAM,YAAY;AAAA,EACpB,SAAS,OAAO;AAEd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AAEA,SAAO,EAAE,MAAM,EAAE,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD;AAEO,MAAM,sBAAsB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const WebhookEventType = {\n SITE_PUBLISHED: 'site.published',\n} as const\n\nexport const sitePublishedWebhookPayloadSchema = z.object({\n type: z.literal(WebhookEventType.SITE_PUBLISHED),\n data: z.object({\n siteId: z.string().uuid(),\n publish: z.object({\n from: z.string().uuid().nullable(),\n to: z.string().uuid(),\n }),\n at: z.number(),\n }),\n})\n\nexport type SitePublishedWebhookPayload = z.infer<typeof sitePublishedWebhookPayloadSchema>\n\nconst webhookPayloadSchema = sitePublishedWebhookPayloadSchema\n\nexport type WebhookPayloadSchema = z.infer<typeof webhookPayloadSchema>\n\ntype WebhookSuccessBody = { success: true }\n\ntype WebhookErrorBody = { message: string }\n\nexport type WebhookResponseBody = WebhookSuccessBody | WebhookErrorBody\n\nexport type WebhookHandlerResult = {\n body: WebhookResponseBody\n status: 200\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAEX,MAAM,mBAAmB;AAAA,EAC9B,gBAAgB;AAClB;AAEO,MAAM,oCAAoC,aAAE,OAAO;AAAA,EACxD,MAAM,aAAE,QAAQ,iBAAiB,cAAc;AAAA,EAC/C,MAAM,aAAE,OAAO;AAAA,IACb,QAAQ,aAAE,OAAO,EAAE,KAAK;AAAA,IACxB,SAAS,aAAE,OAAO;AAAA,MAChB,MAAM,aAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACjC,IAAI,aAAE,OAAO,EAAE,KAAK;AAAA,IACtB,CAAC;AAAA,IACD,IAAI,aAAE,OAAO;AAAA,EACf,CAAC;AACH,CAAC;AAID,MAAM,uBAAuB;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const WebhookEventType = {\n SITE_PUBLISHED: 'site.published',\n} as const\n\nexport const sitePublishedWebhookPayloadSchema = z.object({\n type: z.literal(WebhookEventType.SITE_PUBLISHED),\n data: z.object({\n siteId: z.string().uuid(),\n publish: z.object({\n from: z.string().uuid().nullable(),\n to: z.string().uuid(),\n }),\n at: z.number(),\n }),\n})\n\nexport type SitePublishedWebhookPayload = z.infer<typeof sitePublishedWebhookPayloadSchema>\n\nconst webhookPayloadSchema = sitePublishedWebhookPayloadSchema\n\nexport type WebhookPayloadSchema = z.infer<typeof webhookPayloadSchema>\n\ntype WebhookSuccessBody = { success: true }\n\ntype WebhookErrorBody = { message: string }\n\nexport type WebhookResponseBody = WebhookSuccessBody | WebhookErrorBody\n\nexport type WebhookHandlerResult = {\n body: WebhookResponseBody\n status: 200\n}\n\nexport type OnPublish = () => void | Promise<void>\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAEX,MAAM,mBAAmB;AAAA,EAC9B,gBAAgB;AAClB;AAEO,MAAM,oCAAoC,aAAE,OAAO;AAAA,EACxD,MAAM,aAAE,QAAQ,iBAAiB,cAAc;AAAA,EAC/C,MAAM,aAAE,OAAO;AAAA,IACb,QAAQ,aAAE,OAAO,EAAE,KAAK;AAAA,IACxB,SAAS,aAAE,OAAO;AAAA,MAChB,MAAM,aAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACjC,IAAI,aAAE,OAAO,EAAE,KAAK;AAAA,IACtB,CAAC;AAAA,IACD,IAAI,aAAE,OAAO;AAAA,EACf,CAAC;AACH,CAAC;AAID,MAAM,uBAAuB;","names":[]}
@@ -55,6 +55,7 @@ function MakeswiftApiHandler(apiKey, {
55
55
  appOrigin = "https://app.makeswift.com",
56
56
  apiOrigin = "https://api.makeswift.com",
57
57
  getFonts,
58
+ events,
58
59
  runtime
59
60
  }) {
60
61
  const cors = (0, import_cors.default)({ origin: appOrigin });
@@ -142,7 +143,7 @@ Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/d
142
143
  return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_merge_translated_data.default)(...args2, client)).with(apiRoutePattern, (args2) => (0, import_merge_translated_data.default)(...args2, client)).exhaustive();
143
144
  }
144
145
  if (matches("/webhook")) {
145
- return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_webhook.default)(...args2, { apiKey })).with(apiRoutePattern, (args2) => (0, import_webhook.default)(...args2, { apiKey })).exhaustive();
146
+ return (0, import_ts_pattern.match)(args).with(routeHandlerPattern, (args2) => (0, import_webhook.default)(...args2, { apiKey, events })).with(apiRoutePattern, (args2) => (0, import_webhook.default)(...args2, { apiKey, events })).exhaustive();
146
147
  }
147
148
  const handleResource = (resource) => {
148
149
  const status2 = resource === null ? 404 : 200;
@@ -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 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"]}
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 { OnPublish, 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 Events = { onPublish: OnPublish }\n\ntype MakeswiftApiHandlerConfig = {\n appOrigin?: string\n apiOrigin?: string\n getFonts?: GetFonts\n events?: Events\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 events,\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, events }))\n .with(apiRoutePattern, args => webhook(...args, { apiKey, events }))\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,61 @@
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 test_utils_exports = {};
20
+ __export(test_utils_exports, {
21
+ createNextApiRequest: () => createNextApiRequest
22
+ });
23
+ module.exports = __toCommonJS(test_utils_exports);
24
+ var import_node_mocks_http = require("node-mocks-http");
25
+ function urlToQuery(url) {
26
+ const segments = url.pathname.split("/").filter(Boolean);
27
+ if (segments.length === 0)
28
+ return {};
29
+ if (segments.length === 1)
30
+ return [segments[0]];
31
+ let structure = {};
32
+ let current = structure;
33
+ for (let i = 0; i < segments.length - 2; i++) {
34
+ current[segments[i]] = {};
35
+ current = current[segments[i]];
36
+ }
37
+ current[segments[segments.length - 2]] = [segments[segments.length - 1]];
38
+ return {
39
+ ...structure,
40
+ ...Object.fromEntries(
41
+ url.searchParams.entries()
42
+ )
43
+ };
44
+ }
45
+ function createNextApiRequest({
46
+ method,
47
+ path,
48
+ body
49
+ }) {
50
+ return (0, import_node_mocks_http.createRequest)({
51
+ method,
52
+ url: path,
53
+ query: urlToQuery(new URL(path, "http://localhost")),
54
+ body
55
+ });
56
+ }
57
+ // Annotate the CommonJS export names for ESM import in node:
58
+ 0 && (module.exports = {
59
+ createNextApiRequest
60
+ });
61
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/next/tests/test-utils.ts"],"sourcesContent":["import { NextApiRequest } from \"next\"\nimport { createRequest, RequestMethod } from \"node-mocks-http\"\n\ntype Query = { [key: string]: Query } | string[]\n\nfunction urlToQuery(url: URL): Query {\n const segments = url.pathname.split('/').filter(Boolean)\n\n if (segments.length === 0) return {}\n if (segments.length === 1) return [segments[0]]\n\n let structure: { [key: string]: any } = {}\n let current = structure\n\n for (let i = 0; i < segments.length - 2; i++) {\n current[segments[i]] = {}\n current = current[segments[i]]\n }\n\n current[segments[segments.length - 2]] = [segments[segments.length - 1]]\n\n return {\n ...structure,\n ...Object.fromEntries(\n url.searchParams.entries(),\n ),\n }\n}\n\nexport function createNextApiRequest({\n method,\n path,\n body\n}: {\n method: RequestMethod\n path: string\n body?: Record<string, unknown>\n}): NextApiRequest {\n return createRequest<NextApiRequest>({\n method,\n url: path,\n query: urlToQuery(new URL(path, 'http://localhost')),\n body\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,6BAA6C;AAI7C,SAAS,WAAW,KAAiB;AACnC,QAAM,WAAW,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAEvD,MAAI,SAAS,WAAW;AAAG,WAAO,CAAC;AACnC,MAAI,SAAS,WAAW;AAAG,WAAO,CAAC,SAAS,CAAC,CAAC;AAE9C,MAAI,YAAoC,CAAC;AACzC,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,YAAQ,SAAS,CAAC,CAAC,IAAI,CAAC;AACxB,cAAU,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC/B;AAEA,UAAQ,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,SAAS,CAAC,CAAC;AAEvE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,IAAI,aAAa,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAImB;AACjB,aAAO,sCAA8B;AAAA,IACnC;AAAA,IACA,KAAK;AAAA,IACL,OAAO,WAAW,IAAI,IAAI,MAAM,kBAAkB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -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.12-canary.4",
17
+ version: "0.23.12",
18
18
  previewMode: supportsPreviewMode,
19
19
  draftMode: supportsDraftMode,
20
20
  interactionMode: true,
@@ -14,10 +14,10 @@ function getRequestBody(args) {
14
14
  return match(args).with(routeHandlerPattern, ([request]) => request.json()).with(apiRoutePattern, ([req]) => req.body).exhaustive();
15
15
  }
16
16
  function respond(args, response, status) {
17
- return match(args).with(routeHandlerPattern, () => NextResponse.json(response, { status })).with(apiRoutePattern, ([, res]) => res.json(response)).exhaustive();
17
+ return match(args).with(routeHandlerPattern, () => NextResponse.json(response, { status })).with(apiRoutePattern, ([, res]) => res.status(status ?? 200).json(response)).exhaustive();
18
18
  }
19
19
  async function handler(...args) {
20
- const [, , { apiKey }] = args;
20
+ const [, , { apiKey, events }] = args;
21
21
  const secret = getSecret(args);
22
22
  if (secret !== apiKey)
23
23
  return respond(args, { message: "Unauthorized" }, 401);
@@ -29,7 +29,7 @@ async function handler(...args) {
29
29
  console.error(error);
30
30
  return respond(args, { message: "Invalid request body" }, 400);
31
31
  }
32
- const result = match(payload.type).with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload)).exhaustive();
32
+ const result = await match(payload.type).with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload, { onPublish: events?.onPublish })).exhaustive();
33
33
  return respond(args, result.body, result.status);
34
34
  }
35
35
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { handleSitePublished } from './site-published'\nimport {\n sitePublishedWebhookPayloadSchema,\n WebhookEventType,\n WebhookPayloadSchema,\n WebhookResponseBody,\n} from './types'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\nexport type WebhookHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, 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\nfunction getSecret(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('secret'))\n .with(apiRoutePattern, ([req]) => req.query.secret)\n .exhaustive()\n}\n\nfunction getRequestBody(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.json())\n .with(apiRoutePattern, ([req]) => req.body)\n .exhaustive()\n}\n\nfunction respond(args: WebhookHandlerArgs, response: WebhookResponseBody, status?: number) {\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(response, { status }))\n .with(apiRoutePattern, ([, res]) => res.json(response))\n .exhaustive()\n}\n\nexport default async function handler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<WebhookResponseBody>>\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse<WebhookResponseBody>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function handler(\n ...args: WebhookHandlerArgs\n): Promise<NextResponse<WebhookResponseBody> | void> {\n const [, , { apiKey }] = args\n const secret = getSecret(args)\n\n if (secret !== apiKey) return respond(args, { message: 'Unauthorized' }, 401)\n\n let payload: WebhookPayloadSchema\n\n try {\n const body = await getRequestBody(args)\n payload = sitePublishedWebhookPayloadSchema.parse(body)\n } catch (error) {\n console.error(error)\n return respond(args, { message: 'Invalid request body' }, 400)\n }\n\n const result = match(payload.type)\n .with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload))\n .exhaustive()\n\n return respond(args, result.body, result.status)\n}\n"],"mappings":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AACzB,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAQP,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAE5C,SAAS,UAAU,MAA0B;AAC3C,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ,CAAC,EACnF,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,MAAM,EACjD,WAAW;AAChB;AAEA,SAAS,eAAe,MAA0B;AAChD,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,CAAC,EACvD,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EACzC,WAAW;AAChB;AAEA,SAAS,QAAQ,MAA0B,UAA+B,QAAiB;AACzF,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,MAAM,aAAa,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,EACvE,KAAK,iBAAiB,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,KAAK,QAAQ,CAAC,EACrD,WAAW;AAChB;AAYA,eAAO,WACF,MACgD;AACnD,QAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI;AACzB,QAAM,SAAS,UAAU,IAAI;AAE7B,MAAI,WAAW;AAAQ,WAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,GAAG,GAAG;AAE5E,MAAI;AAEJ,MAAI;AACF,UAAM,OAAO,MAAM,eAAe,IAAI;AACtC,cAAU,kCAAkC,MAAM,IAAI;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AACnB,WAAO,QAAQ,MAAM,EAAE,SAAS,uBAAuB,GAAG,GAAG;AAAA,EAC/D;AAEA,QAAM,SAAS,MAAM,QAAQ,IAAI,EAC9B,KAAK,iBAAiB,gBAAgB,MAAM,oBAAoB,OAAO,CAAC,EACxE,WAAW;AAEd,SAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { handleSitePublished } from './site-published'\nimport {\n OnPublish,\n sitePublishedWebhookPayloadSchema,\n WebhookEventType,\n WebhookPayloadSchema,\n WebhookResponseBody,\n} from './types'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype WebhookParams = {\n apiKey: string,\n events?: { onPublish?: OnPublish },\n}\n\nexport type WebhookHandlerArgs =\n | [request: NextRequest, context: Context, params: WebhookParams]\n | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, params: WebhookParams]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nfunction getSecret(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get('secret'))\n .with(apiRoutePattern, ([req]) => req.query.secret)\n .exhaustive()\n}\n\nfunction getRequestBody(args: WebhookHandlerArgs) {\n return match(args)\n .with(routeHandlerPattern, ([request]) => request.json())\n .with(apiRoutePattern, ([req]) => req.body)\n .exhaustive()\n}\n\nfunction respond(args: WebhookHandlerArgs, response: WebhookResponseBody, status?: number) {\n return match(args)\n .with(routeHandlerPattern, () => NextResponse.json(response, { status }))\n .with(apiRoutePattern, ([, res]) => res.status(status ?? 200).json(response))\n .exhaustive()\n}\n\nexport default async function handler(\n request: NextRequest,\n context: Context,\n { apiKey, events }: WebhookParams,\n): Promise<NextResponse<WebhookResponseBody>>\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse<WebhookResponseBody>,\n { apiKey, events }: WebhookParams,\n): Promise<void>\nexport default async function handler(\n ...args: WebhookHandlerArgs\n): Promise<NextResponse<WebhookResponseBody> | void> {\n const [, , { apiKey, events }] = args\n const secret = getSecret(args)\n\n if (secret !== apiKey) return respond(args, { message: 'Unauthorized' }, 401)\n\n let payload: WebhookPayloadSchema\n\n try {\n const body = await getRequestBody(args)\n payload = sitePublishedWebhookPayloadSchema.parse(body)\n } catch (error) {\n console.error(error)\n return respond(args, { message: 'Invalid request body' }, 400)\n }\n\n const result = await match(payload.type)\n .with(WebhookEventType.SITE_PUBLISHED, () => handleSitePublished(payload, { onPublish: events?.onPublish }))\n .exhaustive()\n\n return respond(args, result.body, result.status)\n}\n"],"mappings":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AACzB,SAAS,2BAA2B;AACpC;AAAA,EAEE;AAAA,EACA;AAAA,OAGK;AAaP,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAE5C,SAAS,UAAU,MAA0B;AAC3C,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,QAAQ,aAAa,IAAI,QAAQ,CAAC,EACnF,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,MAAM,EACjD,WAAW;AAChB;AAEA,SAAS,eAAe,MAA0B;AAChD,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,CAAC,EACvD,KAAK,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EACzC,WAAW;AAChB;AAEA,SAAS,QAAQ,MAA0B,UAA+B,QAAiB;AACzF,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,MAAM,aAAa,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,EACvE,KAAK,iBAAiB,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,KAAK,QAAQ,CAAC,EAC3E,WAAW;AAChB;AAYA,eAAO,WACF,MACgD;AACnD,QAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,OAAO,CAAC,IAAI;AACjC,QAAM,SAAS,UAAU,IAAI;AAE7B,MAAI,WAAW;AAAQ,WAAO,QAAQ,MAAM,EAAE,SAAS,eAAe,GAAG,GAAG;AAE5E,MAAI;AAEJ,MAAI;AACF,UAAM,OAAO,MAAM,eAAe,IAAI;AACtC,cAAU,kCAAkC,MAAM,IAAI;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AACnB,WAAO,QAAQ,MAAM,EAAE,SAAS,uBAAuB,GAAG,GAAG;AAAA,EAC/D;AAEA,QAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,EACpC,KAAK,iBAAiB,gBAAgB,MAAM,oBAAoB,SAAS,EAAE,WAAW,QAAQ,UAAU,CAAC,CAAC,EAC1G,WAAW;AAEd,SAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM;AACjD;","names":[]}
@@ -1,6 +1,11 @@
1
1
  import { revalidateTag } from "next/cache";
2
- function handleSitePublished(_payload) {
2
+ async function handleSitePublished(_payload, { onPublish }) {
3
3
  revalidateTag(MAKESWIFT_CACHE_TAG);
4
+ try {
5
+ await onPublish?.();
6
+ } catch (error) {
7
+ console.error("Unhandled exception in the 'onPublish' callback:", error);
8
+ }
4
9
  return { body: { success: true }, status: 200 };
5
10
  }
6
11
  const MAKESWIFT_CACHE_TAG = "@@makeswift";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"sourcesContent":["import { revalidateTag } from 'next/cache'\nimport { SitePublishedWebhookPayload, WebhookHandlerResult } from './types'\n\nexport function handleSitePublished(_payload: SitePublishedWebhookPayload): WebhookHandlerResult {\n revalidateTag(MAKESWIFT_CACHE_TAG)\n\n return { body: { success: true }, status: 200 }\n}\n\nexport const MAKESWIFT_CACHE_TAG = '@@makeswift'\n"],"mappings":"AAAA,SAAS,qBAAqB;AAGvB,SAAS,oBAAoB,UAA6D;AAC/F,gBAAc,mBAAmB;AAEjC,SAAO,EAAE,MAAM,EAAE,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD;AAEO,MAAM,sBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"sourcesContent":["import { revalidateTag } from 'next/cache'\nimport { OnPublish, SitePublishedWebhookPayload, WebhookHandlerResult } from './types'\n\ntype SitePublishedParams = {\n onPublish?: OnPublish\n}\n\nexport async function handleSitePublished(\n _payload: SitePublishedWebhookPayload,\n { onPublish }: SitePublishedParams\n): Promise<WebhookHandlerResult> {\n revalidateTag(MAKESWIFT_CACHE_TAG)\n\n try {\n await onPublish?.()\n } catch (error) {\n // log and ignore any error in user-provided onPublish\n console.error(\"Unhandled exception in the 'onPublish' callback:\", error)\n }\n\n return { body: { success: true }, status: 200 }\n}\n\nexport const MAKESWIFT_CACHE_TAG = '@@makeswift'\n"],"mappings":"AAAA,SAAS,qBAAqB;AAO9B,eAAsB,oBACpB,UACA,EAAE,UAAU,GACmB;AAC/B,gBAAc,mBAAmB;AAEjC,MAAI;AACF,UAAM,YAAY;AAAA,EACpB,SAAS,OAAO;AAEd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AAEA,SAAO,EAAE,MAAM,EAAE,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD;AAEO,MAAM,sBAAsB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const WebhookEventType = {\n SITE_PUBLISHED: 'site.published',\n} as const\n\nexport const sitePublishedWebhookPayloadSchema = z.object({\n type: z.literal(WebhookEventType.SITE_PUBLISHED),\n data: z.object({\n siteId: z.string().uuid(),\n publish: z.object({\n from: z.string().uuid().nullable(),\n to: z.string().uuid(),\n }),\n at: z.number(),\n }),\n})\n\nexport type SitePublishedWebhookPayload = z.infer<typeof sitePublishedWebhookPayloadSchema>\n\nconst webhookPayloadSchema = sitePublishedWebhookPayloadSchema\n\nexport type WebhookPayloadSchema = z.infer<typeof webhookPayloadSchema>\n\ntype WebhookSuccessBody = { success: true }\n\ntype WebhookErrorBody = { message: string }\n\nexport type WebhookResponseBody = WebhookSuccessBody | WebhookErrorBody\n\nexport type WebhookHandlerResult = {\n body: WebhookResponseBody\n status: 200\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,mBAAmB;AAAA,EAC9B,gBAAgB;AAClB;AAEO,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,MAAM,EAAE,QAAQ,iBAAiB,cAAc;AAAA,EAC/C,MAAM,EAAE,OAAO;AAAA,IACb,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,IACxB,SAAS,EAAE,OAAO;AAAA,MAChB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACjC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,IACtB,CAAC;AAAA,IACD,IAAI,EAAE,OAAO;AAAA,EACf,CAAC;AACH,CAAC;AAID,MAAM,uBAAuB;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const WebhookEventType = {\n SITE_PUBLISHED: 'site.published',\n} as const\n\nexport const sitePublishedWebhookPayloadSchema = z.object({\n type: z.literal(WebhookEventType.SITE_PUBLISHED),\n data: z.object({\n siteId: z.string().uuid(),\n publish: z.object({\n from: z.string().uuid().nullable(),\n to: z.string().uuid(),\n }),\n at: z.number(),\n }),\n})\n\nexport type SitePublishedWebhookPayload = z.infer<typeof sitePublishedWebhookPayloadSchema>\n\nconst webhookPayloadSchema = sitePublishedWebhookPayloadSchema\n\nexport type WebhookPayloadSchema = z.infer<typeof webhookPayloadSchema>\n\ntype WebhookSuccessBody = { success: true }\n\ntype WebhookErrorBody = { message: string }\n\nexport type WebhookResponseBody = WebhookSuccessBody | WebhookErrorBody\n\nexport type WebhookHandlerResult = {\n body: WebhookResponseBody\n status: 200\n}\n\nexport type OnPublish = () => void | Promise<void>\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,mBAAmB;AAAA,EAC9B,gBAAgB;AAClB;AAEO,MAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,MAAM,EAAE,QAAQ,iBAAiB,cAAc;AAAA,EAC/C,MAAM,EAAE,OAAO;AAAA,IACb,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,IACxB,SAAS,EAAE,OAAO;AAAA,MAChB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACjC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,IACtB,CAAC;AAAA,IACD,IAAI,EAAE,OAAO;AAAA,EACf,CAAC;AACH,CAAC;AAID,MAAM,uBAAuB;","names":[]}
@@ -26,6 +26,7 @@ function MakeswiftApiHandler(apiKey, {
26
26
  appOrigin = "https://app.makeswift.com",
27
27
  apiOrigin = "https://api.makeswift.com",
28
28
  getFonts,
29
+ events,
29
30
  runtime
30
31
  }) {
31
32
  const cors = Cors({ origin: appOrigin });
@@ -113,7 +114,7 @@ Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/d
113
114
  return match(args).with(routeHandlerPattern, (args2) => mergeTranslatedData(...args2, client)).with(apiRoutePattern, (args2) => mergeTranslatedData(...args2, client)).exhaustive();
114
115
  }
115
116
  if (matches("/webhook")) {
116
- return match(args).with(routeHandlerPattern, (args2) => webhook(...args2, { apiKey })).with(apiRoutePattern, (args2) => webhook(...args2, { apiKey })).exhaustive();
117
+ return match(args).with(routeHandlerPattern, (args2) => webhook(...args2, { apiKey, events })).with(apiRoutePattern, (args2) => webhook(...args2, { apiKey, events })).exhaustive();
117
118
  }
118
119
  const handleResource = (resource) => {
119
120
  const status2 = resource === null ? 404 : 200;
@@ -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 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"]}
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 { OnPublish, 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 Events = { onPublish: OnPublish }\n\ntype MakeswiftApiHandlerConfig = {\n appOrigin?: string\n apiOrigin?: string\n getFonts?: GetFonts\n events?: Events\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 events,\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, events }))\n .with(apiRoutePattern, args => webhook(...args, { apiKey, events }))\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,37 @@
1
+ import { createRequest } from "node-mocks-http";
2
+ function urlToQuery(url) {
3
+ const segments = url.pathname.split("/").filter(Boolean);
4
+ if (segments.length === 0)
5
+ return {};
6
+ if (segments.length === 1)
7
+ return [segments[0]];
8
+ let structure = {};
9
+ let current = structure;
10
+ for (let i = 0; i < segments.length - 2; i++) {
11
+ current[segments[i]] = {};
12
+ current = current[segments[i]];
13
+ }
14
+ current[segments[segments.length - 2]] = [segments[segments.length - 1]];
15
+ return {
16
+ ...structure,
17
+ ...Object.fromEntries(
18
+ url.searchParams.entries()
19
+ )
20
+ };
21
+ }
22
+ function createNextApiRequest({
23
+ method,
24
+ path,
25
+ body
26
+ }) {
27
+ return createRequest({
28
+ method,
29
+ url: path,
30
+ query: urlToQuery(new URL(path, "http://localhost")),
31
+ body
32
+ });
33
+ }
34
+ export {
35
+ createNextApiRequest
36
+ };
37
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/next/tests/test-utils.ts"],"sourcesContent":["import { NextApiRequest } from \"next\"\nimport { createRequest, RequestMethod } from \"node-mocks-http\"\n\ntype Query = { [key: string]: Query } | string[]\n\nfunction urlToQuery(url: URL): Query {\n const segments = url.pathname.split('/').filter(Boolean)\n\n if (segments.length === 0) return {}\n if (segments.length === 1) return [segments[0]]\n\n let structure: { [key: string]: any } = {}\n let current = structure\n\n for (let i = 0; i < segments.length - 2; i++) {\n current[segments[i]] = {}\n current = current[segments[i]]\n }\n\n current[segments[segments.length - 2]] = [segments[segments.length - 1]]\n\n return {\n ...structure,\n ...Object.fromEntries(\n url.searchParams.entries(),\n ),\n }\n}\n\nexport function createNextApiRequest({\n method,\n path,\n body\n}: {\n method: RequestMethod\n path: string\n body?: Record<string, unknown>\n}): NextApiRequest {\n return createRequest<NextApiRequest>({\n method,\n url: path,\n query: urlToQuery(new URL(path, 'http://localhost')),\n body\n })\n}\n"],"mappings":"AACA,SAAS,qBAAoC;AAI7C,SAAS,WAAW,KAAiB;AACnC,QAAM,WAAW,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAEvD,MAAI,SAAS,WAAW;AAAG,WAAO,CAAC;AACnC,MAAI,SAAS,WAAW;AAAG,WAAO,CAAC,SAAS,CAAC,CAAC;AAE9C,MAAI,YAAoC,CAAC;AACzC,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,YAAQ,SAAS,CAAC,CAAC,IAAI,CAAC;AACxB,cAAU,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC/B;AAEA,UAAQ,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,SAAS,CAAC,CAAC;AAEvE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,IAAI,aAAa,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAImB;AACjB,SAAO,cAA8B;AAAA,IACnC;AAAA,IACA,KAAK;AAAA,IACL,OAAO,WAAW,IAAI,IAAI,MAAM,kBAAkB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1,21 +1,19 @@
1
1
  import { NextApiRequest, NextApiResponse } from 'next';
2
2
  import { NextRequest, NextResponse } from 'next/server';
3
- import { WebhookResponseBody } from './types';
3
+ import { OnPublish, WebhookResponseBody } from './types';
4
4
  type Context = {
5
5
  params: {
6
6
  [key: string]: string | string[];
7
7
  };
8
8
  };
9
- export type WebhookHandlerArgs = [request: NextRequest, context: Context, params: {
9
+ type WebhookParams = {
10
10
  apiKey: string;
11
- }] | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, params: {
12
- apiKey: string;
13
- }];
14
- export default function handler(request: NextRequest, context: Context, { apiKey }: {
15
- apiKey: string;
16
- }): Promise<NextResponse<WebhookResponseBody>>;
17
- export default function handler(req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, { apiKey }: {
18
- apiKey: string;
19
- }): Promise<void>;
11
+ events?: {
12
+ onPublish?: OnPublish;
13
+ };
14
+ };
15
+ export type WebhookHandlerArgs = [request: NextRequest, context: Context, params: WebhookParams] | [req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, params: WebhookParams];
16
+ export default function handler(request: NextRequest, context: Context, { apiKey, events }: WebhookParams): Promise<NextResponse<WebhookResponseBody>>;
17
+ export default function handler(req: NextApiRequest, res: NextApiResponse<WebhookResponseBody>, { apiKey, events }: WebhookParams): Promise<void>;
20
18
  export {};
21
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGvD,OAAO,EAIL,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,MAAM,MAAM,kBAAkB,GAC1B,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACpE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AA0BhG,wBAA8B,OAAO,CACnC,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,OAAO,CACnC,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGvD,OAAO,EACL,SAAS,EAIT,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,KAAK,OAAO,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/D,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CACpC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAC1B,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAC/D,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AA0B3F,wBAA8B,OAAO,CACnC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,GAChC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAA;AAC7C,wBAA8B,OAAO,CACnC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,CAAC,mBAAmB,CAAC,EACzC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,GAChC,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -1,4 +1,8 @@
1
- import { SitePublishedWebhookPayload, WebhookHandlerResult } from './types';
2
- export declare function handleSitePublished(_payload: SitePublishedWebhookPayload): WebhookHandlerResult;
1
+ import { OnPublish, SitePublishedWebhookPayload, WebhookHandlerResult } from './types';
2
+ type SitePublishedParams = {
3
+ onPublish?: OnPublish;
4
+ };
5
+ export declare function handleSitePublished(_payload: SitePublishedWebhookPayload, { onPublish }: SitePublishedParams): Promise<WebhookHandlerResult>;
3
6
  export declare const MAKESWIFT_CACHE_TAG = "@@makeswift";
7
+ export {};
4
8
  //# sourceMappingURL=site-published.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"site-published.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE3E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,2BAA2B,GAAG,oBAAoB,CAI/F;AAED,eAAO,MAAM,mBAAmB,gBAAgB,CAAA"}
1
+ {"version":3,"file":"site-published.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/site-published.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEtF,KAAK,mBAAmB,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,CAAA;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,2BAA2B,EACrC,EAAE,SAAS,EAAE,EAAE,mBAAmB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED,eAAO,MAAM,mBAAmB,gBAAgB,CAAA"}
@@ -117,5 +117,6 @@ export type WebhookHandlerResult = {
117
117
  body: WebhookResponseBody;
118
118
  status: 200;
119
119
  };
120
+ export type OnPublish = () => void | Promise<void>;
120
121
  export {};
121
122
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,gBAAgB;;CAEnB,CAAA;AAEV,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU5C,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAA;AAE3F,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoC,CAAA;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEvE,KAAK,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAA;AAE3C,KAAK,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3C,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,mBAAmB,CAAA;IACzB,MAAM,EAAE,GAAG,CAAA;CACZ,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/next/api-handler/handlers/webhook/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,gBAAgB;;CAEnB,CAAA;AAEV,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU5C,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAA;AAE3F,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoC,CAAA;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEvE,KAAK,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAA;AAE3C,KAAK,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3C,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,mBAAmB,CAAA;IACzB,MAAM,EAAE,GAAG,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -11,7 +11,7 @@ import { type PreviewModeResponse } from './handlers/preview-mode';
11
11
  import { RevalidationResponse } from './handlers/revalidate';
12
12
  import { TranslatableDataResponse } from './handlers/translatable-data';
13
13
  import { TranslatedDataResponse } from './handlers/merge-translated-data';
14
- import { WebhookResponseBody } from './handlers/webhook/types';
14
+ import { OnPublish, WebhookResponseBody } from './handlers/webhook/types';
15
15
  import { ReactRuntime } from '../../react';
16
16
  export type { Manifest, Font };
17
17
  type Context = {
@@ -19,10 +19,14 @@ type Context = {
19
19
  [key: string]: string | string[];
20
20
  };
21
21
  };
22
+ type Events = {
23
+ onPublish: OnPublish;
24
+ };
22
25
  type MakeswiftApiHandlerConfig = {
23
26
  appOrigin?: string;
24
27
  apiOrigin?: string;
25
28
  getFonts?: GetFonts;
29
+ events?: Events;
26
30
  runtime: ReactRuntime;
27
31
  };
28
32
  type NotFoundError = {
@@ -30,5 +34,5 @@ type NotFoundError = {
30
34
  };
31
35
  export type MakeswiftApiHandlerResponse = ManifestResponse | RevalidationResponse | ProxyPreviewModeResponse | ProxyDraftModeResponse | DraftModeResponse | PreviewModeResponse | FontsResponse | ElementTreeResponse | TranslatableDataResponse | TranslatedDataResponse | APIResource | NotFoundError | WebhookResponseBody;
32
36
  type MakeswiftApiHandlerArgs = [NextRequest, Context] | [NextApiRequest, NextApiResponse<MakeswiftApiHandlerResponse>];
33
- export declare function MakeswiftApiHandler(apiKey: string, { appOrigin, apiOrigin, getFonts, runtime, }: MakeswiftApiHandlerConfig): (...args: MakeswiftApiHandlerArgs) => Promise<NextResponse<MakeswiftApiHandlerResponse> | void>;
37
+ export declare function MakeswiftApiHandler(apiKey: string, { appOrigin, apiOrigin, getFonts, events, runtime, }: MakeswiftApiHandlerConfig): (...args: MakeswiftApiHandlerArgs) => Promise<NextResponse<MakeswiftApiHandlerResponse> | void>;
34
38
  //# 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,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"}
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,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACzE,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,MAAM,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAAA;AAEtC,KAAK,yBAAyB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,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,MAAM,EACN,OAAO,GACR,EAAE,yBAAyB,GAC3B,CAAC,GAAG,IAAI,EAAE,uBAAuB,KAAK,OAAO,CAAC,YAAY,CAAC,2BAA2B,CAAC,GAAG,IAAI,CAAC,CAkOjG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.makeswift-api-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.makeswift-api-handler.test.d.ts","sourceRoot":"","sources":["../../../../src/next/tests/server.makeswift-api-handler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { NextApiRequest } from "next";
2
+ import { RequestMethod } from "node-mocks-http";
3
+ export declare function createNextApiRequest({ method, path, body }: {
4
+ method: RequestMethod;
5
+ path: string;
6
+ body?: Record<string, unknown>;
7
+ }): NextApiRequest;
8
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../../src/next/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AACrC,OAAO,EAAiB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AA4B9D,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,IAAI,EACJ,IAAI,EACL,EAAE;IACD,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,cAAc,CAOjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makeswift/runtime",
3
- "version": "0.23.12-canary.4",
3
+ "version": "0.23.12",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist",
@@ -164,8 +164,8 @@
164
164
  "uuid": "^9.0.0",
165
165
  "zod": "^3.21.4",
166
166
  "@makeswift/controls": "0.1.8",
167
- "@makeswift/next-plugin": "0.3.1",
168
- "@makeswift/prop-controllers": "0.4.1"
167
+ "@makeswift/prop-controllers": "0.4.1",
168
+ "@makeswift/next-plugin": "0.3.1"
169
169
  },
170
170
  "devDependencies": {
171
171
  "@emotion/jest": "^11.11.0",
@@ -195,6 +195,7 @@
195
195
  "madge": "^6.0.0",
196
196
  "msw": "^2.3.1",
197
197
  "next": "15.0.2",
198
+ "node-mocks-http": "^1.16.2",
198
199
  "react": "18.2.0",
199
200
  "react-dom": "18.2.0",
200
201
  "slate": "^0.91.4",