@makeswift/runtime 0.24.9-canary.0 → 0.25.0-canary.2

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 (250) hide show
  1. package/dist/cjs/api/site-version.js +8 -2
  2. package/dist/cjs/api/site-version.js.map +1 -1
  3. package/dist/cjs/api-handler/cookies.js +38 -0
  4. package/dist/cjs/api-handler/cookies.js.map +1 -0
  5. package/dist/cjs/api-handler/cors.js +48 -0
  6. package/dist/cjs/api-handler/cors.js.map +1 -0
  7. package/dist/cjs/api-handler/handlers/clear-draft.js +41 -0
  8. package/dist/cjs/api-handler/handlers/clear-draft.js.map +1 -0
  9. package/dist/cjs/api-handler/handlers/element-tree.js +41 -0
  10. package/dist/cjs/api-handler/handlers/element-tree.js.map +1 -0
  11. package/dist/cjs/{next/api-handler → api-handler}/handlers/fonts.js +9 -9
  12. package/dist/cjs/api-handler/handlers/fonts.js.map +1 -0
  13. package/dist/cjs/api-handler/handlers/manifest.js +50 -0
  14. package/dist/cjs/api-handler/handlers/manifest.js.map +1 -0
  15. package/dist/cjs/api-handler/handlers/merge-translated-data.js +41 -0
  16. package/dist/cjs/api-handler/handlers/merge-translated-data.js.map +1 -0
  17. package/dist/cjs/api-handler/handlers/revalidate.js +60 -0
  18. package/dist/cjs/api-handler/handlers/revalidate.js.map +1 -0
  19. package/dist/cjs/api-handler/handlers/translatable-data.js +42 -0
  20. package/dist/cjs/api-handler/handlers/translatable-data.js.map +1 -0
  21. package/dist/cjs/{next/api-handler → api-handler}/handlers/webhook/index.js +16 -23
  22. package/dist/cjs/api-handler/handlers/webhook/index.js.map +1 -0
  23. package/dist/cjs/{next/api-handler → api-handler}/handlers/webhook/site-published.js +2 -4
  24. package/dist/cjs/api-handler/handlers/webhook/site-published.js.map +1 -0
  25. package/dist/cjs/api-handler/handlers/webhook/types.js.map +1 -0
  26. package/dist/cjs/api-handler/index.js +116 -0
  27. package/dist/cjs/api-handler/index.js.map +1 -0
  28. package/dist/cjs/api-handler/request-response.js +43 -0
  29. package/dist/cjs/api-handler/request-response.js.map +1 -0
  30. package/dist/cjs/next/api-handler/config/app-router.js +65 -0
  31. package/dist/cjs/next/api-handler/config/app-router.js.map +1 -0
  32. package/dist/cjs/next/api-handler/config/base.js +39 -0
  33. package/dist/cjs/next/api-handler/config/base.js.map +1 -0
  34. package/dist/cjs/next/api-handler/config/pages-router.js +123 -0
  35. package/dist/cjs/next/api-handler/config/pages-router.js.map +1 -0
  36. package/dist/cjs/next/api-handler/{handlers/utils/draft.js → draft.js} +2 -14
  37. package/dist/cjs/next/api-handler/draft.js.map +1 -0
  38. package/dist/cjs/next/api-handler/handlers/redirect-draft.js +8 -17
  39. package/dist/cjs/next/api-handler/handlers/redirect-draft.js.map +1 -1
  40. package/dist/cjs/next/api-handler/handlers/redirect-preview.js +12 -19
  41. package/dist/cjs/next/api-handler/handlers/redirect-preview.js.map +1 -1
  42. package/dist/cjs/next/api-handler/index.js +19 -154
  43. package/dist/cjs/next/api-handler/index.js.map +1 -1
  44. package/dist/cjs/next/middleware/request-utils.js +1 -1
  45. package/dist/cjs/next/middleware/request-utils.js.map +1 -1
  46. package/dist/cjs/next/server.js.map +1 -1
  47. package/dist/cjs/next/tests/__fixtures__/element-tree.js +1776 -0
  48. package/dist/cjs/next/tests/__fixtures__/element-tree.js.map +1 -0
  49. package/dist/cjs/next/tests/__fixtures__/resources.js +99 -0
  50. package/dist/cjs/next/tests/__fixtures__/resources.js.map +1 -0
  51. package/dist/cjs/next/tests/__fixtures__/translated-data.js +83 -0
  52. package/dist/cjs/next/tests/__fixtures__/translated-data.js.map +1 -0
  53. package/dist/cjs/next/tests/test-utils.js +98 -23
  54. package/dist/cjs/next/tests/test-utils.js.map +1 -1
  55. package/dist/esm/api/site-version.js +6 -1
  56. package/dist/esm/api/site-version.js.map +1 -1
  57. package/dist/esm/api-handler/cookies.js +13 -0
  58. package/dist/esm/api-handler/cookies.js.map +1 -0
  59. package/dist/esm/api-handler/cors.js +24 -0
  60. package/dist/esm/api-handler/cors.js.map +1 -0
  61. package/dist/esm/api-handler/handlers/clear-draft.js +17 -0
  62. package/dist/esm/api-handler/handlers/clear-draft.js.map +1 -0
  63. package/dist/esm/api-handler/handlers/element-tree.js +17 -0
  64. package/dist/esm/api-handler/handlers/element-tree.js.map +1 -0
  65. package/dist/esm/api-handler/handlers/fonts.js +9 -0
  66. package/dist/esm/api-handler/handlers/fonts.js.map +1 -0
  67. package/dist/esm/api-handler/handlers/manifest.js +29 -0
  68. package/dist/esm/api-handler/handlers/manifest.js.map +1 -0
  69. package/dist/esm/api-handler/handlers/merge-translated-data.js +17 -0
  70. package/dist/esm/api-handler/handlers/merge-translated-data.js.map +1 -0
  71. package/dist/esm/api-handler/handlers/revalidate.js +29 -0
  72. package/dist/esm/api-handler/handlers/revalidate.js.map +1 -0
  73. package/dist/esm/api-handler/handlers/translatable-data.js +18 -0
  74. package/dist/esm/api-handler/handlers/translatable-data.js.map +1 -0
  75. package/dist/esm/api-handler/handlers/webhook/index.js +30 -0
  76. package/dist/esm/api-handler/handlers/webhook/index.js.map +1 -0
  77. package/dist/esm/api-handler/handlers/webhook/site-published.js +13 -0
  78. package/dist/esm/api-handler/handlers/webhook/site-published.js.map +1 -0
  79. package/dist/esm/api-handler/handlers/webhook/types.js.map +1 -0
  80. package/dist/esm/api-handler/index.js +95 -0
  81. package/dist/esm/api-handler/index.js.map +1 -0
  82. package/dist/esm/api-handler/request-response.js +18 -0
  83. package/dist/esm/api-handler/request-response.js.map +1 -0
  84. package/dist/esm/next/api-handler/config/app-router.js +40 -0
  85. package/dist/esm/next/api-handler/config/app-router.js.map +1 -0
  86. package/dist/esm/next/api-handler/config/base.js +15 -0
  87. package/dist/esm/next/api-handler/config/base.js.map +1 -0
  88. package/dist/esm/next/api-handler/config/pages-router.js +98 -0
  89. package/dist/esm/next/api-handler/config/pages-router.js.map +1 -0
  90. package/dist/esm/next/api-handler/{handlers/utils/draft.js → draft.js} +1 -11
  91. package/dist/esm/next/api-handler/draft.js.map +1 -0
  92. package/dist/esm/next/api-handler/handlers/redirect-draft.js +5 -21
  93. package/dist/esm/next/api-handler/handlers/redirect-draft.js.map +1 -1
  94. package/dist/esm/next/api-handler/handlers/redirect-preview.js +4 -21
  95. package/dist/esm/next/api-handler/handlers/redirect-preview.js.map +1 -1
  96. package/dist/esm/next/api-handler/index.js +20 -159
  97. package/dist/esm/next/api-handler/index.js.map +1 -1
  98. package/dist/esm/next/middleware/request-utils.js +1 -4
  99. package/dist/esm/next/middleware/request-utils.js.map +1 -1
  100. package/dist/esm/next/server.js.map +1 -1
  101. package/dist/esm/next/tests/__fixtures__/element-tree.js +1752 -0
  102. package/dist/esm/next/tests/__fixtures__/element-tree.js.map +1 -0
  103. package/dist/esm/next/tests/__fixtures__/resources.js +69 -0
  104. package/dist/esm/next/tests/__fixtures__/resources.js.map +1 -0
  105. package/dist/esm/next/tests/__fixtures__/translated-data.js +59 -0
  106. package/dist/esm/next/tests/__fixtures__/translated-data.js.map +1 -0
  107. package/dist/esm/next/tests/test-utils.js +98 -23
  108. package/dist/esm/next/tests/test-utils.js.map +1 -1
  109. package/dist/types/api/site-version.d.ts +1 -0
  110. package/dist/types/api/site-version.d.ts.map +1 -1
  111. package/dist/types/api-handler/cookies.d.ts +9 -0
  112. package/dist/types/api-handler/cookies.d.ts.map +1 -0
  113. package/dist/types/api-handler/cors.d.ts +10 -0
  114. package/dist/types/api-handler/cors.d.ts.map +1 -0
  115. package/dist/types/api-handler/handlers/clear-draft.d.ts +7 -0
  116. package/dist/types/api-handler/handlers/clear-draft.d.ts.map +1 -0
  117. package/dist/types/api-handler/handlers/element-tree.d.ts +9 -0
  118. package/dist/types/api-handler/handlers/element-tree.d.ts.map +1 -0
  119. package/dist/types/api-handler/handlers/fonts.d.ts +18 -0
  120. package/dist/types/api-handler/handlers/fonts.d.ts.map +1 -0
  121. package/dist/types/api-handler/handlers/manifest.d.ts +20 -0
  122. package/dist/types/api-handler/handlers/manifest.d.ts.map +1 -0
  123. package/dist/types/api-handler/handlers/merge-translated-data.d.ts +11 -0
  124. package/dist/types/api-handler/handlers/merge-translated-data.d.ts.map +1 -0
  125. package/dist/types/api-handler/handlers/revalidate.d.ts +10 -0
  126. package/dist/types/api-handler/handlers/revalidate.d.ts.map +1 -0
  127. package/dist/types/api-handler/handlers/translatable-data.d.ts +15 -0
  128. package/dist/types/api-handler/handlers/translatable-data.d.ts.map +1 -0
  129. package/dist/types/api-handler/handlers/webhook/index.d.ts +12 -0
  130. package/dist/types/api-handler/handlers/webhook/index.d.ts.map +1 -0
  131. package/dist/types/{next/api-handler → api-handler}/handlers/webhook/site-published.d.ts +2 -1
  132. package/dist/types/api-handler/handlers/webhook/site-published.d.ts.map +1 -0
  133. package/dist/types/{next/api-handler → api-handler}/handlers/webhook/types.d.ts +2 -4
  134. package/dist/types/api-handler/handlers/webhook/types.d.ts.map +1 -0
  135. package/dist/types/api-handler/index.d.ts +35 -0
  136. package/dist/types/api-handler/index.d.ts.map +1 -0
  137. package/dist/types/api-handler/request-response.d.ts +12 -0
  138. package/dist/types/api-handler/request-response.d.ts.map +1 -0
  139. package/dist/types/next/api-handler/config/app-router.d.ts +16 -0
  140. package/dist/types/next/api-handler/config/app-router.d.ts.map +1 -0
  141. package/dist/types/next/api-handler/config/base.d.ts +15 -0
  142. package/dist/types/next/api-handler/config/base.d.ts.map +1 -0
  143. package/dist/types/next/api-handler/config/pages-router.d.ts +10 -0
  144. package/dist/types/next/api-handler/config/pages-router.d.ts.map +1 -0
  145. package/dist/types/next/api-handler/{handlers/utils/draft.d.ts → draft.d.ts} +0 -8
  146. package/dist/types/next/api-handler/draft.d.ts.map +1 -0
  147. package/dist/types/next/api-handler/handlers/redirect-draft.d.ts +3 -16
  148. package/dist/types/next/api-handler/handlers/redirect-draft.d.ts.map +1 -1
  149. package/dist/types/next/api-handler/handlers/redirect-preview.d.ts +1 -14
  150. package/dist/types/next/api-handler/handlers/redirect-preview.d.ts.map +1 -1
  151. package/dist/types/next/api-handler/index.d.ts +10 -36
  152. package/dist/types/next/api-handler/index.d.ts.map +1 -1
  153. package/dist/types/next/middleware/request-utils.d.ts.map +1 -1
  154. package/dist/types/next/server.d.ts +2 -1
  155. package/dist/types/next/server.d.ts.map +1 -1
  156. package/dist/types/next/tests/__fixtures__/element-tree.d.ts +3 -0
  157. package/dist/types/next/tests/__fixtures__/element-tree.d.ts.map +1 -0
  158. package/dist/types/next/tests/__fixtures__/resources.d.ts +9 -0
  159. package/dist/types/next/tests/__fixtures__/resources.d.ts.map +1 -0
  160. package/dist/types/next/tests/__fixtures__/translated-data.d.ts +56 -0
  161. package/dist/types/next/tests/__fixtures__/translated-data.d.ts.map +1 -0
  162. package/dist/types/next/tests/server.api-handler-clear-draft.test.d.ts +2 -0
  163. package/dist/types/next/tests/server.api-handler-clear-draft.test.d.ts.map +1 -0
  164. package/dist/types/next/tests/server.api-handler-cors.test.d.ts +2 -0
  165. package/dist/types/next/tests/server.api-handler-cors.test.d.ts.map +1 -0
  166. package/dist/types/next/tests/server.api-handler-element-tree.test.d.ts +2 -0
  167. package/dist/types/next/tests/server.api-handler-element-tree.test.d.ts.map +1 -0
  168. package/dist/types/next/tests/server.api-handler-error-handling.test.d.ts +2 -0
  169. package/dist/types/next/tests/server.api-handler-error-handling.test.d.ts.map +1 -0
  170. package/dist/types/next/tests/server.api-handler-fonts.test.d.ts +2 -0
  171. package/dist/types/next/tests/server.api-handler-fonts.test.d.ts.map +1 -0
  172. package/dist/types/next/tests/server.api-handler-manifest.test.d.ts +2 -0
  173. package/dist/types/next/tests/server.api-handler-manifest.test.d.ts.map +1 -0
  174. package/dist/types/next/tests/server.api-handler-merge-translated-data.test.d.ts +2 -0
  175. package/dist/types/next/tests/server.api-handler-merge-translated-data.test.d.ts.map +1 -0
  176. package/dist/types/next/tests/server.api-handler-redirect-draft.test.d.ts +2 -0
  177. package/dist/types/next/tests/server.api-handler-redirect-draft.test.d.ts.map +1 -0
  178. package/dist/types/next/tests/server.api-handler-redirect-preview.test.d.ts +2 -0
  179. package/dist/types/next/tests/server.api-handler-redirect-preview.test.d.ts.map +1 -0
  180. package/dist/types/next/tests/server.api-handler-resources.test.d.ts +2 -0
  181. package/dist/types/next/tests/server.api-handler-resources.test.d.ts.map +1 -0
  182. package/dist/types/next/tests/server.api-handler-revalidate.test.d.ts +2 -0
  183. package/dist/types/next/tests/server.api-handler-revalidate.test.d.ts.map +1 -0
  184. package/dist/types/next/tests/server.api-handler-translatable-data.test.d.ts +2 -0
  185. package/dist/types/next/tests/server.api-handler-translatable-data.test.d.ts.map +1 -0
  186. package/dist/types/next/tests/server.api-handler-webhook.test.d.ts +2 -0
  187. package/dist/types/next/tests/server.api-handler-webhook.test.d.ts.map +1 -0
  188. package/dist/types/next/tests/test-utils.d.ts +37 -4
  189. package/dist/types/next/tests/test-utils.d.ts.map +1 -1
  190. package/package.json +3 -3
  191. package/dist/cjs/next/api-handler/handlers/clear-draft.js +0 -64
  192. package/dist/cjs/next/api-handler/handlers/clear-draft.js.map +0 -1
  193. package/dist/cjs/next/api-handler/handlers/element-tree.js +0 -47
  194. package/dist/cjs/next/api-handler/handlers/element-tree.js.map +0 -1
  195. package/dist/cjs/next/api-handler/handlers/fonts.js.map +0 -1
  196. package/dist/cjs/next/api-handler/handlers/manifest.js +0 -55
  197. package/dist/cjs/next/api-handler/handlers/manifest.js.map +0 -1
  198. package/dist/cjs/next/api-handler/handlers/merge-translated-data.js +0 -47
  199. package/dist/cjs/next/api-handler/handlers/merge-translated-data.js.map +0 -1
  200. package/dist/cjs/next/api-handler/handlers/revalidate.js +0 -74
  201. package/dist/cjs/next/api-handler/handlers/revalidate.js.map +0 -1
  202. package/dist/cjs/next/api-handler/handlers/translatable-data.js +0 -47
  203. package/dist/cjs/next/api-handler/handlers/translatable-data.js.map +0 -1
  204. package/dist/cjs/next/api-handler/handlers/utils/draft.js.map +0 -1
  205. package/dist/cjs/next/api-handler/handlers/webhook/index.js.map +0 -1
  206. package/dist/cjs/next/api-handler/handlers/webhook/site-published.js.map +0 -1
  207. package/dist/cjs/next/api-handler/handlers/webhook/types.js.map +0 -1
  208. package/dist/esm/next/api-handler/handlers/clear-draft.js +0 -50
  209. package/dist/esm/next/api-handler/handlers/clear-draft.js.map +0 -1
  210. package/dist/esm/next/api-handler/handlers/element-tree.js +0 -27
  211. package/dist/esm/next/api-handler/handlers/element-tree.js.map +0 -1
  212. package/dist/esm/next/api-handler/handlers/fonts.js +0 -13
  213. package/dist/esm/next/api-handler/handlers/fonts.js.map +0 -1
  214. package/dist/esm/next/api-handler/handlers/manifest.js +0 -35
  215. package/dist/esm/next/api-handler/handlers/manifest.js.map +0 -1
  216. package/dist/esm/next/api-handler/handlers/merge-translated-data.js +0 -27
  217. package/dist/esm/next/api-handler/handlers/merge-translated-data.js.map +0 -1
  218. package/dist/esm/next/api-handler/handlers/revalidate.js +0 -40
  219. package/dist/esm/next/api-handler/handlers/revalidate.js.map +0 -1
  220. package/dist/esm/next/api-handler/handlers/translatable-data.js +0 -27
  221. package/dist/esm/next/api-handler/handlers/translatable-data.js.map +0 -1
  222. package/dist/esm/next/api-handler/handlers/utils/draft.js.map +0 -1
  223. package/dist/esm/next/api-handler/handlers/webhook/index.js +0 -41
  224. package/dist/esm/next/api-handler/handlers/webhook/index.js.map +0 -1
  225. package/dist/esm/next/api-handler/handlers/webhook/site-published.js +0 -15
  226. package/dist/esm/next/api-handler/handlers/webhook/site-published.js.map +0 -1
  227. package/dist/esm/next/api-handler/handlers/webhook/types.js.map +0 -1
  228. package/dist/types/next/api-handler/handlers/clear-draft.d.ts +0 -20
  229. package/dist/types/next/api-handler/handlers/clear-draft.d.ts.map +0 -1
  230. package/dist/types/next/api-handler/handlers/element-tree.d.ts +0 -20
  231. package/dist/types/next/api-handler/handlers/element-tree.d.ts.map +0 -1
  232. package/dist/types/next/api-handler/handlers/fonts.d.ts +0 -28
  233. package/dist/types/next/api-handler/handlers/fonts.d.ts.map +0 -1
  234. package/dist/types/next/api-handler/handlers/manifest.d.ts +0 -32
  235. package/dist/types/next/api-handler/handlers/manifest.d.ts.map +0 -1
  236. package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts +0 -20
  237. package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts.map +0 -1
  238. package/dist/types/next/api-handler/handlers/revalidate.d.ts +0 -22
  239. package/dist/types/next/api-handler/handlers/revalidate.d.ts.map +0 -1
  240. package/dist/types/next/api-handler/handlers/translatable-data.d.ts +0 -20
  241. package/dist/types/next/api-handler/handlers/translatable-data.d.ts.map +0 -1
  242. package/dist/types/next/api-handler/handlers/utils/draft.d.ts.map +0 -1
  243. package/dist/types/next/api-handler/handlers/webhook/index.d.ts +0 -19
  244. package/dist/types/next/api-handler/handlers/webhook/index.d.ts.map +0 -1
  245. package/dist/types/next/api-handler/handlers/webhook/site-published.d.ts.map +0 -1
  246. package/dist/types/next/api-handler/handlers/webhook/types.d.ts.map +0 -1
  247. package/dist/types/next/tests/server.makeswift-api-handler.test.d.ts +0 -2
  248. package/dist/types/next/tests/server.makeswift-api-handler.test.d.ts.map +0 -1
  249. /package/dist/cjs/{next/api-handler → api-handler}/handlers/webhook/types.js +0 -0
  250. /package/dist/esm/{next/api-handler → api-handler}/handlers/webhook/types.js +0 -0
@@ -0,0 +1,98 @@
1
+ import { P } from "ts-pattern";
2
+ import { redirectPreviewHandler } from "../handlers/redirect-preview";
3
+ import { PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE } from "../draft";
4
+ import { validateApiRoute } from "./base";
5
+ const argsPattern = [P.any, P.any];
6
+ async function config({
7
+ req,
8
+ res,
9
+ apiKey
10
+ }) {
11
+ return {
12
+ req: {
13
+ headers: requestHeaders(req.headers),
14
+ method: req.method ?? "GET",
15
+ url: req.url ?? "",
16
+ json() {
17
+ return req.body;
18
+ }
19
+ },
20
+ route: validateApiRoute(await apiRequestParams(req)),
21
+ manifest: {
22
+ previewMode: true
23
+ },
24
+ draftCookieNames: [PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE],
25
+ sendResponse: async (apiResponse) => {
26
+ const headers = responseHeaders(apiResponse.headers);
27
+ Object.entries(headers).forEach(([key, value]) => {
28
+ res.setHeader(key, value);
29
+ });
30
+ res.status(apiResponse.status);
31
+ if (apiResponse.body) {
32
+ await pipeTo(apiResponse.body, res);
33
+ }
34
+ res.end();
35
+ },
36
+ revalidationHandler: async (path) => {
37
+ if (path != null) {
38
+ res.revalidate(path);
39
+ } else {
40
+ }
41
+ },
42
+ customRoutes: async (route) => {
43
+ if (route === "/preview") {
44
+ return { res: await redirectPreviewHandler(req, res, { apiKey }) };
45
+ }
46
+ return null;
47
+ }
48
+ };
49
+ }
50
+ function apiRequestParams(request) {
51
+ return Promise.resolve(request.query);
52
+ }
53
+ function requestHeaders(headers) {
54
+ const result = new Headers();
55
+ for (const [key, value] of Object.entries(headers)) {
56
+ if (value != null) {
57
+ if (Array.isArray(value)) {
58
+ value.forEach((v) => result.append(key, v));
59
+ } else {
60
+ result.append(key, value);
61
+ }
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ function responseHeaders(headers) {
67
+ return [...headers.entries()].reduce((acc, [key, value]) => {
68
+ if (key in acc) {
69
+ const existingValue = acc[key];
70
+ if (Array.isArray(existingValue)) {
71
+ existingValue.push(value);
72
+ } else {
73
+ acc[key] = [existingValue, value];
74
+ }
75
+ } else {
76
+ acc[key] = value;
77
+ }
78
+ return acc;
79
+ }, {});
80
+ }
81
+ async function pipeTo(stream, res) {
82
+ try {
83
+ const reader = stream.getReader();
84
+ while (true) {
85
+ const { done, value } = await reader.read();
86
+ if (done)
87
+ break;
88
+ res.write(value);
89
+ }
90
+ } catch (error) {
91
+ res.destroy(error instanceof Error ? error : new Error(`${error}`));
92
+ }
93
+ }
94
+ export {
95
+ argsPattern,
96
+ config
97
+ };
98
+ //# sourceMappingURL=pages-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/next/api-handler/config/pages-router.ts"],"sourcesContent":["import { P } from 'ts-pattern'\nimport { NextApiRequest, NextApiResponse } from 'next'\n\nimport { type ApiResponse } from '../../../api-handler/request-response'\n\nimport { redirectPreviewHandler } from '../handlers/redirect-preview'\nimport { PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE } from '../draft'\n\nimport { validateApiRoute, type ApiHandlerConfig } from './base'\n\nexport type ApiHandlerArgs = [NextApiRequest, NextApiResponse]\nexport const argsPattern = [P.any, P.any] as const\n\nexport async function config({\n req,\n res,\n apiKey,\n}: {\n req: NextApiRequest\n res: NextApiResponse\n apiKey: string\n}): Promise<ApiHandlerConfig> {\n return {\n req: {\n headers: requestHeaders(req.headers),\n method: req.method ?? 'GET',\n url: req.url ?? '',\n json() {\n return req.body\n },\n },\n route: validateApiRoute(await apiRequestParams(req)),\n manifest: {\n previewMode: true,\n },\n draftCookieNames: [PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE],\n sendResponse: async (apiResponse: ApiResponse): Promise<Response | void> => {\n const headers = responseHeaders(apiResponse.headers)\n Object.entries(headers).forEach(([key, value]) => {\n res.setHeader(key, value)\n })\n\n res.status(apiResponse.status)\n\n if (apiResponse.body) {\n await pipeTo(apiResponse.body, res)\n }\n\n res.end()\n },\n revalidationHandler: async (path?: string): Promise<void> => {\n if (path != null) {\n res.revalidate(path)\n } else {\n // No-op, Pages Router does not support tag-based revalidation\n }\n },\n customRoutes: async (route: string) => {\n if (route === '/preview') {\n return { res: await redirectPreviewHandler(req, res, { apiKey }) }\n }\n\n return null\n },\n }\n}\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\nfunction requestHeaders(headers: NextApiRequest['headers']): Headers {\n const result = new Headers()\n for (const [key, value] of Object.entries(headers)) {\n if (value != null) {\n if (Array.isArray(value)) {\n value.forEach(v => result.append(key, v))\n } else {\n result.append(key, value)\n }\n }\n }\n\n return result\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string | string[]> {\n return [...headers.entries()].reduce<Record<string, string | string[]>>((acc, [key, value]) => {\n if (key in acc) {\n const existingValue = acc[key]\n if (Array.isArray(existingValue)) {\n existingValue.push(value)\n } else {\n acc[key] = [existingValue, value]\n }\n } else {\n acc[key] = value\n }\n return acc\n }, {})\n}\n\nasync function pipeTo(stream: ReadableStream<Uint8Array>, res: NextApiResponse): Promise<void> {\n try {\n const reader = stream.getReader()\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n res.write(value)\n }\n } catch (error) {\n res.destroy(error instanceof Error ? error : new Error(`${error}`))\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAKlB,SAAS,8BAA8B;AACvC,SAAS,yBAAyB,2BAA2B;AAE7D,SAAS,wBAA+C;AAGjD,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG;AAExC,eAAsB,OAAO;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAI8B;AAC5B,SAAO;AAAA,IACL,KAAK;AAAA,MACH,SAAS,eAAe,IAAI,OAAO;AAAA,MACnC,QAAQ,IAAI,UAAU;AAAA,MACtB,KAAK,IAAI,OAAO;AAAA,MAChB,OAAO;AACL,eAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO,iBAAiB,MAAM,iBAAiB,GAAG,CAAC;AAAA,IACnD,UAAU;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA,kBAAkB,CAAC,yBAAyB,mBAAmB;AAAA,IAC/D,cAAc,OAAO,gBAAuD;AAC1E,YAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,YAAI,UAAU,KAAK,KAAK;AAAA,MAC1B,CAAC;AAED,UAAI,OAAO,YAAY,MAAM;AAE7B,UAAI,YAAY,MAAM;AACpB,cAAM,OAAO,YAAY,MAAM,GAAG;AAAA,MACpC;AAEA,UAAI,IAAI;AAAA,IACV;AAAA,IACA,qBAAqB,OAAO,SAAiC;AAC3D,UAAI,QAAQ,MAAM;AAChB,YAAI,WAAW,IAAI;AAAA,MACrB,OAAO;AAAA,MAEP;AAAA,IACF;AAAA,IACA,cAAc,OAAO,UAAkB;AACrC,UAAI,UAAU,YAAY;AACxB,eAAO,EAAE,KAAK,MAAM,uBAAuB,KAAK,KAAK,EAAE,OAAO,CAAC,EAAE;AAAA,MACnE;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAA2D;AAGnF,SAAO,QAAQ,QAAQ,QAAQ,KAAK;AACtC;AAEA,SAAS,eAAe,SAA6C;AACnE,QAAM,SAAS,IAAI,QAAQ;AAC3B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,SAAS,MAAM;AACjB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,QAAQ,OAAK,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,MAC1C,OAAO;AACL,eAAO,OAAO,KAAK,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAqD;AAC5E,SAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,OAA0C,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC7F,QAAI,OAAO,KAAK;AACd,YAAM,gBAAgB,IAAI,GAAG;AAC7B,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,sBAAc,KAAK,KAAK;AAAA,MAC1B,OAAO;AACL,YAAI,GAAG,IAAI,CAAC,eAAe,KAAK;AAAA,MAClC;AAAA,IACF,OAAO;AACL,UAAI,GAAG,IAAI;AAAA,IACb;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEA,eAAe,OAAO,QAAoC,KAAqC;AAC7F,MAAI;AACF,UAAM,SAAS,OAAO,UAAU;AAChC,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI;AAAM;AACV,UAAI,MAAM,KAAK;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;AAAA,EACpE;AACF;","names":[]}
@@ -1,24 +1,14 @@
1
1
  const PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
2
2
  const PREVIEW_DATA_COOKIE = "__next_preview_data";
3
3
  const MAKESWIFT_DRAFT_DATA_COOKIE = "x-makeswift-draft-data";
4
- const SET_COOKIE_HEADER = "set-cookie";
5
4
  const SearchParams = {
6
5
  DraftMode: "x-makeswift-draft-mode",
7
6
  PreviewMode: "x-makeswift-preview-mode"
8
7
  };
9
- const cookieSettingOptions = {
10
- path: "/",
11
- sameSite: "none",
12
- secure: true,
13
- httpOnly: true,
14
- partitioned: true
15
- };
16
8
  export {
17
9
  MAKESWIFT_DRAFT_DATA_COOKIE,
18
10
  PRERENDER_BYPASS_COOKIE,
19
11
  PREVIEW_DATA_COOKIE,
20
- SET_COOKIE_HEADER,
21
- SearchParams,
22
- cookieSettingOptions
12
+ SearchParams
23
13
  };
24
14
  //# sourceMappingURL=draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/next/api-handler/draft.ts"],"sourcesContent":["export const PRERENDER_BYPASS_COOKIE = '__prerender_bypass'\nexport const PREVIEW_DATA_COOKIE = '__next_preview_data'\n\nexport const MAKESWIFT_DRAFT_DATA_COOKIE = 'x-makeswift-draft-data'\n\nexport const SearchParams = {\n DraftMode: 'x-makeswift-draft-mode',\n PreviewMode: 'x-makeswift-preview-mode',\n} as const\n"],"mappings":"AAAO,MAAM,0BAA0B;AAChC,MAAM,sBAAsB;AAE5B,MAAM,8BAA8B;AAEpC,MAAM,eAAe;AAAA,EAC1B,WAAW;AAAA,EACX,aAAa;AACf;","names":[]}
@@ -1,25 +1,14 @@
1
1
  import { NextResponse } from "next/server";
2
- import { P, match } from "ts-pattern";
3
2
  import { cookies, draftMode } from "next/headers";
4
3
  import { serialize as serializeCookie } from "cookie";
5
4
  import { MakeswiftSiteVersion } from "../../../api/site-version";
6
- import {
7
- cookieSettingOptions,
8
- MAKESWIFT_DRAFT_DATA_COOKIE,
9
- PRERENDER_BYPASS_COOKIE,
10
- SearchParams,
11
- SET_COOKIE_HEADER
12
- } from "./utils/draft";
13
- const routeHandlerPattern = [P.instanceOf(Request), P.any, P.any];
14
- const apiRoutePattern = [P.any, P.any, P.any];
15
- async function redirectDraftHandler(...args) {
16
- return match(args).with(routeHandlerPattern, (args2) => redirectDraftRouteHandler(...args2)).with(apiRoutePattern, (args2) => redirectDraftApiRouteHandler(...args2)).exhaustive();
17
- }
5
+ import { cookieSettingOptions, SET_COOKIE_HEADER } from "../../../api-handler/cookies";
6
+ import { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE, SearchParams } from "../draft";
18
7
  function originalRequestProtocol(request) {
19
8
  const forwardedProto = request.headers.get("x-forwarded-proto");
20
9
  return forwardedProto != null ? forwardedProto.split(",")[0].trim() : null;
21
10
  }
22
- async function redirectDraftRouteHandler(request, _context, { apiKey }) {
11
+ async function redirectDraftHandler(request, _context, { apiKey }) {
23
12
  const secret = request.nextUrl.searchParams.get(SearchParams.DraftMode);
24
13
  if (secret == null) {
25
14
  return new NextResponse("Unauthorized to enable draft mode: no secret provided", {
@@ -56,13 +45,8 @@ async function redirectDraftRouteHandler(request, _context, { apiKey }) {
56
45
  });
57
46
  return NextResponse.redirect(redirectUrl, { headers });
58
47
  }
59
- async function redirectDraftApiRouteHandler(_req, res, {}) {
60
- const message = "Cannot request draft endpoint from an API handler registered in `pages`. Move your Makeswift API handler to the `app` directory";
61
- console.error(message);
62
- return res.status(500).send(message);
63
- }
64
48
  export {
65
- redirectDraftHandler as default,
66
- originalRequestProtocol
49
+ originalRequestProtocol,
50
+ redirectDraftHandler
67
51
  };
68
52
  //# sourceMappingURL=redirect-draft.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/next/api-handler/handlers/redirect-draft.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\nimport { cookies, draftMode } from 'next/headers'\n\nimport { serialize as serializeCookie } from 'cookie'\n\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\nimport {\n cookieSettingOptions,\n MAKESWIFT_DRAFT_DATA_COOKIE,\n PRERENDER_BYPASS_COOKIE,\n SearchParams,\n SET_COOKIE_HEADER,\n} from './utils/draft'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype RedirectDraftError = string\n\ntype Response = unknown\n\nexport type RedirectDraftResponse = RedirectDraftError | Response\n\ntype RedirectDraftHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<RedirectDraftResponse>, params: { apiKey: string }]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nexport default async function redirectDraftHandler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<RedirectDraftResponse>>\nexport default async function redirectDraftHandler(\n req: NextApiRequest,\n res: NextApiResponse<RedirectDraftResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function redirectDraftHandler(\n ...args: RedirectDraftHandlerArgs\n): Promise<NextResponse<RedirectDraftResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, args => redirectDraftRouteHandler(...args))\n .with(apiRoutePattern, args => redirectDraftApiRouteHandler(...args))\n .exhaustive()\n}\n\nexport function originalRequestProtocol(request: NextRequest): string | null {\n // The `x-forwarded-proto` header is not formally standardized, but many proxies\n // *append* the protocol used for the request to the existing value. As a result,\n // if the request passes through multiple proxies, the header may contain a\n // comma-separated list of protocols: https://code.djangoproject.com/ticket/33569\n const forwardedProto = request.headers.get('x-forwarded-proto')\n return forwardedProto != null ? forwardedProto.split(',')[0].trim() : null\n}\n\nasync function redirectDraftRouteHandler(\n request: NextRequest,\n _context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<RedirectDraftResponse>> {\n const secret = request.nextUrl.searchParams.get(SearchParams.DraftMode)\n\n if (secret == null) {\n return new NextResponse('Unauthorized to enable draft mode: no secret provided', {\n status: 401,\n })\n }\n if (secret !== apiKey) {\n return new NextResponse('Unauthorized to enable draft mode: incorrect secret', { status: 401 })\n }\n\n const draft = await draftMode()\n const cookieStore = await cookies()\n\n draft.enable()\n\n const prerenderBypassCookie = cookieStore.get(PRERENDER_BYPASS_COOKIE)\n\n if (prerenderBypassCookie?.value == null) {\n return new NextResponse('Could not retrieve draft mode bypass cookie', { status: 500 })\n }\n\n const draftCookies: { name: string; value: string }[] = [\n prerenderBypassCookie,\n {\n name: MAKESWIFT_DRAFT_DATA_COOKIE,\n // Eventually, we can make this value dynamic using the request\n value: JSON.stringify({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working }),\n },\n ]\n\n const redirectProtocol =\n originalRequestProtocol(request) ?? request.nextUrl.protocol.replace(':', '')\n\n const redirectHost =\n request.headers.get('x-forwarded-host') ?? request.headers.get('host') ?? request.nextUrl.host\n\n const redirectUrl = new URL(\n `${redirectProtocol}://${redirectHost}${request.nextUrl.pathname}${request.nextUrl.search}`,\n )\n\n redirectUrl.searchParams.delete(SearchParams.DraftMode)\n\n const headers = new Headers()\n draftCookies.forEach(({ name, value }) => {\n headers.append(SET_COOKIE_HEADER, serializeCookie(name, value, { ...cookieSettingOptions }))\n })\n\n return NextResponse.redirect(redirectUrl, { headers })\n}\n\nasync function redirectDraftApiRouteHandler(\n _req: NextApiRequest,\n res: NextApiResponse<RedirectDraftResponse>,\n {}: { apiKey: string },\n): Promise<void> {\n const message =\n 'Cannot request draft endpoint from an API handler registered in `pages`. Move your Makeswift API handler to the `app` directory'\n console.error(message)\n return res.status(500).send(message)\n}\n"],"mappings":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AACzB,SAAS,SAAS,iBAAiB;AAEnC,SAAS,aAAa,uBAAuB;AAE7C,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAY5C,eAAO,wBACF,MACkD;AACrD,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAAA,UAAQ,0BAA0B,GAAGA,KAAI,CAAC,EACpE,KAAK,iBAAiB,CAAAA,UAAQ,6BAA6B,GAAGA,KAAI,CAAC,EACnE,WAAW;AAChB;AAEO,SAAS,wBAAwB,SAAqC;AAK3E,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,mBAAmB;AAC9D,SAAO,kBAAkB,OAAO,eAAe,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI;AACxE;AAEA,eAAe,0BACb,SACA,UACA,EAAE,OAAO,GACqC;AAC9C,QAAM,SAAS,QAAQ,QAAQ,aAAa,IAAI,aAAa,SAAS;AAEtE,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,aAAa,yDAAyD;AAAA,MAC/E,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,aAAa,uDAAuD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAChG;AAEA,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,cAAc,MAAM,QAAQ;AAElC,QAAM,OAAO;AAEb,QAAM,wBAAwB,YAAY,IAAI,uBAAuB;AAErE,MAAI,uBAAuB,SAAS,MAAM;AACxC,WAAO,IAAI,aAAa,+CAA+C,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxF;AAEA,QAAM,eAAkD;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA;AAAA,MAEN,OAAO,KAAK,UAAU,EAAE,WAAW,MAAM,aAAa,qBAAqB,QAAQ,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,mBACJ,wBAAwB,OAAO,KAAK,QAAQ,QAAQ,SAAS,QAAQ,KAAK,EAAE;AAE9E,QAAM,eACJ,QAAQ,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,QAAQ,IAAI,MAAM,KAAK,QAAQ,QAAQ;AAE5F,QAAM,cAAc,IAAI;AAAA,IACtB,GAAG,gBAAgB,MAAM,YAAY,GAAG,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAAA,EAC3F;AAEA,cAAY,aAAa,OAAO,aAAa,SAAS;AAEtD,QAAM,UAAU,IAAI,QAAQ;AAC5B,eAAa,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AACxC,YAAQ,OAAO,mBAAmB,gBAAgB,MAAM,OAAO,EAAE,GAAG,qBAAqB,CAAC,CAAC;AAAA,EAC7F,CAAC;AAED,SAAO,aAAa,SAAS,aAAa,EAAE,QAAQ,CAAC;AACvD;AAEA,eAAe,6BACb,MACA,KACA,CAAC,GACc;AACf,QAAM,UACJ;AACF,UAAQ,MAAM,OAAO;AACrB,SAAO,IAAI,OAAO,GAAG,EAAE,KAAK,OAAO;AACrC;","names":["args"]}
1
+ {"version":3,"sources":["../../../../../src/next/api-handler/handlers/redirect-draft.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { cookies, draftMode } from 'next/headers'\n\nimport { serialize as serializeCookie } from 'cookie'\n\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\nimport { cookieSettingOptions, SET_COOKIE_HEADER } from '../../../api-handler/cookies'\n\nimport { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE, SearchParams } from '../draft'\n\nexport function originalRequestProtocol(request: NextRequest): string | null {\n // The `x-forwarded-proto` header is not formally standardized, but many proxies\n // *append* the protocol used for the request to the existing value. As a result,\n // if the request passes through multiple proxies, the header may contain a\n // comma-separated list of protocols: https://code.djangoproject.com/ticket/33569\n const forwardedProto = request.headers.get('x-forwarded-proto')\n return forwardedProto != null ? forwardedProto.split(',')[0].trim() : null\n}\n\nexport async function redirectDraftHandler(\n request: NextRequest,\n _context: any,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse> {\n const secret = request.nextUrl.searchParams.get(SearchParams.DraftMode)\n\n if (secret == null) {\n return new NextResponse('Unauthorized to enable draft mode: no secret provided', {\n status: 401,\n })\n }\n\n if (secret !== apiKey) {\n return new NextResponse('Unauthorized to enable draft mode: incorrect secret', { status: 401 })\n }\n\n const draft = await draftMode()\n const cookieStore = await cookies()\n\n draft.enable()\n\n const prerenderBypassCookie = cookieStore.get(PRERENDER_BYPASS_COOKIE)\n\n if (prerenderBypassCookie?.value == null) {\n return new NextResponse('Could not retrieve draft mode bypass cookie', { status: 500 })\n }\n\n const draftCookies: { name: string; value: string }[] = [\n prerenderBypassCookie,\n {\n name: MAKESWIFT_DRAFT_DATA_COOKIE,\n // Eventually, we can make this value dynamic using the request\n value: JSON.stringify({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working }),\n },\n ]\n\n const redirectProtocol =\n originalRequestProtocol(request) ?? request.nextUrl.protocol.replace(':', '')\n\n const redirectHost =\n request.headers.get('x-forwarded-host') ?? request.headers.get('host') ?? request.nextUrl.host\n\n const redirectUrl = new URL(\n `${redirectProtocol}://${redirectHost}${request.nextUrl.pathname}${request.nextUrl.search}`,\n )\n\n redirectUrl.searchParams.delete(SearchParams.DraftMode)\n\n const headers = new Headers()\n draftCookies.forEach(({ name, value }) => {\n headers.append(SET_COOKIE_HEADER, serializeCookie(name, value, { ...cookieSettingOptions }))\n })\n\n return NextResponse.redirect(redirectUrl, { headers })\n}\n"],"mappings":"AAAA,SAAsB,oBAAoB;AAC1C,SAAS,SAAS,iBAAiB;AAEnC,SAAS,aAAa,uBAAuB;AAE7C,SAAS,4BAA4B;AACrC,SAAS,sBAAsB,yBAAyB;AAExD,SAAS,6BAA6B,yBAAyB,oBAAoB;AAE5E,SAAS,wBAAwB,SAAqC;AAK3E,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,mBAAmB;AAC9D,SAAO,kBAAkB,OAAO,eAAe,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI;AACxE;AAEA,eAAsB,qBACpB,SACA,UACA,EAAE,OAAO,GACc;AACvB,QAAM,SAAS,QAAQ,QAAQ,aAAa,IAAI,aAAa,SAAS;AAEtE,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,aAAa,yDAAyD;AAAA,MAC/E,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,aAAa,uDAAuD,EAAE,QAAQ,IAAI,CAAC;AAAA,EAChG;AAEA,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,cAAc,MAAM,QAAQ;AAElC,QAAM,OAAO;AAEb,QAAM,wBAAwB,YAAY,IAAI,uBAAuB;AAErE,MAAI,uBAAuB,SAAS,MAAM;AACxC,WAAO,IAAI,aAAa,+CAA+C,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxF;AAEA,QAAM,eAAkD;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA;AAAA,MAEN,OAAO,KAAK,UAAU,EAAE,WAAW,MAAM,aAAa,qBAAqB,QAAQ,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,mBACJ,wBAAwB,OAAO,KAAK,QAAQ,QAAQ,SAAS,QAAQ,KAAK,EAAE;AAE9E,QAAM,eACJ,QAAQ,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,QAAQ,IAAI,MAAM,KAAK,QAAQ,QAAQ;AAE5F,QAAM,cAAc,IAAI;AAAA,IACtB,GAAG,gBAAgB,MAAM,YAAY,GAAG,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAAA,EAC3F;AAEA,cAAY,aAAa,OAAO,aAAa,SAAS;AAEtD,QAAM,UAAU,IAAI,QAAQ;AAC5B,eAAa,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AACxC,YAAQ,OAAO,mBAAmB,gBAAgB,MAAM,OAAO,EAAE,GAAG,qBAAqB,CAAC,CAAC;AAAA,EAC7F,CAAC;AAED,SAAO,aAAa,SAAS,aAAa,EAAE,QAAQ,CAAC;AACvD;","names":[]}
@@ -1,26 +1,9 @@
1
- import { NextResponse } from "next/server";
2
- import { P, match } from "ts-pattern";
3
1
  import { parse as parseSetCookie } from "set-cookie-parser";
4
2
  import { serialize as serializeCookie } from "cookie";
5
3
  import { MakeswiftSiteVersion } from "../../../api/site-version";
6
- import {
7
- cookieSettingOptions,
8
- PRERENDER_BYPASS_COOKIE,
9
- PREVIEW_DATA_COOKIE,
10
- SearchParams,
11
- SET_COOKIE_HEADER
12
- } from "./utils/draft";
13
- const routeHandlerPattern = [P.instanceOf(Request), P.any, P.any];
14
- const apiRoutePattern = [P.any, P.any, P.any];
15
- async function redirectPreviewHandler(...args) {
16
- return match(args).with(routeHandlerPattern, (args2) => redirectPreviewRouteHandler(...args2)).with(apiRoutePattern, (args2) => redirectPreviewApiRouteHandler(...args2)).exhaustive();
17
- }
18
- async function redirectPreviewRouteHandler(_request, _context, {}) {
19
- const message = "Cannot request preview endpoint from an API handler registered in `app`. Move your Makeswift API handler to the `pages/api` directory";
20
- console.error(message);
21
- return NextResponse.json(message, { status: 500 });
22
- }
23
- async function redirectPreviewApiRouteHandler(req, res, { apiKey }) {
4
+ import { cookieSettingOptions, SET_COOKIE_HEADER } from "../../../api-handler/cookies";
5
+ import { PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE, SearchParams } from "../draft";
6
+ async function redirectPreviewHandler(req, res, { apiKey }) {
24
7
  const secret = req.query[SearchParams.PreviewMode];
25
8
  const pathname = req.query.path;
26
9
  if (secret == null) {
@@ -49,6 +32,6 @@ async function redirectPreviewApiRouteHandler(req, res, { apiKey }) {
49
32
  res.redirect(`${destinationUrl.pathname}?${destinationUrl.searchParams.toString()}`);
50
33
  }
51
34
  export {
52
- redirectPreviewHandler as default
35
+ redirectPreviewHandler
53
36
  };
54
37
  //# sourceMappingURL=redirect-preview.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/next/api-handler/handlers/redirect-preview.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { P, match } from 'ts-pattern'\n\nimport { parse as parseSetCookie } from 'set-cookie-parser'\nimport { serialize as serializeCookie } from 'cookie'\n\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\nimport {\n cookieSettingOptions,\n PRERENDER_BYPASS_COOKIE,\n PREVIEW_DATA_COOKIE,\n SearchParams,\n SET_COOKIE_HEADER,\n} from './utils/draft'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\ntype RedirectPreviewError = string\n\ntype Response = unknown\n\nexport type RedirectPreviewResponse = RedirectPreviewError | Response\n\ntype RedirectPreviewHandlerArgs =\n | [request: NextRequest, context: Context, params: { apiKey: string }]\n | [req: NextApiRequest, res: NextApiResponse<RedirectPreviewResponse>, params: { apiKey: string }]\n\nconst routeHandlerPattern = [P.instanceOf(Request), P.any, P.any] as const\nconst apiRoutePattern = [P.any, P.any, P.any] as const\n\nexport default async function redirectPreviewHandler(\n request: NextRequest,\n context: Context,\n { apiKey }: { apiKey: string },\n): Promise<NextResponse<RedirectPreviewResponse>>\nexport default async function redirectPreviewHandler(\n req: NextApiRequest,\n res: NextApiResponse<RedirectPreviewResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void>\nexport default async function redirectPreviewHandler(\n ...args: RedirectPreviewHandlerArgs\n): Promise<NextResponse<RedirectPreviewResponse> | void> {\n return match(args)\n .with(routeHandlerPattern, args => redirectPreviewRouteHandler(...args))\n .with(apiRoutePattern, args => redirectPreviewApiRouteHandler(...args))\n .exhaustive()\n}\n\nasync function redirectPreviewRouteHandler(\n _request: NextRequest,\n _context: Context,\n {}: { apiKey: string },\n): Promise<NextResponse<RedirectPreviewResponse>> {\n const message =\n 'Cannot request preview endpoint from an API handler registered in `app`. Move your Makeswift API handler to the `pages/api` directory'\n console.error(message)\n return NextResponse.json(message, { status: 500 })\n}\n\nasync function redirectPreviewApiRouteHandler(\n req: NextApiRequest,\n res: NextApiResponse<RedirectPreviewResponse>,\n { apiKey }: { apiKey: string },\n): Promise<void> {\n const secret = req.query[SearchParams.PreviewMode]\n // Next.js automatically strips the locale prefix from rewritten request's URL, even when the\n // rewrite's `locale` option is set to `false`: https://github.com/vercel/next.js/discussions/21798.\n // At the same time, it also maps rewrite's URL segments (e.g. `:path`) to query parameters\n // on the rewritten request, so we use `query.path` to recover the original request path.\n const pathname = req.query.path as string | undefined\n\n if (secret == null) {\n return res.status(401).send('Unauthorized to enable preview mode: no secret provided')\n }\n\n if (secret !== apiKey) {\n return res.status(401).send('Unauthorized to enable preview mode: secret is incorrect')\n }\n\n if (pathname == null) {\n return res\n .status(400)\n .send('Bad request: incoming request does not have an associated pathname')\n }\n\n const setCookie = res\n // Eventually, we can make the preview data value dynamic using the request\n .setPreviewData({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working })\n .getHeader(SET_COOKIE_HEADER)\n\n res.removeHeader(SET_COOKIE_HEADER)\n\n const parsedCookies = parseSetCookie(Array.isArray(setCookie) ? setCookie : '')\n\n const prerenderBypassCookie = parsedCookies.find(c => c.name === PRERENDER_BYPASS_COOKIE)\n const previewDataCookie = parsedCookies.find(c => c.name === PREVIEW_DATA_COOKIE)\n\n if (prerenderBypassCookie?.value == null || previewDataCookie?.value == null) {\n return res.status(500).send('Could not retrieve preview mode cookies')\n }\n\n const patchedCookies = [prerenderBypassCookie, previewDataCookie].map(({ name, value }) => {\n return serializeCookie(name, value, { ...cookieSettingOptions })\n })\n\n res.setHeader(SET_COOKIE_HEADER, patchedCookies)\n\n const destinationUrl = new URL(pathname, 'http://test.com')\n destinationUrl.searchParams.delete(SearchParams.PreviewMode)\n\n res.redirect(`${destinationUrl.pathname}?${destinationUrl.searchParams.toString()}`)\n}\n"],"mappings":"AACA,SAAsB,oBAAoB;AAC1C,SAAS,GAAG,aAAa;AAEzB,SAAS,SAAS,sBAAsB;AACxC,SAAS,aAAa,uBAAuB;AAE7C,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP,MAAM,sBAAsB,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG;AAChE,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG;AAY5C,eAAO,0BACF,MACoD;AACvD,SAAO,MAAM,IAAI,EACd,KAAK,qBAAqB,CAAAA,UAAQ,4BAA4B,GAAGA,KAAI,CAAC,EACtE,KAAK,iBAAiB,CAAAA,UAAQ,+BAA+B,GAAGA,KAAI,CAAC,EACrE,WAAW;AAChB;AAEA,eAAe,4BACb,UACA,UACA,CAAC,GAC+C;AAChD,QAAM,UACJ;AACF,UAAQ,MAAM,OAAO;AACrB,SAAO,aAAa,KAAK,SAAS,EAAE,QAAQ,IAAI,CAAC;AACnD;AAEA,eAAe,+BACb,KACA,KACA,EAAE,OAAO,GACM;AACf,QAAM,SAAS,IAAI,MAAM,aAAa,WAAW;AAKjD,QAAM,WAAW,IAAI,MAAM;AAE3B,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yDAAyD;AAAA,EACvF;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,0DAA0D;AAAA,EACxF;AAEA,MAAI,YAAY,MAAM;AACpB,WAAO,IACJ,OAAO,GAAG,EACV,KAAK,oEAAoE;AAAA,EAC9E;AAEA,QAAM,YAAY,IAEf,eAAe,EAAE,WAAW,MAAM,aAAa,qBAAqB,QAAQ,CAAC,EAC7E,UAAU,iBAAiB;AAE9B,MAAI,aAAa,iBAAiB;AAElC,QAAM,gBAAgB,eAAe,MAAM,QAAQ,SAAS,IAAI,YAAY,EAAE;AAE9E,QAAM,wBAAwB,cAAc,KAAK,OAAK,EAAE,SAAS,uBAAuB;AACxF,QAAM,oBAAoB,cAAc,KAAK,OAAK,EAAE,SAAS,mBAAmB;AAEhF,MAAI,uBAAuB,SAAS,QAAQ,mBAAmB,SAAS,MAAM;AAC5E,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yCAAyC;AAAA,EACvE;AAEA,QAAM,iBAAiB,CAAC,uBAAuB,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM;AACzF,WAAO,gBAAgB,MAAM,OAAO,EAAE,GAAG,qBAAqB,CAAC;AAAA,EACjE,CAAC;AAED,MAAI,UAAU,mBAAmB,cAAc;AAE/C,QAAM,iBAAiB,IAAI,IAAI,UAAU,iBAAiB;AAC1D,iBAAe,aAAa,OAAO,aAAa,WAAW;AAE3D,MAAI,SAAS,GAAG,eAAe,QAAQ,IAAI,eAAe,aAAa,SAAS,CAAC,EAAE;AACrF;","names":["args"]}
1
+ {"version":3,"sources":["../../../../../src/next/api-handler/handlers/redirect-preview.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\n\nimport { parse as parseSetCookie } from 'set-cookie-parser'\nimport { serialize as serializeCookie } from 'cookie'\n\nimport { MakeswiftSiteVersion } from '../../../api/site-version'\nimport { cookieSettingOptions, SET_COOKIE_HEADER } from '../../../api-handler/cookies'\n\nimport { PRERENDER_BYPASS_COOKIE, PREVIEW_DATA_COOKIE, SearchParams } from '../draft'\n\nexport async function redirectPreviewHandler(\n req: NextApiRequest,\n res: NextApiResponse,\n { apiKey }: { apiKey: string },\n): Promise<void> {\n const secret = req.query[SearchParams.PreviewMode]\n // Next.js automatically strips the locale prefix from rewritten request's URL, even when the\n // rewrite's `locale` option is set to `false`: https://github.com/vercel/next.js/discussions/21798.\n // At the same time, it also maps rewrite's URL segments (e.g. `:path`) to query parameters\n // on the rewritten request, so we use `query.path` to recover the original request path.\n const pathname = req.query.path as string | undefined\n\n if (secret == null) {\n return res.status(401).send('Unauthorized to enable preview mode: no secret provided')\n }\n\n if (secret !== apiKey) {\n return res.status(401).send('Unauthorized to enable preview mode: secret is incorrect')\n }\n\n if (pathname == null) {\n return res\n .status(400)\n .send('Bad request: incoming request does not have an associated pathname')\n }\n\n const setCookie = res\n // Eventually, we can make the preview data value dynamic using the request\n .setPreviewData({ makeswift: true, siteVersion: MakeswiftSiteVersion.Working })\n .getHeader(SET_COOKIE_HEADER)\n\n res.removeHeader(SET_COOKIE_HEADER)\n\n const parsedCookies = parseSetCookie(Array.isArray(setCookie) ? setCookie : '')\n\n const prerenderBypassCookie = parsedCookies.find(c => c.name === PRERENDER_BYPASS_COOKIE)\n const previewDataCookie = parsedCookies.find(c => c.name === PREVIEW_DATA_COOKIE)\n\n if (prerenderBypassCookie?.value == null || previewDataCookie?.value == null) {\n return res.status(500).send('Could not retrieve preview mode cookies')\n }\n\n const patchedCookies = [prerenderBypassCookie, previewDataCookie].map(({ name, value }) => {\n return serializeCookie(name, value, { ...cookieSettingOptions })\n })\n\n res.setHeader(SET_COOKIE_HEADER, patchedCookies)\n\n const destinationUrl = new URL(pathname, 'http://test.com')\n destinationUrl.searchParams.delete(SearchParams.PreviewMode)\n\n res.redirect(`${destinationUrl.pathname}?${destinationUrl.searchParams.toString()}`)\n}\n"],"mappings":"AAEA,SAAS,SAAS,sBAAsB;AACxC,SAAS,aAAa,uBAAuB;AAE7C,SAAS,4BAA4B;AACrC,SAAS,sBAAsB,yBAAyB;AAExD,SAAS,yBAAyB,qBAAqB,oBAAoB;AAE3E,eAAsB,uBACpB,KACA,KACA,EAAE,OAAO,GACM;AACf,QAAM,SAAS,IAAI,MAAM,aAAa,WAAW;AAKjD,QAAM,WAAW,IAAI,MAAM;AAE3B,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yDAAyD;AAAA,EACvF;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,0DAA0D;AAAA,EACxF;AAEA,MAAI,YAAY,MAAM;AACpB,WAAO,IACJ,OAAO,GAAG,EACV,KAAK,oEAAoE;AAAA,EAC9E;AAEA,QAAM,YAAY,IAEf,eAAe,EAAE,WAAW,MAAM,aAAa,qBAAqB,QAAQ,CAAC,EAC7E,UAAU,iBAAiB;AAE9B,MAAI,aAAa,iBAAiB;AAElC,QAAM,gBAAgB,eAAe,MAAM,QAAQ,SAAS,IAAI,YAAY,EAAE;AAE9E,QAAM,wBAAwB,cAAc,KAAK,OAAK,EAAE,SAAS,uBAAuB;AACxF,QAAM,oBAAoB,cAAc,KAAK,OAAK,EAAE,SAAS,mBAAmB;AAEhF,MAAI,uBAAuB,SAAS,QAAQ,mBAAmB,SAAS,MAAM;AAC5E,WAAO,IAAI,OAAO,GAAG,EAAE,KAAK,yCAAyC;AAAA,EACvE;AAEA,QAAM,iBAAiB,CAAC,uBAAuB,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM;AACzF,WAAO,gBAAgB,MAAM,OAAO,EAAE,GAAG,qBAAqB,CAAC;AAAA,EACjE,CAAC;AAED,MAAI,UAAU,mBAAmB,cAAc;AAE/C,QAAM,iBAAiB,IAAI,IAAI,UAAU,iBAAiB;AAC1D,iBAAe,aAAa,OAAO,aAAa,WAAW;AAE3D,MAAI,SAAS,GAAG,eAAe,QAAQ,IAAI,eAAe,aAAa,SAAS,CAAC,EAAE;AACrF;","names":[]}
@@ -1,163 +1,24 @@
1
- import Cors from "cors";
2
- import { NextResponse } from "next/server";
3
- import { match as matchPattern } from "path-to-regexp";
4
- import { Makeswift } from "../client";
5
- import elementTree from "./handlers/element-tree";
6
- import fonts from "./handlers/fonts";
7
- import manifest from "./handlers/manifest";
8
- import redirectDraft from "./handlers/redirect-draft";
9
- import redirectPreview from "./handlers/redirect-preview";
10
- import clearDraft from "./handlers/clear-draft";
11
- import { revalidate } from "./handlers/revalidate";
12
- import translatableData from "./handlers/translatable-data";
13
- import mergeTranslatedData from "./handlers/merge-translated-data";
14
- import webhook from "./handlers/webhook";
15
- import { P, match } from "ts-pattern";
16
- import {
17
- API_HANDLER_SITE_VERSION_HEADER,
18
- MakeswiftSiteVersion,
19
- makeswiftSiteVersionSchema
20
- } from "../../api/site-version";
21
- function apiRequestParams(request) {
22
- return Promise.resolve(request.query);
23
- }
24
- function MakeswiftApiHandler(apiKey, {
25
- appOrigin = "https://app.makeswift.com",
26
- apiOrigin = "https://api.makeswift.com",
27
- getFonts,
28
- events,
29
- runtime
30
- }) {
31
- const cors = Cors({ origin: appOrigin });
32
- if (typeof apiKey !== "string") {
33
- throw new Error(
34
- `The Makeswift Next.js API handler must be passed a valid Makeswift site API key: \`MakeswiftApiHandler('<makeswift_site_api_key>')\`
35
- Received "${apiKey}" instead.`
36
- );
37
- }
38
- const routeHandlerPattern = [P.instanceOf(Request), P.any];
39
- const apiRoutePattern = [P.any, P.any];
40
- return function handler(...args) {
41
- return match(args).with(routeHandlerPattern, async (args2) => {
42
- const [req] = args2;
43
- if (req.method.toUpperCase() === "OPTIONS") {
44
- return new NextResponse(null, {
45
- status: 204,
46
- headers: new Headers({
47
- "Content-Length": "0",
48
- "Access-Control-Allow-Origin": appOrigin,
49
- "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
50
- "Access-Control-Allow-Headers": "Content-Type, Authorization"
51
- })
52
- });
53
- }
54
- const response = await makeswiftApiHandler(...args2);
55
- response.headers.append("Access-Control-Allow-Origin", appOrigin);
56
- response.headers.append("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
57
- response.headers.append("Access-Control-Allow-Headers", "Content-Type, Authorization");
58
- return response;
59
- }).with(apiRoutePattern, async (args2) => {
60
- const [req, res] = args2;
61
- await new Promise((resolve, reject) => {
62
- cors(req, res, (err) => {
63
- if (err instanceof Error)
64
- reject(err);
65
- else
66
- resolve();
67
- });
68
- });
69
- return await makeswiftApiHandler(...args2);
70
- }).exhaustive();
1
+ import { match } from "ts-pattern";
2
+ import { Makeswift as MakeswiftClient } from "../client";
3
+ import { createApiHandler } from "../../api-handler";
4
+ import * as AppRouter from "./config/app-router";
5
+ import * as PagesRouter from "./config/pages-router";
6
+ function MakeswiftApiHandler(apiKey, { apiOrigin, runtime, ...userConfig }) {
7
+ const client = new MakeswiftClient(apiKey, { apiOrigin, runtime });
8
+ return async function handler(...args) {
9
+ const { req, route, sendResponse, customRoutes, ...handlerConfig } = await match(args).with(AppRouter.argsPattern, ([req2, context]) => AppRouter.config({ req: req2, context, apiKey })).with(PagesRouter.argsPattern, ([req2, res]) => PagesRouter.config({ req: req2, res, apiKey })).exhaustive();
10
+ const apiHandler = createApiHandler(apiKey, {
11
+ ...userConfig,
12
+ ...handlerConfig,
13
+ runtime,
14
+ client
15
+ });
16
+ const customRouteResponse = await customRoutes(route);
17
+ if (customRouteResponse) {
18
+ return customRouteResponse.res;
19
+ }
20
+ return sendResponse(await apiHandler(req, route));
71
21
  };
72
- function getSiteVersionFromRequest(args) {
73
- const header = match(args).with(
74
- routeHandlerPattern,
75
- ([request]) => request.headers.get(API_HANDLER_SITE_VERSION_HEADER)
76
- ).with(apiRoutePattern, ([req]) => req.headers[API_HANDLER_SITE_VERSION_HEADER.toLowerCase()]).exhaustive();
77
- const parsed = makeswiftSiteVersionSchema.safeParse(header);
78
- if (!parsed.success)
79
- return MakeswiftSiteVersion.Live;
80
- return parsed.data;
81
- }
82
- async function makeswiftApiHandler(...args) {
83
- const params = match(args).with(routeHandlerPattern, ([, context]) => context.params).with(apiRoutePattern, ([req]) => apiRequestParams(req)).exhaustive();
84
- const { makeswift } = await params;
85
- if (!Array.isArray(makeswift)) {
86
- throw new Error(
87
- `The Makeswift Next.js API handler must be used in a dynamic catch-all route named \`[...makeswift]\`.
88
- Received "${makeswift}" for the \`makeswift\` param instead.
89
- Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes`
90
- );
91
- }
92
- const client = new Makeswift(apiKey, { apiOrigin, runtime });
93
- const siteVersion = getSiteVersionFromRequest(args);
94
- const action = "/" + makeswift.join("/");
95
- const matches = (pattern) => matchPattern(pattern, { decode: decodeURIComponent })(action);
96
- let m;
97
- if (matches("/manifest")) {
98
- return match(args).with(routeHandlerPattern, (args2) => manifest(...args2, { apiKey })).with(apiRoutePattern, (args2) => manifest(...args2, { apiKey })).exhaustive();
99
- }
100
- if (matches("/revalidate")) {
101
- return match(args).with(routeHandlerPattern, (args2) => revalidate(...args2, { apiKey })).with(apiRoutePattern, (args2) => revalidate(...args2, { apiKey })).exhaustive();
102
- }
103
- if (matches("/draft")) {
104
- return match(args).with(routeHandlerPattern, (args2) => redirectDraft(...args2, { apiKey })).with(apiRoutePattern, (args2) => redirectDraft(...args2, { apiKey })).exhaustive();
105
- }
106
- if (matches("/preview")) {
107
- return match(args).with(routeHandlerPattern, (args2) => redirectPreview(...args2, { apiKey })).with(apiRoutePattern, (args2) => redirectPreview(...args2, { apiKey })).exhaustive();
108
- }
109
- if (matches("/clear-draft")) {
110
- return match(args).with(routeHandlerPattern, (args2) => clearDraft(...args2, { apiKey })).with(apiRoutePattern, (args2) => clearDraft(...args2, { apiKey })).exhaustive();
111
- }
112
- if (matches("/fonts")) {
113
- return match(args).with(routeHandlerPattern, (args2) => fonts(...args2, { getFonts })).with(apiRoutePattern, (args2) => fonts(...args2, { getFonts })).exhaustive();
114
- }
115
- if (matches("/element-tree")) {
116
- return match(args).with(routeHandlerPattern, (args2) => elementTree(...args2, runtime)).with(apiRoutePattern, (args2) => elementTree(...args2, runtime)).exhaustive();
117
- }
118
- if (matches("/translatable-data")) {
119
- return match(args).with(routeHandlerPattern, (args2) => translatableData(...args2, client)).with(apiRoutePattern, (args2) => translatableData(...args2, client)).exhaustive();
120
- }
121
- if (matches("/merge-translated-data")) {
122
- return match(args).with(routeHandlerPattern, (args2) => mergeTranslatedData(...args2, client)).with(apiRoutePattern, (args2) => mergeTranslatedData(...args2, client)).exhaustive();
123
- }
124
- if (matches("/webhook")) {
125
- return match(args).with(routeHandlerPattern, (args2) => webhook(...args2, { apiKey, events })).with(apiRoutePattern, (args2) => webhook(...args2, { apiKey, events })).exhaustive();
126
- }
127
- const handleResource = (resource) => {
128
- const status2 = resource === null ? 404 : 200;
129
- const body2 = resource === null ? { message: "Not Found" } : resource;
130
- return match(args).with(routeHandlerPattern, () => NextResponse.json(body2, { status: status2 })).with(apiRoutePattern, ([, res]) => res.status(status2).json(body2)).exhaustive();
131
- };
132
- if (m = matches("/swatches/:id")) {
133
- return client.getSwatch(m.params.id, siteVersion).then(handleResource);
134
- }
135
- if (m = matches("/files/:id")) {
136
- return client.getFile(m.params.id).then(handleResource);
137
- }
138
- if (m = matches("/typographies/:id")) {
139
- return client.getTypography(m.params.id, siteVersion).then(handleResource);
140
- }
141
- if (m = matches("/global-elements/:id")) {
142
- return client.getGlobalElement(m.params.id, siteVersion).then(handleResource);
143
- }
144
- if (m = matches(
145
- "/localized-global-elements/:globalElementId/:locale"
146
- )) {
147
- return client.getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion).then(handleResource);
148
- }
149
- if (m = matches("/page-pathname-slices/:id")) {
150
- const localeParam = match(args).with(routeHandlerPattern, ([request]) => request.nextUrl.searchParams.get("locale")).with(apiRoutePattern, ([req]) => req.query.locale).exhaustive();
151
- const locale = typeof localeParam === "string" ? localeParam : void 0;
152
- return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource);
153
- }
154
- if (m = matches("/tables/:id")) {
155
- return client.getTable(m.params.id).then(handleResource);
156
- }
157
- const status = 404;
158
- const body = { message: "Not Found" };
159
- return match(args).with(routeHandlerPattern, () => NextResponse.json(body, { status })).with(apiRoutePattern, ([, res]) => res.status(status).json(body)).exhaustive();
160
- }
161
22
  }
162
23
  export {
163
24
  MakeswiftApiHandler
@@ -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 redirectDraft, { type RedirectDraftResponse } from './handlers/redirect-draft'\nimport redirectPreview, { type RedirectPreviewResponse } from './handlers/redirect-preview'\nimport clearDraft, { type ClearDraftResponse } from './handlers/clear-draft'\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 | RedirectDraftResponse\n | RedirectPreviewResponse\n | ClearDraftResponse\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 [req] = args\n if (req.method.toUpperCase() === 'OPTIONS') {\n return new NextResponse(null, {\n status: 204,\n headers: new Headers({\n 'Content-Length': '0',\n 'Access-Control-Allow-Origin': appOrigin,\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n }),\n })\n }\n\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('/draft')) {\n return match(args)\n .with(routeHandlerPattern, args => redirectDraft(...args, { apiKey }))\n .with(apiRoutePattern, args => redirectDraft(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/preview')) {\n return match(args)\n .with(routeHandlerPattern, args => redirectPreview(...args, { apiKey }))\n .with(apiRoutePattern, args => redirectPreview(...args, { apiKey }))\n .exhaustive()\n }\n\n if (matches('/clear-draft')) {\n return match(args)\n .with(routeHandlerPattern, args => clearDraft(...args, { apiKey }))\n .with(apiRoutePattern, args => clearDraft(...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"]}
1
+ {"version":3,"sources":["../../../../src/next/api-handler/index.ts"],"sourcesContent":["import { match } from 'ts-pattern'\n\nimport { Makeswift as MakeswiftClient } from '../client'\n\nimport { type ApiHandlerUserConfig, createApiHandler } from '../../api-handler'\n\nimport * as AppRouter from './config/app-router'\nimport * as PagesRouter from './config/pages-router'\n\n/**\n * @deprecated This type is deprecated and will be removed in a future release.\n */\nexport type MakeswiftApiHandlerResponse = any\n\ntype ApiHandlerArgs = AppRouter.ApiHandlerArgs | PagesRouter.ApiHandlerArgs\n\nexport function MakeswiftApiHandler(\n apiKey: string,\n { apiOrigin, runtime, ...userConfig }: ApiHandlerUserConfig,\n): (...args: ApiHandlerArgs) => Promise<Response | void> {\n const client = new MakeswiftClient(apiKey, { apiOrigin, runtime })\n\n return async function handler(...args: ApiHandlerArgs): Promise<Response | void> {\n const { req, route, sendResponse, customRoutes, ...handlerConfig } = await match(args)\n .with(AppRouter.argsPattern, ([req, context]) => AppRouter.config({ req, context, apiKey }))\n .with(PagesRouter.argsPattern, ([req, res]) => PagesRouter.config({ req, res, apiKey }))\n .exhaustive()\n\n const apiHandler = createApiHandler(apiKey, {\n ...userConfig,\n ...handlerConfig,\n runtime,\n client,\n })\n\n const customRouteResponse = await customRoutes(route)\n if (customRouteResponse) {\n return customRouteResponse.res\n }\n\n return sendResponse(await apiHandler(req, route))\n }\n}\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,aAAa,uBAAuB;AAE7C,SAAoC,wBAAwB;AAE5D,YAAY,eAAe;AAC3B,YAAY,iBAAiB;AAStB,SAAS,oBACd,QACA,EAAE,WAAW,SAAS,GAAG,WAAW,GACmB;AACvD,QAAM,SAAS,IAAI,gBAAgB,QAAQ,EAAE,WAAW,QAAQ,CAAC;AAEjE,SAAO,eAAe,WAAW,MAAgD;AAC/E,UAAM,EAAE,KAAK,OAAO,cAAc,cAAc,GAAG,cAAc,IAAI,MAAM,MAAM,IAAI,EAClF,KAAK,UAAU,aAAa,CAAC,CAACA,MAAK,OAAO,MAAM,UAAU,OAAO,EAAE,KAAAA,MAAK,SAAS,OAAO,CAAC,CAAC,EAC1F,KAAK,YAAY,aAAa,CAAC,CAACA,MAAK,GAAG,MAAM,YAAY,OAAO,EAAE,KAAAA,MAAK,KAAK,OAAO,CAAC,CAAC,EACtF,WAAW;AAEd,UAAM,aAAa,iBAAiB,QAAQ;AAAA,MAC1C,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,MAAM,aAAa,KAAK;AACpD,QAAI,qBAAqB;AACvB,aAAO,oBAAoB;AAAA,IAC7B;AAEA,WAAO,aAAa,MAAM,WAAW,KAAK,KAAK,CAAC;AAAA,EAClD;AACF;","names":["req"]}
@@ -1,7 +1,4 @@
1
- import {
2
- MAKESWIFT_DRAFT_DATA_COOKIE,
3
- PRERENDER_BYPASS_COOKIE
4
- } from "../api-handler/handlers/utils/draft";
1
+ import { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE } from "../api-handler/draft";
5
2
  const HeaderNames = {
6
3
  DraftMode: "X-Makeswift-Draft-Mode",
7
4
  PreviewMode: "X-Makeswift-Preview-Mode"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/next/middleware/request-utils.ts"],"sourcesContent":["import { NextRequest } from 'next/server'\nimport {\n MAKESWIFT_DRAFT_DATA_COOKIE,\n PRERENDER_BYPASS_COOKIE,\n} from '../api-handler/handlers/utils/draft'\n\nconst HeaderNames = {\n DraftMode: 'X-Makeswift-Draft-Mode',\n PreviewMode: 'X-Makeswift-Preview-Mode',\n} as const\n\nconst SearchParams = {\n DraftMode: 'x-makeswift-draft-mode',\n PreviewMode: 'x-makeswift-preview-mode',\n} as const\n\nfunction getDraftModeSecret(request: NextRequest): string | null {\n return (\n request.nextUrl.searchParams.get(SearchParams.DraftMode) ??\n request.headers.get(HeaderNames.DraftMode) ??\n null\n )\n}\n\nexport function isDraftModeRequest(request: NextRequest): boolean {\n const hasSecret = getDraftModeSecret(request) != null\n if (hasSecret) return true\n\n const hasDraftCookies =\n request.cookies.has(PRERENDER_BYPASS_COOKIE) && request.cookies.has(MAKESWIFT_DRAFT_DATA_COOKIE)\n\n if (hasDraftCookies) return true\n\n return false\n}\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,MAAM,cAAc;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AACf;AAEA,MAAM,eAAe;AAAA,EACnB,WAAW;AAAA,EACX,aAAa;AACf;AAEA,SAAS,mBAAmB,SAAqC;AAC/D,SACE,QAAQ,QAAQ,aAAa,IAAI,aAAa,SAAS,KACvD,QAAQ,QAAQ,IAAI,YAAY,SAAS,KACzC;AAEJ;AAEO,SAAS,mBAAmB,SAA+B;AAChE,QAAM,YAAY,mBAAmB,OAAO,KAAK;AACjD,MAAI;AAAW,WAAO;AAEtB,QAAM,kBACJ,QAAQ,QAAQ,IAAI,uBAAuB,KAAK,QAAQ,QAAQ,IAAI,2BAA2B;AAEjG,MAAI;AAAiB,WAAO;AAE5B,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/next/middleware/request-utils.ts"],"sourcesContent":["import { NextRequest } from 'next/server'\nimport { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE } from '../api-handler/draft'\n\nconst HeaderNames = {\n DraftMode: 'X-Makeswift-Draft-Mode',\n PreviewMode: 'X-Makeswift-Preview-Mode',\n} as const\n\nconst SearchParams = {\n DraftMode: 'x-makeswift-draft-mode',\n PreviewMode: 'x-makeswift-preview-mode',\n} as const\n\nfunction getDraftModeSecret(request: NextRequest): string | null {\n return (\n request.nextUrl.searchParams.get(SearchParams.DraftMode) ??\n request.headers.get(HeaderNames.DraftMode) ??\n null\n )\n}\n\nexport function isDraftModeRequest(request: NextRequest): boolean {\n const hasSecret = getDraftModeSecret(request) != null\n if (hasSecret) return true\n\n const hasDraftCookies =\n request.cookies.has(PRERENDER_BYPASS_COOKIE) && request.cookies.has(MAKESWIFT_DRAFT_DATA_COOKIE)\n\n if (hasDraftCookies) return true\n\n return false\n}\n"],"mappings":"AACA,SAAS,6BAA6B,+BAA+B;AAErE,MAAM,cAAc;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AACf;AAEA,MAAM,eAAe;AAAA,EACnB,WAAW;AAAA,EACX,aAAa;AACf;AAEA,SAAS,mBAAmB,SAAqC;AAC/D,SACE,QAAQ,QAAQ,aAAa,IAAI,aAAa,SAAS,KACvD,QAAQ,QAAQ,IAAI,YAAY,SAAS,KACzC;AAEJ;AAEO,SAAS,mBAAmB,SAA+B;AAChE,QAAM,YAAY,mBAAmB,OAAO,KAAK;AACjD,MAAI;AAAW,WAAO;AAEtB,QAAM,kBACJ,QAAQ,QAAQ,IAAI,uBAAuB,KAAK,QAAQ,QAAQ,IAAI,2BAA2B;AAEjG,MAAI;AAAiB,WAAO;AAE5B,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/next/server.ts"],"sourcesContent":["export { MakeswiftApiHandler } from './api-handler'\nexport type { Manifest, Font, MakeswiftApiHandlerResponse } from './api-handler'\nexport { getSiteVersion } from './draft-mode'\n"],"mappings":"AAAA,SAAS,2BAA2B;AAEpC,SAAS,sBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../../src/next/server.ts"],"sourcesContent":["export { MakeswiftApiHandler } from './api-handler'\nexport type { Manifest, Font } from '../api-handler'\nexport type { MakeswiftApiHandlerResponse } from './api-handler'\nexport { getSiteVersion } from './draft-mode'\n"],"mappings":"AAAA,SAAS,2BAA2B;AAGpC,SAAS,sBAAsB;","names":[]}