@makeswift/runtime 0.28.10-canary.0 → 0.28.10-canary.10

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 (290) hide show
  1. package/dist/cjs/api/graphql/documents/queries.js +0 -42
  2. package/dist/cjs/api/graphql/documents/queries.js.map +1 -1
  3. package/dist/cjs/api/graphql/generated/types.js.map +1 -1
  4. package/dist/cjs/api/graphql-api-client.js +1 -18
  5. package/dist/cjs/api/graphql-api-client.js.map +1 -1
  6. package/dist/cjs/api/makeswift-api-resources-client.js +2 -8
  7. package/dist/cjs/api/makeswift-api-resources-client.js.map +1 -1
  8. package/dist/cjs/api/rest-api-client.js +27 -1
  9. package/dist/cjs/api/rest-api-client.js.map +1 -1
  10. package/dist/cjs/api/table-record-client.js +47 -0
  11. package/dist/cjs/api/table-record-client.js.map +1 -0
  12. package/dist/cjs/api-handler/handlers/manifest.js +1 -1
  13. package/dist/cjs/api-handler/handlers/table-record.js +63 -0
  14. package/dist/cjs/api-handler/handlers/table-record.js.map +1 -0
  15. package/dist/cjs/api-handler/index.js +3 -0
  16. package/dist/cjs/api-handler/index.js.map +1 -1
  17. package/dist/cjs/client/index.js +17 -5
  18. package/dist/cjs/client/index.js.map +1 -1
  19. package/dist/cjs/components/builtin/Form/Form.js +2 -2
  20. package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
  21. package/dist/cjs/controls/index.js +10 -0
  22. package/dist/cjs/controls/index.js.map +1 -1
  23. package/dist/cjs/controls/rich-text/control.js.map +1 -1
  24. package/dist/cjs/next/components/tests/controls/page-control-prop-rendering.js +3 -18
  25. package/dist/cjs/next/components/tests/controls/page-control-prop-rendering.js.map +1 -1
  26. package/dist/cjs/react/server/index.js +47 -0
  27. package/dist/cjs/react/server/index.js.map +1 -0
  28. package/dist/cjs/runtimes/react/components/ElementData.js +41 -8
  29. package/dist/cjs/runtimes/react/components/ElementData.js.map +1 -1
  30. package/dist/cjs/runtimes/react/components/framework-context.js.map +1 -1
  31. package/dist/cjs/runtimes/react/hooks/use-editable-element-stylesheet-factory.js +58 -0
  32. package/dist/cjs/runtimes/react/hooks/use-editable-element-stylesheet-factory.js.map +1 -0
  33. package/dist/cjs/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  34. package/dist/cjs/runtimes/react/hooks/use-server-element-refresh.js +90 -0
  35. package/dist/cjs/runtimes/react/hooks/use-server-element-refresh.js.map +1 -0
  36. package/dist/cjs/runtimes/react/hooks/{use-graphql-api-client.js → use-table-record-client.js} +9 -9
  37. package/dist/cjs/runtimes/react/hooks/use-table-record-client.js.map +1 -0
  38. package/dist/cjs/runtimes/react/react-runtime-core.js +33 -4
  39. package/dist/cjs/runtimes/react/react-runtime-core.js.map +1 -1
  40. package/dist/cjs/runtimes/react/resource-resolver.js.map +1 -1
  41. package/dist/cjs/runtimes/react/runtime-core.js +0 -1
  42. package/dist/cjs/runtimes/react/runtime-core.js.map +1 -1
  43. package/dist/cjs/runtimes/react/server/collect-server-elements.js +74 -0
  44. package/dist/cjs/runtimes/react/server/collect-server-elements.js.map +1 -0
  45. package/dist/cjs/runtimes/react/server/components/editable-server-element.js +173 -0
  46. package/dist/cjs/runtimes/react/server/components/editable-server-element.js.map +1 -0
  47. package/dist/cjs/runtimes/react/server/components/element-data.js +80 -0
  48. package/dist/cjs/runtimes/react/server/components/element-data.js.map +1 -0
  49. package/dist/cjs/runtimes/react/server/components/element.js +77 -0
  50. package/dist/cjs/runtimes/react/server/components/element.js.map +1 -0
  51. package/dist/cjs/runtimes/react/server/components/makeswift-component.js +32 -0
  52. package/dist/cjs/runtimes/react/server/components/makeswift-component.js.map +1 -0
  53. package/dist/cjs/runtimes/react/server/components/renderer.js +53 -0
  54. package/dist/cjs/runtimes/react/server/components/renderer.js.map +1 -0
  55. package/dist/cjs/runtimes/react/server/components/server-elements-cache.js +77 -0
  56. package/dist/cjs/runtimes/react/server/components/server-elements-cache.js.map +1 -0
  57. package/dist/cjs/runtimes/react/server/components/slot.js +33 -0
  58. package/dist/cjs/runtimes/react/server/components/slot.js.map +1 -0
  59. package/dist/cjs/runtimes/react/server/components/snapshot-renderer.js +50 -0
  60. package/dist/cjs/runtimes/react/server/components/snapshot-renderer.js.map +1 -0
  61. package/dist/cjs/runtimes/react/server/css/client-css.js +112 -0
  62. package/dist/cjs/runtimes/react/server/css/client-css.js.map +1 -0
  63. package/dist/cjs/runtimes/react/server/css/css-runtime.js +102 -0
  64. package/dist/cjs/runtimes/react/server/css/css-runtime.js.map +1 -0
  65. package/dist/cjs/runtimes/react/server/css/server-css.js +71 -0
  66. package/dist/cjs/runtimes/react/server/css/server-css.js.map +1 -0
  67. package/dist/cjs/runtimes/react/server/index.js +54 -0
  68. package/dist/cjs/runtimes/react/server/index.js.map +1 -0
  69. package/dist/cjs/runtimes/react/server/injectable-props.js +17 -0
  70. package/dist/cjs/runtimes/react/server/injectable-props.js.map +1 -0
  71. package/dist/cjs/runtimes/react/server/render-context.js +53 -0
  72. package/dist/cjs/runtimes/react/server/render-context.js.map +1 -0
  73. package/dist/cjs/runtimes/react/server/render-element-payload.js +45 -0
  74. package/dist/cjs/runtimes/react/server/render-element-payload.js.map +1 -0
  75. package/dist/cjs/runtimes/react/server/resolve-props.js +58 -0
  76. package/dist/cjs/runtimes/react/server/resolve-props.js.map +1 -0
  77. package/dist/cjs/runtimes/react/server/resource-resolver.js +40 -0
  78. package/dist/cjs/runtimes/react/server/resource-resolver.js.map +1 -0
  79. package/dist/cjs/runtimes/react/server/update-api-resource-cache.js +32 -0
  80. package/dist/cjs/runtimes/react/server/update-api-resource-cache.js.map +1 -0
  81. package/dist/cjs/runtimes/react/testing/react-runtime.js +18 -2
  82. package/dist/cjs/runtimes/react/testing/react-runtime.js.map +1 -1
  83. package/dist/cjs/runtimes/react/testing/render-to-string.js +44 -0
  84. package/dist/cjs/runtimes/react/testing/render-to-string.js.map +1 -0
  85. package/dist/cjs/state/modules/components-meta.js.map +1 -1
  86. package/dist/cjs/unstable-framework-support/index.js +6 -0
  87. package/dist/cjs/unstable-framework-support/index.js.map +1 -1
  88. package/dist/cjs/utils/prop-by-path.js +35 -0
  89. package/dist/cjs/utils/prop-by-path.js.map +1 -0
  90. package/dist/cjs/utils/set.js +32 -0
  91. package/dist/cjs/utils/set.js.map +1 -0
  92. package/dist/esm/api/graphql/documents/queries.js +0 -39
  93. package/dist/esm/api/graphql/documents/queries.js.map +1 -1
  94. package/dist/esm/api/graphql/generated/types.js.map +1 -1
  95. package/dist/esm/api/graphql-api-client.js +2 -24
  96. package/dist/esm/api/graphql-api-client.js.map +1 -1
  97. package/dist/esm/api/makeswift-api-resources-client.js +2 -8
  98. package/dist/esm/api/makeswift-api-resources-client.js.map +1 -1
  99. package/dist/esm/api/rest-api-client.js +27 -1
  100. package/dist/esm/api/rest-api-client.js.map +1 -1
  101. package/dist/esm/api/table-record-client.js +23 -0
  102. package/dist/esm/api/table-record-client.js.map +1 -0
  103. package/dist/esm/api-handler/handlers/manifest.js +1 -1
  104. package/dist/esm/api-handler/handlers/table-record.js +29 -0
  105. package/dist/esm/api-handler/handlers/table-record.js.map +1 -0
  106. package/dist/esm/api-handler/index.js +3 -0
  107. package/dist/esm/api-handler/index.js.map +1 -1
  108. package/dist/esm/client/index.js +17 -5
  109. package/dist/esm/client/index.js.map +1 -1
  110. package/dist/esm/components/builtin/Form/Form.js +2 -2
  111. package/dist/esm/components/builtin/Form/Form.js.map +1 -1
  112. package/dist/esm/controls/index.js +10 -0
  113. package/dist/esm/controls/index.js.map +1 -1
  114. package/dist/esm/controls/rich-text/control.js.map +1 -1
  115. package/dist/esm/next/components/tests/controls/page-control-prop-rendering.js +1 -16
  116. package/dist/esm/next/components/tests/controls/page-control-prop-rendering.js.map +1 -1
  117. package/dist/esm/react/server/index.js +25 -0
  118. package/dist/esm/react/server/index.js.map +1 -0
  119. package/dist/esm/runtimes/react/components/ElementData.js +42 -9
  120. package/dist/esm/runtimes/react/components/ElementData.js.map +1 -1
  121. package/dist/esm/runtimes/react/components/framework-context.js.map +1 -1
  122. package/dist/esm/runtimes/react/hooks/use-editable-element-stylesheet-factory.js +34 -0
  123. package/dist/esm/runtimes/react/hooks/use-editable-element-stylesheet-factory.js.map +1 -0
  124. package/dist/esm/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  125. package/dist/esm/runtimes/react/hooks/use-server-element-refresh.js +66 -0
  126. package/dist/esm/runtimes/react/hooks/use-server-element-refresh.js.map +1 -0
  127. package/dist/esm/runtimes/react/hooks/use-table-record-client.js +11 -0
  128. package/dist/esm/runtimes/react/hooks/use-table-record-client.js.map +1 -0
  129. package/dist/esm/runtimes/react/react-runtime-core.js +33 -4
  130. package/dist/esm/runtimes/react/react-runtime-core.js.map +1 -1
  131. package/dist/esm/runtimes/react/resource-resolver.js.map +1 -1
  132. package/dist/esm/runtimes/react/runtime-core.js +0 -1
  133. package/dist/esm/runtimes/react/runtime-core.js.map +1 -1
  134. package/dist/esm/runtimes/react/server/collect-server-elements.js +50 -0
  135. package/dist/esm/runtimes/react/server/collect-server-elements.js.map +1 -0
  136. package/dist/esm/runtimes/react/server/components/editable-server-element.js +152 -0
  137. package/dist/esm/runtimes/react/server/components/editable-server-element.js.map +1 -0
  138. package/dist/esm/runtimes/react/server/components/element-data.js +64 -0
  139. package/dist/esm/runtimes/react/server/components/element-data.js.map +1 -0
  140. package/dist/esm/runtimes/react/server/components/element.js +56 -0
  141. package/dist/esm/runtimes/react/server/components/element.js.map +1 -0
  142. package/dist/esm/runtimes/react/server/components/makeswift-component.js +8 -0
  143. package/dist/esm/runtimes/react/server/components/makeswift-component.js.map +1 -0
  144. package/dist/esm/runtimes/react/server/components/renderer.js +28 -0
  145. package/dist/esm/runtimes/react/server/components/renderer.js.map +1 -0
  146. package/dist/esm/runtimes/react/server/components/server-elements-cache.js +51 -0
  147. package/dist/esm/runtimes/react/server/components/server-elements-cache.js.map +1 -0
  148. package/dist/esm/runtimes/react/server/components/slot.js +9 -0
  149. package/dist/esm/runtimes/react/server/components/slot.js.map +1 -0
  150. package/dist/esm/runtimes/react/server/components/snapshot-renderer.js +26 -0
  151. package/dist/esm/runtimes/react/server/components/snapshot-renderer.js.map +1 -0
  152. package/dist/esm/runtimes/react/server/css/client-css.js +87 -0
  153. package/dist/esm/runtimes/react/server/css/client-css.js.map +1 -0
  154. package/dist/esm/runtimes/react/server/css/css-runtime.js +77 -0
  155. package/dist/esm/runtimes/react/server/css/css-runtime.js.map +1 -0
  156. package/dist/esm/runtimes/react/server/css/server-css.js +45 -0
  157. package/dist/esm/runtimes/react/server/css/server-css.js.map +1 -0
  158. package/dist/esm/runtimes/react/server/index.js +25 -0
  159. package/dist/esm/runtimes/react/server/index.js.map +1 -0
  160. package/dist/esm/runtimes/react/server/injectable-props.js +1 -0
  161. package/dist/esm/runtimes/react/server/injectable-props.js.map +1 -0
  162. package/dist/esm/runtimes/react/server/render-context.js +26 -0
  163. package/dist/esm/runtimes/react/server/render-context.js.map +1 -0
  164. package/dist/esm/runtimes/react/server/render-element-payload.js +21 -0
  165. package/dist/esm/runtimes/react/server/render-element-payload.js.map +1 -0
  166. package/dist/esm/runtimes/react/server/resolve-props.js +34 -0
  167. package/dist/esm/runtimes/react/server/resolve-props.js.map +1 -0
  168. package/dist/esm/runtimes/react/server/resource-resolver.js +16 -0
  169. package/dist/esm/runtimes/react/server/resource-resolver.js.map +1 -0
  170. package/dist/esm/runtimes/react/server/update-api-resource-cache.js +8 -0
  171. package/dist/esm/runtimes/react/server/update-api-resource-cache.js.map +1 -0
  172. package/dist/esm/runtimes/react/testing/react-runtime.js +18 -2
  173. package/dist/esm/runtimes/react/testing/react-runtime.js.map +1 -1
  174. package/dist/esm/runtimes/react/testing/render-to-string.js +20 -0
  175. package/dist/esm/runtimes/react/testing/render-to-string.js.map +1 -0
  176. package/dist/esm/state/modules/components-meta.js.map +1 -1
  177. package/dist/esm/unstable-framework-support/index.js +4 -0
  178. package/dist/esm/unstable-framework-support/index.js.map +1 -1
  179. package/dist/esm/utils/prop-by-path.js +10 -0
  180. package/dist/esm/utils/prop-by-path.js.map +1 -0
  181. package/dist/esm/utils/set.js +7 -0
  182. package/dist/esm/utils/set.js.map +1 -0
  183. package/dist/types/api/graphql/documents/queries.d.ts +0 -3
  184. package/dist/types/api/graphql/documents/queries.d.ts.map +1 -1
  185. package/dist/types/api/graphql/generated/types.d.ts +0 -71
  186. package/dist/types/api/graphql/generated/types.d.ts.map +1 -1
  187. package/dist/types/api/graphql-api-client.d.ts +0 -4
  188. package/dist/types/api/graphql-api-client.d.ts.map +1 -1
  189. package/dist/types/api/makeswift-api-resources-client.d.ts +1 -3
  190. package/dist/types/api/makeswift-api-resources-client.d.ts.map +1 -1
  191. package/dist/types/api/rest-api-client.d.ts +3 -1
  192. package/dist/types/api/rest-api-client.d.ts.map +1 -1
  193. package/dist/types/api/table-record-client.d.ts +13 -0
  194. package/dist/types/api/table-record-client.d.ts.map +1 -0
  195. package/dist/types/api-handler/handlers/table-record.d.ts +6 -0
  196. package/dist/types/api-handler/handlers/table-record.d.ts.map +1 -0
  197. package/dist/types/api-handler/index.d.ts +2 -1
  198. package/dist/types/api-handler/index.d.ts.map +1 -1
  199. package/dist/types/client/index.d.ts +4 -3
  200. package/dist/types/client/index.d.ts.map +1 -1
  201. package/dist/types/controls/index.d.ts +1 -1
  202. package/dist/types/controls/index.d.ts.map +1 -1
  203. package/dist/types/next/components/tests/controls/page-control-prop-rendering.d.ts.map +1 -1
  204. package/dist/types/next/tests/server.api-handler-table-record.test.d.ts +2 -0
  205. package/dist/types/next/tests/server.api-handler-table-record.test.d.ts.map +1 -0
  206. package/dist/types/react/server/index.d.ts +2 -0
  207. package/dist/types/react/server/index.d.ts.map +1 -0
  208. package/dist/types/runtimes/react/components/ElementData.d.ts +2 -2
  209. package/dist/types/runtimes/react/components/ElementData.d.ts.map +1 -1
  210. package/dist/types/runtimes/react/components/framework-context.d.ts +6 -1
  211. package/dist/types/runtimes/react/components/framework-context.d.ts.map +1 -1
  212. package/dist/types/runtimes/react/hooks/__tests__/use-server-element-refresh.test.d.ts +3 -0
  213. package/dist/types/runtimes/react/hooks/__tests__/use-server-element-refresh.test.d.ts.map +1 -0
  214. package/dist/types/runtimes/react/hooks/use-editable-element-stylesheet-factory.d.ts +5 -0
  215. package/dist/types/runtimes/react/hooks/use-editable-element-stylesheet-factory.d.ts.map +1 -0
  216. package/dist/types/runtimes/react/hooks/use-resolved-props.d.ts +3 -0
  217. package/dist/types/runtimes/react/hooks/use-resolved-props.d.ts.map +1 -1
  218. package/dist/types/runtimes/react/hooks/use-server-element-refresh.d.ts +14 -0
  219. package/dist/types/runtimes/react/hooks/use-server-element-refresh.d.ts.map +1 -0
  220. package/dist/types/runtimes/react/hooks/use-table-record-client.d.ts +3 -0
  221. package/dist/types/runtimes/react/hooks/use-table-record-client.d.ts.map +1 -0
  222. package/dist/types/runtimes/react/react-runtime-core.d.ts +21 -6
  223. package/dist/types/runtimes/react/react-runtime-core.d.ts.map +1 -1
  224. package/dist/types/runtimes/react/resource-resolver.d.ts +1 -0
  225. package/dist/types/runtimes/react/resource-resolver.d.ts.map +1 -1
  226. package/dist/types/runtimes/react/runtime-core.d.ts.map +1 -1
  227. package/dist/types/runtimes/react/server/collect-server-elements.d.ts +19 -0
  228. package/dist/types/runtimes/react/server/collect-server-elements.d.ts.map +1 -0
  229. package/dist/types/runtimes/react/server/components/__tests__/editable-server-element.test.d.ts +3 -0
  230. package/dist/types/runtimes/react/server/components/__tests__/editable-server-element.test.d.ts.map +1 -0
  231. package/dist/types/runtimes/react/server/components/__tests__/element.test.d.ts +2 -0
  232. package/dist/types/runtimes/react/server/components/__tests__/element.test.d.ts.map +1 -0
  233. package/dist/types/runtimes/react/server/components/editable-server-element.d.ts +6 -0
  234. package/dist/types/runtimes/react/server/components/editable-server-element.d.ts.map +1 -0
  235. package/dist/types/runtimes/react/server/components/element-data.d.ts +10 -0
  236. package/dist/types/runtimes/react/server/components/element-data.d.ts.map +1 -0
  237. package/dist/types/runtimes/react/server/components/element.d.ts +9 -0
  238. package/dist/types/runtimes/react/server/components/element.d.ts.map +1 -0
  239. package/dist/types/runtimes/react/server/components/makeswift-component.d.ts +8 -0
  240. package/dist/types/runtimes/react/server/components/makeswift-component.d.ts.map +1 -0
  241. package/dist/types/runtimes/react/server/components/renderer.d.ts +23 -0
  242. package/dist/types/runtimes/react/server/components/renderer.d.ts.map +1 -0
  243. package/dist/types/runtimes/react/server/components/server-elements-cache.d.ts +26 -0
  244. package/dist/types/runtimes/react/server/components/server-elements-cache.d.ts.map +1 -0
  245. package/dist/types/runtimes/react/server/components/slot.d.ts +8 -0
  246. package/dist/types/runtimes/react/server/components/slot.d.ts.map +1 -0
  247. package/dist/types/runtimes/react/server/components/snapshot-renderer.d.ts +10 -0
  248. package/dist/types/runtimes/react/server/components/snapshot-renderer.d.ts.map +1 -0
  249. package/dist/types/runtimes/react/server/css/client-css.d.ts +10 -0
  250. package/dist/types/runtimes/react/server/css/client-css.d.ts.map +1 -0
  251. package/dist/types/runtimes/react/server/css/css-runtime.d.ts +16 -0
  252. package/dist/types/runtimes/react/server/css/css-runtime.d.ts.map +1 -0
  253. package/dist/types/runtimes/react/server/css/server-css.d.ts +14 -0
  254. package/dist/types/runtimes/react/server/css/server-css.d.ts.map +1 -0
  255. package/dist/types/runtimes/react/server/index.d.ts +9 -0
  256. package/dist/types/runtimes/react/server/index.d.ts.map +1 -0
  257. package/dist/types/runtimes/react/server/injectable-props.d.ts +5 -0
  258. package/dist/types/runtimes/react/server/injectable-props.d.ts.map +1 -0
  259. package/dist/types/runtimes/react/server/render-context.d.ts +29 -0
  260. package/dist/types/runtimes/react/server/render-context.d.ts.map +1 -0
  261. package/dist/types/runtimes/react/server/render-element-payload.d.ts +215 -0
  262. package/dist/types/runtimes/react/server/render-element-payload.d.ts.map +1 -0
  263. package/dist/types/runtimes/react/server/resolve-props.d.ts +7 -0
  264. package/dist/types/runtimes/react/server/resolve-props.d.ts.map +1 -0
  265. package/dist/types/runtimes/react/server/resource-resolver.d.ts +6 -0
  266. package/dist/types/runtimes/react/server/resource-resolver.d.ts.map +1 -0
  267. package/dist/types/runtimes/react/server/update-api-resource-cache.d.ts +4 -0
  268. package/dist/types/runtimes/react/server/update-api-resource-cache.d.ts.map +1 -0
  269. package/dist/types/runtimes/react/testing/react-runtime.d.ts +15 -4
  270. package/dist/types/runtimes/react/testing/react-runtime.d.ts.map +1 -1
  271. package/dist/types/runtimes/react/testing/render-to-string.d.ts +3 -0
  272. package/dist/types/runtimes/react/testing/render-to-string.d.ts.map +1 -0
  273. package/dist/types/slate/InlineModePlugin/index.d.ts +1 -1
  274. package/dist/types/state/modules/components-meta.d.ts +3 -0
  275. package/dist/types/state/modules/components-meta.d.ts.map +1 -1
  276. package/dist/types/unstable-framework-support/index.d.ts +2 -0
  277. package/dist/types/unstable-framework-support/index.d.ts.map +1 -1
  278. package/dist/types/utils/__tests__/prop-by-path.test.d.ts +2 -0
  279. package/dist/types/utils/__tests__/prop-by-path.test.d.ts.map +1 -0
  280. package/dist/types/utils/prop-by-path.d.ts +3 -0
  281. package/dist/types/utils/prop-by-path.d.ts.map +1 -0
  282. package/dist/types/utils/set.d.ts +3 -0
  283. package/dist/types/utils/set.d.ts.map +1 -0
  284. package/package.json +8 -3
  285. package/react/server/package.json +5 -0
  286. package/dist/cjs/runtimes/react/hooks/use-graphql-api-client.js.map +0 -1
  287. package/dist/esm/runtimes/react/hooks/use-graphql-api-client.js +0 -11
  288. package/dist/esm/runtimes/react/hooks/use-graphql-api-client.js.map +0 -1
  289. package/dist/types/runtimes/react/hooks/use-graphql-api-client.d.ts +0 -3
  290. package/dist/types/runtimes/react/hooks/use-graphql-api-client.d.ts.map +0 -1
@@ -5,8 +5,10 @@ import {
5
5
  } from "../../state/actions/internal/read-only-actions";
6
6
  import { ComponentIcon } from "../../state/modules/components-meta";
7
7
  import { RuntimeCore } from "./runtime-core";
8
- function validateComponentType(type, component) {
9
- const componentName = component?.name ?? "Component";
8
+ function validateComponentType({
9
+ type,
10
+ componentName
11
+ }) {
10
12
  if (typeof type !== "string" || type === "") {
11
13
  throw new Error(
12
14
  `${componentName}: A non-empty string \`type\` is required for component registration, got ${type}`
@@ -22,13 +24,32 @@ class ReactRuntimeCore extends RuntimeCore {
22
24
  description,
23
25
  builtinSuspense,
24
26
  unstable_migration,
27
+ server = false,
25
28
  props
26
29
  }) {
27
- validateComponentType(type, component);
30
+ const isServerComponent = server !== false;
31
+ const injectedProps = typeof server === "object" ? server.unstable_injectedProps : {};
32
+ validateComponentType(
33
+ // make sure we don't access `component?.name` and trigger loading of the server
34
+ // component unless we're running in the RSC environment
35
+ isServerComponent && !this.isRSCEnv() ? { type, componentName: label || "Unknown server component" } : {
36
+ type,
37
+ componentName: component?.name || label || "Unknown component"
38
+ }
39
+ );
28
40
  const unregisterComponent = this.protoStore.dispatch(
29
41
  registerComponentEffect(
30
42
  type,
31
- { label, icon, hidden, description, builtinSuspense, unstable_migration },
43
+ {
44
+ label,
45
+ icon,
46
+ hidden,
47
+ description,
48
+ builtinSuspense,
49
+ unstable_migration,
50
+ server: isServerComponent,
51
+ injectedProps
52
+ },
32
53
  props ?? {}
33
54
  )
34
55
  );
@@ -37,6 +58,11 @@ class ReactRuntimeCore extends RuntimeCore {
37
58
  "builtinSuspense is ignored in React >= 19.2; components are always wrapped in <Activity>."
38
59
  );
39
60
  }
61
+ if (isServerComponent && !this.isRSCEnv()) {
62
+ return () => {
63
+ unregisterComponent();
64
+ };
65
+ }
40
66
  const unregisterReactComponent = this.protoStore.dispatch(
41
67
  registerReactComponentEffect(type, component)
42
68
  );
@@ -45,6 +71,9 @@ class ReactRuntimeCore extends RuntimeCore {
45
71
  unregisterReactComponent();
46
72
  };
47
73
  }
74
+ isRSCEnv() {
75
+ return false;
76
+ }
48
77
  }
49
78
  export {
50
79
  ReactRuntimeCore
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtimes/react/react-runtime-core.ts"],"sourcesContent":["import { ControlDefinition as UnifiedControlDefinition } from '@makeswift/controls'\n\nimport { type LegacyDescriptor, type DescriptorValueType } from '../../prop-controllers/descriptors'\n\nimport { supportsActivity } from './components/activity-with-fallback'\n\nimport {\n registerComponentEffect,\n registerReactComponentEffect,\n} from '../../state/actions/internal/read-only-actions'\n\nimport { ComponentIcon } from '../../state/modules/components-meta'\nimport type { ComponentType } from '../../state/read-only-state'\n\nimport { RuntimeCore } from './runtime-core'\n\nfunction validateComponentType(type: string, component?: ComponentType): void {\n const componentName = component?.name ?? 'Component'\n if (typeof type !== 'string' || type === '') {\n throw new Error(\n `${componentName}: A non-empty string \\`type\\` is required for component registration, got ${type}`,\n )\n }\n}\n\nexport class ReactRuntimeCore extends RuntimeCore {\n registerComponent<\n ControlDef extends UnifiedControlDefinition,\n P extends Record<string, LegacyDescriptor | ControlDef>,\n C extends ComponentType<{ [K in keyof P]: DescriptorValueType<P[K]> }>,\n >(\n component: C,\n {\n type,\n label,\n icon = ComponentIcon.Cube,\n hidden = false,\n description,\n builtinSuspense,\n unstable_migration,\n props,\n }: {\n type: string\n label: string\n icon?: ComponentIcon\n hidden?: boolean\n description?: string\n /**\n * In React <= 19.1, controls the default `<Suspense>` boundary.\n * Ignored in React >= 19.2; components are always wrapped in `<Activity>`.\n * Defaults to `true`.\n */\n builtinSuspense?: boolean\n /**\n * Marks this registration as superseded by `replacementType`. When\n * `replacementType` differs from `type`, the builder offers a way to\n * update existing instances.\n */\n unstable_migration?: { replacementType: string }\n props?: P\n },\n ): () => void {\n validateComponentType(type, component as unknown as ComponentType)\n\n const unregisterComponent = this.protoStore.dispatch(\n registerComponentEffect(\n type,\n { label, icon, hidden, description, builtinSuspense, unstable_migration },\n props ?? {},\n ),\n )\n\n if (supportsActivity() && builtinSuspense !== undefined) {\n console.warn(\n 'builtinSuspense is ignored in React >= 19.2; components are always wrapped in <Activity>.',\n )\n }\n\n const unregisterReactComponent = this.protoStore.dispatch(\n registerReactComponentEffect(type, component as unknown as ComponentType),\n )\n\n return () => {\n unregisterComponent()\n unregisterReactComponent()\n }\n }\n}\n"],"mappings":"AAIA,SAAS,wBAAwB;AAEjC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB;AAG9B,SAAS,mBAAmB;AAE5B,SAAS,sBAAsB,MAAc,WAAiC;AAC5E,QAAM,gBAAgB,WAAW,QAAQ;AACzC,MAAI,OAAO,SAAS,YAAY,SAAS,IAAI;AAC3C,UAAM,IAAI;AAAA,MACR,GAAG,aAAa,6EAA6E,IAAI;AAAA,IACnG;AAAA,EACF;AACF;AAEO,MAAM,yBAAyB,YAAY;AAAA,EAChD,kBAKE,WACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,cAAc;AAAA,IACrB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAoBY;AACZ,0BAAsB,MAAM,SAAqC;AAEjE,UAAM,sBAAsB,KAAK,WAAW;AAAA,MAC1C;AAAA,QACE;AAAA,QACA,EAAE,OAAO,MAAM,QAAQ,aAAa,iBAAiB,mBAAmB;AAAA,QACxE,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,iBAAiB,KAAK,oBAAoB,QAAW;AACvD,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,2BAA2B,KAAK,WAAW;AAAA,MAC/C,6BAA6B,MAAM,SAAqC;AAAA,IAC1E;AAEA,WAAO,MAAM;AACX,0BAAoB;AACpB,+BAAyB;AAAA,IAC3B;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtimes/react/react-runtime-core.ts"],"sourcesContent":["import { type Component, type PropsWithoutRef, type ReactNode, type RefAttributes } from 'react'\n\nimport {\n ControlDefinition as UnifiedControlDefinition,\n type PropsWithValidContextUsage,\n} from '@makeswift/controls'\n\nimport { type LegacyDescriptor, type DescriptorValueType } from '../../prop-controllers/descriptors'\n\nimport { supportsActivity } from './components/activity-with-fallback'\n\nimport {\n registerComponentEffect,\n registerReactComponentEffect,\n} from '../../state/actions/internal/read-only-actions'\n\nimport { ComponentIcon } from '../../state/modules/components-meta'\nimport type { ComponentType } from '../../state/read-only-state'\n\nimport { type InjectableProps } from './server/injectable-props'\n\nimport { RuntimeCore } from './runtime-core'\n\nfunction validateComponentType({\n type,\n componentName,\n}: {\n type: string\n componentName: string\n}): void {\n if (typeof type !== 'string' || type === '') {\n throw new Error(\n `${componentName}: A non-empty string \\`type\\` is required for component registration, got ${type}`,\n )\n }\n}\n\ntype InjectedPropsConfig = Record<string, keyof InjectableProps>\n\ntype ServerComponentConfig<I extends InjectedPropsConfig> =\n | boolean\n | {\n unstable_injectedProps: I\n }\n\ntype InjectedProps<I extends InjectedPropsConfig> = {\n [K in keyof I]: InjectableProps[I[K]]\n}\n\ntype ResolvedProps<P extends Record<string, LegacyDescriptor | UnifiedControlDefinition>> = {\n [K in keyof P]: DescriptorValueType<P[K]>\n}\n\ntype RegisteredComponentType<\n P extends Record<string, LegacyDescriptor | UnifiedControlDefinition>,\n I extends InjectedPropsConfig,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T = any,\n> =\n | {\n new (\n props: PropsWithoutRef<ResolvedProps<P>> & InjectedProps<I> & RefAttributes<T>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context?: any,\n ): Component<ResolvedProps<P> & InjectedProps<I>>\n }\n | ((\n props: PropsWithoutRef<ResolvedProps<P>> & InjectedProps<I> & RefAttributes<T>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context?: any,\n ) => ReactNode)\n\nexport class ReactRuntimeCore extends RuntimeCore {\n registerComponent<\n ControlDef extends UnifiedControlDefinition,\n P extends Record<string, LegacyDescriptor | ControlDef>,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n const I extends InjectedPropsConfig = {},\n C extends RegisteredComponentType<P, I> = RegisteredComponentType<P, I>,\n >(\n component: C,\n {\n type,\n label,\n icon = ComponentIcon.Cube,\n hidden = false,\n description,\n builtinSuspense,\n unstable_migration,\n server = false,\n props,\n }: {\n type: string\n label: string\n icon?: ComponentIcon\n hidden?: boolean\n description?: string\n /**\n * In React <= 19.1, controls the default `<Suspense>` boundary.\n * Ignored in React >= 19.2; components are always wrapped in `<Activity>`.\n * Defaults to `true`.\n */\n builtinSuspense?: boolean\n /**\n * Marks this registration as superseded by `replacementType`. When\n * `replacementType` differs from `type`, the builder offers a way to\n * update existing instances.\n */\n unstable_migration?: { replacementType: string }\n server?: ServerComponentConfig<I>\n props?: P & PropsWithValidContextUsage<P>\n },\n ): () => void {\n const isServerComponent = server !== false\n const injectedProps = typeof server === 'object' ? server.unstable_injectedProps : {}\n\n validateComponentType(\n // make sure we don't access `component?.name` and trigger loading of the server\n // component unless we're running in the RSC environment\n isServerComponent && !this.isRSCEnv()\n ? { type, componentName: label || 'Unknown server component' }\n : {\n type,\n componentName: component?.name || label || 'Unknown component',\n },\n )\n\n const unregisterComponent = this.protoStore.dispatch(\n registerComponentEffect(\n type,\n {\n label,\n icon,\n hidden,\n description,\n builtinSuspense,\n unstable_migration,\n server: isServerComponent,\n injectedProps,\n },\n props ?? {},\n ),\n )\n\n if (supportsActivity() && builtinSuspense !== undefined) {\n console.warn(\n 'builtinSuspense is ignored in React >= 19.2; components are always wrapped in <Activity>.',\n )\n }\n\n if (isServerComponent && !this.isRSCEnv()) {\n // we can't load server components code outside of the RSC environment, but we also\n // don't need to: if everything is set up correctly, React has already rendered and\n // streamed the corresponding React elements to the client for us -- see\n // `ServerElementsCache` and `ElementDataServer`\n return () => {\n unregisterComponent()\n }\n }\n\n const unregisterReactComponent = this.protoStore.dispatch(\n registerReactComponentEffect(type, component as unknown as ComponentType),\n )\n\n return () => {\n unregisterComponent()\n unregisterReactComponent()\n }\n }\n\n protected isRSCEnv() {\n return false\n }\n}\n"],"mappings":"AASA,SAAS,wBAAwB;AAEjC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB;AAK9B,SAAS,mBAAmB;AAE5B,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGS;AACP,MAAI,OAAO,SAAS,YAAY,SAAS,IAAI;AAC3C,UAAM,IAAI;AAAA,MACR,GAAG,aAAa,6EAA6E,IAAI;AAAA,IACnG;AAAA,EACF;AACF;AAqCO,MAAM,yBAAyB,YAAY;AAAA,EAChD,kBAOE,WACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,cAAc;AAAA,IACrB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,GAqBY;AACZ,UAAM,oBAAoB,WAAW;AACrC,UAAM,gBAAgB,OAAO,WAAW,WAAW,OAAO,yBAAyB,CAAC;AAEpF;AAAA;AAAA;AAAA,MAGE,qBAAqB,CAAC,KAAK,SAAS,IAChC,EAAE,MAAM,eAAe,SAAS,2BAA2B,IAC3D;AAAA,QACE;AAAA,QACA,eAAe,WAAW,QAAQ,SAAS;AAAA,MAC7C;AAAA,IACN;AAEA,UAAM,sBAAsB,KAAK,WAAW;AAAA,MAC1C;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,QACA,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,iBAAiB,KAAK,oBAAoB,QAAW;AACvD,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,QAAI,qBAAqB,CAAC,KAAK,SAAS,GAAG;AAKzC,aAAO,MAAM;AACX,4BAAoB;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,2BAA2B,KAAK,WAAW;AAAA,MAC/C,6BAA6B,MAAM,SAAqC;AAAA,IAC1E;AAEA,WAAO,MAAM;AACX,0BAAoB;AACpB,+BAAyB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEU,WAAW;AACnB,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtimes/react/resource-resolver.ts"],"sourcesContent":["import { type ResourceResolver } from '@makeswift/controls'\n\nimport { getElementId } from '../../state/read-only-state'\nimport { ApiResourcesClient } from '../../api/api-resources-client'\nimport { Store } from '../../state/store'\n\nexport const createResourceResolver = ({\n store,\n apiClient,\n documentKey,\n locale,\n}: {\n store: Store\n apiClient: ApiResourcesClient\n documentKey: string | null\n locale: string | null\n}): ResourceResolver => ({\n resolveSwatch: swatchId => apiClient.resolveSwatch(swatchId),\n resolveFile: fileId => apiClient.resolveFile(fileId),\n resolveTypography: typographyId => apiClient.resolveTypography(typographyId),\n resolvePagePathnameSlice: pageId => apiClient.resolvePagePathnameSlice({ pageId, locale }),\n resolveElementId: elementKey => {\n const read = () =>\n documentKey == null ? null : getElementId(store.getState(), documentKey, elementKey)\n\n let lastValue: string | null = null\n return {\n name: `element-id:${documentKey}:${elementKey}`,\n readStable: () => (lastValue = read()),\n subscribe: (onUpdate: () => void) =>\n store.subscribe(() => {\n if (read() !== lastValue) onUpdate()\n }),\n }\n },\n})\n"],"mappings":"AAEA,SAAS,oBAAoB;AAItB,MAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAKyB;AAAA,EACvB,eAAe,cAAY,UAAU,cAAc,QAAQ;AAAA,EAC3D,aAAa,YAAU,UAAU,YAAY,MAAM;AAAA,EACnD,mBAAmB,kBAAgB,UAAU,kBAAkB,YAAY;AAAA,EAC3E,0BAA0B,YAAU,UAAU,yBAAyB,EAAE,QAAQ,OAAO,CAAC;AAAA,EACzF,kBAAkB,gBAAc;AAC9B,UAAM,OAAO,MACX,eAAe,OAAO,OAAO,aAAa,MAAM,SAAS,GAAG,aAAa,UAAU;AAErF,QAAI,YAA2B;AAC/B,WAAO;AAAA,MACL,MAAM,cAAc,WAAW,IAAI,UAAU;AAAA,MAC7C,YAAY,MAAO,YAAY,KAAK;AAAA,MACpC,WAAW,CAAC,aACV,MAAM,UAAU,MAAM;AACpB,YAAI,KAAK,MAAM;AAAW,mBAAS;AAAA,MACrC,CAAC;AAAA,IACL;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtimes/react/resource-resolver.ts"],"sourcesContent":["import { type ResourceResolver } from '@makeswift/controls'\n\nimport { getElementId } from '../../state/read-only-state'\nimport { ApiResourcesClient } from '../../api/api-resources-client'\nimport { Store } from '../../state/store'\n\nexport { type ResourceResolver } from '@makeswift/controls'\n\nexport const createResourceResolver = ({\n store,\n apiClient,\n documentKey,\n locale,\n}: {\n store: Store\n apiClient: ApiResourcesClient\n documentKey: string | null\n locale: string | null\n}): ResourceResolver => ({\n resolveSwatch: swatchId => apiClient.resolveSwatch(swatchId),\n resolveFile: fileId => apiClient.resolveFile(fileId),\n resolveTypography: typographyId => apiClient.resolveTypography(typographyId),\n resolvePagePathnameSlice: pageId => apiClient.resolvePagePathnameSlice({ pageId, locale }),\n resolveElementId: elementKey => {\n const read = () =>\n documentKey == null ? null : getElementId(store.getState(), documentKey, elementKey)\n\n let lastValue: string | null = null\n return {\n name: `element-id:${documentKey}:${elementKey}`,\n readStable: () => (lastValue = read()),\n subscribe: (onUpdate: () => void) =>\n store.subscribe(() => {\n if (read() !== lastValue) onUpdate()\n }),\n }\n },\n})\n"],"mappings":"AAEA,SAAS,oBAAoB;AAMtB,MAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAKyB;AAAA,EACvB,eAAe,cAAY,UAAU,cAAc,QAAQ;AAAA,EAC3D,aAAa,YAAU,UAAU,YAAY,MAAM;AAAA,EACnD,mBAAmB,kBAAgB,UAAU,kBAAkB,YAAY;AAAA,EAC3E,0BAA0B,YAAU,UAAU,yBAAyB,EAAE,QAAQ,OAAO,CAAC;AAAA,EACzF,kBAAkB,gBAAc;AAC9B,UAAM,OAAO,MACX,eAAe,OAAO,OAAO,aAAa,MAAM,SAAS,GAAG,aAAa,UAAU;AAErF,QAAI,YAA2B;AAC/B,WAAO;AAAA,MACL,MAAM,cAAc,WAAW,IAAI,UAAU;AAAA,MAC7C,YAAY,MAAO,YAAY,KAAK;AAAA,MACpC,WAAW,CAAC,aACV,MAAM,UAAU,MAAM;AACpB,YAAI,KAAK,MAAM;AAAW,mBAAS;AAAA,MACrC,CAAC;AAAA,IACL;AAAA,EACF;AACF;","names":[]}
@@ -98,7 +98,6 @@ class RuntimeCore {
98
98
  fetch: this.fetch,
99
99
  apiKey: this.apiKey,
100
100
  apiOrigin: this.apiOrigin,
101
- graphqlApiEndpoint: this.graphqlApiEndpoint,
102
101
  preloadedState
103
102
  });
104
103
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtimes/react/runtime-core.ts"],"sourcesContent":["import { type SerializableReplacementContext } from '@makeswift/controls'\n\nimport { ApiResourcesClient } from '../../api/api-resources-client'\nimport { HostApiResourcesClient } from '../../api/host-api-resources-client'\nimport { MakeswiftApiResourcesClient } from '../../api/makeswift-api-resources-client'\nimport { type HttpFetch } from '../../api/types'\nimport { type SiteVersion } from '../../api/site-version'\n\nimport {\n type Breakpoints,\n type BreakpointsInput,\n parseBreakpointsInput,\n} from '../../state/modules/breakpoints'\n\nimport { copyElementTree } from '../../state/ops/copy-element-tree'\n\nimport { getBreakpoints, type Element, type ElementData } from '../../state/read-only-state'\nimport {\n configureProtoStore,\n configureReadWriteStore,\n type ProtoStore,\n type Store,\n} from '../../state/store'\n\nimport { RefCountedMap } from '../../utils/ref-counted-map'\nimport { isServer } from '../../utils/is-server'\n\nexport type StoreKey = {\n siteVersion: SiteVersion | null\n locale: string | undefined\n}\n\nconst VERSION_TAG_LIVE = 'ref:live'\n\nexport class RuntimeCore {\n // The unowned entry TTL affects performance, not correctness. The TTL controls how long an unretained store stays\n // in the map. If an entry expires and is removed from the map before React commits, the store remains retained\n // via `<StoreContext.Provider>`. The only impact is that future lookups will create a new store instance instead of\n // reusing the existing one, reducing cache efficiency.\n private readonly activeStores = new RefCountedMap<string | null, Store>({\n unownedEntryTtlMs: 1000,\n // Checking on retain/release is sufficient on the client, and we don't need to check on get on the server\n // as the only scenario in which we add the store to the map is when the runtime is already bound to the\n // requested site version, which should be the only site version for which the store is requested\n ttlCheck: RefCountedMap.TTLCheck.ON_RETAIN | RefCountedMap.TTLCheck.ON_RELEASE,\n })\n\n private readonly apiKey: string | undefined\n\n readonly protoStore: ProtoStore\n readonly appOrigin: string\n readonly apiOrigin: string\n readonly requestKey: StoreKey | undefined\n readonly fetch: HttpFetch\n\n constructor({\n appOrigin = 'https://app.makeswift.com',\n apiOrigin = 'https://api.makeswift.com',\n apiKey,\n breakpoints,\n requestKey,\n fetch,\n }: {\n appOrigin?: string\n apiOrigin?: string\n apiKey?: string\n breakpoints?: BreakpointsInput\n requestKey?: StoreKey\n fetch: HttpFetch\n }) {\n this.appOrigin = validateOrigin(appOrigin, 'appOrigin')\n this.apiOrigin = validateOrigin(apiOrigin, 'apiOrigin')\n this.apiKey = apiKey\n this.requestKey = requestKey\n this.fetch = fetch\n\n this.protoStore = configureProtoStore({\n name: 'Runtime proto-store',\n breakpoints: breakpoints ? parseBreakpointsInput(breakpoints) : undefined,\n })\n }\n\n getOrCreateStore({ siteVersion, locale }: StoreKey): Store {\n const key = storeCacheKey({ siteVersion, locale })\n\n const createStore = () => {\n // API resources client includes an in-memory cache of the site's resources and thus also has to be versioned\n const apiResourcesClient = this.createApiResourcesClient({ siteVersion, locale })\n\n // TODO: we need to decouple editability from the site version; specifically, previewing\n // a draft version of the site should not lead to switching to the read-write state\n const isReadOnly = siteVersion == null\n\n return configureReadWriteStore({\n name: `Runtime read-write store (site version: ${key})`,\n appOrigin: this.appOrigin,\n apiResourcesClient,\n preloadedState: { ...this.protoStore.getState(), siteVersion, isReadOnly, locale },\n })\n }\n\n // On the server, stores are ephemeral by default so SSR does not retain them in a long-lived runtime.\n // The exception is a runtime that is already bound to the requested site version & locale, where we\n // can safely reuse the store across multiple root regions and benefit from the host API client's\n // in-memory cache.\n //\n // On the client, stores are reference-counted by site version so multiple root regions can share a store\n // instance, which preserves the pre-v0.17 per-site-version store behavior without requiring a separate\n // runtime per root.\n const usePersistentStore = this.shouldUsePersistentStore(key)\n return usePersistentStore ? this.activeStores.getOrCreate(key, createStore) : createStore()\n }\n\n retainStore({ siteVersion, locale }: StoreKey, store: Store): void {\n const key = storeCacheKey({ siteVersion, locale })\n\n if (!this.shouldUsePersistentStore(key)) {\n console.error('RuntimeCore: attempt to retain an ephemeral store', { key })\n return\n }\n\n if (this.activeStores.retain(key, store)) {\n store.startBreakpointWatch()\n }\n }\n\n releaseStore({ siteVersion, locale }: StoreKey, store: Store): void {\n const key = storeCacheKey({ siteVersion, locale })\n\n if (!this.shouldUsePersistentStore(key)) {\n console.error('RuntimeCore: attempt to release an ephemeral store', { key })\n return\n }\n\n if (this.activeStores.release(key, store)) {\n store.stopBreakpointWatch()\n }\n }\n\n copyElementTree(\n elementTree: ElementData,\n replacementContext: SerializableReplacementContext,\n ): Element {\n return copyElementTree(this.protoStore.getState(), elementTree, replacementContext)\n }\n\n getBreakpoints(): Breakpoints {\n return getBreakpoints(this.protoStore.getState())\n }\n\n get graphqlApiEndpoint(): string {\n return new URL('graphql', this.apiOrigin).href\n }\n\n private createApiResourcesClient(preloadedState: {\n siteVersion: SiteVersion | null\n locale: string | undefined\n }): ApiResourcesClient {\n if (isServer() && this.apiKey) {\n return new MakeswiftApiResourcesClient({\n fetch: this.fetch,\n apiKey: this.apiKey,\n apiOrigin: this.apiOrigin,\n graphqlApiEndpoint: this.graphqlApiEndpoint,\n preloadedState,\n })\n }\n\n return new HostApiResourcesClient({\n fetch: this.fetch,\n preloadedState,\n })\n }\n\n private shouldUsePersistentStore(key: string): boolean {\n // don't persist stores on the server unless the runtime instance is bound to a request\n // and the requested store matches the request's site version and locale\n return !isServer() || (this.requestKey !== undefined && storeCacheKey(this.requestKey) === key)\n }\n}\n\nconst storeCacheKey = ({ siteVersion, locale }: StoreKey): string =>\n `${siteVersionTag(siteVersion)}/${locale ?? 'default'}`\n\nconst siteVersionTag = (siteVersion: SiteVersion | null): string =>\n siteVersion?.version ?? VERSION_TAG_LIVE\n\nfunction validateOrigin(url: string, name: string): string {\n try {\n return new URL(url).origin\n } catch {\n throw new Error(`The Makeswift runtime received an invalid \\`${name}\\` parameter: \"${url}\".`)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtimes/react/runtime-core.ts"],"sourcesContent":["import { type SerializableReplacementContext } from '@makeswift/controls'\n\nimport { ApiResourcesClient } from '../../api/api-resources-client'\nimport { HostApiResourcesClient } from '../../api/host-api-resources-client'\nimport { MakeswiftApiResourcesClient } from '../../api/makeswift-api-resources-client'\nimport { type HttpFetch } from '../../api/types'\nimport { type SiteVersion } from '../../api/site-version'\n\nimport {\n type Breakpoints,\n type BreakpointsInput,\n parseBreakpointsInput,\n} from '../../state/modules/breakpoints'\n\nimport { copyElementTree } from '../../state/ops/copy-element-tree'\n\nimport { getBreakpoints, type Element, type ElementData } from '../../state/read-only-state'\nimport {\n configureProtoStore,\n configureReadWriteStore,\n type ProtoStore,\n type Store,\n} from '../../state/store'\n\nimport { RefCountedMap } from '../../utils/ref-counted-map'\nimport { isServer } from '../../utils/is-server'\n\nexport type StoreKey = {\n siteVersion: SiteVersion | null\n locale: string | undefined\n}\n\nconst VERSION_TAG_LIVE = 'ref:live'\n\nexport class RuntimeCore {\n // The unowned entry TTL affects performance, not correctness. The TTL controls how long an unretained store stays\n // in the map. If an entry expires and is removed from the map before React commits, the store remains retained\n // via `<StoreContext.Provider>`. The only impact is that future lookups will create a new store instance instead of\n // reusing the existing one, reducing cache efficiency.\n private readonly activeStores = new RefCountedMap<string | null, Store>({\n unownedEntryTtlMs: 1000,\n // Checking on retain/release is sufficient on the client, and we don't need to check on get on the server\n // as the only scenario in which we add the store to the map is when the runtime is already bound to the\n // requested site version, which should be the only site version for which the store is requested\n ttlCheck: RefCountedMap.TTLCheck.ON_RETAIN | RefCountedMap.TTLCheck.ON_RELEASE,\n })\n\n private readonly apiKey: string | undefined\n\n readonly protoStore: ProtoStore\n readonly appOrigin: string\n readonly apiOrigin: string\n readonly requestKey: StoreKey | undefined\n readonly fetch: HttpFetch\n\n constructor({\n appOrigin = 'https://app.makeswift.com',\n apiOrigin = 'https://api.makeswift.com',\n apiKey,\n breakpoints,\n requestKey,\n fetch,\n }: {\n appOrigin?: string\n apiOrigin?: string\n apiKey?: string\n breakpoints?: BreakpointsInput\n requestKey?: StoreKey\n fetch: HttpFetch\n }) {\n this.appOrigin = validateOrigin(appOrigin, 'appOrigin')\n this.apiOrigin = validateOrigin(apiOrigin, 'apiOrigin')\n this.apiKey = apiKey\n this.requestKey = requestKey\n this.fetch = fetch\n\n this.protoStore = configureProtoStore({\n name: 'Runtime proto-store',\n breakpoints: breakpoints ? parseBreakpointsInput(breakpoints) : undefined,\n })\n }\n\n getOrCreateStore({ siteVersion, locale }: StoreKey): Store {\n const key = storeCacheKey({ siteVersion, locale })\n\n const createStore = () => {\n // API resources client includes an in-memory cache of the site's resources and thus also has to be versioned\n const apiResourcesClient = this.createApiResourcesClient({ siteVersion, locale })\n\n // TODO: we need to decouple editability from the site version; specifically, previewing\n // a draft version of the site should not lead to switching to the read-write state\n const isReadOnly = siteVersion == null\n\n return configureReadWriteStore({\n name: `Runtime read-write store (site version: ${key})`,\n appOrigin: this.appOrigin,\n apiResourcesClient,\n preloadedState: { ...this.protoStore.getState(), siteVersion, isReadOnly, locale },\n })\n }\n\n // On the server, stores are ephemeral by default so SSR does not retain them in a long-lived runtime.\n // The exception is a runtime that is already bound to the requested site version & locale, where we\n // can safely reuse the store across multiple root regions and benefit from the host API client's\n // in-memory cache.\n //\n // On the client, stores are reference-counted by site version so multiple root regions can share a store\n // instance, which preserves the pre-v0.17 per-site-version store behavior without requiring a separate\n // runtime per root.\n const usePersistentStore = this.shouldUsePersistentStore(key)\n return usePersistentStore ? this.activeStores.getOrCreate(key, createStore) : createStore()\n }\n\n retainStore({ siteVersion, locale }: StoreKey, store: Store): void {\n const key = storeCacheKey({ siteVersion, locale })\n\n if (!this.shouldUsePersistentStore(key)) {\n console.error('RuntimeCore: attempt to retain an ephemeral store', { key })\n return\n }\n\n if (this.activeStores.retain(key, store)) {\n store.startBreakpointWatch()\n }\n }\n\n releaseStore({ siteVersion, locale }: StoreKey, store: Store): void {\n const key = storeCacheKey({ siteVersion, locale })\n\n if (!this.shouldUsePersistentStore(key)) {\n console.error('RuntimeCore: attempt to release an ephemeral store', { key })\n return\n }\n\n if (this.activeStores.release(key, store)) {\n store.stopBreakpointWatch()\n }\n }\n\n copyElementTree(\n elementTree: ElementData,\n replacementContext: SerializableReplacementContext,\n ): Element {\n return copyElementTree(this.protoStore.getState(), elementTree, replacementContext)\n }\n\n getBreakpoints(): Breakpoints {\n return getBreakpoints(this.protoStore.getState())\n }\n\n get graphqlApiEndpoint(): string {\n return new URL('graphql', this.apiOrigin).href\n }\n\n private createApiResourcesClient(preloadedState: {\n siteVersion: SiteVersion | null\n locale: string | undefined\n }): ApiResourcesClient {\n if (isServer() && this.apiKey) {\n return new MakeswiftApiResourcesClient({\n fetch: this.fetch,\n apiKey: this.apiKey,\n apiOrigin: this.apiOrigin,\n preloadedState,\n })\n }\n\n return new HostApiResourcesClient({\n fetch: this.fetch,\n preloadedState,\n })\n }\n\n private shouldUsePersistentStore(key: string): boolean {\n // don't persist stores on the server unless the runtime instance is bound to a request\n // and the requested store matches the request's site version and locale\n return !isServer() || (this.requestKey !== undefined && storeCacheKey(this.requestKey) === key)\n }\n}\n\nconst storeCacheKey = ({ siteVersion, locale }: StoreKey): string =>\n `${siteVersionTag(siteVersion)}/${locale ?? 'default'}`\n\nconst siteVersionTag = (siteVersion: SiteVersion | null): string =>\n siteVersion?.version ?? VERSION_TAG_LIVE\n\nfunction validateOrigin(url: string, name: string): string {\n try {\n return new URL(url).origin\n } catch {\n throw new Error(`The Makeswift runtime received an invalid \\`${name}\\` parameter: \"${url}\".`)\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,50 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { isElementReference } from "@makeswift/controls";
3
+ import { getComponentsMeta } from "../../../state/modules/components-meta";
4
+ import { traverseElementTree } from "../../../state/modules/element-trees";
5
+ import { registerDocument } from "../../../state/shared-api";
6
+ import { getPropControllerDescriptors } from "../../../state/read-only-state";
7
+ import { ServerElement } from "./components/element";
8
+ import { getStore } from "./render-context";
9
+ import { updateApiResourceCache } from "./update-api-resource-cache";
10
+ function collectServerElements(context, document, cacheData) {
11
+ const store = getStore(context);
12
+ updateApiResourceCache(store, cacheData);
13
+ store.dispatch(registerDocument(document));
14
+ const state = store.getState();
15
+ const descriptors = getPropControllerDescriptors(state);
16
+ const result = /* @__PURE__ */ new Map();
17
+ for (const element of traverseElementTree(document.rootElement, descriptors)) {
18
+ if (isElementReference(element)) {
19
+ continue;
20
+ }
21
+ const meta = getComponentsMeta(state.componentsMeta).get(element.type);
22
+ if (meta == null) {
23
+ console.warn(`collectServerElements: Component meta not found for ${element.type}`);
24
+ continue;
25
+ }
26
+ if (result.has(element.key)) {
27
+ console.warn(`collectServerElements: RSC node already exists for ${element.key}`);
28
+ continue;
29
+ }
30
+ if (meta.server) {
31
+ result.set(
32
+ element.key,
33
+ /* @__PURE__ */ jsx(
34
+ ServerElement,
35
+ {
36
+ context,
37
+ element,
38
+ documentKey: document.key
39
+ },
40
+ element.key
41
+ )
42
+ );
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ export {
48
+ collectServerElements
49
+ };
50
+ //# sourceMappingURL=collect-server-elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/server/collect-server-elements.tsx"],"sourcesContent":["import { type ReactNode } from 'react'\n\nimport { isElementReference } from '@makeswift/controls'\n\nimport { type CacheData } from '../../../api/api-resources-client'\n\nimport { type Document } from '../../../state/modules/read-only-documents'\nimport { getComponentsMeta } from '../../../state/modules/components-meta'\nimport { traverseElementTree } from '../../../state/modules/element-trees'\nimport { registerDocument } from '../../../state/shared-api'\nimport { getPropControllerDescriptors } from '../../../state/read-only-state'\n\nimport { ServerElement } from './components/element'\n\nimport { type ServerRenderContext, getStore } from './render-context'\nimport { updateApiResourceCache } from './update-api-resource-cache'\n\nexport type ElementsMap = Map<string, ReactNode>\n\n/**\n * Collects React nodes for document's server elements into a map keyed by\n * element key.\n *\n * Note that this function only *creates* React elements and associates them\n * with the corresponding Makeswift elements; it does not render anything.\n *\n * The actual render happens when React's server renderer walks the React tree\n * and hits the 'use client' boundary at `<ServerElementsCache />`, at which\n * point it needs to serialize the `value` prop into the flight stream and thus\n * execute `ServerElement` rendering code for each entry in the map.\n */\nexport function collectServerElements(\n context: ServerRenderContext,\n document: Document,\n cacheData: CacheData,\n): ElementsMap {\n const store = getStore(context)\n updateApiResourceCache(store, cacheData)\n\n store.dispatch(registerDocument(document))\n\n const state = store.getState()\n const descriptors = getPropControllerDescriptors(state)\n\n const result: ElementsMap = new Map()\n\n for (const element of traverseElementTree(document.rootElement, descriptors)) {\n if (isElementReference(element)) {\n // TODO: Element reference support\n continue\n }\n\n const meta = getComponentsMeta(state.componentsMeta).get(element.type)\n\n if (meta == null) {\n console.warn(`collectServerElements: Component meta not found for ${element.type}`)\n continue\n }\n\n if (result.has(element.key)) {\n console.warn(`collectServerElements: RSC node already exists for ${element.key}`)\n continue\n }\n\n if (meta.server) {\n result.set(\n element.key,\n <ServerElement\n key={element.key}\n context={context}\n element={element}\n documentKey={document.key}\n />,\n )\n }\n }\n\n return result\n}\n"],"mappings":"AAmEQ;AAjER,SAAS,0BAA0B;AAKnC,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,oCAAoC;AAE7C,SAAS,qBAAqB;AAE9B,SAAmC,gBAAgB;AACnD,SAAS,8BAA8B;AAgBhC,SAAS,sBACd,SACA,UACA,WACa;AACb,QAAM,QAAQ,SAAS,OAAO;AAC9B,yBAAuB,OAAO,SAAS;AAEvC,QAAM,SAAS,iBAAiB,QAAQ,CAAC;AAEzC,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,cAAc,6BAA6B,KAAK;AAEtD,QAAM,SAAsB,oBAAI,IAAI;AAEpC,aAAW,WAAW,oBAAoB,SAAS,aAAa,WAAW,GAAG;AAC5E,QAAI,mBAAmB,OAAO,GAAG;AAE/B;AAAA,IACF;AAEA,UAAM,OAAO,kBAAkB,MAAM,cAAc,EAAE,IAAI,QAAQ,IAAI;AAErE,QAAI,QAAQ,MAAM;AAChB,cAAQ,KAAK,uDAAuD,QAAQ,IAAI,EAAE;AAClF;AAAA,IACF;AAEA,QAAI,OAAO,IAAI,QAAQ,GAAG,GAAG;AAC3B,cAAQ,KAAK,sDAAsD,QAAQ,GAAG,EAAE;AAChF;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,aAAO;AAAA,QACL,QAAQ;AAAA,QACR;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA,aAAa,SAAS;AAAA;AAAA,UAHjB,QAAQ;AAAA,QAIf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,152 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, startTransition, useCallback } from "react";
4
+ import {
5
+ setResolvedValueOverride,
6
+ clearResolvedValueOverride
7
+ } from "../../../../state/actions/internal/read-write-actions";
8
+ import { useServerElementRefresh } from "../../hooks/use-server-element-refresh";
9
+ import { useElementData } from "../../hooks/use-element-data";
10
+ import { useControlDefs } from "../../hooks/use-control-defs";
11
+ import { useEditableElementStylesheetFactory } from "../../hooks/use-editable-element-stylesheet-factory";
12
+ import { useResolvedProps } from "../../hooks/use-resolved-props";
13
+ import { useControlInstances } from "../../components/control-instances-context";
14
+ import { useDispatch } from "../../hooks/use-dispatch";
15
+ import { useDocumentKey } from "../../hooks/use-document-context";
16
+ import { getProp } from "../../../../utils/prop-by-path";
17
+ import { setUnion, setDifference } from "../../../../utils/set";
18
+ const EditableServerElement = ({
19
+ initialElementData,
20
+ children
21
+ }) => {
22
+ const elementKey = initialElementData.key;
23
+ const elementData = useElementData({ elementKey });
24
+ if (elementData == null) {
25
+ return null;
26
+ }
27
+ return /* @__PURE__ */ jsx(EditableServerElementWrapper, { ...{ initialElementData, elementData }, children });
28
+ };
29
+ const EditableServerElementWrapper = ({
30
+ initialElementData,
31
+ elementData,
32
+ children
33
+ }) => {
34
+ const elementKey = initialElementData.key;
35
+ const dispatch = useDispatch();
36
+ const documentKey = useDocumentKey();
37
+ const [_legacyDefs, definitions] = useControlDefs({ elementType: initialElementData.type });
38
+ const stylesheetFactory = useEditableElementStylesheetFactory({ elementKey });
39
+ const controlInstances = useControlInstances(elementKey);
40
+ const resolvedProps = useResolvedProps({
41
+ elementKey,
42
+ propDefs: definitions,
43
+ propData: elementData.props,
44
+ controlInstances,
45
+ stylesheetFactory
46
+ });
47
+ const prevPropsRef = useRef(resolvedProps);
48
+ const prevLeafPropsRef = useRef(
49
+ getLeafPropsAndInstances(resolvedProps, controlInstances).leafProps
50
+ );
51
+ const serverRefresh = useServerElementRefresh({ elementKey });
52
+ const applyServerRefresh = useCallback(
53
+ (elementData2, leafInstances, documentKey2) => startTransition(async () => {
54
+ const applied = await serverRefresh(elementData2);
55
+ if (!applied)
56
+ return;
57
+ startTransition(() => {
58
+ leafInstances.forEach(
59
+ (c) => dispatch(clearResolvedValueOverride({ documentKey: documentKey2, instanceKey: c.instanceKey }))
60
+ );
61
+ });
62
+ }),
63
+ [serverRefresh, dispatch]
64
+ );
65
+ const applyResolvedValueOverrides = useCallback(
66
+ (instances, props, documentKey2) => instances.forEach(
67
+ (c) => dispatch(
68
+ setResolvedValueOverride({
69
+ documentKey: documentKey2,
70
+ instanceKey: c.instanceKey,
71
+ value: getProp(props, c.propPath)
72
+ })
73
+ )
74
+ ),
75
+ [dispatch]
76
+ );
77
+ useEffect(() => {
78
+ if (documentKey == null)
79
+ return;
80
+ if (children == null) {
81
+ const { leafInstances, leafProps } = getLeafPropsAndInstances(resolvedProps, controlInstances);
82
+ applyServerRefresh(elementData, leafInstances, documentKey);
83
+ prevPropsRef.current = resolvedProps;
84
+ prevLeafPropsRef.current = leafProps;
85
+ return;
86
+ }
87
+ if (resolvedProps !== prevPropsRef.current) {
88
+ const { needsRefresh, leafInstances, leafProps, reactNodeInstances } = needsServerRefresh({
89
+ resolvedProps,
90
+ controlInstances,
91
+ prevProps: prevPropsRef.current,
92
+ prevLeafProps: prevLeafPropsRef.current
93
+ });
94
+ if (needsRefresh) {
95
+ applyServerRefresh(elementData, leafInstances, documentKey);
96
+ } else {
97
+ applyResolvedValueOverrides(reactNodeInstances, resolvedProps, documentKey);
98
+ }
99
+ prevPropsRef.current = resolvedProps;
100
+ prevLeafPropsRef.current = leafProps;
101
+ }
102
+ }, [
103
+ children,
104
+ resolvedProps,
105
+ documentKey,
106
+ elementData,
107
+ controlInstances,
108
+ applyServerRefresh,
109
+ applyResolvedValueOverrides
110
+ ]);
111
+ return children;
112
+ };
113
+ const needsServerRefresh = ({
114
+ resolvedProps,
115
+ controlInstances,
116
+ prevProps,
117
+ prevLeafProps
118
+ }) => {
119
+ const { leafInstances, leafProps } = getLeafPropsAndInstances(resolvedProps, controlInstances);
120
+ const combinedLeafProps = setUnion(leafProps, prevLeafProps).values();
121
+ const updatedLeafProps = new Set(
122
+ [...combinedLeafProps].filter(
123
+ (propName) => getProp(resolvedProps, propName) !== getProp(prevProps, propName)
124
+ )
125
+ );
126
+ const updatedLeafInstances = leafInstances.filter(
127
+ (instance) => updatedLeafProps.has(instance.propPath)
128
+ );
129
+ const reactNodeInstances = updatedLeafInstances.filter((c) => c.resolvesToRenderableNode());
130
+ const reactNodePropKeys = new Set(reactNodeInstances.map((c) => c.propPath));
131
+ const newlyAddedLeafProps = setDifference(leafProps, prevLeafProps);
132
+ const needsRefresh = setDifference(updatedLeafProps, reactNodePropKeys).size > 0 || newlyAddedLeafProps.size > 0;
133
+ return {
134
+ needsRefresh,
135
+ leafInstances,
136
+ leafProps,
137
+ reactNodeInstances
138
+ };
139
+ };
140
+ const getLeafPropsAndInstances = (props, controlInstances) => {
141
+ const topLevelInstances = Object.keys(props).map((prop) => controlInstances?.[prop]).filter((inst) => inst != null);
142
+ const leafInstances = getLeafInstances(topLevelInstances);
143
+ const leafProps = new Set(leafInstances.map((c) => c.propPath));
144
+ return { leafProps, leafInstances };
145
+ };
146
+ const getLeafInstances = (instances) => instances.flatMap(
147
+ (instance) => instance.isCompositeProp() ? getLeafInstances(instance.children()) : [instance]
148
+ );
149
+ export {
150
+ EditableServerElement
151
+ };
152
+ //# sourceMappingURL=editable-server-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/runtimes/react/server/components/editable-server-element.tsx"],"sourcesContent":["'use client'\n\nimport { type PropsWithChildren, useEffect, useRef, startTransition, useCallback } from 'react'\n\nimport { ControlInstance } from '@makeswift/controls'\n\nimport { type ElementData } from '../../../../state/read-only-state'\nimport {\n setResolvedValueOverride,\n clearResolvedValueOverride,\n} from '../../../../state/actions/internal/read-write-actions'\n\nimport { useServerElementRefresh } from '../../hooks/use-server-element-refresh'\nimport { useElementData } from '../../hooks/use-element-data'\nimport { useControlDefs } from '../../hooks/use-control-defs'\nimport { useEditableElementStylesheetFactory } from '../../hooks/use-editable-element-stylesheet-factory'\nimport { useResolvedProps } from '../../hooks/use-resolved-props'\nimport { useControlInstances } from '../../components/control-instances-context'\nimport { useDispatch } from '../../hooks/use-dispatch'\nimport { useDocumentKey } from '../../hooks/use-document-context'\n\nimport { getProp } from '../../../../utils/prop-by-path'\nimport { setUnion, setDifference } from '../../../../utils/set'\n\nexport const EditableServerElement = ({\n initialElementData,\n children,\n}: PropsWithChildren<{ initialElementData: ElementData }>) => {\n const elementKey = initialElementData.key\n const elementData = useElementData({ elementKey })\n if (elementData == null) {\n // Element has been deleted\n return null\n }\n\n return (\n <EditableServerElementWrapper {...{ initialElementData, elementData }}>\n {children}\n </EditableServerElementWrapper>\n )\n}\n\n/**\n * Reflects edits to `elementData.props` in the server-rendered `children`.\n * Changes limited to existing `ReactNode` props are applied through client-side\n * overrides. Style prop changes are handled by the stylesheet engine during\n * prop resolution. All other prop changes trigger a server refresh.\n */\nconst EditableServerElementWrapper = ({\n initialElementData,\n elementData,\n children,\n}: PropsWithChildren<{ initialElementData: ElementData; elementData: ElementData }>) => {\n const elementKey = initialElementData.key\n const dispatch = useDispatch()\n const documentKey = useDocumentKey()\n\n const [_legacyDefs, definitions] = useControlDefs({ elementType: initialElementData.type })\n const stylesheetFactory = useEditableElementStylesheetFactory({ elementKey })\n\n const controlInstances = useControlInstances(elementKey)\n const resolvedProps = useResolvedProps({\n elementKey,\n propDefs: definitions,\n propData: elementData.props,\n controlInstances,\n stylesheetFactory,\n })\n\n const prevPropsRef = useRef(resolvedProps)\n const prevLeafPropsRef = useRef(\n getLeafPropsAndInstances(resolvedProps, controlInstances).leafProps,\n )\n\n const serverRefresh = useServerElementRefresh({ elementKey })\n const applyServerRefresh = useCallback(\n (elementData: ElementData, leafInstances: ControlInstance[], documentKey: string) =>\n startTransition(async () => {\n const applied = await serverRefresh(elementData)\n if (!applied) return\n\n // need a nested `startTransition` here, see\n // https://react.dev/reference/react/useTransition#react-doesnt-treat-my-state-update-after-await-as-a-transition\n startTransition(() => {\n // reset instance overrides, if any\n leafInstances.forEach(c =>\n dispatch(clearResolvedValueOverride({ documentKey, instanceKey: c.instanceKey })),\n )\n })\n }),\n [serverRefresh, dispatch],\n )\n\n const applyResolvedValueOverrides = useCallback(\n (instances: ControlInstance[], props: Record<string, unknown>, documentKey: string) =>\n instances.forEach(c =>\n dispatch(\n setResolvedValueOverride({\n documentKey,\n instanceKey: c.instanceKey,\n value: getProp(props, c.propPath),\n }),\n ),\n ),\n [dispatch],\n )\n\n useEffect(() => {\n if (documentKey == null) return\n\n if (children == null) {\n // If we don't have a server-rendered node (i.e. user just dropped the element to the page),\n // trigger a server re-render\n const { leafInstances, leafProps } = getLeafPropsAndInstances(resolvedProps, controlInstances)\n\n applyServerRefresh(elementData, leafInstances, documentKey)\n\n prevPropsRef.current = resolvedProps\n prevLeafPropsRef.current = leafProps\n return\n }\n\n if (resolvedProps !== prevPropsRef.current) {\n // If there was a change in resolved value, check if any of the changed props necessitate\n // a server refresh.\n //\n // Note that style props have stable class names and updating a style prop will not result\n // in a change to the resolved value, which is what we want. The stylesheet engine takes\n // care of updating the client CSS on style prop updates through the `useResolvedProps` call.\n const { needsRefresh, leafInstances, leafProps, reactNodeInstances } = needsServerRefresh({\n resolvedProps,\n controlInstances,\n prevProps: prevPropsRef.current,\n prevLeafProps: prevLeafPropsRef.current,\n })\n\n if (needsRefresh) {\n applyServerRefresh(elementData, leafInstances, documentKey)\n } else {\n applyResolvedValueOverrides(reactNodeInstances, resolvedProps, documentKey)\n }\n\n prevPropsRef.current = resolvedProps\n prevLeafPropsRef.current = leafProps\n }\n }, [\n children,\n resolvedProps,\n documentKey,\n elementData,\n controlInstances,\n applyServerRefresh,\n applyResolvedValueOverrides,\n ])\n\n return children\n}\n\n/**\n * Determines whether resolved prop changes require a server refresh and returns\n * the control-instance state needed to apply the update.\n */\nconst needsServerRefresh = ({\n resolvedProps,\n controlInstances,\n prevProps,\n prevLeafProps,\n}: {\n resolvedProps: Record<string, unknown>\n controlInstances: Record<string, ControlInstance> | null\n prevProps: Record<string, unknown>\n prevLeafProps: Set<string>\n}): {\n needsRefresh: boolean\n leafInstances: ControlInstance[]\n leafProps: Set<string>\n reactNodeInstances: ControlInstance[]\n} => {\n const { leafInstances, leafProps } = getLeafPropsAndInstances(resolvedProps, controlInstances)\n\n const combinedLeafProps = setUnion(leafProps, prevLeafProps).values()\n const updatedLeafProps = new Set(\n [...combinedLeafProps].filter(\n propName => getProp(resolvedProps, propName) !== getProp(prevProps, propName),\n ),\n )\n\n const updatedLeafInstances = leafInstances.filter(instance =>\n updatedLeafProps.has(instance.propPath),\n )\n\n const reactNodeInstances = updatedLeafInstances.filter(c => c.resolvesToRenderableNode())\n\n const reactNodePropKeys = new Set(reactNodeInstances.map(c => c.propPath))\n const newlyAddedLeafProps = setDifference(leafProps, prevLeafProps)\n\n // A server refresh is needed if some of the updated props are not `ReactNode` props, or we\n // have newly observed props (typically `List` items). Even when newly observed props are\n // `ReactNode` props, we have to first render them on the server to get them in the element\n // tree before they can be updated client-side.\n const needsRefresh =\n setDifference(updatedLeafProps, reactNodePropKeys).size > 0 || newlyAddedLeafProps.size > 0\n\n return {\n needsRefresh,\n leafInstances,\n leafProps,\n reactNodeInstances,\n }\n}\n\n/**\n * Returns terminal prop paths with the corresponding control instances.\n */\nconst getLeafPropsAndInstances = (\n props: Record<string, unknown>,\n controlInstances: Record<string, ControlInstance> | null,\n): {\n leafProps: Set<string>\n leafInstances: ControlInstance[]\n} => {\n const topLevelInstances = Object.keys(props)\n .map(prop => controlInstances?.[prop])\n .filter(inst => inst != null)\n\n const leafInstances = getLeafInstances(topLevelInstances)\n const leafProps = new Set(leafInstances.map(c => c.propPath))\n return { leafProps, leafInstances }\n}\n\n/**\n * Flattens a control instance tree to its leaf (terminal) instances.\n */\nconst getLeafInstances = (instances: ControlInstance[]): ControlInstance[] =>\n instances.flatMap(instance =>\n instance.isCompositeProp() ? getLeafInstances(instance.children()) : [instance],\n )\n"],"mappings":"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","names":["elementData","documentKey"]}
@@ -0,0 +1,64 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { partitionRecord } from "../../../../utils/partition";
3
+ import {
4
+ getReactComponent,
5
+ getBreakpoints,
6
+ getComponentPropControllerDescriptors
7
+ } from "../../../../state/read-only-state";
8
+ import { FallbackComponent } from "../../../../components/shared/FallbackComponent";
9
+ import { isLegacyDescriptor } from "../../../../prop-controllers/descriptors";
10
+ import {
11
+ ServerCSSCollector,
12
+ createCollectingServerStylesheet,
13
+ InjectServerCSS
14
+ } from "../css/server-css";
15
+ import { getStore } from "../render-context";
16
+ import { resolveProps } from "../resolve-props";
17
+ async function ServerElementData({
18
+ documentKey,
19
+ context,
20
+ elementData,
21
+ injectedProps
22
+ }) {
23
+ const state = getStore(context).getState();
24
+ const Component = getReactComponent(state, elementData.type);
25
+ if (Component == null) {
26
+ return /* @__PURE__ */ jsx(
27
+ FallbackComponent,
28
+ {
29
+ text: "Component not found",
30
+ details: `Unknown component '${elementData.type}'`
31
+ }
32
+ );
33
+ }
34
+ const [legacyDescriptors, definitions] = getControlDefs(state, elementData);
35
+ const legacyKeys = Object.keys(legacyDescriptors);
36
+ if (legacyKeys.length > 0) {
37
+ console.warn(`Unexpected legacy control data in server element '${elementData.key}`, {
38
+ elementData,
39
+ legacyKeys
40
+ });
41
+ }
42
+ const cssCollector = new ServerCSSCollector();
43
+ const stylesheet = createCollectingServerStylesheet(
44
+ cssCollector,
45
+ getBreakpoints(state),
46
+ elementData.key
47
+ );
48
+ const props = {
49
+ ...await resolveProps(context, elementData, documentKey, definitions, stylesheet),
50
+ ...injectedProps
51
+ };
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
53
+ /* @__PURE__ */ jsx(Component, { ...props }, elementData.key),
54
+ /* @__PURE__ */ jsx(InjectServerCSS, { collector: cssCollector, elementKey: elementData.key })
55
+ ] });
56
+ }
57
+ const getControlDefs = (state, elementData) => {
58
+ const descriptors = getComponentPropControllerDescriptors(state, elementData.type) ?? {};
59
+ return partitionRecord(descriptors, isLegacyDescriptor);
60
+ };
61
+ export {
62
+ ServerElementData
63
+ };
64
+ //# sourceMappingURL=element-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/runtimes/react/server/components/element-data.tsx"],"sourcesContent":["import { type ReactNode } from 'react'\n\nimport { partitionRecord } from '../../../../utils/partition'\n\nimport {\n type State,\n type ElementData,\n getReactComponent,\n getBreakpoints,\n getComponentPropControllerDescriptors,\n} from '../../../../state/read-only-state'\n\nimport { FallbackComponent } from '../../../../components/shared/FallbackComponent'\nimport { isLegacyDescriptor } from '../../../../prop-controllers/descriptors'\n\nimport {\n ServerCSSCollector,\n createCollectingServerStylesheet,\n InjectServerCSS,\n} from '../css/server-css'\nimport { type ServerRenderContext, getStore } from '../render-context'\nimport { resolveProps } from '../resolve-props'\n\nexport async function ServerElementData({\n documentKey,\n context,\n elementData,\n injectedProps,\n}: {\n documentKey: string\n context: ServerRenderContext\n elementData: ElementData\n injectedProps: Record<string, unknown>\n}): Promise<ReactNode> {\n const state = getStore(context).getState()\n\n const Component = getReactComponent(state, elementData.type)\n if (Component == null) {\n return (\n <FallbackComponent\n text=\"Component not found\"\n details={`Unknown component '${elementData.type}'`}\n />\n )\n }\n\n const [legacyDescriptors, definitions] = getControlDefs(state, elementData)\n const legacyKeys = Object.keys(legacyDescriptors)\n if (legacyKeys.length > 0) {\n console.warn(`Unexpected legacy control data in server element '${elementData.key}`, {\n elementData,\n legacyKeys,\n })\n }\n\n const cssCollector = new ServerCSSCollector()\n const stylesheet = createCollectingServerStylesheet(\n cssCollector,\n getBreakpoints(state),\n elementData.key,\n )\n\n const props = {\n ...(await resolveProps(context, elementData, documentKey, definitions, stylesheet)),\n ...injectedProps,\n }\n\n return (\n <>\n {/* Make the component the first child so that `findDOMNode` resolves to its first\n rendered DOM node (if any) rather than the component's `<style>` element */}\n <Component key={elementData.key} {...props} />\n <InjectServerCSS collector={cssCollector} elementKey={elementData.key} />\n </>\n )\n}\n\nconst getControlDefs = (state: State, elementData: ElementData) => {\n const descriptors = getComponentPropControllerDescriptors(state, elementData.type) ?? {}\n return partitionRecord(descriptors, isLegacyDescriptor)\n}\n"],"mappings":"AAuCM,SA6BF,UA7BE,KA6BF,YA7BE;AArCN,SAAS,uBAAuB;AAEhC;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AAEnC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAmC,gBAAgB;AACnD,SAAS,oBAAoB;AAE7B,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKuB;AACrB,QAAM,QAAQ,SAAS,OAAO,EAAE,SAAS;AAEzC,QAAM,YAAY,kBAAkB,OAAO,YAAY,IAAI;AAC3D,MAAI,aAAa,MAAM;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,sBAAsB,YAAY,IAAI;AAAA;AAAA,IACjD;AAAA,EAEJ;AAEA,QAAM,CAAC,mBAAmB,WAAW,IAAI,eAAe,OAAO,WAAW;AAC1E,QAAM,aAAa,OAAO,KAAK,iBAAiB;AAChD,MAAI,WAAW,SAAS,GAAG;AACzB,YAAQ,KAAK,qDAAqD,YAAY,GAAG,IAAI;AAAA,MACnF;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,IAAI,mBAAmB;AAC5C,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,eAAe,KAAK;AAAA,IACpB,YAAY;AAAA,EACd;AAEA,QAAM,QAAQ;AAAA,IACZ,GAAI,MAAM,aAAa,SAAS,aAAa,aAAa,aAAa,UAAU;AAAA,IACjF,GAAG;AAAA,EACL;AAEA,SACE,iCAGE;AAAA,wBAAC,aAAiC,GAAG,SAArB,YAAY,GAAgB;AAAA,IAC5C,oBAAC,mBAAgB,WAAW,cAAc,YAAY,YAAY,KAAK;AAAA,KACzE;AAEJ;AAEA,MAAM,iBAAiB,CAAC,OAAc,gBAA6B;AACjE,QAAM,cAAc,sCAAsC,OAAO,YAAY,IAAI,KAAK,CAAC;AACvF,SAAO,gBAAgB,aAAa,kBAAkB;AACxD;","names":[]}
@@ -0,0 +1,56 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { mapValues } from "@makeswift/controls";
3
+ import {
4
+ isElementReference,
5
+ getComponentsMeta
6
+ } from "../../../../state/read-only-state";
7
+ import { FallbackComponent } from "../../../../components/shared/FallbackComponent";
8
+ import { Element as ClientElement } from "../../components/Element";
9
+ import { getStore } from "../render-context";
10
+ import { ServerElementData } from "./element-data";
11
+ function ServerElement({
12
+ context,
13
+ element,
14
+ documentKey
15
+ }) {
16
+ if (isElementReference(element)) {
17
+ return /* @__PURE__ */ jsx(FallbackComponent, { text: "Element reference is not supported on server yet" });
18
+ }
19
+ const state = getStore(context).getState();
20
+ const elementMeta = getComponentsMeta(state).get(element.type);
21
+ if (elementMeta == null) {
22
+ return /* @__PURE__ */ jsx(
23
+ FallbackComponent,
24
+ {
25
+ text: "Component not found",
26
+ details: `Missing component metadata for '${element.type}'`
27
+ }
28
+ );
29
+ }
30
+ const elementKey = element.key;
31
+ const isRSC = elementMeta.server ?? false;
32
+ if (!isRSC) {
33
+ return /* @__PURE__ */ jsx(ClientElement, { element }, elementKey);
34
+ }
35
+ const injectableProps = {
36
+ elementKey,
37
+ documentKey
38
+ };
39
+ const injectedProps = mapValues(
40
+ elementMeta.injectedProps ?? {},
41
+ (propName) => injectableProps[propName]
42
+ );
43
+ return /* @__PURE__ */ jsx(
44
+ ServerElementData,
45
+ {
46
+ documentKey,
47
+ context,
48
+ elementData: element,
49
+ injectedProps
50
+ }
51
+ );
52
+ }
53
+ export {
54
+ ServerElement
55
+ };
56
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/runtimes/react/server/components/element.tsx"],"sourcesContent":["import { ReactNode } from 'react'\n\nimport { mapValues } from '@makeswift/controls'\n\nimport {\n isElementReference,\n getComponentsMeta,\n type Element as ElementDataOrRef,\n} from '../../../../state/read-only-state'\n\nimport { FallbackComponent } from '../../../../components/shared/FallbackComponent'\n\nimport { Element as ClientElement } from '../../components/Element'\n\nimport { type ServerRenderContext, getStore } from '../render-context'\nimport { type InjectableProps } from '../injectable-props'\n\nimport { ServerElementData } from './element-data'\n\nexport function ServerElement({\n context,\n element,\n documentKey,\n}: {\n context: ServerRenderContext\n element: ElementDataOrRef\n documentKey: string\n}): ReactNode {\n // check for element references first to avoid looking them up as regular components\n if (isElementReference(element)) {\n return <FallbackComponent text=\"Element reference is not supported on server yet\" />\n }\n\n const state = getStore(context).getState()\n const elementMeta = getComponentsMeta(state).get(element.type)\n if (elementMeta == null) {\n return (\n <FallbackComponent\n text=\"Component not found\"\n details={`Missing component metadata for '${element.type}'`}\n />\n )\n }\n\n const elementKey = element.key\n const isRSC = elementMeta.server ?? false\n if (!isRSC) {\n return <ClientElement key={elementKey} element={element} />\n }\n\n const injectableProps: InjectableProps = {\n elementKey,\n documentKey,\n }\n\n const injectedProps = mapValues(\n elementMeta.injectedProps ?? {},\n propName => injectableProps[propName],\n )\n\n return (\n <ServerElementData\n documentKey={documentKey}\n context={context}\n elementData={element}\n injectedProps={injectedProps}\n />\n )\n}\n"],"mappings":"AA8BW;AA5BX,SAAS,iBAAiB;AAE1B;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,yBAAyB;AAElC,SAAS,WAAW,qBAAqB;AAEzC,SAAmC,gBAAgB;AAGnD,SAAS,yBAAyB;AAE3B,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIc;AAEZ,MAAI,mBAAmB,OAAO,GAAG;AAC/B,WAAO,oBAAC,qBAAkB,MAAK,oDAAmD;AAAA,EACpF;AAEA,QAAM,QAAQ,SAAS,OAAO,EAAE,SAAS;AACzC,QAAM,cAAc,kBAAkB,KAAK,EAAE,IAAI,QAAQ,IAAI;AAC7D,MAAI,eAAe,MAAM;AACvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,mCAAmC,QAAQ,IAAI;AAAA;AAAA,IAC1D;AAAA,EAEJ;AAEA,QAAM,aAAa,QAAQ;AAC3B,QAAM,QAAQ,YAAY,UAAU;AACpC,MAAI,CAAC,OAAO;AACV,WAAO,oBAAC,iBAA+B,WAAZ,UAA8B;AAAA,EAC3D;AAEA,QAAM,kBAAmC;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,YAAY,iBAAiB,CAAC;AAAA,IAC9B,cAAY,gBAAgB,QAAQ;AAAA,EACtC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { MakeswiftComponent as MakeswiftClientComponent } from "../../components/MakeswiftComponent";
3
+ import { RSCSnapshotRenderer } from "./snapshot-renderer";
4
+ const MakeswiftComponent = (props) => /* @__PURE__ */ jsx(RSCSnapshotRenderer, { ...props, children: /* @__PURE__ */ jsx(MakeswiftClientComponent, { ...props }) });
5
+ export {
6
+ MakeswiftComponent
7
+ };
8
+ //# sourceMappingURL=makeswift-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/runtimes/react/server/components/makeswift-component.tsx"],"sourcesContent":["import { type ComponentProps } from 'react'\n\nimport { MakeswiftComponent as MakeswiftClientComponent } from '../../components/MakeswiftComponent'\n\nimport { RSCSnapshotRenderer } from './snapshot-renderer'\n\n/**\n * Renders Makeswift component snapshot with server-element support. RSC counterpart of\n * https://docs.makeswift.com/developer/docs/reference/components/makeswift-component#props\n */\nexport const MakeswiftComponent = (props: ComponentProps<typeof MakeswiftClientComponent>) => (\n <RSCSnapshotRenderer {...props}>\n <MakeswiftClientComponent {...props} />\n </RSCSnapshotRenderer>\n)\n"],"mappings":"AAYI;AAVJ,SAAS,sBAAsB,gCAAgC;AAE/D,SAAS,2BAA2B;AAM7B,MAAM,qBAAqB,CAAC,UACjC,oBAAC,uBAAqB,GAAG,OACvB,8BAAC,4BAA0B,GAAG,OAAO,GACvC;","names":[]}
@@ -0,0 +1,28 @@
1
+ import { Fragment, jsx } from "react/jsx-runtime";
2
+ import { getStore } from "../render-context";
3
+ import { collectServerElements } from "../collect-server-elements";
4
+ import { updateApiResourceCache } from "../update-api-resource-cache";
5
+ import { ServerElementsProvider } from "./server-elements-cache";
6
+ function RSCRenderer({
7
+ context,
8
+ document,
9
+ cacheData,
10
+ children
11
+ }) {
12
+ const serverElements = collectServerElements(context, document, cacheData);
13
+ return /* @__PURE__ */ jsx(ServerElementsProvider, { elements: serverElements, children });
14
+ }
15
+ function RSCElementRenderer({
16
+ context,
17
+ cacheData,
18
+ children
19
+ }) {
20
+ const store = getStore(context);
21
+ updateApiResourceCache(store, cacheData);
22
+ return /* @__PURE__ */ jsx(Fragment, { children });
23
+ }
24
+ export {
25
+ RSCElementRenderer,
26
+ RSCRenderer
27
+ };
28
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/runtimes/react/server/components/renderer.tsx"],"sourcesContent":["import { type PropsWithChildren } from 'react'\n\nimport { type CacheData } from '../../../../api/api-resources-client'\nimport { type Document } from '../../../../state/modules/read-only-documents'\n\nimport { type ServerRenderContext, getStore } from '../render-context'\nimport { collectServerElements } from '../collect-server-elements'\nimport { updateApiResourceCache } from '../update-api-resource-cache'\n\nimport { ServerElementsProvider } from './server-elements-cache'\n\n/**\n * Helper for rendering a Makeswift document containing server elements. Makes\n * the server-rendered nodes available to the client renderer and enables\n * client-side style updates for editable server elements.\n */\nexport function RSCRenderer({\n context,\n document,\n cacheData,\n children,\n}: PropsWithChildren<{ context: ServerRenderContext; document: Document; cacheData: CacheData }>) {\n const serverElements = collectServerElements(context, document, cacheData)\n\n return <ServerElementsProvider elements={serverElements}>{children}</ServerElementsProvider>\n}\n\n/**\n * Helper for (re-)rendering an isolated server element. Updates the server\n * state with the context's API resource cache.\n */\nexport function RSCElementRenderer({\n context,\n cacheData,\n children,\n}: PropsWithChildren<{ context: ServerRenderContext; cacheData: CacheData }>) {\n const store = getStore(context)\n\n updateApiResourceCache(store, cacheData)\n return <>{children}</>\n}\n"],"mappings":"AAwBS,SAeA,UAfA;AAnBT,SAAmC,gBAAgB;AACnD,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAEvC,SAAS,8BAA8B;AAOhC,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkG;AAChG,QAAM,iBAAiB,sBAAsB,SAAS,UAAU,SAAS;AAEzE,SAAO,oBAAC,0BAAuB,UAAU,gBAAiB,UAAS;AACrE;AAMO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAA8E;AAC5E,QAAM,QAAQ,SAAS,OAAO;AAE9B,yBAAuB,OAAO,SAAS;AACvC,SAAO,gCAAG,UAAS;AACrB;","names":[]}