@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
@@ -1 +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(url.searchParams.entries()),\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,YAAY,IAAI,aAAa,QAAQ,CAAC;AAAA,EAClD;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":[]}
1
+ {"version":3,"sources":["../../../../src/next/tests/test-utils.ts"],"sourcesContent":["import { NextApiRequest, NextApiResponse } from 'next'\nimport { NextRequest } from 'next/server'\nimport {\n createRequest,\n createResponse,\n type RequestMethod,\n type MockResponse,\n} from 'node-mocks-http'\n\nimport { MakeswiftApiHandler } from '../api-handler'\nimport { ReactRuntime } from '../../react'\n\nexport type MakeswiftApiHandlerArgs = Partial<Parameters<typeof MakeswiftApiHandler>[1]>\n\nfunction createHandler(apiKey: string, args: Partial<MakeswiftApiHandlerArgs> = {}) {\n const runtime = new ReactRuntime()\n return MakeswiftApiHandler(apiKey, {\n ...args,\n runtime,\n apiOrigin: 'https://api.fakeswift.com',\n appOrigin: 'https://app.fakeswift.com',\n })\n}\n\nexport const hostUrl = (path: string) => new URL(path, 'https://example.com')\n\nfunction routeParams(url: URL) {\n // simulate Next.js API route's context params, e.g. /api/makeswift/revalidate -> { 'makeswift': ['revalidate'] }\n const segments = url.pathname.split('/').filter(Boolean).slice(1)\n return { [segments[0]]: segments.slice(1) }\n}\n\nexport type RequestParams = {\n method: RequestMethod\n path: string\n originalPath?: string\n body?: Record<string, unknown>\n headers?: Record<string, string>\n}\n\nfunction createNextApiRequest({\n method,\n path,\n originalPath,\n body,\n headers,\n}: RequestParams): NextApiRequest {\n const url = hostUrl(originalPath ?? path)\n return createRequest<NextApiRequest>({\n method,\n url: url.toString(),\n query: {\n ...routeParams(hostUrl(path)),\n ...Object.fromEntries(url.searchParams.entries()),\n ...(originalPath ? { path: originalPath } : {}),\n },\n body,\n headers,\n })\n}\n\nfunction createNextRequestWithContext({\n method,\n path,\n originalPath,\n body,\n headers,\n}: RequestParams): [NextRequest, { params: { [key: string]: string | string[] } }] {\n const request = new NextRequest(hostUrl(originalPath ?? path), {\n method,\n body: JSON.stringify(body),\n headers,\n })\n\n return [request, { params: routeParams(hostUrl(path)) }]\n}\n\nexport function pagesRouterApiRequestFixture(\n args: MakeswiftApiHandlerArgs = {},\n responseMock?: MockResponse<NextApiResponse>,\n) {\n const apiKey = 'pages-router-api-key'\n const handler = createHandler(apiKey, args)\n\n const response = responseMock ?? createResponse<NextApiResponse>()\n const testApiRequest = async (reqParams: RequestParams) => {\n await handler(createNextApiRequest(reqParams), response)\n return {\n statusCode: response.statusCode,\n get jsonBody() {\n return response._getJSONData()\n },\n get textBody() {\n return response._getData()\n },\n headers: {\n getSetCookie() {\n return response._getHeaders()['set-cookie']\n },\n get(key: string) {\n return key.toLowerCase() === 'location'\n ? response._getRedirectUrl()\n : response._getHeaders()[key]\n },\n },\n }\n }\n\n return { testApiRequest, apiKey }\n}\n\nexport function appRouterApiRequestFixture(args: MakeswiftApiHandlerArgs = {}) {\n const apiKey = 'app-router-api-key'\n const handler = createHandler(apiKey, args)\n const testApiRequest = async (reqParams: RequestParams) => {\n const response = await handler(...createNextRequestWithContext(reqParams))\n return {\n statusCode: response?.status,\n get jsonBody() {\n return response?.json()\n },\n get textBody() {\n return response?.text()\n },\n headers: response?.headers ?? new Headers(),\n }\n }\n\n return { testApiRequest, apiKey }\n}\n\nexport const apiRequestFixtures = [\n { fixture: pagesRouterApiRequestFixture, router: 'pages' },\n { fixture: appRouterApiRequestFixture, router: 'app' },\n]\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA4B;AAC5B,6BAKO;AAEP,yBAAoC;AACpC,mBAA6B;AAI7B,SAAS,cAAc,QAAgB,OAAyC,CAAC,GAAG;AAClF,QAAM,UAAU,IAAI,0BAAa;AACjC,aAAO,wCAAoB,QAAQ;AAAA,IACjC,GAAG;AAAA,IACH;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AACH;AAEO,MAAM,UAAU,CAAC,SAAiB,IAAI,IAAI,MAAM,qBAAqB;AAE5E,SAAS,YAAY,KAAU;AAE7B,QAAM,WAAW,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,MAAM,CAAC;AAChE,SAAO,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE;AAC5C;AAUA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,MAAM,QAAQ,gBAAgB,IAAI;AACxC,aAAO,sCAA8B;AAAA,IACnC;AAAA,IACA,KAAK,IAAI,SAAS;AAAA,IAClB,OAAO;AAAA,MACL,GAAG,YAAY,QAAQ,IAAI,CAAC;AAAA,MAC5B,GAAG,OAAO,YAAY,IAAI,aAAa,QAAQ,CAAC;AAAA,MAChD,GAAI,eAAe,EAAE,MAAM,aAAa,IAAI,CAAC;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmF;AACjF,QAAM,UAAU,IAAI,0BAAY,QAAQ,gBAAgB,IAAI,GAAG;AAAA,IAC7D;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB;AAAA,EACF,CAAC;AAED,SAAO,CAAC,SAAS,EAAE,QAAQ,YAAY,QAAQ,IAAI,CAAC,EAAE,CAAC;AACzD;AAEO,SAAS,6BACd,OAAgC,CAAC,GACjC,cACA;AACA,QAAM,SAAS;AACf,QAAM,UAAU,cAAc,QAAQ,IAAI;AAE1C,QAAM,WAAW,oBAAgB,uCAAgC;AACjE,QAAM,iBAAiB,OAAO,cAA6B;AACzD,UAAM,QAAQ,qBAAqB,SAAS,GAAG,QAAQ;AACvD,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,IAAI,WAAW;AACb,eAAO,SAAS,aAAa;AAAA,MAC/B;AAAA,MACA,IAAI,WAAW;AACb,eAAO,SAAS,SAAS;AAAA,MAC3B;AAAA,MACA,SAAS;AAAA,QACP,eAAe;AACb,iBAAO,SAAS,YAAY,EAAE,YAAY;AAAA,QAC5C;AAAA,QACA,IAAI,KAAa;AACf,iBAAO,IAAI,YAAY,MAAM,aACzB,SAAS,gBAAgB,IACzB,SAAS,YAAY,EAAE,GAAG;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,gBAAgB,OAAO;AAClC;AAEO,SAAS,2BAA2B,OAAgC,CAAC,GAAG;AAC7E,QAAM,SAAS;AACf,QAAM,UAAU,cAAc,QAAQ,IAAI;AAC1C,QAAM,iBAAiB,OAAO,cAA6B;AACzD,UAAM,WAAW,MAAM,QAAQ,GAAG,6BAA6B,SAAS,CAAC;AACzE,WAAO;AAAA,MACL,YAAY,UAAU;AAAA,MACtB,IAAI,WAAW;AACb,eAAO,UAAU,KAAK;AAAA,MACxB;AAAA,MACA,IAAI,WAAW;AACb,eAAO,UAAU,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,UAAU,WAAW,IAAI,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,EAAE,gBAAgB,OAAO;AAClC;AAEO,MAAM,qBAAqB;AAAA,EAChC,EAAE,SAAS,8BAA8B,QAAQ,QAAQ;AAAA,EACzD,EAAE,SAAS,4BAA4B,QAAQ,MAAM;AACvD;","names":[]}
@@ -2,9 +2,14 @@ import { z } from "zod";
2
2
  const makeswiftSiteVersionSchema = z.enum(["Live", "Working"]);
3
3
  const MakeswiftSiteVersion = makeswiftSiteVersionSchema.Enum;
4
4
  const API_HANDLER_SITE_VERSION_HEADER = "X-Makeswift-Site-Version";
5
+ function parseSiteVersion(version) {
6
+ const parsed = makeswiftSiteVersionSchema.safeParse(version);
7
+ return parsed.success ? parsed.data : MakeswiftSiteVersion.Live;
8
+ }
5
9
  export {
6
10
  API_HANDLER_SITE_VERSION_HEADER,
7
11
  MakeswiftSiteVersion,
8
- makeswiftSiteVersionSchema
12
+ makeswiftSiteVersionSchema,
13
+ parseSiteVersion
9
14
  };
10
15
  //# sourceMappingURL=site-version.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/api/site-version.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const makeswiftSiteVersionSchema = z.enum(['Live', 'Working'])\nexport const MakeswiftSiteVersion = makeswiftSiteVersionSchema.Enum\nexport type MakeswiftSiteVersion = z.infer<typeof makeswiftSiteVersionSchema>\n\nexport const API_HANDLER_SITE_VERSION_HEADER = 'X-Makeswift-Site-Version'\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,6BAA6B,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC;AAC7D,MAAM,uBAAuB,2BAA2B;AAGxD,MAAM,kCAAkC;","names":[]}
1
+ {"version":3,"sources":["../../../src/api/site-version.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const makeswiftSiteVersionSchema = z.enum(['Live', 'Working'])\n\nexport const MakeswiftSiteVersion = makeswiftSiteVersionSchema.Enum\nexport type MakeswiftSiteVersion = z.infer<typeof makeswiftSiteVersionSchema>\n\nexport const API_HANDLER_SITE_VERSION_HEADER = 'X-Makeswift-Site-Version'\n\nexport function parseSiteVersion(version: unknown): MakeswiftSiteVersion {\n const parsed = makeswiftSiteVersionSchema.safeParse(version)\n return parsed.success ? parsed.data : MakeswiftSiteVersion.Live\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,6BAA6B,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC;AAE7D,MAAM,uBAAuB,2BAA2B;AAGxD,MAAM,kCAAkC;AAExC,SAAS,iBAAiB,SAAwC;AACvE,QAAM,SAAS,2BAA2B,UAAU,OAAO;AAC3D,SAAO,OAAO,UAAU,OAAO,OAAO,qBAAqB;AAC7D;","names":[]}
@@ -0,0 +1,13 @@
1
+ const SET_COOKIE_HEADER = "set-cookie";
2
+ const cookieSettingOptions = {
3
+ path: "/",
4
+ sameSite: "none",
5
+ secure: true,
6
+ httpOnly: true,
7
+ partitioned: true
8
+ };
9
+ export {
10
+ SET_COOKIE_HEADER,
11
+ cookieSettingOptions
12
+ };
13
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/api-handler/cookies.ts"],"sourcesContent":["export const SET_COOKIE_HEADER = 'set-cookie'\n\nexport const cookieSettingOptions = {\n path: '/',\n sameSite: 'none',\n secure: true,\n httpOnly: true,\n partitioned: true,\n} as const\n"],"mappings":"AAAO,MAAM,oBAAoB;AAE1B,MAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AACf;","names":[]}
@@ -0,0 +1,24 @@
1
+ function applyCorsHeaders(headers, options) {
2
+ const {
3
+ origin = "*",
4
+ methods = ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"],
5
+ allowedHeaders = ["Content-Type"],
6
+ exposedHeaders,
7
+ credentials,
8
+ maxAge
9
+ } = options;
10
+ headers.append("Access-Control-Allow-Origin", origin);
11
+ headers.append("Access-Control-Allow-Methods", methods.join(", ").toUpperCase());
12
+ if (allowedHeaders)
13
+ headers.append("Access-Control-Allow-Headers", allowedHeaders.join(", "));
14
+ if (exposedHeaders)
15
+ headers.append("Access-Control-Expose-Headers", exposedHeaders.join(", "));
16
+ if (credentials)
17
+ headers.append("Access-Control-Allow-Credentials", "true");
18
+ if (maxAge != null)
19
+ headers.append("Access-Control-Max-Age", `${maxAge}`);
20
+ }
21
+ export {
22
+ applyCorsHeaders
23
+ };
24
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/api-handler/cors.ts"],"sourcesContent":["// loosely based on https://github.com/tinyhttp/cors\n\nexport type CorsOptions = {\n origin?: string\n methods?: string[]\n allowedHeaders?: string[]\n exposedHeaders?: string[]\n credentials?: boolean\n maxAge?: number\n}\n\nexport function applyCorsHeaders(headers: Headers, options: CorsOptions) {\n const {\n origin = '*',\n methods = ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH', 'OPTIONS'],\n allowedHeaders = ['Content-Type'],\n exposedHeaders,\n credentials,\n maxAge,\n } = options\n\n headers.append('Access-Control-Allow-Origin', origin)\n headers.append('Access-Control-Allow-Methods', methods.join(', ').toUpperCase())\n\n if (allowedHeaders) headers.append('Access-Control-Allow-Headers', allowedHeaders.join(', '))\n if (exposedHeaders) headers.append('Access-Control-Expose-Headers', exposedHeaders.join(', '))\n if (credentials) headers.append('Access-Control-Allow-Credentials', 'true')\n if (maxAge != null) headers.append('Access-Control-Max-Age', `${maxAge}`)\n}\n"],"mappings":"AAWO,SAAS,iBAAiB,SAAkB,SAAsB;AACvE,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,UAAU,CAAC,OAAO,QAAQ,OAAO,QAAQ,UAAU,SAAS,SAAS;AAAA,IACrE,iBAAiB,CAAC,cAAc;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,UAAQ,OAAO,+BAA+B,MAAM;AACpD,UAAQ,OAAO,gCAAgC,QAAQ,KAAK,IAAI,EAAE,YAAY,CAAC;AAE/E,MAAI;AAAgB,YAAQ,OAAO,gCAAgC,eAAe,KAAK,IAAI,CAAC;AAC5F,MAAI;AAAgB,YAAQ,OAAO,iCAAiC,eAAe,KAAK,IAAI,CAAC;AAC7F,MAAI;AAAa,YAAQ,OAAO,oCAAoC,MAAM;AAC1E,MAAI,UAAU;AAAM,YAAQ,OAAO,0BAA0B,GAAG,MAAM,EAAE;AAC1E;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { serialize as serializeCookie } from "cookie";
2
+ import { ApiResponse } from "../request-response";
3
+ import { SET_COOKIE_HEADER, cookieSettingOptions } from "../cookies";
4
+ async function clearDraftHandler(_req, { draftCookieNames }) {
5
+ const headers = new Headers();
6
+ draftCookieNames.forEach((name) => {
7
+ headers.append(
8
+ SET_COOKIE_HEADER,
9
+ serializeCookie(name, "", { ...cookieSettingOptions, expires: /* @__PURE__ */ new Date(0) })
10
+ );
11
+ });
12
+ return ApiResponse.json({ cleared: true }, { headers });
13
+ }
14
+ export {
15
+ clearDraftHandler
16
+ };
17
+ //# sourceMappingURL=clear-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/clear-draft.ts"],"sourcesContent":["import { serialize as serializeCookie } from 'cookie'\nimport { type ApiRequest, ApiResponse } from '../request-response'\nimport { SET_COOKIE_HEADER, cookieSettingOptions } from '../cookies'\n\nexport async function clearDraftHandler(\n _req: ApiRequest,\n { draftCookieNames }: { draftCookieNames: string[] },\n): Promise<ApiResponse<{ cleared: boolean }>> {\n const headers = new Headers()\n\n draftCookieNames.forEach(name => {\n headers.append(\n SET_COOKIE_HEADER,\n serializeCookie(name, '', { ...cookieSettingOptions, expires: new Date(0) }),\n )\n })\n\n return ApiResponse.json({ cleared: true }, { headers })\n}\n"],"mappings":"AAAA,SAAS,aAAa,uBAAuB;AAC7C,SAA0B,mBAAmB;AAC7C,SAAS,mBAAmB,4BAA4B;AAExD,eAAsB,kBACpB,MACA,EAAE,iBAAiB,GACyB;AAC5C,QAAM,UAAU,IAAI,QAAQ;AAE5B,mBAAiB,QAAQ,UAAQ;AAC/B,YAAQ;AAAA,MACN;AAAA,MACA,gBAAgB,MAAM,IAAI,EAAE,GAAG,sBAAsB,SAAS,oBAAI,KAAK,CAAC,EAAE,CAAC;AAAA,IAC7E;AAAA,EACF,CAAC;AAED,SAAO,YAAY,KAAK,EAAE,SAAS,KAAK,GAAG,EAAE,QAAQ,CAAC;AACxD;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { ApiResponse } from "../request-response";
2
+ async function elementTreeHandler(req, { runtime }) {
3
+ const body = await req.json();
4
+ const { elementTree, replacementContext } = body;
5
+ if (elementTree == null) {
6
+ return ApiResponse.json({ message: "elementTree must be defined" }, { status: 400 });
7
+ }
8
+ if (replacementContext == null) {
9
+ return ApiResponse.json({ message: "replacementContext must be defined" }, { status: 400 });
10
+ }
11
+ const generatedElementTree = runtime.copyElementTree(elementTree, replacementContext);
12
+ return ApiResponse.json({ elementTree: generatedElementTree });
13
+ }
14
+ export {
15
+ elementTreeHandler
16
+ };
17
+ //# sourceMappingURL=element-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/element-tree.ts"],"sourcesContent":["import { ReactRuntime } from '../../react'\nimport { type Element } from '../../state/react-page'\nimport { type ApiRequest, ApiResponse, type ErrorResponseBody } from '../request-response'\n\nexport async function elementTreeHandler(\n req: ApiRequest,\n { runtime }: { runtime: ReactRuntime },\n): Promise<ApiResponse<{ elementTree: Element } | ErrorResponseBody>> {\n const body = await req.json()\n const { elementTree, replacementContext } = body\n\n if (elementTree == null) {\n return ApiResponse.json({ message: 'elementTree must be defined' }, { status: 400 })\n }\n\n if (replacementContext == null) {\n return ApiResponse.json({ message: 'replacementContext must be defined' }, { status: 400 })\n }\n\n const generatedElementTree = runtime.copyElementTree(elementTree, replacementContext)\n return ApiResponse.json({ elementTree: generatedElementTree })\n}\n"],"mappings":"AAEA,SAA0B,mBAA2C;AAErE,eAAsB,mBACpB,KACA,EAAE,QAAQ,GAC0D;AACpE,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,EAAE,aAAa,mBAAmB,IAAI;AAE5C,MAAI,eAAe,MAAM;AACvB,WAAO,YAAY,KAAK,EAAE,SAAS,8BAA8B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrF;AAEA,MAAI,sBAAsB,MAAM;AAC9B,WAAO,YAAY,KAAK,EAAE,SAAS,qCAAqC,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5F;AAEA,QAAM,uBAAuB,QAAQ,gBAAgB,aAAa,kBAAkB;AACpF,SAAO,YAAY,KAAK,EAAE,aAAa,qBAAqB,CAAC;AAC/D;","names":[]}
@@ -0,0 +1,9 @@
1
+ import { ApiResponse } from "../request-response";
2
+ async function fontsHandler(_req, { getFonts }) {
3
+ const fonts = await getFonts?.() ?? [];
4
+ return ApiResponse.json(fonts);
5
+ }
6
+ export {
7
+ fontsHandler
8
+ };
9
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/fonts.ts"],"sourcesContent":["import { type ApiRequest, ApiResponse } from '../request-response'\n\ntype FontVariant = { weight: string; style: 'italic' | 'normal'; src?: string }\n\nexport type Font = {\n family: string\n label?: string\n variants: FontVariant[]\n}\n\ntype Fonts = Font[]\n\nexport type GetFonts = () => Fonts | Promise<Fonts>\n\nexport async function fontsHandler(\n _req: ApiRequest,\n { getFonts }: { getFonts?: GetFonts },\n): Promise<ApiResponse<Fonts>> {\n const fonts = (await getFonts?.()) ?? []\n\n return ApiResponse.json(fonts)\n}\n"],"mappings":"AAAA,SAA0B,mBAAmB;AAc7C,eAAsB,aACpB,MACA,EAAE,SAAS,GACkB;AAC7B,QAAM,QAAS,MAAM,WAAW,KAAM,CAAC;AAEvC,SAAO,YAAY,KAAK,KAAK;AAC/B;","names":[]}
@@ -0,0 +1,29 @@
1
+ import {
2
+ ApiResponse,
3
+ searchParams
4
+ } from "../request-response";
5
+ async function manifestHandler(req, { apiKey, manifest }) {
6
+ const secret = searchParams(req).get("secret");
7
+ if (secret !== apiKey) {
8
+ return ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
9
+ }
10
+ return ApiResponse.json({
11
+ version: "0.25.0-canary.2",
12
+ previewMode: false,
13
+ draftMode: false,
14
+ interactionMode: true,
15
+ clientSideNavigation: false,
16
+ elementFromPoint: false,
17
+ customBreakpoints: true,
18
+ siteVersions: true,
19
+ unstable_siteVersions: true,
20
+ localizedPageSSR: true,
21
+ webhook: true,
22
+ localizedPagesOnlineByDefault: true,
23
+ ...manifest
24
+ });
25
+ }
26
+ export {
27
+ manifestHandler
28
+ };
29
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/manifest.ts"],"sourcesContent":["import {\n type ApiRequest,\n type ErrorResponseBody,\n ApiResponse,\n searchParams,\n} from '../request-response'\n\nexport type Manifest = {\n version: string\n previewMode: boolean\n draftMode: boolean\n interactionMode: boolean\n clientSideNavigation: boolean\n elementFromPoint: boolean\n customBreakpoints: boolean\n siteVersions: boolean\n unstable_siteVersions: boolean\n localizedPageSSR: boolean\n webhook: boolean\n localizedPagesOnlineByDefault: boolean\n}\n\nexport async function manifestHandler(\n req: ApiRequest,\n { apiKey, manifest }: { apiKey: string; manifest: Partial<Manifest> },\n): Promise<ApiResponse<Manifest | ErrorResponseBody>> {\n const secret = searchParams(req).get('secret')\n\n if (secret !== apiKey) {\n return ApiResponse.json({ message: 'Unauthorized' }, { status: 401 })\n }\n\n return ApiResponse.json({\n version: PACKAGE_VERSION,\n previewMode: false,\n draftMode: false,\n interactionMode: true,\n clientSideNavigation: false,\n elementFromPoint: false,\n customBreakpoints: true,\n siteVersions: true,\n unstable_siteVersions: true,\n localizedPageSSR: true,\n webhook: true,\n localizedPagesOnlineByDefault: true,\n ...manifest,\n })\n}\n"],"mappings":"AAAA;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAiBP,eAAsB,gBACpB,KACA,EAAE,QAAQ,SAAS,GACiC;AACpD,QAAM,SAAS,aAAa,GAAG,EAAE,IAAI,QAAQ;AAE7C,MAAI,WAAW,QAAQ;AACrB,WAAO,YAAY,KAAK,EAAE,SAAS,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtE;AAEA,SAAO,YAAY,KAAK;AAAA,IACtB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,uBAAuB;AAAA,IACvB,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,+BAA+B;AAAA,IAC/B,GAAG;AAAA,EACL,CAAC;AACH;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { ApiResponse } from "../request-response";
2
+ async function mergeTranslatedDataHandler(req, { client }) {
3
+ const body = await req.json();
4
+ const { translatedData, elementTree } = body;
5
+ if (translatedData == null) {
6
+ return ApiResponse.json({ message: "translatedData must be defined" }, { status: 400 });
7
+ }
8
+ if (elementTree == null) {
9
+ return ApiResponse.json({ message: "elementTree must be defined" }, { status: 400 });
10
+ }
11
+ const translatedElementTree = client.mergeTranslatedData(elementTree, translatedData);
12
+ return ApiResponse.json({ elementTree: translatedElementTree });
13
+ }
14
+ export {
15
+ mergeTranslatedDataHandler
16
+ };
17
+ //# sourceMappingURL=merge-translated-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/merge-translated-data.ts"],"sourcesContent":["import { type Element } from '../../state/react-page'\nimport { MakeswiftClient } from '../../client'\nimport { type ApiRequest, ApiResponse, type ErrorResponseBody } from '../request-response'\n\ntype TranslatedData = { elementTree: Element }\n\nexport async function mergeTranslatedDataHandler(\n req: ApiRequest,\n { client }: { client: MakeswiftClient },\n): Promise<ApiResponse<TranslatedData | ErrorResponseBody>> {\n const body = await req.json()\n const { translatedData, elementTree } = body\n\n if (translatedData == null) {\n return ApiResponse.json({ message: 'translatedData must be defined' }, { status: 400 })\n }\n\n if (elementTree == null) {\n return ApiResponse.json({ message: 'elementTree must be defined' }, { status: 400 })\n }\n\n const translatedElementTree = client.mergeTranslatedData(elementTree, translatedData)\n return ApiResponse.json({ elementTree: translatedElementTree })\n}\n"],"mappings":"AAEA,SAA0B,mBAA2C;AAIrE,eAAsB,2BACpB,KACA,EAAE,OAAO,GACiD;AAC1D,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,EAAE,gBAAgB,YAAY,IAAI;AAExC,MAAI,kBAAkB,MAAM;AAC1B,WAAO,YAAY,KAAK,EAAE,SAAS,iCAAiC,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxF;AAEA,MAAI,eAAe,MAAM;AACvB,WAAO,YAAY,KAAK,EAAE,SAAS,8BAA8B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrF;AAEA,QAAM,wBAAwB,OAAO,oBAAoB,aAAa,cAAc;AACpF,SAAO,YAAY,KAAK,EAAE,aAAa,sBAAsB,CAAC;AAChE;","names":[]}
@@ -0,0 +1,29 @@
1
+ import isErrorWithMessage from "../../utils/isErrorWithMessage";
2
+ import {
3
+ ApiResponse,
4
+ searchParams
5
+ } from "../request-response";
6
+ async function revalidateHandler(req, { apiKey, revalidatePath }) {
7
+ const params = searchParams(req);
8
+ const secret = params.get("secret");
9
+ if (secret !== apiKey) {
10
+ return ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
11
+ }
12
+ const path = params.get("path");
13
+ if (typeof path !== "string") {
14
+ return ApiResponse.json({ message: "Bad Request" }, { status: 400 });
15
+ }
16
+ try {
17
+ await revalidatePath(path);
18
+ return ApiResponse.json({ revalidated: true });
19
+ } catch (error) {
20
+ if (isErrorWithMessage(error)) {
21
+ return ApiResponse.json({ message: error.message }, { status: 500 });
22
+ }
23
+ return ApiResponse.json({ message: "Error Revalidating" }, { status: 500 });
24
+ }
25
+ }
26
+ export {
27
+ revalidateHandler
28
+ };
29
+ //# sourceMappingURL=revalidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/revalidate.ts"],"sourcesContent":["import isErrorWithMessage from '../../utils/isErrorWithMessage'\nimport {\n type ApiRequest,\n type ErrorResponseBody,\n ApiResponse,\n searchParams,\n} from '../request-response'\n\ntype RevalidationResult = { revalidated: boolean }\n\nexport async function revalidateHandler(\n req: ApiRequest,\n { apiKey, revalidatePath }: { apiKey: string; revalidatePath: (path: string) => Promise<void> },\n): Promise<ApiResponse<RevalidationResult | ErrorResponseBody>> {\n const params = searchParams(req)\n\n const secret = params.get('secret')\n if (secret !== apiKey) {\n return ApiResponse.json({ message: 'Unauthorized' }, { status: 401 })\n }\n\n const path = params.get('path')\n if (typeof path !== 'string') {\n return ApiResponse.json({ message: 'Bad Request' }, { status: 400 })\n }\n\n try {\n await revalidatePath(path)\n return ApiResponse.json({ revalidated: true })\n } catch (error) {\n if (isErrorWithMessage(error)) {\n return ApiResponse.json({ message: error.message }, { status: 500 })\n }\n\n return ApiResponse.json({ message: 'Error Revalidating' }, { status: 500 })\n }\n}\n"],"mappings":"AAAA,OAAO,wBAAwB;AAC/B;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAIP,eAAsB,kBACpB,KACA,EAAE,QAAQ,eAAe,GACqC;AAC9D,QAAM,SAAS,aAAa,GAAG;AAE/B,QAAM,SAAS,OAAO,IAAI,QAAQ;AAClC,MAAI,WAAW,QAAQ;AACrB,WAAO,YAAY,KAAK,EAAE,SAAS,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtE;AAEA,QAAM,OAAO,OAAO,IAAI,MAAM;AAC9B,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,YAAY,KAAK,EAAE,SAAS,cAAc,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AAEA,MAAI;AACF,UAAM,eAAe,IAAI;AACzB,WAAO,YAAY,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,EAC/C,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,GAAG;AAC7B,aAAO,YAAY,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrE;AAEA,WAAO,YAAY,KAAK,EAAE,SAAS,qBAAqB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E;AACF;","names":[]}
@@ -0,0 +1,18 @@
1
+ import { ApiResponse } from "../request-response";
2
+ async function translatableDataHandler(req, { client }) {
3
+ const body = await req.json();
4
+ const { elementTree } = body;
5
+ if (elementTree == null) {
6
+ return ApiResponse.json({ message: "elementTree must be defined." }, { status: 400 });
7
+ }
8
+ try {
9
+ let translatableData = client.getTranslatableData(elementTree);
10
+ return ApiResponse.json({ translatableData });
11
+ } catch (error) {
12
+ return ApiResponse.json({ message: "Failed to get translatable data." }, { status: 500 });
13
+ }
14
+ }
15
+ export {
16
+ translatableDataHandler
17
+ };
18
+ //# sourceMappingURL=translatable-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/translatable-data.ts"],"sourcesContent":["import { type Data } from '../../state/react-page'\nimport { MakeswiftClient } from '../../client'\nimport { type ApiRequest, ApiResponse } from '../request-response'\n\ntype TranslatableDataResult = { translatableData: Record<string, Data> }\ntype TranslatableDataError = { message: string }\n\nexport type TranslatableDataResponse = TranslatableDataResult | TranslatableDataError\n\nexport async function translatableDataHandler(\n req: ApiRequest,\n { client }: { client: MakeswiftClient },\n): Promise<ApiResponse> {\n const body = await req.json()\n\n const { elementTree } = body\n\n if (elementTree == null) {\n return ApiResponse.json({ message: 'elementTree must be defined.' }, { status: 400 })\n }\n\n try {\n let translatableData = client.getTranslatableData(elementTree)\n return ApiResponse.json({ translatableData })\n } catch (error) {\n return ApiResponse.json({ message: 'Failed to get translatable data.' }, { status: 500 })\n }\n}\n"],"mappings":"AAEA,SAA0B,mBAAmB;AAO7C,eAAsB,wBACpB,KACA,EAAE,OAAO,GACa;AACtB,QAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,QAAM,EAAE,YAAY,IAAI;AAExB,MAAI,eAAe,MAAM;AACvB,WAAO,YAAY,KAAK,EAAE,SAAS,+BAA+B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtF;AAEA,MAAI;AACF,QAAI,mBAAmB,OAAO,oBAAoB,WAAW;AAC7D,WAAO,YAAY,KAAK,EAAE,iBAAiB,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,WAAO,YAAY,KAAK,EAAE,SAAS,mCAAmC,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC1F;AACF;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { match } from "ts-pattern";
2
+ import { ApiResponse, searchParams } from "../../request-response";
3
+ import {
4
+ sitePublishedWebhookPayloadSchema,
5
+ WebhookEventType
6
+ } from "./types";
7
+ import { handleSitePublished } from "./site-published";
8
+ async function webhookHandler(req, { apiKey, events, revalidate }) {
9
+ const secret = searchParams(req).get("secret");
10
+ if (secret !== apiKey) {
11
+ return ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
12
+ }
13
+ let payload;
14
+ try {
15
+ const body = await req.json();
16
+ payload = sitePublishedWebhookPayloadSchema.parse(body);
17
+ } catch (error) {
18
+ console.error(error);
19
+ return ApiResponse.json({ message: "Invalid request body" }, { status: 400 });
20
+ }
21
+ const result = await match(payload.type).with(
22
+ WebhookEventType.SITE_PUBLISHED,
23
+ () => handleSitePublished(payload, { onPublish: events?.onPublish, revalidate })
24
+ ).exhaustive();
25
+ return ApiResponse.json(result.body, { status: result.status });
26
+ }
27
+ export {
28
+ webhookHandler
29
+ };
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/api-handler/handlers/webhook/index.ts"],"sourcesContent":["import { match } from 'ts-pattern'\nimport { type ApiRequest, ApiResponse, searchParams } from '../../request-response'\n\nimport {\n type OnPublish,\n type WebhookPayloadSchema,\n type WebhookResponseBody,\n sitePublishedWebhookPayloadSchema,\n WebhookEventType,\n} from './types'\n\nimport { handleSitePublished } from './site-published'\n\ntype WebhookParams = {\n apiKey: string\n events?: { onPublish?: OnPublish }\n revalidate: () => void\n}\n\nexport async function webhookHandler(\n req: ApiRequest,\n { apiKey, events, revalidate }: WebhookParams,\n): Promise<ApiResponse<WebhookResponseBody>> {\n const secret = searchParams(req).get('secret')\n if (secret !== apiKey) {\n return ApiResponse.json({ message: 'Unauthorized' }, { status: 401 })\n }\n\n let payload: WebhookPayloadSchema\n\n try {\n const body = await req.json()\n payload = sitePublishedWebhookPayloadSchema.parse(body)\n } catch (error) {\n console.error(error)\n return ApiResponse.json({ message: 'Invalid request body' }, { status: 400 })\n }\n\n const result = await match(payload.type)\n .with(WebhookEventType.SITE_PUBLISHED, () =>\n handleSitePublished(payload, { onPublish: events?.onPublish, revalidate }),\n )\n .exhaustive()\n\n return ApiResponse.json(result.body, { status: result.status })\n}\n"],"mappings":"AAAA,SAAS,aAAa;AACtB,SAA0B,aAAa,oBAAoB;AAE3D;AAAA,EAIE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,2BAA2B;AAQpC,eAAsB,eACpB,KACA,EAAE,QAAQ,QAAQ,WAAW,GACc;AAC3C,QAAM,SAAS,aAAa,GAAG,EAAE,IAAI,QAAQ;AAC7C,MAAI,WAAW,QAAQ;AACrB,WAAO,YAAY,KAAK,EAAE,SAAS,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtE;AAEA,MAAI;AAEJ,MAAI;AACF,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAU,kCAAkC,MAAM,IAAI;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AACnB,WAAO,YAAY,KAAK,EAAE,SAAS,uBAAuB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9E;AAEA,QAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,EACpC;AAAA,IAAK,iBAAiB;AAAA,IAAgB,MACrC,oBAAoB,SAAS,EAAE,WAAW,QAAQ,WAAW,WAAW,CAAC;AAAA,EAC3E,EACC,WAAW;AAEd,SAAO,YAAY,KAAK,OAAO,MAAM,EAAE,QAAQ,OAAO,OAAO,CAAC;AAChE;","names":[]}
@@ -0,0 +1,13 @@
1
+ async function handleSitePublished(_payload, { onPublish, revalidate }) {
2
+ revalidate();
3
+ try {
4
+ await onPublish?.();
5
+ } catch (error) {
6
+ console.error("Unhandled exception in the 'onPublish' callback:", error);
7
+ }
8
+ return { body: { success: true }, status: 200 };
9
+ }
10
+ export {
11
+ handleSitePublished
12
+ };
13
+ //# sourceMappingURL=site-published.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/api-handler/handlers/webhook/site-published.ts"],"sourcesContent":["import {\n type OnPublish,\n type SitePublishedWebhookPayload,\n type WebhookHandlerResult,\n} from './types'\n\ntype SitePublishedParams = {\n onPublish?: OnPublish\n revalidate: () => void\n}\n\nexport async function handleSitePublished(\n _payload: SitePublishedWebhookPayload,\n { onPublish, revalidate }: SitePublishedParams,\n): Promise<WebhookHandlerResult> {\n revalidate()\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"],"mappings":"AAWA,eAAsB,oBACpB,UACA,EAAE,WAAW,WAAW,GACO;AAC/B,aAAW;AAEX,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;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/api-handler/handlers/webhook/types.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { type ErrorResponseBody } from '../../request-response'\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\nexport type WebhookResponseBody = WebhookSuccessBody | ErrorResponseBody\n\nexport type WebhookHandlerResult = {\n body: WebhookResponseBody\n status: 200\n}\n\nexport type OnPublish = () => void | Promise<void>\n"],"mappings":"AAAA,SAAS,SAAS;AAIX,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":[]}
@@ -0,0 +1,95 @@
1
+ import { match as matchPattern } from "path-to-regexp";
2
+ import { API_HANDLER_SITE_VERSION_HEADER, parseSiteVersion } from "../api/site-version";
3
+ import { clearDraftHandler } from "./handlers/clear-draft";
4
+ import { elementTreeHandler } from "./handlers/element-tree";
5
+ import { fontsHandler } from "./handlers/fonts";
6
+ import { manifestHandler } from "./handlers/manifest";
7
+ import { mergeTranslatedDataHandler } from "./handlers/merge-translated-data";
8
+ import { revalidateHandler } from "./handlers/revalidate";
9
+ import { translatableDataHandler } from "./handlers/translatable-data";
10
+ import { webhookHandler } from "./handlers/webhook";
11
+ import {
12
+ ApiResponse,
13
+ searchParams
14
+ } from "./request-response";
15
+ import { applyCorsHeaders } from "./cors";
16
+ function createApiHandler(apiKey, {
17
+ runtime,
18
+ appOrigin = "https://app.makeswift.com",
19
+ getFonts,
20
+ events,
21
+ client,
22
+ manifest,
23
+ revalidationHandler,
24
+ draftCookieNames
25
+ }) {
26
+ if (typeof apiKey !== "string") {
27
+ throw new Error(
28
+ `The Makeswift API handler must be passed a valid Makeswift site API key. Received "${apiKey}" instead.`
29
+ );
30
+ }
31
+ return async function(req, route) {
32
+ const res = req.method.toUpperCase() !== "OPTIONS" ? await apiRouteHandler(req, route) : new Response(null, { status: 204, headers: [["Content-Length", "0"]] });
33
+ applyCorsHeaders(res.headers, {
34
+ origin: appOrigin,
35
+ allowedHeaders: ["Content-Type", "Authorization"]
36
+ });
37
+ return res;
38
+ };
39
+ async function apiRouteHandler(req, route) {
40
+ const siteVersion = parseSiteVersion(req.headers.get(API_HANDLER_SITE_VERSION_HEADER));
41
+ const matches = (pattern) => matchPattern(pattern, { decode: decodeURIComponent })(route);
42
+ if (matches("/clear-draft"))
43
+ return clearDraftHandler(req, { draftCookieNames });
44
+ if (matches("/element-tree"))
45
+ return elementTreeHandler(req, { runtime });
46
+ if (matches("/fonts"))
47
+ return fontsHandler(req, { getFonts });
48
+ if (matches("/manifest"))
49
+ return manifestHandler(req, { apiKey, manifest });
50
+ if (matches("/merge-translated-data"))
51
+ return mergeTranslatedDataHandler(req, { client });
52
+ if (matches("/revalidate")) {
53
+ return revalidateHandler(req, { apiKey, revalidatePath: revalidationHandler });
54
+ }
55
+ if (matches("/translatable-data"))
56
+ return translatableDataHandler(req, { client });
57
+ if (matches("/webhook")) {
58
+ return webhookHandler(req, { apiKey, events, revalidate: revalidationHandler });
59
+ }
60
+ const handleResource = (resource) => {
61
+ return resource !== null ? ApiResponse.json(resource) : ApiResponse.json({ message: "Not Found" }, { status: 404 });
62
+ };
63
+ let m;
64
+ if (m = matches("/swatches/:id")) {
65
+ return client.getSwatch(m.params.id, siteVersion).then(handleResource);
66
+ }
67
+ if (m = matches("/files/:id")) {
68
+ return client.getFile(m.params.id).then(handleResource);
69
+ }
70
+ if (m = matches("/typographies/:id")) {
71
+ return client.getTypography(m.params.id, siteVersion).then(handleResource);
72
+ }
73
+ if (m = matches("/global-elements/:id")) {
74
+ return client.getGlobalElement(m.params.id, siteVersion).then(handleResource);
75
+ }
76
+ if (m = matches(
77
+ "/localized-global-elements/:globalElementId/:locale"
78
+ )) {
79
+ return client.getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion).then(handleResource);
80
+ }
81
+ if (m = matches("/page-pathname-slices/:id")) {
82
+ const localeParam = searchParams(req).get("locale");
83
+ const locale = typeof localeParam === "string" ? localeParam : void 0;
84
+ return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource);
85
+ }
86
+ if (m = matches("/tables/:id")) {
87
+ return client.getTable(m.params.id).then(handleResource);
88
+ }
89
+ return ApiResponse.json({ message: "Not Found" }, { status: 404 });
90
+ }
91
+ }
92
+ export {
93
+ createApiHandler
94
+ };
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/api-handler/index.ts"],"sourcesContent":["import { Match, match as matchPattern } from 'path-to-regexp'\n\nimport { APIResource } from '../api'\nimport { API_HANDLER_SITE_VERSION_HEADER, parseSiteVersion } from '../api/site-version'\n\nimport { MakeswiftClient } from '../client'\nimport { ReactRuntime } from '../react'\n\nimport { clearDraftHandler } from './handlers/clear-draft'\nimport { elementTreeHandler } from './handlers/element-tree'\nimport { fontsHandler, type Font, type GetFonts } from './handlers/fonts'\nimport { manifestHandler, type Manifest } from './handlers/manifest'\nimport { mergeTranslatedDataHandler } from './handlers/merge-translated-data'\nimport { revalidateHandler } from './handlers/revalidate'\nimport { translatableDataHandler } from './handlers/translatable-data'\nimport { webhookHandler } from './handlers/webhook'\nimport { type OnPublish } from './handlers/webhook/types'\n\nimport {\n type ApiRequest,\n type ErrorResponseBody,\n ApiResponse,\n searchParams,\n} from './request-response'\n\nimport { applyCorsHeaders } from './cors'\n\nexport type { Manifest, Font }\n\ntype Events = { onPublish: OnPublish }\n\nexport type ApiHandlerUserConfig = {\n runtime: ReactRuntime\n appOrigin?: string\n apiOrigin?: string\n getFonts?: GetFonts\n events?: Events\n}\n\nexport type ApiHandlerInternalConfig = {\n client: MakeswiftClient\n manifest: Partial<Manifest>\n revalidationHandler: (path?: string) => Promise<void>\n draftCookieNames: string[]\n}\n\ntype ApiHandlerConfig = ApiHandlerUserConfig & ApiHandlerInternalConfig\n\ntype ResponseType =\n | Awaited<\n | ReturnType<typeof clearDraftHandler>\n | ReturnType<typeof elementTreeHandler>\n | ReturnType<typeof fontsHandler>\n | ReturnType<typeof manifestHandler>\n | ReturnType<typeof mergeTranslatedDataHandler>\n | ReturnType<typeof revalidateHandler>\n | ReturnType<typeof translatableDataHandler>\n | ReturnType<typeof webhookHandler>\n >\n | ApiResponse<APIResource>\n | ApiResponse<ErrorResponseBody>\n | Response\n\ntype ApiHandler = (req: ApiRequest, route: string) => Promise<ResponseType>\n\nexport function createApiHandler(\n apiKey: string,\n {\n runtime,\n appOrigin = 'https://app.makeswift.com',\n getFonts,\n events,\n client,\n manifest,\n revalidationHandler,\n draftCookieNames,\n }: ApiHandlerConfig,\n): ApiHandler {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift API handler must be passed a valid Makeswift site API key. ' +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n return async function (req: ApiRequest, route: string): Promise<ResponseType> {\n const res =\n req.method.toUpperCase() !== 'OPTIONS'\n ? await apiRouteHandler(req, route)\n : new Response(null, { status: 204, headers: [['Content-Length', '0']] })\n\n applyCorsHeaders(res.headers, {\n origin: appOrigin,\n allowedHeaders: ['Content-Type', 'Authorization'],\n })\n\n return res\n }\n\n async function apiRouteHandler(req: ApiRequest, route: string): Promise<ResponseType> {\n const siteVersion = parseSiteVersion(req.headers.get(API_HANDLER_SITE_VERSION_HEADER))\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(route)\n\n if (matches('/clear-draft')) return clearDraftHandler(req, { draftCookieNames })\n if (matches('/element-tree')) return elementTreeHandler(req, { runtime })\n if (matches('/fonts')) return fontsHandler(req, { getFonts })\n if (matches('/manifest')) return manifestHandler(req, { apiKey, manifest })\n if (matches('/merge-translated-data')) return mergeTranslatedDataHandler(req, { client })\n if (matches('/revalidate')) {\n return revalidateHandler(req, { apiKey, revalidatePath: revalidationHandler })\n }\n\n if (matches('/translatable-data')) return translatableDataHandler(req, { client })\n if (matches('/webhook')) {\n return webhookHandler(req, { apiKey, events, revalidate: revalidationHandler })\n }\n\n const handleResource = <T extends APIResource>(\n resource: T | null,\n ): ApiResponse<APIResource | ErrorResponseBody> => {\n return resource !== null\n ? ApiResponse.json(resource)\n : ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n\n let m\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 = searchParams(req).get('locale')\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 return ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,18 @@
1
+ function searchParams(req) {
2
+ return new URL(req.url, "http://localhost").searchParams;
3
+ }
4
+ const ApiResponse = {
5
+ json(body, init) {
6
+ const headers = new Headers(init?.headers);
7
+ headers.set("Content-Type", "application/json");
8
+ return new Response(JSON.stringify(body), {
9
+ ...init,
10
+ headers
11
+ });
12
+ }
13
+ };
14
+ export {
15
+ ApiResponse,
16
+ searchParams
17
+ };
18
+ //# sourceMappingURL=request-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/api-handler/request-response.ts"],"sourcesContent":["export type ApiRequest = Pick<Request, 'method' | 'json' | 'headers' | 'url'>\n\nexport function searchParams(req: ApiRequest): URLSearchParams {\n // provide a placeholder domain to enable parsing of relative URLs\n return new URL(req.url, 'http://localhost').searchParams\n}\n\nexport interface ApiResponse<R extends unknown = unknown> extends Response {\n readonly __responseType?: R // prevent unsafe assignment between instances with incompatible `R`\n}\n\nexport const ApiResponse = {\n json<T>(body: T, init?: ResponseInit): ApiResponse<T> {\n const headers = new Headers(init?.headers)\n headers.set('Content-Type', 'application/json')\n\n return new Response(JSON.stringify(body), {\n ...init,\n headers,\n }) as ApiResponse<T>\n },\n} as const\n\nexport type ErrorResponseBody = { message: string }\n"],"mappings":"AAEO,SAAS,aAAa,KAAkC;AAE7D,SAAO,IAAI,IAAI,IAAI,KAAK,kBAAkB,EAAE;AAC9C;AAMO,MAAM,cAAc;AAAA,EACzB,KAAQ,MAAS,MAAqC;AACpD,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,YAAQ,IAAI,gBAAgB,kBAAkB;AAE9C,WAAO,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,MACxC,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,40 @@
1
+ import { P } from "ts-pattern";
2
+ import { revalidatePath, revalidateTag } from "next/cache";
3
+ import { MAKESWIFT_CACHE_TAG } from "../../cache";
4
+ import { redirectDraftHandler } from "../handlers/redirect-draft";
5
+ import { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE } from "../draft";
6
+ import { validateApiRoute } from "./base";
7
+ const argsPattern = [P.instanceOf(Request), P.any];
8
+ async function config({
9
+ req,
10
+ context,
11
+ apiKey
12
+ }) {
13
+ return {
14
+ req,
15
+ route: validateApiRoute(await context.params),
16
+ manifest: {
17
+ draftMode: true
18
+ },
19
+ draftCookieNames: [PRERENDER_BYPASS_COOKIE, MAKESWIFT_DRAFT_DATA_COOKIE],
20
+ sendResponse: async (res) => res,
21
+ revalidationHandler: async (path) => {
22
+ if (path != null) {
23
+ revalidatePath(path);
24
+ } else {
25
+ revalidateTag(MAKESWIFT_CACHE_TAG);
26
+ }
27
+ },
28
+ customRoutes: async (route) => {
29
+ if (route === "/draft") {
30
+ return { res: await redirectDraftHandler(req, context, { apiKey }) };
31
+ }
32
+ return null;
33
+ }
34
+ };
35
+ }
36
+ export {
37
+ argsPattern,
38
+ config
39
+ };
40
+ //# sourceMappingURL=app-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/next/api-handler/config/app-router.ts"],"sourcesContent":["import { P } from 'ts-pattern'\nimport { revalidatePath, revalidateTag } from 'next/cache'\nimport { NextRequest } from 'next/server'\n\nimport { MAKESWIFT_CACHE_TAG } from '../../cache'\nimport { type ApiResponse } from '../../../api-handler/request-response'\n\nimport { redirectDraftHandler } from '../handlers/redirect-draft'\nimport { MAKESWIFT_DRAFT_DATA_COOKIE, PRERENDER_BYPASS_COOKIE } from '../draft'\n\nimport { validateApiRoute, type ApiHandlerConfig } from './base'\n\ntype Context = { params: { [key: string]: string | string[] } }\n\nexport type ApiHandlerArgs = [NextRequest, Context]\nexport const argsPattern = [P.instanceOf(Request), P.any] as const\n\nexport async function config({\n req,\n context,\n apiKey,\n}: {\n req: NextRequest\n context: Context\n apiKey: string\n}): Promise<ApiHandlerConfig> {\n return {\n req,\n route: validateApiRoute(await context.params),\n manifest: {\n draftMode: true,\n },\n draftCookieNames: [PRERENDER_BYPASS_COOKIE, MAKESWIFT_DRAFT_DATA_COOKIE],\n sendResponse: async (res: ApiResponse): Promise<Response | void> => res,\n revalidationHandler: async (path?: string): Promise<void> => {\n if (path != null) {\n revalidatePath(path)\n } else {\n revalidateTag(MAKESWIFT_CACHE_TAG)\n }\n },\n customRoutes: async (route: string) => {\n if (route === '/draft') {\n return { res: await redirectDraftHandler(req, context, { apiKey }) }\n }\n\n return null\n },\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAClB,SAAS,gBAAgB,qBAAqB;AAG9C,SAAS,2BAA2B;AAGpC,SAAS,4BAA4B;AACrC,SAAS,6BAA6B,+BAA+B;AAErE,SAAS,wBAA+C;AAKjD,MAAM,cAAc,CAAC,EAAE,WAAW,OAAO,GAAG,EAAE,GAAG;AAExD,eAAsB,OAAO;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAI8B;AAC5B,SAAO;AAAA,IACL;AAAA,IACA,OAAO,iBAAiB,MAAM,QAAQ,MAAM;AAAA,IAC5C,UAAU;AAAA,MACR,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB,CAAC,yBAAyB,2BAA2B;AAAA,IACvE,cAAc,OAAO,QAA+C;AAAA,IACpE,qBAAqB,OAAO,SAAiC;AAC3D,UAAI,QAAQ,MAAM;AAChB,uBAAe,IAAI;AAAA,MACrB,OAAO;AACL,sBAAc,mBAAmB;AAAA,MACnC;AAAA,IACF;AAAA,IACA,cAAc,OAAO,UAAkB;AACrC,UAAI,UAAU,UAAU;AACtB,eAAO,EAAE,KAAK,MAAM,qBAAqB,KAAK,SAAS,EAAE,OAAO,CAAC,EAAE;AAAA,MACrE;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,15 @@
1
+ function validateApiRoute(params) {
2
+ const { makeswift } = params;
3
+ if (!Array.isArray(makeswift)) {
4
+ throw new Error(
5
+ `The Makeswift Next.js API handler must be used in a dynamic catch-all route named \`[...makeswift]\`.
6
+ Received "${makeswift}" for the \`makeswift\` param instead.
7
+ Read more about dynamic catch-all routes here: https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes`
8
+ );
9
+ }
10
+ return "/" + makeswift.join("/");
11
+ }
12
+ export {
13
+ validateApiRoute
14
+ };
15
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/next/api-handler/config/base.ts"],"sourcesContent":["import { type ApiHandlerInternalConfig } from '../../../api-handler'\nimport { type ApiRequest, type ApiResponse } from '../../../api-handler/request-response'\n\nexport type ApiHandlerConfig = Omit<ApiHandlerInternalConfig, 'client' | 'revalidationHandler'> & {\n req: ApiRequest\n route: string\n sendResponse: (res: ApiResponse) => Promise<Response | void>\n revalidationHandler: (path?: string) => Promise<void>\n customRoutes: (route: string) => Promise<{ res: Response | void } | null>\n}\n\nexport function validateApiRoute(params: Partial<{ [key: string]: string | string[] }>): string {\n const { makeswift } = 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 return '/' + makeswift.join('/')\n}\n"],"mappings":"AAWO,SAAS,iBAAiB,QAA+D;AAC9F,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,YACe,SAAS;AAAA;AAAA,IAE1B;AAAA,EACF;AAEA,SAAO,MAAM,UAAU,KAAK,GAAG;AACjC;","names":[]}