@makeswift/runtime 0.25.0-canary.13 → 0.25.0-canary.14

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 (274) hide show
  1. package/dist/cjs/api/site-version/index.js +103 -0
  2. package/dist/cjs/api/site-version/index.js.map +1 -0
  3. package/dist/cjs/api-handler/handlers/manifest.js +2 -3
  4. package/dist/cjs/api-handler/handlers/manifest.js.map +1 -1
  5. package/dist/cjs/api-handler/handlers/{clear-draft.js → redirect-live.js} +19 -10
  6. package/dist/cjs/api-handler/handlers/redirect-live.js.map +1 -0
  7. package/dist/cjs/api-handler/index.js +6 -5
  8. package/dist/cjs/api-handler/index.js.map +1 -1
  9. package/dist/cjs/api-handler/request-response.js +9 -0
  10. package/dist/cjs/api-handler/request-response.js.map +1 -1
  11. package/dist/cjs/client/index.js +67 -59
  12. package/dist/cjs/client/index.js.map +1 -1
  13. package/dist/cjs/components/builtin/Root/Root.js +4 -4
  14. package/dist/cjs/components/builtin/Root/Root.js.map +1 -1
  15. package/dist/cjs/components/builtin/Video/Video.js +3 -13
  16. package/dist/cjs/components/builtin/Video/Video.js.map +1 -1
  17. package/dist/cjs/components/hooks/useMediaQuery.js +1 -2
  18. package/dist/cjs/components/hooks/useMediaQuery.js.map +1 -1
  19. package/dist/cjs/components/shared/BackgroundsContainer/components/BackgroundVideo/index.js +3 -13
  20. package/dist/cjs/components/shared/BackgroundsContainer/components/BackgroundVideo/index.js.map +1 -1
  21. package/dist/cjs/components/shared/react-player.js +41 -0
  22. package/dist/cjs/components/shared/react-player.js.map +1 -0
  23. package/dist/cjs/next/api-handler/config/app-router.js +7 -9
  24. package/dist/cjs/next/api-handler/config/app-router.js.map +1 -1
  25. package/dist/cjs/next/api-handler/config/pages-router.js +7 -9
  26. package/dist/cjs/next/api-handler/config/pages-router.js.map +1 -1
  27. package/dist/cjs/next/api-handler/handlers/{redirect-draft.js → app-router-redirect-preview.js} +30 -26
  28. package/dist/cjs/next/api-handler/handlers/app-router-redirect-preview.js.map +1 -0
  29. package/dist/cjs/next/api-handler/handlers/{redirect-preview.js → pages-router-redirect-preview.js} +29 -22
  30. package/dist/cjs/next/api-handler/handlers/pages-router-redirect-preview.js.map +1 -0
  31. package/dist/cjs/next/api-handler/index.js +1 -1
  32. package/dist/cjs/next/api-handler/index.js.map +1 -1
  33. package/dist/cjs/next/api-handler/{draft.js → preview.js} +14 -9
  34. package/dist/cjs/next/api-handler/preview.js.map +1 -0
  35. package/dist/cjs/next/{draft-mode/index.js → app-router-site-version.js} +11 -27
  36. package/dist/cjs/next/app-router-site-version.js.map +1 -0
  37. package/dist/cjs/next/client.js +9 -3
  38. package/dist/cjs/next/client.js.map +1 -1
  39. package/dist/cjs/next/components/framework-provider/index.js.map +1 -1
  40. package/dist/cjs/next/components/page.js +1 -1
  41. package/dist/cjs/next/components/page.js.map +1 -1
  42. package/dist/cjs/next/index.js.map +1 -1
  43. package/dist/cjs/next/middleware/request-utils.js +11 -17
  44. package/dist/cjs/next/middleware/request-utils.js.map +1 -1
  45. package/dist/cjs/next/root-style-registry.js +13 -20
  46. package/dist/cjs/next/root-style-registry.js.map +1 -1
  47. package/dist/cjs/next/server.js +2 -2
  48. package/dist/cjs/next/server.js.map +1 -1
  49. package/dist/cjs/next/testing/page-rendering.js +2 -2
  50. package/dist/cjs/next/testing/page-rendering.js.map +1 -1
  51. package/dist/cjs/next/testing/react-provider.js +2 -2
  52. package/dist/cjs/next/testing/react-provider.js.map +1 -1
  53. package/dist/cjs/next/tests/test-utils.js +6 -4
  54. package/dist/cjs/next/tests/test-utils.js.map +1 -1
  55. package/dist/cjs/runtimes/react/components/RuntimeProvider.js +7 -9
  56. package/dist/cjs/runtimes/react/components/RuntimeProvider.js.map +1 -1
  57. package/dist/cjs/runtimes/react/components/framework-context.js +1 -1
  58. package/dist/cjs/runtimes/react/components/framework-context.js.map +1 -1
  59. package/dist/cjs/runtimes/react/components/page/index.js +18 -16
  60. package/dist/cjs/runtimes/react/components/page/index.js.map +1 -1
  61. package/dist/cjs/runtimes/react/components/{draft-switcher/draft-switcher.js → preview-switcher/preview-switcher.js} +12 -22
  62. package/dist/cjs/runtimes/react/components/preview-switcher/preview-switcher.js.map +1 -0
  63. package/dist/cjs/runtimes/react/components/{draft-switcher/draft-toolbar.js → preview-switcher/preview-toolbar.js} +17 -9
  64. package/dist/cjs/runtimes/react/components/preview-switcher/preview-toolbar.js.map +1 -0
  65. package/dist/cjs/runtimes/react/hooks/makeswift-api.js +9 -10
  66. package/dist/cjs/runtimes/react/hooks/makeswift-api.js.map +1 -1
  67. package/dist/cjs/runtimes/react/hooks/use-selector.js +1 -1
  68. package/dist/cjs/runtimes/react/hooks/use-selector.js.map +1 -1
  69. package/dist/cjs/runtimes/react/root-style-registry.js +24 -13
  70. package/dist/cjs/runtimes/react/root-style-registry.js.map +1 -1
  71. package/dist/cjs/{next/preview-mode.js → testing/fixtures.js} +16 -18
  72. package/dist/cjs/testing/fixtures.js.map +1 -0
  73. package/dist/cjs/utils/esm-compat.js +29 -0
  74. package/dist/cjs/utils/esm-compat.js.map +1 -0
  75. package/dist/esm/api/site-version/index.js +75 -0
  76. package/dist/esm/api/site-version/index.js.map +1 -0
  77. package/dist/esm/api-handler/handlers/manifest.js +2 -3
  78. package/dist/esm/api-handler/handlers/manifest.js.map +1 -1
  79. package/dist/esm/api-handler/handlers/redirect-live.js +26 -0
  80. package/dist/esm/api-handler/handlers/redirect-live.js.map +1 -0
  81. package/dist/esm/api-handler/index.js +7 -6
  82. package/dist/esm/api-handler/index.js.map +1 -1
  83. package/dist/esm/api-handler/request-response.js +9 -0
  84. package/dist/esm/api-handler/request-response.js.map +1 -1
  85. package/dist/esm/client/index.js +65 -58
  86. package/dist/esm/client/index.js.map +1 -1
  87. package/dist/esm/components/builtin/Root/Root.js +4 -4
  88. package/dist/esm/components/builtin/Root/Root.js.map +1 -1
  89. package/dist/esm/components/builtin/Video/Video.js +1 -1
  90. package/dist/esm/components/builtin/Video/Video.js.map +1 -1
  91. package/dist/esm/components/hooks/useMediaQuery.js +1 -2
  92. package/dist/esm/components/hooks/useMediaQuery.js.map +1 -1
  93. package/dist/esm/components/shared/BackgroundsContainer/components/BackgroundVideo/index.js +1 -1
  94. package/dist/esm/components/shared/BackgroundsContainer/components/BackgroundVideo/index.js.map +1 -1
  95. package/dist/esm/components/shared/react-player.js +7 -0
  96. package/dist/esm/components/shared/react-player.js.map +1 -0
  97. package/dist/esm/next/api-handler/config/app-router.js +7 -9
  98. package/dist/esm/next/api-handler/config/app-router.js.map +1 -1
  99. package/dist/esm/next/api-handler/config/pages-router.js +7 -9
  100. package/dist/esm/next/api-handler/config/pages-router.js.map +1 -1
  101. package/dist/esm/next/api-handler/handlers/app-router-redirect-preview.js +64 -0
  102. package/dist/esm/next/api-handler/handlers/app-router-redirect-preview.js.map +1 -0
  103. package/dist/esm/next/api-handler/handlers/pages-router-redirect-preview.js +52 -0
  104. package/dist/esm/next/api-handler/handlers/pages-router-redirect-preview.js.map +1 -0
  105. package/dist/esm/next/api-handler/index.js +1 -1
  106. package/dist/esm/next/api-handler/index.js.map +1 -1
  107. package/dist/esm/next/api-handler/preview.js +18 -0
  108. package/dist/esm/next/api-handler/preview.js.map +1 -0
  109. package/dist/esm/next/app-router-site-version.js +16 -0
  110. package/dist/esm/next/app-router-site-version.js.map +1 -0
  111. package/dist/esm/next/client.js +10 -4
  112. package/dist/esm/next/client.js.map +1 -1
  113. package/dist/esm/next/components/framework-provider/index.js.map +1 -1
  114. package/dist/esm/next/components/page.js +2 -4
  115. package/dist/esm/next/components/page.js.map +1 -1
  116. package/dist/esm/next/index.js.map +1 -1
  117. package/dist/esm/next/middleware/request-utils.js +14 -17
  118. package/dist/esm/next/middleware/request-utils.js.map +1 -1
  119. package/dist/esm/next/root-style-registry.js +12 -17
  120. package/dist/esm/next/root-style-registry.js.map +1 -1
  121. package/dist/esm/next/server.js +1 -1
  122. package/dist/esm/next/server.js.map +1 -1
  123. package/dist/esm/next/testing/page-rendering.js +2 -2
  124. package/dist/esm/next/testing/page-rendering.js.map +1 -1
  125. package/dist/esm/next/testing/react-provider.js +2 -2
  126. package/dist/esm/next/testing/react-provider.js.map +1 -1
  127. package/dist/esm/next/tests/test-utils.js +6 -4
  128. package/dist/esm/next/tests/test-utils.js.map +1 -1
  129. package/dist/esm/runtimes/react/components/RuntimeProvider.js +7 -9
  130. package/dist/esm/runtimes/react/components/RuntimeProvider.js.map +1 -1
  131. package/dist/esm/runtimes/react/components/framework-context.js +5 -2
  132. package/dist/esm/runtimes/react/components/framework-context.js.map +1 -1
  133. package/dist/esm/runtimes/react/components/page/index.js +19 -17
  134. package/dist/esm/runtimes/react/components/page/index.js.map +1 -1
  135. package/dist/esm/runtimes/react/components/{draft-switcher/draft-switcher.js → preview-switcher/preview-switcher.js} +8 -18
  136. package/dist/esm/runtimes/react/components/preview-switcher/preview-switcher.js.map +1 -0
  137. package/dist/esm/runtimes/react/components/{draft-switcher/draft-toolbar.js → preview-switcher/preview-toolbar.js} +13 -5
  138. package/dist/esm/runtimes/react/components/preview-switcher/preview-toolbar.js.map +1 -0
  139. package/dist/esm/runtimes/react/hooks/makeswift-api.js +1 -2
  140. package/dist/esm/runtimes/react/hooks/makeswift-api.js.map +1 -1
  141. package/dist/esm/runtimes/react/hooks/use-selector.js +1 -1
  142. package/dist/esm/runtimes/react/hooks/use-selector.js.map +1 -1
  143. package/dist/esm/runtimes/react/root-style-registry.js +24 -13
  144. package/dist/esm/runtimes/react/root-style-registry.js.map +1 -1
  145. package/dist/esm/testing/fixtures.js +13 -0
  146. package/dist/esm/testing/fixtures.js.map +1 -0
  147. package/dist/esm/utils/esm-compat.js +5 -0
  148. package/dist/esm/utils/esm-compat.js.map +1 -0
  149. package/dist/types/api/site-version/index.d.ts +19 -0
  150. package/dist/types/api/site-version/index.d.ts.map +1 -0
  151. package/dist/types/api/site-version/site-version.test.d.ts +2 -0
  152. package/dist/types/api/site-version/site-version.test.d.ts.map +1 -0
  153. package/dist/types/api-handler/handlers/manifest.d.ts +0 -2
  154. package/dist/types/api-handler/handlers/manifest.d.ts.map +1 -1
  155. package/dist/types/api-handler/handlers/redirect-live.d.ts +5 -0
  156. package/dist/types/api-handler/handlers/redirect-live.d.ts.map +1 -0
  157. package/dist/types/api-handler/index.d.ts +4 -4
  158. package/dist/types/api-handler/index.d.ts.map +1 -1
  159. package/dist/types/api-handler/request-response.d.ts +1 -0
  160. package/dist/types/api-handler/request-response.d.ts.map +1 -1
  161. package/dist/types/client/index.d.ts +32 -23
  162. package/dist/types/client/index.d.ts.map +1 -1
  163. package/dist/types/components/builtin/Root/Root.d.ts +1 -1
  164. package/dist/types/components/builtin/Root/Root.d.ts.map +1 -1
  165. package/dist/types/components/hooks/useMediaQuery.d.ts.map +1 -1
  166. package/dist/types/components/shared/BackgroundsContainer/components/BackgroundVideo/index.d.ts.map +1 -1
  167. package/dist/types/components/shared/react-player.d.ts +3 -0
  168. package/dist/types/components/shared/react-player.d.ts.map +1 -0
  169. package/dist/types/next/api-handler/config/app-router.d.ts +3 -2
  170. package/dist/types/next/api-handler/config/app-router.d.ts.map +1 -1
  171. package/dist/types/next/api-handler/config/pages-router.d.ts +3 -2
  172. package/dist/types/next/api-handler/config/pages-router.d.ts.map +1 -1
  173. package/dist/types/next/api-handler/handlers/app-router-redirect-preview.d.ts +5 -0
  174. package/dist/types/next/api-handler/handlers/app-router-redirect-preview.d.ts.map +1 -0
  175. package/dist/types/next/api-handler/handlers/app-router-redirect-preview.test.d.ts +2 -0
  176. package/dist/types/next/api-handler/handlers/app-router-redirect-preview.test.d.ts.map +1 -0
  177. package/dist/types/next/api-handler/handlers/pages-router-redirect-preview.d.ts +4 -0
  178. package/dist/types/next/api-handler/handlers/pages-router-redirect-preview.d.ts.map +1 -0
  179. package/dist/types/next/api-handler/preview.d.ts +11 -0
  180. package/dist/types/next/api-handler/preview.d.ts.map +1 -0
  181. package/dist/types/next/app-router-site-version.d.ts +3 -0
  182. package/dist/types/next/app-router-site-version.d.ts.map +1 -0
  183. package/dist/types/next/client.d.ts +3 -3
  184. package/dist/types/next/client.d.ts.map +1 -1
  185. package/dist/types/next/components/page.d.ts +2 -6
  186. package/dist/types/next/components/page.d.ts.map +1 -1
  187. package/dist/types/next/index.d.ts +1 -1
  188. package/dist/types/next/index.d.ts.map +1 -1
  189. package/dist/types/next/middleware/request-utils.d.ts +1 -0
  190. package/dist/types/next/middleware/request-utils.d.ts.map +1 -1
  191. package/dist/types/next/root-style-registry.d.ts +3 -12
  192. package/dist/types/next/root-style-registry.d.ts.map +1 -1
  193. package/dist/types/next/server.d.ts +1 -1
  194. package/dist/types/next/server.d.ts.map +1 -1
  195. package/dist/types/next/testing/react-provider.d.ts +3 -2
  196. package/dist/types/next/testing/react-provider.d.ts.map +1 -1
  197. package/dist/types/next/tests/server.api-handler-app-router-redirect-preview.test.d.ts +2 -0
  198. package/dist/types/next/tests/server.api-handler-app-router-redirect-preview.test.d.ts.map +1 -0
  199. package/dist/types/next/tests/server.api-handler-pages-router-redirect-preview.test.d.ts +2 -0
  200. package/dist/types/next/tests/server.api-handler-pages-router-redirect-preview.test.d.ts.map +1 -0
  201. package/dist/types/next/tests/server.api-handler-redirect-live.test.d.ts +2 -0
  202. package/dist/types/next/tests/server.api-handler-redirect-live.test.d.ts.map +1 -0
  203. package/dist/types/next/tests/test-utils.d.ts.map +1 -1
  204. package/dist/types/runtimes/react/components/RuntimeProvider.d.ts +3 -2
  205. package/dist/types/runtimes/react/components/RuntimeProvider.d.ts.map +1 -1
  206. package/dist/types/runtimes/react/components/framework-context.d.ts +2 -2
  207. package/dist/types/runtimes/react/components/framework-context.d.ts.map +1 -1
  208. package/dist/types/runtimes/react/components/page/index.d.ts +23 -3
  209. package/dist/types/runtimes/react/components/page/index.d.ts.map +1 -1
  210. package/dist/types/runtimes/react/components/preview-switcher/preview-switcher.d.ts +4 -0
  211. package/dist/types/runtimes/react/components/preview-switcher/preview-switcher.d.ts.map +1 -0
  212. package/dist/types/runtimes/react/components/preview-switcher/preview-toolbar.d.ts +2 -0
  213. package/dist/types/runtimes/react/components/preview-switcher/preview-toolbar.d.ts.map +1 -0
  214. package/dist/types/runtimes/react/hooks/makeswift-api.d.ts.map +1 -1
  215. package/dist/types/runtimes/react/hooks/use-selector.d.ts.map +1 -1
  216. package/dist/types/runtimes/react/root-style-registry.d.ts +23 -11
  217. package/dist/types/runtimes/react/root-style-registry.d.ts.map +1 -1
  218. package/dist/types/testing/fixtures.d.ts +7 -0
  219. package/dist/types/testing/fixtures.d.ts.map +1 -0
  220. package/dist/types/utils/esm-compat.d.ts +2 -0
  221. package/dist/types/utils/esm-compat.d.ts.map +1 -0
  222. package/package.json +6 -5
  223. package/dist/cjs/api/site-version.js +0 -42
  224. package/dist/cjs/api/site-version.js.map +0 -1
  225. package/dist/cjs/api-handler/handlers/clear-draft.js.map +0 -1
  226. package/dist/cjs/next/api-handler/draft.js.map +0 -1
  227. package/dist/cjs/next/api-handler/handlers/redirect-draft.js.map +0 -1
  228. package/dist/cjs/next/api-handler/handlers/redirect-preview.js.map +0 -1
  229. package/dist/cjs/next/draft-mode/index.js.map +0 -1
  230. package/dist/cjs/next/preview-mode.js.map +0 -1
  231. package/dist/cjs/runtimes/react/components/draft-switcher/draft-switcher.js.map +0 -1
  232. package/dist/cjs/runtimes/react/components/draft-switcher/draft-toolbar.js.map +0 -1
  233. package/dist/esm/api/site-version.js +0 -15
  234. package/dist/esm/api/site-version.js.map +0 -1
  235. package/dist/esm/api-handler/handlers/clear-draft.js +0 -17
  236. package/dist/esm/api-handler/handlers/clear-draft.js.map +0 -1
  237. package/dist/esm/next/api-handler/draft.js +0 -14
  238. package/dist/esm/next/api-handler/draft.js.map +0 -1
  239. package/dist/esm/next/api-handler/handlers/redirect-draft.js +0 -52
  240. package/dist/esm/next/api-handler/handlers/redirect-draft.js.map +0 -1
  241. package/dist/esm/next/api-handler/handlers/redirect-preview.js +0 -37
  242. package/dist/esm/next/api-handler/handlers/redirect-preview.js.map +0 -1
  243. package/dist/esm/next/draft-mode/index.js +0 -30
  244. package/dist/esm/next/draft-mode/index.js.map +0 -1
  245. package/dist/esm/next/preview-mode.js +0 -16
  246. package/dist/esm/next/preview-mode.js.map +0 -1
  247. package/dist/esm/runtimes/react/components/draft-switcher/draft-switcher.js.map +0 -1
  248. package/dist/esm/runtimes/react/components/draft-switcher/draft-toolbar.js.map +0 -1
  249. package/dist/types/api/site-version.d.ts +0 -7
  250. package/dist/types/api/site-version.d.ts.map +0 -1
  251. package/dist/types/api-handler/handlers/clear-draft.d.ts +0 -7
  252. package/dist/types/api-handler/handlers/clear-draft.d.ts.map +0 -1
  253. package/dist/types/next/api-handler/draft.d.ts +0 -8
  254. package/dist/types/next/api-handler/draft.d.ts.map +0 -1
  255. package/dist/types/next/api-handler/handlers/redirect-draft.d.ts +0 -6
  256. package/dist/types/next/api-handler/handlers/redirect-draft.d.ts.map +0 -1
  257. package/dist/types/next/api-handler/handlers/redirect-draft.test.d.ts +0 -2
  258. package/dist/types/next/api-handler/handlers/redirect-draft.test.d.ts.map +0 -1
  259. package/dist/types/next/api-handler/handlers/redirect-preview.d.ts +0 -5
  260. package/dist/types/next/api-handler/handlers/redirect-preview.d.ts.map +0 -1
  261. package/dist/types/next/draft-mode/index.d.ts +0 -15
  262. package/dist/types/next/draft-mode/index.d.ts.map +0 -1
  263. package/dist/types/next/preview-mode.d.ts +0 -17
  264. package/dist/types/next/preview-mode.d.ts.map +0 -1
  265. package/dist/types/next/tests/server.api-handler-clear-draft.test.d.ts +0 -2
  266. package/dist/types/next/tests/server.api-handler-clear-draft.test.d.ts.map +0 -1
  267. package/dist/types/next/tests/server.api-handler-redirect-draft.test.d.ts +0 -2
  268. package/dist/types/next/tests/server.api-handler-redirect-draft.test.d.ts.map +0 -1
  269. package/dist/types/next/tests/server.api-handler-redirect-preview.test.d.ts +0 -2
  270. package/dist/types/next/tests/server.api-handler-redirect-preview.test.d.ts.map +0 -1
  271. package/dist/types/runtimes/react/components/draft-switcher/draft-switcher.d.ts +0 -4
  272. package/dist/types/runtimes/react/components/draft-switcher/draft-switcher.d.ts.map +0 -1
  273. package/dist/types/runtimes/react/components/draft-switcher/draft-toolbar.d.ts +0 -6
  274. package/dist/types/runtimes/react/components/draft-switcher/draft-toolbar.d.ts.map +0 -1
@@ -45,23 +45,34 @@ const CSSResetEnabledContext = (0, import_react.createContext)(DEFAULT_CSS_RESET
45
45
  const createRootStyleCache = ({ key } = {}) => {
46
46
  const cache2 = (0, import_cache.default)({ key: key ?? "mswft" });
47
47
  cache2.compat = true;
48
- const prevInsert = cache2.insert;
49
48
  let inserted = [];
50
- cache2.insert = (...args) => {
51
- const serialized = args[1];
52
- if (cache2.inserted[serialized.name] === void 0) {
53
- inserted.push(serialized.name);
49
+ return {
50
+ ...cache2,
51
+ // override the `insert` method to track inserted names
52
+ insert(...args) {
53
+ const serialized = args[1];
54
+ if (cache2.inserted[serialized.name] === void 0) {
55
+ inserted.push(serialized.name);
56
+ }
57
+ return cache2.insert(...args);
58
+ },
59
+ flush() {
60
+ const classNames = inserted;
61
+ inserted = [];
62
+ return {
63
+ classNames,
64
+ css: classNames.reduce((css, name) => {
65
+ return css + cache2.inserted[name];
66
+ }, "")
67
+ };
54
68
  }
55
- return prevInsert(...args);
56
69
  };
57
- const flush = () => {
58
- const prevInserted = inserted;
59
- inserted = [];
60
- return prevInserted;
61
- };
62
- return { cache: cache2, flush };
63
70
  };
64
- function RootStyleRegistry({ children, cache: cache2, enableCssReset }) {
71
+ function RootStyleRegistry({
72
+ children,
73
+ cache: cache2,
74
+ enableCssReset
75
+ }) {
65
76
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CacheContext.Provider, { value: cache2, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CSSResetEnabledContext.Provider, { value: enableCssReset ?? DEFAULT_CSS_RESET_ENABLED, children }) });
66
77
  }
67
78
  function useCache() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtimes/react/root-style-registry.tsx"],"sourcesContent":["'use client'\n\nimport createCache, { EmotionCache } from '@emotion/cache'\nimport { cache } from '@emotion/css'\nimport { ReactNode, createContext, useContext } from 'react'\n\nconst CacheContext = createContext(cache)\n\nconst DEFAULT_CSS_RESET_ENABLED = true\nconst CSSResetEnabledContext = createContext(DEFAULT_CSS_RESET_ENABLED)\n\nexport const createRootStyleCache = ({ key }: { key?: string } = {}) => {\n const cache = createCache({ key: key ?? 'mswft' })\n cache.compat = true\n\n const prevInsert = cache.insert\n let inserted: string[] = []\n\n cache.insert = (...args) => {\n const serialized = args[1]\n if (cache.inserted[serialized.name] === undefined) {\n inserted.push(serialized.name)\n }\n return prevInsert(...args)\n }\n\n const flush = () => {\n const prevInserted = inserted\n inserted = []\n return prevInserted\n }\n\n return { cache, flush }\n}\n\ntype Props = {\n children: ReactNode\n cache: EmotionCache\n /**\n * Toggle the built-in CSS reset.\n * Set to `false` when using `@layer`-based CSS frameworks like Tailwind.\n */\n enableCssReset?: boolean\n}\n\nexport function RootStyleRegistry({ children, cache, enableCssReset }: Props) {\n return (\n <CacheContext.Provider value={cache}>\n <CSSResetEnabledContext.Provider value={enableCssReset ?? DEFAULT_CSS_RESET_ENABLED}>\n {children}\n </CSSResetEnabledContext.Provider>\n </CacheContext.Provider>\n )\n}\n\nexport function useCache(): EmotionCache {\n return useContext(CacheContext)\n}\n\nexport function useCSSResetEnabled(): boolean {\n return useContext(CSSResetEnabledContext)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDM;AA9CN,mBAA0C;AAC1C,iBAAsB;AACtB,mBAAqD;AAErD,MAAM,mBAAe,4BAAc,gBAAK;AAExC,MAAM,4BAA4B;AAClC,MAAM,6BAAyB,4BAAc,yBAAyB;AAE/D,MAAM,uBAAuB,CAAC,EAAE,IAAI,IAAsB,CAAC,MAAM;AACtE,QAAMA,aAAQ,aAAAC,SAAY,EAAE,KAAK,OAAO,QAAQ,CAAC;AACjD,EAAAD,OAAM,SAAS;AAEf,QAAM,aAAaA,OAAM;AACzB,MAAI,WAAqB,CAAC;AAE1B,EAAAA,OAAM,SAAS,IAAI,SAAS;AAC1B,UAAM,aAAa,KAAK,CAAC;AACzB,QAAIA,OAAM,SAAS,WAAW,IAAI,MAAM,QAAW;AACjD,eAAS,KAAK,WAAW,IAAI;AAAA,IAC/B;AACA,WAAO,WAAW,GAAG,IAAI;AAAA,EAC3B;AAEA,QAAM,QAAQ,MAAM;AAClB,UAAM,eAAe;AACrB,eAAW,CAAC;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,OAAAA,QAAO,MAAM;AACxB;AAYO,SAAS,kBAAkB,EAAE,UAAU,OAAAA,QAAO,eAAe,GAAU;AAC5E,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAOA,QAC5B,sDAAC,uBAAuB,UAAvB,EAAgC,OAAO,kBAAkB,2BACvD,UACH,GACF;AAEJ;AAEO,SAAS,WAAyB;AACvC,aAAO,yBAAW,YAAY;AAChC;AAEO,SAAS,qBAA8B;AAC5C,aAAO,yBAAW,sBAAsB;AAC1C;","names":["cache","createCache"]}
1
+ {"version":3,"sources":["../../../../src/runtimes/react/root-style-registry.tsx"],"sourcesContent":["'use client'\n\nimport createCache, { type EmotionCache } from '@emotion/cache'\nimport { cache } from '@emotion/css'\nimport { type PropsWithChildren, createContext, useContext } from 'react'\n\nconst CacheContext = createContext(cache)\n\nconst DEFAULT_CSS_RESET_ENABLED = true\nconst CSSResetEnabledContext = createContext(DEFAULT_CSS_RESET_ENABLED)\n\nexport type StyleCache = EmotionCache & {\n /**\n * Flush the inserted styles.\n * @returns A list of class names and the corresponding CSS rules that were flushed.\n */\n flush: () => { classNames: string[]; css: string }\n}\n\nexport const createRootStyleCache = ({ key }: { key?: string } = {}): StyleCache => {\n const cache = createCache({ key: key ?? 'mswft' })\n cache.compat = true\n\n // additional state to track inserted style names\n let inserted: string[] = []\n\n return {\n ...cache,\n\n // override the `insert` method to track inserted names\n insert(...args) {\n const serialized = args[1]\n if (cache.inserted[serialized.name] === undefined) {\n inserted.push(serialized.name)\n }\n return cache.insert(...args)\n },\n\n flush() {\n const classNames = inserted\n // reset our own state, leave `cache.inserted` intact\n inserted = []\n\n return {\n classNames,\n css: classNames.reduce((css, name) => {\n return css + cache.inserted[name]\n }, ''),\n }\n },\n }\n}\n\nexport type RootStyleProps = {\n /**\n * The key used to prefix generated class names.\n * If not provided, a default key will be used.\n */\n cacheKey?: string\n /**\n * Toggle the built-in CSS reset.\n * Set to `false` when using `@layer`-based CSS frameworks like Tailwind.\n */\n enableCssReset?: boolean\n}\n\nexport function RootStyleRegistry({\n children,\n cache,\n enableCssReset,\n}: PropsWithChildren<{\n cache: StyleCache\n enableCssReset?: boolean\n}>) {\n return (\n <CacheContext.Provider value={cache}>\n <CSSResetEnabledContext.Provider value={enableCssReset ?? DEFAULT_CSS_RESET_ENABLED}>\n {children}\n </CSSResetEnabledContext.Provider>\n </CacheContext.Provider>\n )\n}\n\nexport function useCache(): EmotionCache {\n return useContext(CacheContext)\n}\n\nexport function useCSSResetEnabled(): boolean {\n return useContext(CSSResetEnabledContext)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4EM;AA1EN,mBAA+C;AAC/C,iBAAsB;AACtB,mBAAkE;AAElE,MAAM,mBAAe,4BAAc,gBAAK;AAExC,MAAM,4BAA4B;AAClC,MAAM,6BAAyB,4BAAc,yBAAyB;AAU/D,MAAM,uBAAuB,CAAC,EAAE,IAAI,IAAsB,CAAC,MAAkB;AAClF,QAAMA,aAAQ,aAAAC,SAAY,EAAE,KAAK,OAAO,QAAQ,CAAC;AACjD,EAAAD,OAAM,SAAS;AAGf,MAAI,WAAqB,CAAC;AAE1B,SAAO;AAAA,IACL,GAAGA;AAAA;AAAA,IAGH,UAAU,MAAM;AACd,YAAM,aAAa,KAAK,CAAC;AACzB,UAAIA,OAAM,SAAS,WAAW,IAAI,MAAM,QAAW;AACjD,iBAAS,KAAK,WAAW,IAAI;AAAA,MAC/B;AACA,aAAOA,OAAM,OAAO,GAAG,IAAI;AAAA,IAC7B;AAAA,IAEA,QAAQ;AACN,YAAM,aAAa;AAEnB,iBAAW,CAAC;AAEZ,aAAO;AAAA,QACL;AAAA,QACA,KAAK,WAAW,OAAO,CAAC,KAAK,SAAS;AACpC,iBAAO,MAAMA,OAAM,SAAS,IAAI;AAAA,QAClC,GAAG,EAAE;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,OAAAA;AAAA,EACA;AACF,GAGI;AACF,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAOA,QAC5B,sDAAC,uBAAuB,UAAvB,EAAgC,OAAO,kBAAkB,2BACvD,UACH,GACF;AAEJ;AAEO,SAAS,WAAyB;AACvC,aAAO,yBAAW,YAAY;AAChC;AAEO,SAAS,qBAA8B;AAC5C,aAAO,yBAAW,sBAAsB;AAC1C;","names":["cache","createCache"]}
@@ -16,25 +16,23 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var preview_mode_exports = {};
20
- __export(preview_mode_exports, {
21
- getMakeswiftSiteVersion: () => getMakeswiftSiteVersion
19
+ var fixtures_exports = {};
20
+ __export(fixtures_exports, {
21
+ TestOrigins: () => TestOrigins,
22
+ TestWorkingSiteVersion: () => TestWorkingSiteVersion
22
23
  });
23
- module.exports = __toCommonJS(preview_mode_exports);
24
- var import_zod = require("zod");
25
- var import_site_version = require("../api/site-version");
26
- const makeswiftPreviewDataSchema = import_zod.z.object({
27
- makeswift: import_zod.z.literal(true),
28
- siteVersion: import_site_version.makeswiftSiteVersionSchema
29
- });
30
- function getMakeswiftSiteVersion(previewData) {
31
- const result = makeswiftPreviewDataSchema.safeParse(previewData);
32
- if (result.success)
33
- return result.data.siteVersion;
34
- return null;
35
- }
24
+ module.exports = __toCommonJS(fixtures_exports);
25
+ const TestWorkingSiteVersion = {
26
+ version: "draft",
27
+ token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtYWtlc3dpZnQtcnVudGltZSIsImlhdCI6MTc1NDU5OTE0OSwiZXhwIjo0MTAyNDMyNzQ5LCJhdWQiOiJ0ZXN0Iiwic3ViIjoibWFrZXN3aWZ0LXJ1bnRpbWUifQ.-1BDOmEN1Q1QeKP7qfjPyAkrKRjb4q4qaqyhPBvMnhg"
28
+ };
29
+ const TestOrigins = {
30
+ apiOrigin: "https://api.fakeswift.com",
31
+ appOrigin: "https://app.fakeswift.com"
32
+ };
36
33
  // Annotate the CommonJS export names for ESM import in node:
37
34
  0 && (module.exports = {
38
- getMakeswiftSiteVersion
35
+ TestOrigins,
36
+ TestWorkingSiteVersion
39
37
  });
40
- //# sourceMappingURL=preview-mode.js.map
38
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/testing/fixtures.ts"],"sourcesContent":["import { type SiteVersion } from '../next'\n\nexport const TestWorkingSiteVersion: SiteVersion = {\n version: 'draft',\n token:\n 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtYWtlc3dpZnQtcnVudGltZSIsImlhdCI6MTc1NDU5OTE0OSwiZXhwIjo0MTAyNDMyNzQ5LCJhdWQiOiJ0ZXN0Iiwic3ViIjoibWFrZXN3aWZ0LXJ1bnRpbWUifQ.-1BDOmEN1Q1QeKP7qfjPyAkrKRjb4q4qaqyhPBvMnhg',\n} as const\n\nexport const TestOrigins = {\n apiOrigin: 'https://api.fakeswift.com',\n appOrigin: 'https://app.fakeswift.com',\n} as const\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,yBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,OACE;AACJ;AAEO,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,EACX,WAAW;AACb;","names":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var esm_compat_exports = {};
20
+ __export(esm_compat_exports, {
21
+ esmCompat: () => esmCompat
22
+ });
23
+ module.exports = __toCommonJS(esm_compat_exports);
24
+ const esmCompat = (x) => x.default ?? x;
25
+ // Annotate the CommonJS export names for ESM import in node:
26
+ 0 && (module.exports = {
27
+ esmCompat
28
+ });
29
+ //# sourceMappingURL=esm-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/esm-compat.ts"],"sourcesContent":["// see https://www.npmjs.com/package/vite-plugin-cjs-interop\nexport const esmCompat = <T>(x: T): T => (x as any).default ?? x\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,MAAM,YAAY,CAAI,MAAa,EAAU,WAAW;","names":[]}
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { jwtDecode } from "jwt-decode";
3
+ const ApiHandlerHeaders = {
4
+ SiteVersion: "X-Makeswift-Site-Version"
5
+ };
6
+ const decodedTokenPayloadSchema = z.object({
7
+ exp: z.number()
8
+ });
9
+ const siteVersionSchema = z.object({
10
+ version: z.string(),
11
+ token: z.string()
12
+ });
13
+ function millisecondsToSeconds(ms) {
14
+ return Math.floor(ms / 1e3);
15
+ }
16
+ function serializeSiteVersion(data) {
17
+ const jsonString = JSON.stringify({ version: data.version, token: data.token });
18
+ return jsonString;
19
+ }
20
+ function parseSerializedSiteVersion(input) {
21
+ try {
22
+ return siteVersionSchema.parse(JSON.parse(input));
23
+ } catch {
24
+ console.error("Failed to parse serialized site version:", input);
25
+ return null;
26
+ }
27
+ }
28
+ function getSiteVersionTokenPayload(siteVersion) {
29
+ try {
30
+ const decoded = jwtDecode(siteVersion.token);
31
+ return decodedTokenPayloadSchema.parse(decoded);
32
+ } catch (error) {
33
+ console.error("Invalid site version token");
34
+ throw error;
35
+ }
36
+ }
37
+ function secondsUntilTokenExpiration(tokenPayload) {
38
+ const currentTime = millisecondsToSeconds(Date.now());
39
+ return Math.max(tokenPayload.exp - currentTime, 0);
40
+ }
41
+ function secondsUntilSiteVersionExpiration(siteVersion) {
42
+ try {
43
+ const tokenPayload = getSiteVersionTokenPayload(siteVersion);
44
+ return secondsUntilTokenExpiration(tokenPayload);
45
+ } catch (error) {
46
+ console.error("Failed to check site version expiration:", error);
47
+ return 0;
48
+ }
49
+ }
50
+ function isSiteVersionExpired(siteVersion) {
51
+ return secondsUntilSiteVersionExpiration(siteVersion) <= 0;
52
+ }
53
+ function deserializeSiteVersion(input) {
54
+ try {
55
+ const parsedSiteVersion = parseSerializedSiteVersion(input);
56
+ if (parsedSiteVersion == null)
57
+ return null;
58
+ if (isSiteVersionExpired(parsedSiteVersion)) {
59
+ console.error("Site version token is expired");
60
+ return null;
61
+ }
62
+ return parsedSiteVersion;
63
+ } catch {
64
+ console.error("Failed to deserialize site version:", input);
65
+ return null;
66
+ }
67
+ }
68
+ export {
69
+ ApiHandlerHeaders,
70
+ deserializeSiteVersion,
71
+ secondsUntilSiteVersionExpiration,
72
+ serializeSiteVersion,
73
+ siteVersionSchema
74
+ };
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api/site-version/index.ts"],"sourcesContent":["import { z } from 'zod'\nimport { jwtDecode } from 'jwt-decode'\n\nexport const ApiHandlerHeaders = {\n SiteVersion: 'X-Makeswift-Site-Version',\n}\n\nconst decodedTokenPayloadSchema = z.object({\n exp: z.number(),\n})\n\ntype DecodedTokenPayload = z.infer<typeof decodedTokenPayloadSchema>\n\nexport const siteVersionSchema = z.object({\n version: z.string(),\n token: z.string(),\n})\n\nexport type SiteVersion = z.infer<typeof siteVersionSchema>\n\nfunction millisecondsToSeconds(ms: number): number {\n return Math.floor(ms / 1000)\n}\n\nexport function serializeSiteVersion(data: SiteVersion): string {\n const jsonString = JSON.stringify({ version: data.version, token: data.token })\n return jsonString\n}\n\nfunction parseSerializedSiteVersion(input: string): SiteVersion | null {\n try {\n return siteVersionSchema.parse(JSON.parse(input))\n } catch {\n console.error('Failed to parse serialized site version:', input)\n return null\n }\n}\n\nfunction getSiteVersionTokenPayload(siteVersion: SiteVersion): DecodedTokenPayload {\n try {\n const decoded = jwtDecode<DecodedTokenPayload>(siteVersion.token)\n return decodedTokenPayloadSchema.parse(decoded)\n } catch (error) {\n console.error('Invalid site version token')\n throw error\n }\n}\n\nfunction secondsUntilTokenExpiration(tokenPayload: DecodedTokenPayload): number {\n const currentTime = millisecondsToSeconds(Date.now())\n return Math.max(tokenPayload.exp - currentTime, 0)\n}\n\nexport function secondsUntilSiteVersionExpiration(siteVersion: SiteVersion): number {\n try {\n const tokenPayload = getSiteVersionTokenPayload(siteVersion)\n return secondsUntilTokenExpiration(tokenPayload)\n } catch (error) {\n console.error('Failed to check site version expiration:', error)\n return 0\n }\n}\n\nfunction isSiteVersionExpired(siteVersion: SiteVersion): boolean {\n return secondsUntilSiteVersionExpiration(siteVersion) <= 0\n}\n\nexport function deserializeSiteVersion(input: string): SiteVersion | null {\n try {\n const parsedSiteVersion = parseSerializedSiteVersion(input)\n if (parsedSiteVersion == null) return null\n\n if (isSiteVersionExpired(parsedSiteVersion)) {\n console.error('Site version token is expired')\n return null\n }\n return parsedSiteVersion\n } catch {\n console.error('Failed to deserialize site version:', input)\n return null\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAClB,SAAS,iBAAiB;AAEnB,MAAM,oBAAoB;AAAA,EAC/B,aAAa;AACf;AAEA,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,KAAK,EAAE,OAAO;AAChB,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAClB,CAAC;AAID,SAAS,sBAAsB,IAAoB;AACjD,SAAO,KAAK,MAAM,KAAK,GAAI;AAC7B;AAEO,SAAS,qBAAqB,MAA2B;AAC9D,QAAM,aAAa,KAAK,UAAU,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC;AAC9E,SAAO;AACT;AAEA,SAAS,2BAA2B,OAAmC;AACrE,MAAI;AACF,WAAO,kBAAkB,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,EAClD,QAAQ;AACN,YAAQ,MAAM,4CAA4C,KAAK;AAC/D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BAA2B,aAA+C;AACjF,MAAI;AACF,UAAM,UAAU,UAA+B,YAAY,KAAK;AAChE,WAAO,0BAA0B,MAAM,OAAO;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B;AAC1C,UAAM;AAAA,EACR;AACF;AAEA,SAAS,4BAA4B,cAA2C;AAC9E,QAAM,cAAc,sBAAsB,KAAK,IAAI,CAAC;AACpD,SAAO,KAAK,IAAI,aAAa,MAAM,aAAa,CAAC;AACnD;AAEO,SAAS,kCAAkC,aAAkC;AAClF,MAAI;AACF,UAAM,eAAe,2BAA2B,WAAW;AAC3D,WAAO,4BAA4B,YAAY;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ,MAAM,4CAA4C,KAAK;AAC/D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,aAAmC;AAC/D,SAAO,kCAAkC,WAAW,KAAK;AAC3D;AAEO,SAAS,uBAAuB,OAAmC;AACxE,MAAI;AACF,UAAM,oBAAoB,2BAA2B,KAAK;AAC1D,QAAI,qBAAqB;AAAM,aAAO;AAEtC,QAAI,qBAAqB,iBAAiB,GAAG;AAC3C,cAAQ,MAAM,+BAA+B;AAC7C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,YAAQ,MAAM,uCAAuC,KAAK;AAC1D,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -8,9 +8,7 @@ async function manifestHandler(req, { apiKey, manifest }) {
8
8
  return ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
9
9
  }
10
10
  return ApiResponse.json({
11
- version: "0.25.0-canary.13",
12
- previewMode: false,
13
- draftMode: false,
11
+ version: "0.25.0-canary.14",
14
12
  interactionMode: true,
15
13
  clientSideNavigation: false,
16
14
  elementFromPoint: false,
@@ -20,6 +18,7 @@ async function manifestHandler(req, { apiKey, manifest }) {
20
18
  localizedPageSSR: true,
21
19
  webhook: true,
22
20
  localizedPagesOnlineByDefault: true,
21
+ previewToken: true,
23
22
  ...manifest
24
23
  });
25
24
  }
@@ -1 +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":[]}
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 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 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 previewToken: true,\n ...manifest,\n })\n}\n"],"mappings":"AAAA;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAeP,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,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,cAAc;AAAA,IACd,GAAG;AAAA,EACL,CAAC;AACH;","names":[]}
@@ -0,0 +1,26 @@
1
+ import { serialize as serializeCookie } from "cookie";
2
+ import { ApiResponse, searchParams } from "../request-response";
3
+ import { SET_COOKIE_HEADER, cookieSettingOptions } from "../cookies";
4
+ const REDIRECT_SEARCH_PARAM = "x-makeswift-redirect-live";
5
+ async function redirectLiveHandler(req, { previewCookieNames }) {
6
+ const params = searchParams(req);
7
+ const redirectDestination = params.get(REDIRECT_SEARCH_PARAM) ?? "/";
8
+ const redirectDestinationUrl = new URL(
9
+ decodeURIComponent(redirectDestination),
10
+ "http://localhost"
11
+ );
12
+ redirectDestinationUrl.searchParams.delete(REDIRECT_SEARCH_PARAM);
13
+ const destinationPath = `${redirectDestinationUrl.pathname}${redirectDestinationUrl.search}${redirectDestinationUrl.hash}`;
14
+ const headers = new Headers();
15
+ previewCookieNames.forEach((name) => {
16
+ headers.append(
17
+ SET_COOKIE_HEADER,
18
+ serializeCookie(name, "", { ...cookieSettingOptions, expires: /* @__PURE__ */ new Date(0), maxAge: 0 })
19
+ );
20
+ });
21
+ return ApiResponse.redirect(destinationPath, { headers });
22
+ }
23
+ export {
24
+ redirectLiveHandler
25
+ };
26
+ //# sourceMappingURL=redirect-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/api-handler/handlers/redirect-live.ts"],"sourcesContent":["import { serialize as serializeCookie } from 'cookie'\nimport { type ApiRequest, ApiResponse, searchParams } from '../request-response'\nimport { SET_COOKIE_HEADER, cookieSettingOptions } from '../cookies'\n\nconst REDIRECT_SEARCH_PARAM = 'x-makeswift-redirect-live'\n\nexport async function redirectLiveHandler(\n req: ApiRequest,\n { previewCookieNames }: { previewCookieNames: string[] },\n): Promise<ApiResponse<null>> {\n const params = searchParams(req)\n const redirectDestination = params.get(REDIRECT_SEARCH_PARAM) ?? '/'\n\n const redirectDestinationUrl = new URL(\n decodeURIComponent(redirectDestination),\n 'http://localhost',\n )\n redirectDestinationUrl.searchParams.delete(REDIRECT_SEARCH_PARAM)\n\n const destinationPath = `${redirectDestinationUrl.pathname}${redirectDestinationUrl.search}${redirectDestinationUrl.hash}`\n\n const headers = new Headers()\n\n previewCookieNames.forEach(name => {\n headers.append(\n SET_COOKIE_HEADER,\n serializeCookie(name, '', { ...cookieSettingOptions, expires: new Date(0), maxAge: 0 }),\n )\n })\n\n return ApiResponse.redirect(destinationPath, { headers })\n}\n"],"mappings":"AAAA,SAAS,aAAa,uBAAuB;AAC7C,SAA0B,aAAa,oBAAoB;AAC3D,SAAS,mBAAmB,4BAA4B;AAExD,MAAM,wBAAwB;AAE9B,eAAsB,oBACpB,KACA,EAAE,mBAAmB,GACO;AAC5B,QAAM,SAAS,aAAa,GAAG;AAC/B,QAAM,sBAAsB,OAAO,IAAI,qBAAqB,KAAK;AAEjE,QAAM,yBAAyB,IAAI;AAAA,IACjC,mBAAmB,mBAAmB;AAAA,IACtC;AAAA,EACF;AACA,yBAAuB,aAAa,OAAO,qBAAqB;AAEhE,QAAM,kBAAkB,GAAG,uBAAuB,QAAQ,GAAG,uBAAuB,MAAM,GAAG,uBAAuB,IAAI;AAExH,QAAM,UAAU,IAAI,QAAQ;AAE5B,qBAAmB,QAAQ,UAAQ;AACjC,YAAQ;AAAA,MACN;AAAA,MACA,gBAAgB,MAAM,IAAI,EAAE,GAAG,sBAAsB,SAAS,oBAAI,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS,iBAAiB,EAAE,QAAQ,CAAC;AAC1D;","names":[]}
@@ -1,6 +1,6 @@
1
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";
2
+ import { ApiHandlerHeaders, deserializeSiteVersion } from "../api/site-version";
3
+ import { redirectLiveHandler } from "./handlers/redirect-live";
4
4
  import { elementTreeHandler } from "./handlers/element-tree";
5
5
  import { fontsHandler } from "./handlers/fonts";
6
6
  import { manifestHandler } from "./handlers/manifest";
@@ -21,7 +21,7 @@ function createApiHandler(apiKey, {
21
21
  client,
22
22
  manifest,
23
23
  revalidationHandler,
24
- draftCookieNames
24
+ previewCookieNames
25
25
  }) {
26
26
  if (typeof apiKey !== "string") {
27
27
  throw new Error(
@@ -37,10 +37,11 @@ function createApiHandler(apiKey, {
37
37
  return res;
38
38
  };
39
39
  async function apiRouteHandler(req, route) {
40
- const siteVersion = parseSiteVersion(req.headers.get(API_HANDLER_SITE_VERSION_HEADER));
40
+ const versionHeader = req.headers.get(ApiHandlerHeaders.SiteVersion);
41
+ const siteVersion = versionHeader != null ? deserializeSiteVersion(versionHeader) : null;
41
42
  const matches = (pattern) => matchPattern(pattern, { decode: decodeURIComponent })(route);
42
- if (matches("/clear-draft"))
43
- return clearDraftHandler(req, { draftCookieNames });
43
+ if (matches("/redirect-live"))
44
+ return redirectLiveHandler(req, { previewCookieNames });
44
45
  if (matches("/element-tree"))
45
46
  return elementTreeHandler(req, { runtime });
46
47
  if (matches("/fonts"))
@@ -1 +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":[]}
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 { ApiHandlerHeaders, deserializeSiteVersion } from '../api/site-version'\n\nimport { MakeswiftClient } from '../client'\nimport { ReactRuntime } from '../react'\n\nimport { redirectLiveHandler } from './handlers/redirect-live'\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 previewCookieNames: string[]\n}\n\ntype ApiHandlerConfig = ApiHandlerUserConfig & ApiHandlerInternalConfig\n\ntype ResponseType =\n | Awaited<\n | ReturnType<typeof redirectLiveHandler>\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 previewCookieNames,\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 versionHeader = req.headers.get(ApiHandlerHeaders.SiteVersion)\n\n const siteVersion = versionHeader != null ? deserializeSiteVersion(versionHeader) : null\n\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(route)\n\n if (matches('/redirect-live')) return redirectLiveHandler(req, { previewCookieNames })\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":[]}
@@ -9,6 +9,15 @@ const ApiResponse = {
9
9
  ...init,
10
10
  headers
11
11
  });
12
+ },
13
+ redirect(location, init) {
14
+ const headers = new Headers(init?.headers);
15
+ headers.set("Location", location.toString());
16
+ return new Response(null, {
17
+ status: 307,
18
+ ...init,
19
+ headers
20
+ });
12
21
  }
13
22
  };
14
23
  export {
@@ -1 +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":[]}
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\n redirect(location: string | URL, init?: ResponseInit): ApiResponse<null> {\n const headers = new Headers(init?.headers)\n headers.set('Location', location.toString())\n\n // Manually constructing a redirect response. We can’t use the\n // `Response.redirect` shorthand here, since it doesn’t allow passing custom\n // headers; see\n // https://community.cloudflare.com/t/make-redirect-with-additional-headers/249365\n return new Response(null, {\n status: 307,\n ...init,\n headers,\n }) as ApiResponse<null>\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;AAAA,EAEA,SAAS,UAAwB,MAAwC;AACvE,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,YAAQ,IAAI,YAAY,SAAS,SAAS,CAAC;AAM3C,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}