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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/cjs/api/graphql/documents/queries.js +0 -14
  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 -8
  5. package/dist/cjs/api/graphql-api-client.js.map +1 -1
  6. package/dist/cjs/api/makeswift-api-resources-client.js +1 -1
  7. package/dist/cjs/api/makeswift-api-resources-client.js.map +1 -1
  8. package/dist/cjs/api/rest-api-client.js +14 -1
  9. package/dist/cjs/api/rest-api-client.js.map +1 -1
  10. package/dist/cjs/api-handler/handlers/manifest.js +1 -1
  11. package/dist/cjs/client/index.js +0 -3
  12. package/dist/cjs/client/index.js.map +1 -1
  13. package/dist/cjs/react/server/index.js +45 -0
  14. package/dist/cjs/react/server/index.js.map +1 -0
  15. package/dist/cjs/runtimes/react/components/ElementData.js +41 -8
  16. package/dist/cjs/runtimes/react/components/ElementData.js.map +1 -1
  17. package/dist/cjs/runtimes/react/components/framework-context.js.map +1 -1
  18. package/dist/cjs/runtimes/react/hooks/use-editable-element-stylesheet-factory.js +58 -0
  19. package/dist/cjs/runtimes/react/hooks/use-editable-element-stylesheet-factory.js.map +1 -0
  20. package/dist/cjs/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  21. package/dist/cjs/runtimes/react/hooks/use-server-element-refresh.js +90 -0
  22. package/dist/cjs/runtimes/react/hooks/use-server-element-refresh.js.map +1 -0
  23. package/dist/cjs/runtimes/react/react-runtime-core.js +22 -4
  24. package/dist/cjs/runtimes/react/react-runtime-core.js.map +1 -1
  25. package/dist/cjs/runtimes/react/resource-resolver.js.map +1 -1
  26. package/dist/cjs/runtimes/react/server/collect-server-elements.js +74 -0
  27. package/dist/cjs/runtimes/react/server/collect-server-elements.js.map +1 -0
  28. package/dist/cjs/runtimes/react/server/components/editable-server-element.js +173 -0
  29. package/dist/cjs/runtimes/react/server/components/editable-server-element.js.map +1 -0
  30. package/dist/cjs/runtimes/react/server/components/element-data.js +76 -0
  31. package/dist/cjs/runtimes/react/server/components/element-data.js.map +1 -0
  32. package/dist/cjs/runtimes/react/server/components/element.js +59 -0
  33. package/dist/cjs/runtimes/react/server/components/element.js.map +1 -0
  34. package/dist/cjs/runtimes/react/server/components/makeswift-component.js +32 -0
  35. package/dist/cjs/runtimes/react/server/components/makeswift-component.js.map +1 -0
  36. package/dist/cjs/runtimes/react/server/components/renderer.js +54 -0
  37. package/dist/cjs/runtimes/react/server/components/renderer.js.map +1 -0
  38. package/dist/cjs/runtimes/react/server/components/server-elements-cache.js +70 -0
  39. package/dist/cjs/runtimes/react/server/components/server-elements-cache.js.map +1 -0
  40. package/dist/cjs/runtimes/react/server/components/slot.js +33 -0
  41. package/dist/cjs/runtimes/react/server/components/slot.js.map +1 -0
  42. package/dist/cjs/runtimes/react/server/components/snapshot-renderer.js +50 -0
  43. package/dist/cjs/runtimes/react/server/components/snapshot-renderer.js.map +1 -0
  44. package/dist/cjs/runtimes/react/server/css/client-css.js +112 -0
  45. package/dist/cjs/runtimes/react/server/css/client-css.js.map +1 -0
  46. package/dist/cjs/runtimes/react/server/css/css-runtime.js +102 -0
  47. package/dist/cjs/runtimes/react/server/css/css-runtime.js.map +1 -0
  48. package/dist/cjs/runtimes/react/server/css/server-css.js +71 -0
  49. package/dist/cjs/runtimes/react/server/css/server-css.js.map +1 -0
  50. package/dist/cjs/runtimes/react/server/index.js +51 -0
  51. package/dist/cjs/runtimes/react/server/index.js.map +1 -0
  52. package/dist/cjs/runtimes/react/server/render-context.js +58 -0
  53. package/dist/cjs/runtimes/react/server/render-context.js.map +1 -0
  54. package/dist/cjs/runtimes/react/server/render-element-payload.js +45 -0
  55. package/dist/cjs/runtimes/react/server/render-element-payload.js.map +1 -0
  56. package/dist/cjs/runtimes/react/server/resolve-props.js +58 -0
  57. package/dist/cjs/runtimes/react/server/resolve-props.js.map +1 -0
  58. package/dist/cjs/runtimes/react/server/resource-resolver.js +40 -0
  59. package/dist/cjs/runtimes/react/server/resource-resolver.js.map +1 -0
  60. package/dist/cjs/runtimes/react/server/update-api-resource-cache.js +32 -0
  61. package/dist/cjs/runtimes/react/server/update-api-resource-cache.js.map +1 -0
  62. package/dist/cjs/runtimes/react/testing/react-runtime.js +19 -2
  63. package/dist/cjs/runtimes/react/testing/react-runtime.js.map +1 -1
  64. package/dist/cjs/state/modules/components-meta.js.map +1 -1
  65. package/dist/cjs/unstable-framework-support/index.js +3 -0
  66. package/dist/cjs/unstable-framework-support/index.js.map +1 -1
  67. package/dist/cjs/utils/prop-by-path.js +35 -0
  68. package/dist/cjs/utils/prop-by-path.js.map +1 -0
  69. package/dist/cjs/utils/set.js +32 -0
  70. package/dist/cjs/utils/set.js.map +1 -0
  71. package/dist/esm/api/graphql/documents/queries.js +0 -13
  72. package/dist/esm/api/graphql/documents/queries.js.map +1 -1
  73. package/dist/esm/api/graphql/generated/types.js.map +1 -1
  74. package/dist/esm/api/graphql-api-client.js +1 -9
  75. package/dist/esm/api/graphql-api-client.js.map +1 -1
  76. package/dist/esm/api/makeswift-api-resources-client.js +1 -1
  77. package/dist/esm/api/makeswift-api-resources-client.js.map +1 -1
  78. package/dist/esm/api/rest-api-client.js +14 -1
  79. package/dist/esm/api/rest-api-client.js.map +1 -1
  80. package/dist/esm/api-handler/handlers/manifest.js +1 -1
  81. package/dist/esm/client/index.js +0 -3
  82. package/dist/esm/client/index.js.map +1 -1
  83. package/dist/esm/react/server/index.js +23 -0
  84. package/dist/esm/react/server/index.js.map +1 -0
  85. package/dist/esm/runtimes/react/components/ElementData.js +42 -9
  86. package/dist/esm/runtimes/react/components/ElementData.js.map +1 -1
  87. package/dist/esm/runtimes/react/components/framework-context.js.map +1 -1
  88. package/dist/esm/runtimes/react/hooks/use-editable-element-stylesheet-factory.js +34 -0
  89. package/dist/esm/runtimes/react/hooks/use-editable-element-stylesheet-factory.js.map +1 -0
  90. package/dist/esm/runtimes/react/hooks/use-resolved-props.js.map +1 -1
  91. package/dist/esm/runtimes/react/hooks/use-server-element-refresh.js +66 -0
  92. package/dist/esm/runtimes/react/hooks/use-server-element-refresh.js.map +1 -0
  93. package/dist/esm/runtimes/react/react-runtime-core.js +22 -4
  94. package/dist/esm/runtimes/react/react-runtime-core.js.map +1 -1
  95. package/dist/esm/runtimes/react/resource-resolver.js.map +1 -1
  96. package/dist/esm/runtimes/react/server/collect-server-elements.js +50 -0
  97. package/dist/esm/runtimes/react/server/collect-server-elements.js.map +1 -0
  98. package/dist/esm/runtimes/react/server/components/editable-server-element.js +152 -0
  99. package/dist/esm/runtimes/react/server/components/editable-server-element.js.map +1 -0
  100. package/dist/esm/runtimes/react/server/components/element-data.js +60 -0
  101. package/dist/esm/runtimes/react/server/components/element-data.js.map +1 -0
  102. package/dist/esm/runtimes/react/server/components/element.js +38 -0
  103. package/dist/esm/runtimes/react/server/components/element.js.map +1 -0
  104. package/dist/esm/runtimes/react/server/components/makeswift-component.js +8 -0
  105. package/dist/esm/runtimes/react/server/components/makeswift-component.js.map +1 -0
  106. package/dist/esm/runtimes/react/server/components/renderer.js +29 -0
  107. package/dist/esm/runtimes/react/server/components/renderer.js.map +1 -0
  108. package/dist/esm/runtimes/react/server/components/server-elements-cache.js +45 -0
  109. package/dist/esm/runtimes/react/server/components/server-elements-cache.js.map +1 -0
  110. package/dist/esm/runtimes/react/server/components/slot.js +9 -0
  111. package/dist/esm/runtimes/react/server/components/slot.js.map +1 -0
  112. package/dist/esm/runtimes/react/server/components/snapshot-renderer.js +26 -0
  113. package/dist/esm/runtimes/react/server/components/snapshot-renderer.js.map +1 -0
  114. package/dist/esm/runtimes/react/server/css/client-css.js +87 -0
  115. package/dist/esm/runtimes/react/server/css/client-css.js.map +1 -0
  116. package/dist/esm/runtimes/react/server/css/css-runtime.js +77 -0
  117. package/dist/esm/runtimes/react/server/css/css-runtime.js.map +1 -0
  118. package/dist/esm/runtimes/react/server/css/server-css.js +45 -0
  119. package/dist/esm/runtimes/react/server/css/server-css.js.map +1 -0
  120. package/dist/esm/runtimes/react/server/index.js +23 -0
  121. package/dist/esm/runtimes/react/server/index.js.map +1 -0
  122. package/dist/esm/runtimes/react/server/render-context.js +31 -0
  123. package/dist/esm/runtimes/react/server/render-context.js.map +1 -0
  124. package/dist/esm/runtimes/react/server/render-element-payload.js +21 -0
  125. package/dist/esm/runtimes/react/server/render-element-payload.js.map +1 -0
  126. package/dist/esm/runtimes/react/server/resolve-props.js +34 -0
  127. package/dist/esm/runtimes/react/server/resolve-props.js.map +1 -0
  128. package/dist/esm/runtimes/react/server/resource-resolver.js +16 -0
  129. package/dist/esm/runtimes/react/server/resource-resolver.js.map +1 -0
  130. package/dist/esm/runtimes/react/server/update-api-resource-cache.js +8 -0
  131. package/dist/esm/runtimes/react/server/update-api-resource-cache.js.map +1 -0
  132. package/dist/esm/runtimes/react/testing/react-runtime.js +19 -2
  133. package/dist/esm/runtimes/react/testing/react-runtime.js.map +1 -1
  134. package/dist/esm/state/modules/components-meta.js.map +1 -1
  135. package/dist/esm/unstable-framework-support/index.js +2 -0
  136. package/dist/esm/unstable-framework-support/index.js.map +1 -1
  137. package/dist/esm/utils/prop-by-path.js +10 -0
  138. package/dist/esm/utils/prop-by-path.js.map +1 -0
  139. package/dist/esm/utils/set.js +7 -0
  140. package/dist/esm/utils/set.js.map +1 -0
  141. package/dist/types/api/graphql/documents/queries.d.ts +0 -1
  142. package/dist/types/api/graphql/documents/queries.d.ts.map +1 -1
  143. package/dist/types/api/graphql/generated/types.d.ts +0 -16
  144. package/dist/types/api/graphql/generated/types.d.ts.map +1 -1
  145. package/dist/types/api/graphql-api-client.d.ts +1 -2
  146. package/dist/types/api/graphql-api-client.d.ts.map +1 -1
  147. package/dist/types/api/rest-api-client.d.ts +2 -1
  148. package/dist/types/api/rest-api-client.d.ts.map +1 -1
  149. package/dist/types/client/index.d.ts +1 -2
  150. package/dist/types/client/index.d.ts.map +1 -1
  151. package/dist/types/react/server/index.d.ts +2 -0
  152. package/dist/types/react/server/index.d.ts.map +1 -0
  153. package/dist/types/runtimes/react/components/ElementData.d.ts +2 -2
  154. package/dist/types/runtimes/react/components/ElementData.d.ts.map +1 -1
  155. package/dist/types/runtimes/react/components/framework-context.d.ts +6 -1
  156. package/dist/types/runtimes/react/components/framework-context.d.ts.map +1 -1
  157. package/dist/types/runtimes/react/hooks/__tests__/use-server-element-refresh.test.d.ts +3 -0
  158. package/dist/types/runtimes/react/hooks/__tests__/use-server-element-refresh.test.d.ts.map +1 -0
  159. package/dist/types/runtimes/react/hooks/use-editable-element-stylesheet-factory.d.ts +5 -0
  160. package/dist/types/runtimes/react/hooks/use-editable-element-stylesheet-factory.d.ts.map +1 -0
  161. package/dist/types/runtimes/react/hooks/use-resolved-props.d.ts +3 -0
  162. package/dist/types/runtimes/react/hooks/use-resolved-props.d.ts.map +1 -1
  163. package/dist/types/runtimes/react/hooks/use-server-element-refresh.d.ts +14 -0
  164. package/dist/types/runtimes/react/hooks/use-server-element-refresh.d.ts.map +1 -0
  165. package/dist/types/runtimes/react/react-runtime-core.d.ts +3 -1
  166. package/dist/types/runtimes/react/react-runtime-core.d.ts.map +1 -1
  167. package/dist/types/runtimes/react/resource-resolver.d.ts +1 -0
  168. package/dist/types/runtimes/react/resource-resolver.d.ts.map +1 -1
  169. package/dist/types/runtimes/react/server/collect-server-elements.d.ts +19 -0
  170. package/dist/types/runtimes/react/server/collect-server-elements.d.ts.map +1 -0
  171. package/dist/types/runtimes/react/server/components/__tests__/editable-server-element.test.d.ts +3 -0
  172. package/dist/types/runtimes/react/server/components/__tests__/editable-server-element.test.d.ts.map +1 -0
  173. package/dist/types/runtimes/react/server/components/editable-server-element.d.ts +6 -0
  174. package/dist/types/runtimes/react/server/components/editable-server-element.d.ts.map +1 -0
  175. package/dist/types/runtimes/react/server/components/element-data.d.ts +9 -0
  176. package/dist/types/runtimes/react/server/components/element-data.d.ts.map +1 -0
  177. package/dist/types/runtimes/react/server/components/element.d.ts +9 -0
  178. package/dist/types/runtimes/react/server/components/element.d.ts.map +1 -0
  179. package/dist/types/runtimes/react/server/components/makeswift-component.d.ts +8 -0
  180. package/dist/types/runtimes/react/server/components/makeswift-component.d.ts.map +1 -0
  181. package/dist/types/runtimes/react/server/components/renderer.d.ts +23 -0
  182. package/dist/types/runtimes/react/server/components/renderer.d.ts.map +1 -0
  183. package/dist/types/runtimes/react/server/components/server-elements-cache.d.ts +22 -0
  184. package/dist/types/runtimes/react/server/components/server-elements-cache.d.ts.map +1 -0
  185. package/dist/types/runtimes/react/server/components/slot.d.ts +8 -0
  186. package/dist/types/runtimes/react/server/components/slot.d.ts.map +1 -0
  187. package/dist/types/runtimes/react/server/components/snapshot-renderer.d.ts +10 -0
  188. package/dist/types/runtimes/react/server/components/snapshot-renderer.d.ts.map +1 -0
  189. package/dist/types/runtimes/react/server/css/client-css.d.ts +10 -0
  190. package/dist/types/runtimes/react/server/css/client-css.d.ts.map +1 -0
  191. package/dist/types/runtimes/react/server/css/css-runtime.d.ts +16 -0
  192. package/dist/types/runtimes/react/server/css/css-runtime.d.ts.map +1 -0
  193. package/dist/types/runtimes/react/server/css/server-css.d.ts +14 -0
  194. package/dist/types/runtimes/react/server/css/server-css.d.ts.map +1 -0
  195. package/dist/types/runtimes/react/server/index.d.ts +8 -0
  196. package/dist/types/runtimes/react/server/index.d.ts.map +1 -0
  197. package/dist/types/runtimes/react/server/render-context.d.ts +28 -0
  198. package/dist/types/runtimes/react/server/render-context.d.ts.map +1 -0
  199. package/dist/types/runtimes/react/server/render-element-payload.d.ts +215 -0
  200. package/dist/types/runtimes/react/server/render-element-payload.d.ts.map +1 -0
  201. package/dist/types/runtimes/react/server/resolve-props.d.ts +7 -0
  202. package/dist/types/runtimes/react/server/resolve-props.d.ts.map +1 -0
  203. package/dist/types/runtimes/react/server/resource-resolver.d.ts +6 -0
  204. package/dist/types/runtimes/react/server/resource-resolver.d.ts.map +1 -0
  205. package/dist/types/runtimes/react/server/update-api-resource-cache.d.ts +4 -0
  206. package/dist/types/runtimes/react/server/update-api-resource-cache.d.ts.map +1 -0
  207. package/dist/types/runtimes/react/testing/react-runtime.d.ts +12 -2
  208. package/dist/types/runtimes/react/testing/react-runtime.d.ts.map +1 -1
  209. package/dist/types/state/modules/components-meta.d.ts +1 -0
  210. package/dist/types/state/modules/components-meta.d.ts.map +1 -1
  211. package/dist/types/unstable-framework-support/index.d.ts +1 -0
  212. package/dist/types/unstable-framework-support/index.d.ts.map +1 -1
  213. package/dist/types/utils/__tests__/prop-by-path.test.d.ts +2 -0
  214. package/dist/types/utils/__tests__/prop-by-path.test.d.ts.map +1 -0
  215. package/dist/types/utils/prop-by-path.d.ts +3 -0
  216. package/dist/types/utils/prop-by-path.d.ts.map +1 -0
  217. package/dist/types/utils/set.d.ts +3 -0
  218. package/dist/types/utils/set.d.ts.map +1 -0
  219. package/package.json +6 -1
  220. package/react/server/package.json +5 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n type UnversionedResourcesQueryResult,\n type UnversionedResourcesQueryVariables,\n} from '../api/graphql/generated/types'\n\nimport {\n APIResourceType,\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Swatch,\n type Table,\n type Typography,\n} from '../api/types'\n\nimport { CacheData } from '../api/api-resources-client'\n\nimport { MakeswiftGraphQLApiClient } from '../api/graphql-api-client'\nimport {\n MakeswiftRestAPIClient,\n failedResponseBody,\n RestApiClientError,\n} from '../api/rest-api-client'\nimport { type SiteVersion } from '../api/site-version'\n\nimport { Descriptor as PropControllerDescriptor } from '../prop-controllers/descriptors'\nimport {\n getElementChildren,\n getSwatchIds,\n getFileIds,\n getPageIds,\n getTableIds,\n getTypographyIds,\n} from '../prop-controllers/introspection'\n\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport {\n type Element,\n type ElementData,\n type Data,\n getPropControllerDescriptors,\n isElementReference,\n} from '../state/read-only-state'\n\nimport { mergeTranslatedContent } from '../state/translations/merge'\nimport { getTranslatableContent } from '../state/translations/get'\n\nimport { deterministicUUID } from '../utils/deterministic-uuid'\nimport { toIterablePaginationResult } from '../utils/pagination'\nimport { isNonNullable } from '../utils/isNonNullable'\n\nimport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentSnapshot,\n} from './component-snapshot'\n\nimport { type MakeswiftPageDocument, type MakeswiftPageSnapshot } from './page-snapshot'\n\nimport * as Schema from './schema'\n\nexport { SnippetLocation } from '../api/graphql/generated/types'\n\n// TODO: clean up the exports below, as most of them are for internal consumptions only\n// and should not be publicly exposed\nexport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentDocumentFallback,\n type MakeswiftComponentSnapshot,\n type MakeswiftComponentMetadata as MakeswiftComponentSnapshotMetadata,\n componentDocumentToRootEmbeddedDocument,\n} from './component-snapshot'\n\nexport {\n type Snippet,\n type Font,\n type MakeswiftPageDocument,\n type MakeswiftPageSnapshot,\n pageToRootDocument,\n} from './page-snapshot'\n\n// TODO: remove, leftover from the `getSitemap` method removed in 0.25.0:\n// https://github.com/makeswift/makeswift/releases/tag/%40makeswift%2Fruntime%400.25.0\nexport type Sitemap = {\n id: string\n loc: string\n lastmod?: string\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n alternateRefs?: {\n hreflang: string\n href: string\n }[]\n}[]\n\nexport type MakeswiftPage = z.infer<typeof Schema.pageData>\nexport type MakeswiftGetPagesResult = z.infer<typeof Schema.getPagesResult>\nexport type PreviewTokenPayload = z.infer<typeof Schema.previewTokenPayload>\nexport type GetFontsAPI = z.infer<typeof Schema.fonts>\n\ntype GetPagesParams = z.infer<typeof Schema.getPagesParams>\ntype GetPageResult = z.infer<typeof Schema.getPageResult>\n\nexport class MakeswiftClient extends MakeswiftRestAPIClient {\n private graphqlClient: MakeswiftGraphQLApiClient\n private runtime: ReactRuntimeCore\n\n constructor(\n apiKey: string,\n {\n runtime,\n }: {\n runtime: ReactRuntimeCore\n },\n ) {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift client must be passed a valid Makeswift site API key: ' +\n \"`new Makeswift('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n super({\n fetch: runtime.fetch,\n apiKey,\n apiOrigin: runtime.apiOrigin,\n })\n\n this.graphqlClient = new MakeswiftGraphQLApiClient({\n endpoint: runtime.graphqlApiEndpoint,\n })\n\n this.runtime = runtime\n }\n\n private getPagesInternal = async ({\n siteVersion = null,\n ...params\n }: {\n siteVersion?: SiteVersion | null\n } & GetPagesParams = {}): Promise<MakeswiftGetPagesResult> => {\n const queryParams = getPagesQueryParams(params)\n\n const response = await this.fetch(`v5/pages?${queryParams.toString()}`, siteVersion)\n if (!response.ok) {\n const body = await failedResponseBody(response)\n throw new RestApiClientError('Failed to get pages', response, {\n body: body,\n siteVersion,\n params,\n })\n }\n\n const result = await response.json()\n const parsedResponse = Schema.getPagesResult.safeParse(result)\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse 'getPages' response: ${parsedResponse.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n return parsedResponse.data\n }\n\n getPages = toIterablePaginationResult(this.getPagesInternal)\n\n async getPage(\n pathname: string,\n { siteVersion = null, locale }: { siteVersion?: SiteVersion | null; locale?: string } = {},\n ): Promise<GetPageResult | null> {\n const url = new URL(`v3/pages/${encodeURIComponent(pathname)}`, this.apiOrigin)\n if (locale) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const json = await response.json()\n\n return Schema.getPageResult.parse(json)\n }\n\n private async getTypographies(\n typographyIds: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Typography | null)[]> {\n if (typographyIds.length === 0) return []\n\n const url = new URL(`v3/typographies/bulk`, this.apiOrigin)\n\n typographyIds.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get typographies for [${typographyIds.join(', ')}]`,\n response,\n { body: failedBody, siteVersion },\n )\n }\n\n const body = await response.json()\n\n return body\n }\n\n private async getSwatches(\n ids: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Swatch | null)[]> {\n if (ids.length === 0) return []\n\n const url = new URL(`v3/swatches/bulk`, this.apiOrigin)\n\n ids.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(`Failed to get swatches for ${ids.join(', ')}`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n return await response.json()\n }\n\n private async getElementTreesBulk(\n ids: string[],\n siteVersion: SiteVersion | null,\n locale?: string,\n ): Promise<(MakeswiftComponentDocument | null)[]> {\n if (ids.length === 0) return []\n\n const requestBody: { ids: string[]; locale?: string } = { ids }\n if (locale != null) requestBody.locale = locale\n\n const response = await this.fetch('v0/element-trees/bulk', siteVersion, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n // 404 can mean the requested version has no commit (e.g., site never published)\n if (response.status === 404) return ids.map(() => null)\n\n throw new RestApiClientError(\n `Failed to get element trees for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const responseBody = await response.json()\n\n return responseBody.map((item: unknown) =>\n item != null ? Schema.componentDocument.parse(item) : null,\n )\n }\n\n private async getIntrospectedResources(\n {\n swatchIds,\n ...unversionedResourceIds\n }: UnversionedResourcesQueryVariables & { swatchIds: string[] },\n siteVersion: SiteVersion | null,\n ): Promise<UnversionedResourcesQueryResult & { swatches: (Swatch | null)[] }> {\n const unversionedResources =\n await this.graphqlClient.getUnversionedResources(unversionedResourceIds)\n\n const swatches = await this.getSwatches(swatchIds, siteVersion)\n\n return { ...unversionedResources, swatches }\n }\n\n // TODO: Consolidate this method with the introspectMany method once the\n // unstable_getComponentSnapshots method is stable and tested in production.\n private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const descriptors = this.getElementDescriptors()\n const swatchIds = new Set<string>()\n const fileIds = new Set<string>()\n const typographyIds = new Set<string>()\n const tableIds = new Set<string>()\n const pageIds = new Set<string>()\n const globalElements = new Map<string, GlobalElement | null>()\n const localizedGlobalElements = new Map<string, LocalizedGlobalElement | null>()\n const localizedResourcesMap = new Map<string, string | null>()\n\n const remaining = [element]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n const globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n localizedGlobalElements.set(localizedGlobalElement.id, localizedGlobalElement)\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => fileIds.add(fileId))\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId =>\n typographyIds.add(typographyId),\n )\n\n getTableIds(descriptor, props[propName]).forEach(tableId => tableIds.add(tableId))\n\n getPageIds(descriptor, props[propName]).forEach(pageId => pageIds.add(pageId))\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n\n remaining.push(child)\n }\n })\n })\n }\n }\n\n const typographies = await this.getTypographies([...typographyIds], siteVersion)\n\n typographies.forEach(typography => {\n typography?.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n\n if (swatchId != null) swatchIds.add(swatchId)\n })\n })\n\n const pagePathnames = await this.getPagePathnameSlices([...pageIds], siteVersion, { locale })\n\n const { swatches, files, tables } = await this.getIntrospectedResources(\n {\n swatchIds: [...swatchIds],\n fileIds: [...fileIds],\n tableIds: [...tableIds],\n },\n siteVersion,\n )\n\n const apiResources = {\n [APIResourceType.Swatch]: [...swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...globalElements.entries()].map(([id, value]) => ({\n id,\n value,\n })),\n [APIResourceType.LocalizedGlobalElement]: [...localizedGlobalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n locale,\n }),\n ),\n }\n\n return {\n apiResources,\n localizedResourcesMap:\n locale != null ? { [locale]: Object.fromEntries(localizedResourcesMap.entries()) } : {},\n }\n }\n\n private async introspectMany(\n trees: { id: string; data: Element }[],\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<Map<string, CacheData>> {\n if (trees.length === 0) return new Map()\n\n const descriptors = this.getElementDescriptors()\n\n // Shared caches for global elements (deduplication across trees)\n const globalElementCache = new Map<string, GlobalElement | null>()\n const localizedGlobalElementCache = new Map<string, LocalizedGlobalElement | null>()\n\n // Per-tree tracking, keyed by tree ID\n const treeCaches = new Map(\n trees.map(tree => [\n tree.id,\n {\n data: tree.data,\n swatchIds: new Set<string>(),\n fileIds: new Set<string>(),\n typographyIds: new Set<string>(),\n tableIds: new Set<string>(),\n pageIds: new Set<string>(),\n globalElements: new Map<string, GlobalElement | null>(),\n localizedGlobalElements: new Map<string, LocalizedGlobalElement | null>(),\n localizedResourcesMap: new Map<string, string | null>(),\n },\n ]),\n )\n\n // DFS traversal per tree\n for (const currentTreeCache of treeCaches.values()) {\n const remaining = [currentTreeCache.data]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n\n // Fetch global element, using cache if already fetched for another tree\n let globalElement: GlobalElement | null\n if (globalElementCache.has(globalElementId)) {\n globalElement = globalElementCache.get(globalElementId)!\n } else {\n globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n globalElementCache.set(globalElementId, globalElement)\n }\n\n let elementData = globalElement?.data\n\n if (locale) {\n let localizedGlobalElement: LocalizedGlobalElement | null\n if (localizedGlobalElementCache.has(globalElementId)) {\n localizedGlobalElement = localizedGlobalElementCache.get(globalElementId)!\n } else {\n localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n localizedGlobalElementCache.set(globalElementId, localizedGlobalElement)\n }\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n currentTreeCache.localizedGlobalElements.set(\n localizedGlobalElement.id,\n localizedGlobalElement,\n )\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n currentTreeCache.localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n currentTreeCache.globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n currentTreeCache.swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => {\n currentTreeCache.fileIds.add(fileId)\n })\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId => {\n currentTreeCache.typographyIds.add(typographyId)\n })\n\n getTableIds(descriptor, props[propName]).forEach(tableId => {\n currentTreeCache.tableIds.add(tableId)\n })\n\n getPageIds(descriptor, props[propName]).forEach(pageId => {\n currentTreeCache.pageIds.add(pageId)\n })\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n remaining.push(child)\n }\n })\n })\n }\n }\n }\n\n // Accumulate shared sets from per-tree state for bulk calls\n const allSwatchIds = new Set<string>()\n const allFileIds = new Set<string>()\n const allTypographyIds = new Set<string>()\n const allTableIds = new Set<string>()\n const allPageIds = new Set<string>()\n\n for (const currentTreeCache of treeCaches.values()) {\n currentTreeCache.swatchIds.forEach(id => allSwatchIds.add(id))\n currentTreeCache.fileIds.forEach(id => allFileIds.add(id))\n currentTreeCache.typographyIds.forEach(id => allTypographyIds.add(id))\n currentTreeCache.tableIds.forEach(id => allTableIds.add(id))\n currentTreeCache.pageIds.forEach(id => allPageIds.add(id))\n }\n\n // One combined round of bulk sub-resource calls\n\n // 1. Fetch typographies first (needed for secondary swatch discovery)\n const typographies = await this.getTypographies([...allTypographyIds], siteVersion)\n\n // 2. Secondary discovery: check for additional swatch IDs in typography styles\n typographies.forEach(typography => {\n if (typography == null) return\n\n const secondarySwatchIds: string[] = []\n typography.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n if (swatchId != null) {\n secondarySwatchIds.push(swatchId)\n allSwatchIds.add(swatchId)\n }\n })\n\n if (secondarySwatchIds.length > 0) {\n // Add discovered swatches to per-tree sets for trees that reference this typography\n for (const currentTreeCache of treeCaches.values()) {\n if (currentTreeCache.typographyIds.has(typography.id)) {\n secondarySwatchIds.forEach(id => currentTreeCache.swatchIds.add(id))\n }\n }\n }\n })\n\n // 3. Fetch remaining resources in parallel\n const [pagePathnames, { swatches, files, tables }] = await Promise.all([\n this.getPagePathnameSlices([...allPageIds], siteVersion, { locale }),\n this.getIntrospectedResources(\n {\n swatchIds: [...allSwatchIds],\n fileIds: [...allFileIds],\n tableIds: [...allTableIds],\n },\n siteVersion,\n ),\n ])\n\n // Build per-tree CacheData using only the resources that tree references\n const result = new Map<string, CacheData>()\n\n for (const [treeId, currentTreeCache] of treeCaches) {\n const apiResources = {\n [APIResourceType.Swatch]: [...currentTreeCache.swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...currentTreeCache.fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...currentTreeCache.typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...currentTreeCache.tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...currentTreeCache.pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...currentTreeCache.globalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n }),\n ),\n [APIResourceType.LocalizedGlobalElement]: [\n ...currentTreeCache.localizedGlobalElements.entries(),\n ].map(([id, value]) => ({\n id,\n value,\n locale,\n })),\n }\n\n result.set(treeId, {\n apiResources,\n localizedResourcesMap:\n locale != null\n ? { [locale]: Object.fromEntries(currentTreeCache.localizedResourcesMap.entries()) }\n : {},\n })\n }\n\n return result\n }\n\n async getPageSnapshot(\n pathname: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftPageSnapshot | null> {\n const queryParams = (): string => {\n const params = new URLSearchParams()\n if (locale) params.set('locale', locale)\n if (allowLocaleFallback != null) params.set('allowLocaleFallback', `${allowLocaleFallback}`)\n return params.toString()\n }\n\n const siteVersion = await siteVersionPromise\n const response = await this.fetch(\n `v4/pages/${encodeURIComponent(pathname)}/document?${queryParams()}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const document: MakeswiftPageDocument = await response.json()\n const baseLocalizedPage = document.localizedPages.find(({ parentId }) => parentId == null)\n\n const cacheData = await this.introspect(\n baseLocalizedPage?.data ?? document.data,\n siteVersion,\n // The /v3/pages endpoint returns null for document.locale when the requested locale is the default.\n // This legacy behavior is set to change with the upcoming /v4/pages endpoint.\n // We rely on document.locale when reading from the API cache, so ensure the cache is built during\n // introspection using the same value.\n document.locale,\n )\n\n return {\n document,\n cacheData,\n }\n }\n\n async getComponentSnapshot(\n id: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n unstable_enforceSuccess = false,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n unstable_enforceSuccess?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n\n const parseElementTreeResponse = async (\n response: Response,\n ): Promise<MakeswiftComponentDocument | null> => {\n if (!response.ok) {\n // See comment on `failedResponseBody` for why we always consume the\n // response body of failed responses.\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) {\n return null\n }\n\n throw new RestApiClientError(`Failed to get component snapshot for '${id}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const responseBody = await response.json()\n const parsed = Schema.componentDocumentResponse.parse(responseBody)\n if ('notFound' in parsed) return null\n return parsed\n }\n\n const getElementTree = async (\n searchParams: URLSearchParams,\n ): Promise<MakeswiftComponentDocument | null> => {\n const response = await this.fetch(\n `v2/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n return await parseElementTreeResponse(response)\n }\n\n const getPrimaryTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const getFallbackTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const primaryTree = await getPrimaryTree()\n\n const result =\n primaryTree == null && canAttemptLocaleFallback ? await getFallbackTree() : primaryTree\n\n if (result == null) {\n return {\n document: {\n id,\n locale: locale ?? null,\n data: null,\n },\n key,\n cacheData: CacheData.empty(),\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n const document = result\n const cacheData = await this.introspect(document.data, siteVersion, document.locale)\n\n return {\n document,\n cacheData,\n key,\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n /**\n * Fetches multiple component snapshots in a single bulk request with unified introspection.\n *\n * @param ids - Element tree IDs to fetch. Maximum 100 IDs per call.\n */\n // TODO: Make getComponentSnapshot use this method under the hood once the v0 bulk endpoint is stable.\n async unstable_getComponentSnapshots(\n ids: string[],\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot[]> {\n if (ids.length === 0) return []\n const siteVersion = await siteVersionPromise\n\n // Step 1: Bulk fetch\n let documents = await this.getElementTreesBulk(ids, siteVersion, locale)\n\n // Step 2: Locale fallback — second-pass for IDs that returned null\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n const fallbackIndices: number[] = []\n\n if (canAttemptLocaleFallback) {\n documents.forEach((doc, i) => {\n if (doc == null) fallbackIndices.push(i)\n })\n\n if (fallbackIndices.length > 0) {\n const fallbackIds = fallbackIndices.map(i => ids[i])\n const fallbackDocuments = await this.getElementTreesBulk(fallbackIds, siteVersion)\n\n fallbackIndices.forEach((originalIndex, fallbackIndex) => {\n documents[originalIndex] = fallbackDocuments[fallbackIndex]\n })\n }\n }\n\n // Step 3: Unified introspection for all trees that have data\n const treesToIntrospect = documents\n .map(doc => (doc?.data != null ? { id: doc.id, data: doc.data } : null))\n .filter(isNonNullable)\n\n const cacheDataMap = await this.introspectMany(treesToIntrospect, siteVersion, locale ?? null)\n\n // Step 4: Build per-component results\n return ids.map((id, i) => {\n const document = documents[i]\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n\n if (document == null || document.data == null) {\n return {\n document: { id, locale: locale ?? null, data: null },\n key,\n cacheData: CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n }\n\n return {\n document,\n key,\n cacheData: cacheDataMap.get(id) ?? CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n })\n }\n\n async getFile(fileId: string): Promise<File | null> {\n return this.graphqlClient.getFile(fileId)\n }\n\n async getTable(tableId: string): Promise<Table | null> {\n return this.graphqlClient.getTable(tableId)\n }\n\n getTranslatableData(elementTree: ElementData): Record<string, Data> {\n return getTranslatableContent(this.getElementDescriptors(), elementTree)\n }\n\n mergeTranslatedData(elementTree: ElementData, translatedData: Record<string, Data>): Element {\n return mergeTranslatedContent(this.getElementDescriptors(), elementTree, translatedData)\n }\n\n async readPreviewToken(token: string): Promise<PreviewTokenPayload | null> {\n const response = await this.fetch('v1/preview-tokens/reads', null, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n cache: 'no-store',\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 401) {\n console.error(`Preview token is invalid or expired`, {\n response: failedBody,\n })\n\n return null\n }\n\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to verify preview token`, response, {\n body: failedBody,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.previewTokenPayload.safeParse(json)\n if (!parsed.success) {\n throw new Error(\n `Failed to parse preview token payload: ${parsed.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n\n return parsed.data\n }\n\n async unstable_getFonts(siteVersion: SiteVersion | null = null): Promise<GetFontsAPI | null> {\n const response = await this.fetch('v1_unstable/fonts', siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError('Failed to fetch fonts', response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.fonts.safeParse(json)\n if (!parsed.success) {\n console.error('Failed to parse fonts API response', {\n response: json,\n siteVersion,\n })\n\n return null\n }\n\n return parsed.data\n }\n\n private getElementDescriptors() {\n return getPropControllerDescriptors(this.runtime.protoStore.getState())\n }\n}\n\nfunction getPagesQueryParams({\n limit = 100,\n after,\n sortBy,\n sortDirection,\n includeOffline,\n pathPrefix,\n locale,\n}: GetPagesParams): URLSearchParams {\n const params = new URLSearchParams()\n\n if (limit != null) params.set('limit', limit.toString())\n if (after != null) params.set('after', after)\n if (sortBy != null) params.set('sortBy', sortBy)\n if (sortDirection != null) params.set('sortDirection', sortDirection)\n if (includeOffline != null) params.set('includeOffline', includeOffline.toString())\n if (pathPrefix != null) params.set('pathPrefix', pathPrefix)\n if (locale != null) params.set('locale', locale)\n\n return params\n}\n"],"mappings":"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","names":["getResourcesFromElementDescriptors","elementDescriptors","element"]}
1
+ {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n type UnversionedResourcesQueryResult,\n type UnversionedResourcesQueryVariables,\n} from '../api/graphql/generated/types'\n\nimport {\n APIResourceType,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Swatch,\n type Table,\n type Typography,\n} from '../api/types'\n\nimport { CacheData } from '../api/api-resources-client'\n\nimport { MakeswiftGraphQLApiClient } from '../api/graphql-api-client'\nimport {\n MakeswiftRestAPIClient,\n failedResponseBody,\n RestApiClientError,\n} from '../api/rest-api-client'\nimport { type SiteVersion } from '../api/site-version'\n\nimport { Descriptor as PropControllerDescriptor } from '../prop-controllers/descriptors'\nimport {\n getElementChildren,\n getSwatchIds,\n getFileIds,\n getPageIds,\n getTableIds,\n getTypographyIds,\n} from '../prop-controllers/introspection'\n\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport {\n type Element,\n type ElementData,\n type Data,\n getPropControllerDescriptors,\n isElementReference,\n} from '../state/read-only-state'\n\nimport { mergeTranslatedContent } from '../state/translations/merge'\nimport { getTranslatableContent } from '../state/translations/get'\n\nimport { deterministicUUID } from '../utils/deterministic-uuid'\nimport { toIterablePaginationResult } from '../utils/pagination'\nimport { isNonNullable } from '../utils/isNonNullable'\n\nimport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentSnapshot,\n} from './component-snapshot'\n\nimport { type MakeswiftPageDocument, type MakeswiftPageSnapshot } from './page-snapshot'\n\nimport * as Schema from './schema'\n\nexport { SnippetLocation } from '../api/graphql/generated/types'\n\n// TODO: clean up the exports below, as most of them are for internal consumptions only\n// and should not be publicly exposed\nexport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentDocumentFallback,\n type MakeswiftComponentSnapshot,\n type MakeswiftComponentMetadata as MakeswiftComponentSnapshotMetadata,\n componentDocumentToRootEmbeddedDocument,\n} from './component-snapshot'\n\nexport {\n type Snippet,\n type Font,\n type MakeswiftPageDocument,\n type MakeswiftPageSnapshot,\n pageToRootDocument,\n} from './page-snapshot'\n\n// TODO: remove, leftover from the `getSitemap` method removed in 0.25.0:\n// https://github.com/makeswift/makeswift/releases/tag/%40makeswift%2Fruntime%400.25.0\nexport type Sitemap = {\n id: string\n loc: string\n lastmod?: string\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n alternateRefs?: {\n hreflang: string\n href: string\n }[]\n}[]\n\nexport type MakeswiftPage = z.infer<typeof Schema.pageData>\nexport type MakeswiftGetPagesResult = z.infer<typeof Schema.getPagesResult>\nexport type PreviewTokenPayload = z.infer<typeof Schema.previewTokenPayload>\nexport type GetFontsAPI = z.infer<typeof Schema.fonts>\n\ntype GetPagesParams = z.infer<typeof Schema.getPagesParams>\ntype GetPageResult = z.infer<typeof Schema.getPageResult>\n\nexport class MakeswiftClient extends MakeswiftRestAPIClient {\n private graphqlClient: MakeswiftGraphQLApiClient\n private runtime: ReactRuntimeCore\n\n constructor(\n apiKey: string,\n {\n runtime,\n }: {\n runtime: ReactRuntimeCore\n },\n ) {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift client must be passed a valid Makeswift site API key: ' +\n \"`new Makeswift('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n super({\n fetch: runtime.fetch,\n apiKey,\n apiOrigin: runtime.apiOrigin,\n })\n\n this.graphqlClient = new MakeswiftGraphQLApiClient({\n endpoint: runtime.graphqlApiEndpoint,\n })\n\n this.runtime = runtime\n }\n\n private getPagesInternal = async ({\n siteVersion = null,\n ...params\n }: {\n siteVersion?: SiteVersion | null\n } & GetPagesParams = {}): Promise<MakeswiftGetPagesResult> => {\n const queryParams = getPagesQueryParams(params)\n\n const response = await this.fetch(`v5/pages?${queryParams.toString()}`, siteVersion)\n if (!response.ok) {\n const body = await failedResponseBody(response)\n throw new RestApiClientError('Failed to get pages', response, {\n body: body,\n siteVersion,\n params,\n })\n }\n\n const result = await response.json()\n const parsedResponse = Schema.getPagesResult.safeParse(result)\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse 'getPages' response: ${parsedResponse.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n return parsedResponse.data\n }\n\n getPages = toIterablePaginationResult(this.getPagesInternal)\n\n async getPage(\n pathname: string,\n { siteVersion = null, locale }: { siteVersion?: SiteVersion | null; locale?: string } = {},\n ): Promise<GetPageResult | null> {\n const url = new URL(`v3/pages/${encodeURIComponent(pathname)}`, this.apiOrigin)\n if (locale) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const json = await response.json()\n\n return Schema.getPageResult.parse(json)\n }\n\n private async getTypographies(\n typographyIds: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Typography | null)[]> {\n if (typographyIds.length === 0) return []\n\n const url = new URL(`v3/typographies/bulk`, this.apiOrigin)\n\n typographyIds.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get typographies for [${typographyIds.join(', ')}]`,\n response,\n { body: failedBody, siteVersion },\n )\n }\n\n const body = await response.json()\n\n return body\n }\n\n private async getSwatches(\n ids: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Swatch | null)[]> {\n if (ids.length === 0) return []\n\n const url = new URL(`v3/swatches/bulk`, this.apiOrigin)\n\n ids.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(`Failed to get swatches for ${ids.join(', ')}`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n return await response.json()\n }\n\n private async getElementTreesBulk(\n ids: string[],\n siteVersion: SiteVersion | null,\n locale?: string,\n ): Promise<(MakeswiftComponentDocument | null)[]> {\n if (ids.length === 0) return []\n\n const requestBody: { ids: string[]; locale?: string } = { ids }\n if (locale != null) requestBody.locale = locale\n\n const response = await this.fetch('v0/element-trees/bulk', siteVersion, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n // 404 can mean the requested version has no commit (e.g., site never published)\n if (response.status === 404) return ids.map(() => null)\n\n throw new RestApiClientError(\n `Failed to get element trees for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const responseBody = await response.json()\n\n return responseBody.map((item: unknown) =>\n item != null ? Schema.componentDocument.parse(item) : null,\n )\n }\n\n private async getIntrospectedResources(\n {\n swatchIds,\n ...unversionedResourceIds\n }: UnversionedResourcesQueryVariables & { swatchIds: string[] },\n siteVersion: SiteVersion | null,\n ): Promise<UnversionedResourcesQueryResult & { swatches: (Swatch | null)[] }> {\n const unversionedResources =\n await this.graphqlClient.getUnversionedResources(unversionedResourceIds)\n\n const swatches = await this.getSwatches(swatchIds, siteVersion)\n\n return { ...unversionedResources, swatches }\n }\n\n // TODO: Consolidate this method with the introspectMany method once the\n // unstable_getComponentSnapshots method is stable and tested in production.\n private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const descriptors = this.getElementDescriptors()\n const swatchIds = new Set<string>()\n const fileIds = new Set<string>()\n const typographyIds = new Set<string>()\n const tableIds = new Set<string>()\n const pageIds = new Set<string>()\n const globalElements = new Map<string, GlobalElement | null>()\n const localizedGlobalElements = new Map<string, LocalizedGlobalElement | null>()\n const localizedResourcesMap = new Map<string, string | null>()\n\n const remaining = [element]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n const globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n localizedGlobalElements.set(localizedGlobalElement.id, localizedGlobalElement)\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => fileIds.add(fileId))\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId =>\n typographyIds.add(typographyId),\n )\n\n getTableIds(descriptor, props[propName]).forEach(tableId => tableIds.add(tableId))\n\n getPageIds(descriptor, props[propName]).forEach(pageId => pageIds.add(pageId))\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n\n remaining.push(child)\n }\n })\n })\n }\n }\n\n const typographies = await this.getTypographies([...typographyIds], siteVersion)\n\n typographies.forEach(typography => {\n typography?.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n\n if (swatchId != null) swatchIds.add(swatchId)\n })\n })\n\n const pagePathnames = await this.getPagePathnameSlices([...pageIds], siteVersion, { locale })\n\n const { swatches, files, tables } = await this.getIntrospectedResources(\n {\n swatchIds: [...swatchIds],\n fileIds: [...fileIds],\n tableIds: [...tableIds],\n },\n siteVersion,\n )\n\n const apiResources = {\n [APIResourceType.Swatch]: [...swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...globalElements.entries()].map(([id, value]) => ({\n id,\n value,\n })),\n [APIResourceType.LocalizedGlobalElement]: [...localizedGlobalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n locale,\n }),\n ),\n }\n\n return {\n apiResources,\n localizedResourcesMap:\n locale != null ? { [locale]: Object.fromEntries(localizedResourcesMap.entries()) } : {},\n }\n }\n\n private async introspectMany(\n trees: { id: string; data: Element }[],\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<Map<string, CacheData>> {\n if (trees.length === 0) return new Map()\n\n const descriptors = this.getElementDescriptors()\n\n // Shared caches for global elements (deduplication across trees)\n const globalElementCache = new Map<string, GlobalElement | null>()\n const localizedGlobalElementCache = new Map<string, LocalizedGlobalElement | null>()\n\n // Per-tree tracking, keyed by tree ID\n const treeCaches = new Map(\n trees.map(tree => [\n tree.id,\n {\n data: tree.data,\n swatchIds: new Set<string>(),\n fileIds: new Set<string>(),\n typographyIds: new Set<string>(),\n tableIds: new Set<string>(),\n pageIds: new Set<string>(),\n globalElements: new Map<string, GlobalElement | null>(),\n localizedGlobalElements: new Map<string, LocalizedGlobalElement | null>(),\n localizedResourcesMap: new Map<string, string | null>(),\n },\n ]),\n )\n\n // DFS traversal per tree\n for (const currentTreeCache of treeCaches.values()) {\n const remaining = [currentTreeCache.data]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n\n // Fetch global element, using cache if already fetched for another tree\n let globalElement: GlobalElement | null\n if (globalElementCache.has(globalElementId)) {\n globalElement = globalElementCache.get(globalElementId)!\n } else {\n globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n globalElementCache.set(globalElementId, globalElement)\n }\n\n let elementData = globalElement?.data\n\n if (locale) {\n let localizedGlobalElement: LocalizedGlobalElement | null\n if (localizedGlobalElementCache.has(globalElementId)) {\n localizedGlobalElement = localizedGlobalElementCache.get(globalElementId)!\n } else {\n localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n localizedGlobalElementCache.set(globalElementId, localizedGlobalElement)\n }\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n currentTreeCache.localizedGlobalElements.set(\n localizedGlobalElement.id,\n localizedGlobalElement,\n )\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n currentTreeCache.localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n currentTreeCache.globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n currentTreeCache.swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => {\n currentTreeCache.fileIds.add(fileId)\n })\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId => {\n currentTreeCache.typographyIds.add(typographyId)\n })\n\n getTableIds(descriptor, props[propName]).forEach(tableId => {\n currentTreeCache.tableIds.add(tableId)\n })\n\n getPageIds(descriptor, props[propName]).forEach(pageId => {\n currentTreeCache.pageIds.add(pageId)\n })\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n remaining.push(child)\n }\n })\n })\n }\n }\n }\n\n // Accumulate shared sets from per-tree state for bulk calls\n const allSwatchIds = new Set<string>()\n const allFileIds = new Set<string>()\n const allTypographyIds = new Set<string>()\n const allTableIds = new Set<string>()\n const allPageIds = new Set<string>()\n\n for (const currentTreeCache of treeCaches.values()) {\n currentTreeCache.swatchIds.forEach(id => allSwatchIds.add(id))\n currentTreeCache.fileIds.forEach(id => allFileIds.add(id))\n currentTreeCache.typographyIds.forEach(id => allTypographyIds.add(id))\n currentTreeCache.tableIds.forEach(id => allTableIds.add(id))\n currentTreeCache.pageIds.forEach(id => allPageIds.add(id))\n }\n\n // One combined round of bulk sub-resource calls\n\n // 1. Fetch typographies first (needed for secondary swatch discovery)\n const typographies = await this.getTypographies([...allTypographyIds], siteVersion)\n\n // 2. Secondary discovery: check for additional swatch IDs in typography styles\n typographies.forEach(typography => {\n if (typography == null) return\n\n const secondarySwatchIds: string[] = []\n typography.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n if (swatchId != null) {\n secondarySwatchIds.push(swatchId)\n allSwatchIds.add(swatchId)\n }\n })\n\n if (secondarySwatchIds.length > 0) {\n // Add discovered swatches to per-tree sets for trees that reference this typography\n for (const currentTreeCache of treeCaches.values()) {\n if (currentTreeCache.typographyIds.has(typography.id)) {\n secondarySwatchIds.forEach(id => currentTreeCache.swatchIds.add(id))\n }\n }\n }\n })\n\n // 3. Fetch remaining resources in parallel\n const [pagePathnames, { swatches, files, tables }] = await Promise.all([\n this.getPagePathnameSlices([...allPageIds], siteVersion, { locale }),\n this.getIntrospectedResources(\n {\n swatchIds: [...allSwatchIds],\n fileIds: [...allFileIds],\n tableIds: [...allTableIds],\n },\n siteVersion,\n ),\n ])\n\n // Build per-tree CacheData using only the resources that tree references\n const result = new Map<string, CacheData>()\n\n for (const [treeId, currentTreeCache] of treeCaches) {\n const apiResources = {\n [APIResourceType.Swatch]: [...currentTreeCache.swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...currentTreeCache.fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...currentTreeCache.typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...currentTreeCache.tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...currentTreeCache.pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...currentTreeCache.globalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n }),\n ),\n [APIResourceType.LocalizedGlobalElement]: [\n ...currentTreeCache.localizedGlobalElements.entries(),\n ].map(([id, value]) => ({\n id,\n value,\n locale,\n })),\n }\n\n result.set(treeId, {\n apiResources,\n localizedResourcesMap:\n locale != null\n ? { [locale]: Object.fromEntries(currentTreeCache.localizedResourcesMap.entries()) }\n : {},\n })\n }\n\n return result\n }\n\n async getPageSnapshot(\n pathname: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftPageSnapshot | null> {\n const queryParams = (): string => {\n const params = new URLSearchParams()\n if (locale) params.set('locale', locale)\n if (allowLocaleFallback != null) params.set('allowLocaleFallback', `${allowLocaleFallback}`)\n return params.toString()\n }\n\n const siteVersion = await siteVersionPromise\n const response = await this.fetch(\n `v4/pages/${encodeURIComponent(pathname)}/document?${queryParams()}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const document: MakeswiftPageDocument = await response.json()\n const baseLocalizedPage = document.localizedPages.find(({ parentId }) => parentId == null)\n\n const cacheData = await this.introspect(\n baseLocalizedPage?.data ?? document.data,\n siteVersion,\n // The /v3/pages endpoint returns null for document.locale when the requested locale is the default.\n // This legacy behavior is set to change with the upcoming /v4/pages endpoint.\n // We rely on document.locale when reading from the API cache, so ensure the cache is built during\n // introspection using the same value.\n document.locale,\n )\n\n return {\n document,\n cacheData,\n }\n }\n\n async getComponentSnapshot(\n id: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n unstable_enforceSuccess = false,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n unstable_enforceSuccess?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n\n const parseElementTreeResponse = async (\n response: Response,\n ): Promise<MakeswiftComponentDocument | null> => {\n if (!response.ok) {\n // See comment on `failedResponseBody` for why we always consume the\n // response body of failed responses.\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) {\n return null\n }\n\n throw new RestApiClientError(`Failed to get component snapshot for '${id}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const responseBody = await response.json()\n const parsed = Schema.componentDocumentResponse.parse(responseBody)\n if ('notFound' in parsed) return null\n return parsed\n }\n\n const getElementTree = async (\n searchParams: URLSearchParams,\n ): Promise<MakeswiftComponentDocument | null> => {\n const response = await this.fetch(\n `v2/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n return await parseElementTreeResponse(response)\n }\n\n const getPrimaryTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const getFallbackTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const primaryTree = await getPrimaryTree()\n\n const result =\n primaryTree == null && canAttemptLocaleFallback ? await getFallbackTree() : primaryTree\n\n if (result == null) {\n return {\n document: {\n id,\n locale: locale ?? null,\n data: null,\n },\n key,\n cacheData: CacheData.empty(),\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n const document = result\n const cacheData = await this.introspect(document.data, siteVersion, document.locale)\n\n return {\n document,\n cacheData,\n key,\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n /**\n * Fetches multiple component snapshots in a single bulk request with unified introspection.\n *\n * @param ids - Element tree IDs to fetch. Maximum 100 IDs per call.\n */\n // TODO: Make getComponentSnapshot use this method under the hood once the v0 bulk endpoint is stable.\n async unstable_getComponentSnapshots(\n ids: string[],\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot[]> {\n if (ids.length === 0) return []\n const siteVersion = await siteVersionPromise\n\n // Step 1: Bulk fetch\n let documents = await this.getElementTreesBulk(ids, siteVersion, locale)\n\n // Step 2: Locale fallback — second-pass for IDs that returned null\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n const fallbackIndices: number[] = []\n\n if (canAttemptLocaleFallback) {\n documents.forEach((doc, i) => {\n if (doc == null) fallbackIndices.push(i)\n })\n\n if (fallbackIndices.length > 0) {\n const fallbackIds = fallbackIndices.map(i => ids[i])\n const fallbackDocuments = await this.getElementTreesBulk(fallbackIds, siteVersion)\n\n fallbackIndices.forEach((originalIndex, fallbackIndex) => {\n documents[originalIndex] = fallbackDocuments[fallbackIndex]\n })\n }\n }\n\n // Step 3: Unified introspection for all trees that have data\n const treesToIntrospect = documents\n .map(doc => (doc?.data != null ? { id: doc.id, data: doc.data } : null))\n .filter(isNonNullable)\n\n const cacheDataMap = await this.introspectMany(treesToIntrospect, siteVersion, locale ?? null)\n\n // Step 4: Build per-component results\n return ids.map((id, i) => {\n const document = documents[i]\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n\n if (document == null || document.data == null) {\n return {\n document: { id, locale: locale ?? null, data: null },\n key,\n cacheData: CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n }\n\n return {\n document,\n key,\n cacheData: cacheDataMap.get(id) ?? CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n })\n }\n\n async getTable(tableId: string): Promise<Table | null> {\n return this.graphqlClient.getTable(tableId)\n }\n\n getTranslatableData(elementTree: ElementData): Record<string, Data> {\n return getTranslatableContent(this.getElementDescriptors(), elementTree)\n }\n\n mergeTranslatedData(elementTree: ElementData, translatedData: Record<string, Data>): Element {\n return mergeTranslatedContent(this.getElementDescriptors(), elementTree, translatedData)\n }\n\n async readPreviewToken(token: string): Promise<PreviewTokenPayload | null> {\n const response = await this.fetch('v1/preview-tokens/reads', null, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n cache: 'no-store',\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 401) {\n console.error(`Preview token is invalid or expired`, {\n response: failedBody,\n })\n\n return null\n }\n\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to verify preview token`, response, {\n body: failedBody,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.previewTokenPayload.safeParse(json)\n if (!parsed.success) {\n throw new Error(\n `Failed to parse preview token payload: ${parsed.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n\n return parsed.data\n }\n\n async unstable_getFonts(siteVersion: SiteVersion | null = null): Promise<GetFontsAPI | null> {\n const response = await this.fetch('v1_unstable/fonts', siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError('Failed to fetch fonts', response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.fonts.safeParse(json)\n if (!parsed.success) {\n console.error('Failed to parse fonts API response', {\n response: json,\n siteVersion,\n })\n\n return null\n }\n\n return parsed.data\n }\n\n private getElementDescriptors() {\n return getPropControllerDescriptors(this.runtime.protoStore.getState())\n }\n}\n\nfunction getPagesQueryParams({\n limit = 100,\n after,\n sortBy,\n sortDirection,\n includeOffline,\n pathPrefix,\n locale,\n}: GetPagesParams): URLSearchParams {\n const params = new URLSearchParams()\n\n if (limit != null) params.set('limit', limit.toString())\n if (after != null) params.set('after', after)\n if (sortBy != null) params.set('sortBy', sortBy)\n if (sortDirection != null) params.set('sortDirection', sortDirection)\n if (includeOffline != null) params.set('includeOffline', includeOffline.toString())\n if (pathPrefix != null) params.set('pathPrefix', pathPrefix)\n if (locale != null) params.set('locale', locale)\n\n return params\n}\n"],"mappings":"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","names":["getResourcesFromElementDescriptors","elementDescriptors","element"]}
@@ -0,0 +1,23 @@
1
+ import {
2
+ RenderElementPayload,
3
+ RenderContext,
4
+ setRenderContext,
5
+ getRenderContext,
6
+ ServerCSSCollector,
7
+ ServerElement,
8
+ RSCElementRenderer,
9
+ MakeswiftComponent,
10
+ Slot
11
+ } from "../../runtimes/react/server";
12
+ export {
13
+ MakeswiftComponent,
14
+ RenderContext as MakeswiftRenderContext,
15
+ RSCElementRenderer,
16
+ RenderElementPayload,
17
+ ServerCSSCollector,
18
+ ServerElement,
19
+ Slot,
20
+ getRenderContext,
21
+ setRenderContext
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/react/server/index.ts"],"sourcesContent":["export {\n type ServerRenderContext,\n RenderElementPayload,\n RenderContext as MakeswiftRenderContext,\n setRenderContext,\n getRenderContext,\n ServerCSSCollector,\n ServerElement,\n RSCElementRenderer,\n MakeswiftComponent,\n Slot,\n} from '../../runtimes/react/server'\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,EACiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -1,24 +1,57 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { createElement } from "react";
3
3
  import { forwardRef, memo } from "react";
4
+ import { FallbackComponent } from "../../../components/shared/FallbackComponent";
5
+ import { EditableServerElement } from "../server/components/editable-server-element";
6
+ import { useServerElementsCache } from "../server/components/server-elements-cache";
4
7
  import { useBuiltinSuspense } from "../hooks/use-builtin-suspense";
5
- import { useComponent } from "../hooks/use-component";
8
+ import { useComponent, useComponentMeta } from "../hooks/use-component";
9
+ import { useIsReadOnly } from "../hooks/use-is-read-only";
6
10
  import { canAcceptRef } from "../utils/can-accept-ref";
7
- import { FallbackComponent } from "../../../components/shared/FallbackComponent";
8
11
  import { ResolveProps } from "./resolve-props";
9
12
  import { ActivityOrFallback } from "./activity-with-fallback";
10
13
  const ElementData = memo(
11
14
  forwardRef(function ElementData2({ elementData }, ref) {
12
- const Component = useComponent(elementData.type);
13
- const builtinSuspense = useBuiltinSuspense(elementData.type);
14
- if (Component == null) {
15
- console.warn(`Unknown component '${elementData.type}'`, { elementData });
16
- return /* @__PURE__ */ jsx(FallbackComponent, { ref, text: "Component not found" });
15
+ const componentMeta = useComponentMeta(elementData.type);
16
+ if (componentMeta == null) {
17
+ const msg = `Component metadata not found for '${elementData.type}'`;
18
+ console.warn(msg);
19
+ return /* @__PURE__ */ jsx(
20
+ FallbackComponent,
21
+ {
22
+ ref,
23
+ text: "Component not found",
24
+ details: msg
25
+ }
26
+ );
17
27
  }
18
- const forwardRef2 = canAcceptRef(Component);
19
- return /* @__PURE__ */ jsx(ActivityOrFallback, { suspenseFallback: builtinSuspense, children: /* @__PURE__ */ jsx(ResolveProps, { element: elementData, children: (props) => forwardRef2 ? /* @__PURE__ */ createElement(Component, { ...props, key: elementData.key, ref }) : /* @__PURE__ */ createElement(Component, { ...props, key: elementData.key }) }) });
28
+ return componentMeta.server ? /* @__PURE__ */ jsx(ElementDataServer, { elementData, ref }) : /* @__PURE__ */ jsx(ElementDataClient, { elementData, ref });
20
29
  })
21
30
  );
31
+ const ElementDataServer = forwardRef(function ElementDataServer2({ elementData }, ref) {
32
+ const rscNode = useServerElementsCache().getElement(elementData.key);
33
+ const isReadOnly = useIsReadOnly();
34
+ if (isReadOnly) {
35
+ if (rscNode == null) {
36
+ console.error(
37
+ `React node not found for server component ${elementData.type}, element key ${elementData.key}`
38
+ );
39
+ return /* @__PURE__ */ jsx(FallbackComponent, { ref, text: "Server component not found" });
40
+ }
41
+ return rscNode;
42
+ }
43
+ return /* @__PURE__ */ jsx(EditableServerElement, { initialElementData: elementData, children: rscNode });
44
+ });
45
+ const ElementDataClient = forwardRef(function ElementDataClient2({ elementData }, ref) {
46
+ const Component = useComponent(elementData.type);
47
+ const builtinSuspense = useBuiltinSuspense(elementData.type);
48
+ if (Component == null) {
49
+ console.warn(`Unknown component '${elementData.type}'`, { elementData });
50
+ return /* @__PURE__ */ jsx(FallbackComponent, { ref, text: "Component not found" });
51
+ }
52
+ const forwardRef2 = canAcceptRef(Component);
53
+ return /* @__PURE__ */ jsx(ActivityOrFallback, { suspenseFallback: builtinSuspense, children: /* @__PURE__ */ jsx(ResolveProps, { element: elementData, children: (props) => forwardRef2 ? /* @__PURE__ */ createElement(Component, { ...props, key: elementData.key, ref }) : /* @__PURE__ */ createElement(Component, { ...props, key: elementData.key }) }) });
54
+ });
22
55
  export {
23
56
  ElementData
24
57
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/components/ElementData.tsx"],"sourcesContent":["import { Ref, forwardRef, memo, ReactNode } from 'react'\n\nimport { ElementData as ReactPageElementData } from '../../../state/read-only-state'\nimport { useBuiltinSuspense } from '../hooks/use-builtin-suspense'\nimport { useComponent } from '../hooks/use-component'\nimport { canAcceptRef } from '../utils/can-accept-ref'\nimport { FallbackComponent } from '../../../components/shared/FallbackComponent'\nimport { ResolveProps } from './resolve-props'\nimport { ActivityOrFallback } from './activity-with-fallback'\n\ntype ElementDataProps = {\n elementData: ReactPageElementData\n}\n\nexport const ElementData = memo(\n forwardRef(function ElementData({ elementData }: ElementDataProps, ref: Ref<unknown>): ReactNode {\n const Component = useComponent(elementData.type)\n const builtinSuspense = useBuiltinSuspense(elementData.type)\n\n if (Component == null) {\n console.warn(`Unknown component '${elementData.type}'`, { elementData })\n return <FallbackComponent ref={ref as Ref<HTMLDivElement>} text=\"Component not found\" />\n }\n\n const forwardRef = canAcceptRef(Component)\n\n return (\n <ActivityOrFallback suspenseFallback={builtinSuspense}>\n <ResolveProps element={elementData}>\n {props =>\n forwardRef ? (\n <Component {...props} key={elementData.key} ref={ref} />\n ) : (\n <Component {...props} key={elementData.key} />\n )\n }\n </ResolveProps>\n </ActivityOrFallback>\n )\n }),\n)\n"],"mappings":"AAqBa;AAUC;AA/Bd,SAAc,YAAY,YAAuB;AAGjD,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AAM5B,MAAM,cAAc;AAAA,EACzB,WAAW,SAASA,aAAY,EAAE,YAAY,GAAqB,KAA8B;AAC/F,UAAM,YAAY,aAAa,YAAY,IAAI;AAC/C,UAAM,kBAAkB,mBAAmB,YAAY,IAAI;AAE3D,QAAI,aAAa,MAAM;AACrB,cAAQ,KAAK,sBAAsB,YAAY,IAAI,KAAK,EAAE,YAAY,CAAC;AACvE,aAAO,oBAAC,qBAAkB,KAAiC,MAAK,uBAAsB;AAAA,IACxF;AAEA,UAAMC,cAAa,aAAa,SAAS;AAEzC,WACE,oBAAC,sBAAmB,kBAAkB,iBACpC,8BAAC,gBAAa,SAAS,aACpB,qBACCA,cACE,8BAAC,aAAW,GAAG,OAAO,KAAK,YAAY,KAAK,KAAU,IAEtD,8BAAC,aAAW,GAAG,OAAO,KAAK,YAAY,KAAK,GAGlD,GACF;AAAA,EAEJ,CAAC;AACH;","names":["ElementData","forwardRef"]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/components/ElementData.tsx"],"sourcesContent":["import { type ReactNode, type Ref, forwardRef, memo } from 'react'\n\nimport { type ElementData as MakeswiftElementData } from '../../../state/read-only-state'\nimport { FallbackComponent } from '../../../components/shared/FallbackComponent'\n\nimport { EditableServerElement } from '../server/components/editable-server-element'\nimport { useServerElementsCache } from '../server/components/server-elements-cache'\n\nimport { useBuiltinSuspense } from '../hooks/use-builtin-suspense'\nimport { useComponent, useComponentMeta } from '../hooks/use-component'\nimport { useIsReadOnly } from '../hooks/use-is-read-only'\n\nimport { canAcceptRef } from '../utils/can-accept-ref'\n\nimport { ResolveProps } from './resolve-props'\nimport { ActivityOrFallback } from './activity-with-fallback'\n\ntype ElementDataProps = {\n elementData: MakeswiftElementData\n}\n\nexport const ElementData = memo(\n forwardRef(function ElementData({ elementData }: ElementDataProps, ref: Ref<unknown>): ReactNode {\n const componentMeta = useComponentMeta(elementData.type)\n\n if (componentMeta == null) {\n const msg = `Component metadata not found for '${elementData.type}'`\n console.warn(msg)\n return (\n <FallbackComponent\n ref={ref as Ref<HTMLDivElement>}\n text=\"Component not found\"\n details={msg}\n />\n )\n }\n\n return componentMeta.server ? (\n <ElementDataServer elementData={elementData} ref={ref} />\n ) : (\n <ElementDataClient elementData={elementData} ref={ref} />\n )\n }),\n)\n\nconst ElementDataServer = forwardRef(function ElementDataServer(\n { elementData }: ElementDataProps,\n ref: Ref<unknown>,\n): ReactNode {\n // lookup and render RSC node for the element; see the `ServerElementsCache` comment\n const rscNode = useServerElementsCache().getElement(elementData.key)\n const isReadOnly = useIsReadOnly()\n\n if (isReadOnly) {\n if (rscNode == null) {\n console.error(\n `React node not found for server component ${elementData.type}, element key ${elementData.key}`,\n )\n\n return (\n <FallbackComponent ref={ref as Ref<HTMLDivElement>} text=\"Server component not found\" />\n )\n }\n\n return rscNode\n }\n\n return <EditableServerElement initialElementData={elementData}>{rscNode}</EditableServerElement>\n})\n\nconst ElementDataClient = forwardRef(function ElementDataClient(\n { elementData }: ElementDataProps,\n ref: Ref<unknown>,\n): ReactNode {\n const Component = useComponent(elementData.type)\n const builtinSuspense = useBuiltinSuspense(elementData.type)\n\n if (Component == null) {\n console.warn(`Unknown component '${elementData.type}'`, { elementData })\n return <FallbackComponent ref={ref as Ref<HTMLDivElement>} text=\"Component not found\" />\n }\n\n const forwardRef = canAcceptRef(Component)\n\n return (\n <ActivityOrFallback suspenseFallback={builtinSuspense}>\n <ResolveProps element={elementData}>\n {props =>\n forwardRef ? (\n <Component {...props} key={elementData.key} ref={ref} />\n ) : (\n <Component {...props} key={elementData.key} />\n )\n }\n </ResolveProps>\n </ActivityOrFallback>\n )\n})\n"],"mappings":"AA6BQ;AA4DI;AAzFZ,SAAmC,YAAY,YAAY;AAG3D,SAAS,yBAAyB;AAElC,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAEvC,SAAS,0BAA0B;AACnC,SAAS,cAAc,wBAAwB;AAC/C,SAAS,qBAAqB;AAE9B,SAAS,oBAAoB;AAE7B,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AAM5B,MAAM,cAAc;AAAA,EACzB,WAAW,SAASA,aAAY,EAAE,YAAY,GAAqB,KAA8B;AAC/F,UAAM,gBAAgB,iBAAiB,YAAY,IAAI;AAEvD,QAAI,iBAAiB,MAAM;AACzB,YAAM,MAAM,qCAAqC,YAAY,IAAI;AACjE,cAAQ,KAAK,GAAG;AAChB,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,SAAS;AAAA;AAAA,MACX;AAAA,IAEJ;AAEA,WAAO,cAAc,SACnB,oBAAC,qBAAkB,aAA0B,KAAU,IAEvD,oBAAC,qBAAkB,aAA0B,KAAU;AAAA,EAE3D,CAAC;AACH;AAEA,MAAM,oBAAoB,WAAW,SAASC,mBAC5C,EAAE,YAAY,GACd,KACW;AAEX,QAAM,UAAU,uBAAuB,EAAE,WAAW,YAAY,GAAG;AACnE,QAAM,aAAa,cAAc;AAEjC,MAAI,YAAY;AACd,QAAI,WAAW,MAAM;AACnB,cAAQ;AAAA,QACN,6CAA6C,YAAY,IAAI,iBAAiB,YAAY,GAAG;AAAA,MAC/F;AAEA,aACE,oBAAC,qBAAkB,KAAiC,MAAK,8BAA6B;AAAA,IAE1F;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,yBAAsB,oBAAoB,aAAc,mBAAQ;AAC1E,CAAC;AAED,MAAM,oBAAoB,WAAW,SAASC,mBAC5C,EAAE,YAAY,GACd,KACW;AACX,QAAM,YAAY,aAAa,YAAY,IAAI;AAC/C,QAAM,kBAAkB,mBAAmB,YAAY,IAAI;AAE3D,MAAI,aAAa,MAAM;AACrB,YAAQ,KAAK,sBAAsB,YAAY,IAAI,KAAK,EAAE,YAAY,CAAC;AACvE,WAAO,oBAAC,qBAAkB,KAAiC,MAAK,uBAAsB;AAAA,EACxF;AAEA,QAAMC,cAAa,aAAa,SAAS;AAEzC,SACE,oBAAC,sBAAmB,kBAAkB,iBACpC,8BAAC,gBAAa,SAAS,aACpB,qBACCA,cACE,8BAAC,aAAW,GAAG,OAAO,KAAK,YAAY,KAAK,KAAU,IAEtD,8BAAC,aAAW,GAAG,OAAO,KAAK,YAAY,KAAK,GAGlD,GACF;AAEJ,CAAC;","names":["ElementData","ElementDataServer","ElementDataClient","forwardRef"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/components/framework-context.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ReactNode,\n type PropsWithChildren,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ForwardRefExoticComponent,\n type RefAttributes,\n forwardRef,\n createContext,\n useContext,\n useMemo,\n} from 'react'\n\nimport { type LinkData } from '@makeswift/prop-controllers'\n\nimport { type Snippet } from '../../../client'\n\nimport { BaseHeadSnippet } from './page/HeadSnippet'\n\ntype HeadComponent = (props: { children: ReactNode }) => ReactNode\ntype HeadSnippet = (props: { snippet: Snippet }) => ReactNode\ntype ImageComponent = (props: {\n src: string\n alt: string\n sizes?: string\n width?: number\n height?: number\n priority?: boolean\n fill?: boolean\n style?: CSSProperties\n}) => ReactNode\n\ntype LinkProps = Omit<ComponentPropsWithoutRef<'a'>, 'onClick'> & {\n linkType?: LinkData['type']\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => unknown\n}\n\ntype LinkComponent = ForwardRefExoticComponent<RefAttributes<HTMLAnchorElement> & LinkProps>\n\nexport type FrameworkContext = {\n Head: HeadComponent\n HeadSnippet: HeadSnippet\n Image: ImageComponent\n Link: LinkComponent\n}\n\n// React 19 automatically hoists metadata tags to the <head>\nconst DefaultHead = ({ children }: PropsWithChildren) => <>{children}</>\n\nconst DefaultHeadSnippet = BaseHeadSnippet\n\nconst DefaultImage: ImageComponent = ({ priority, fill, style, ...props }) => (\n <img\n {...props}\n style={{\n ...(fill\n ? {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n }\n : {}),\n ...style,\n }}\n loading={priority ? 'eager' : 'lazy'}\n />\n)\n\nconst DefaultLink: LinkComponent = forwardRef<HTMLAnchorElement, LinkProps>(\n ({ linkType, ...props }, ref) => <a {...props} ref={ref} />,\n)\n\nconst FrameworkContext = createContext<Partial<FrameworkContext>>({})\n\nexport const FrameworkContextProvider = ({\n value,\n children,\n}: PropsWithChildren<{ value: Partial<FrameworkContext> }>) => {\n const parentContext = useContext(FrameworkContext)\n const mergedContext = useMemo(() => ({ ...parentContext, ...value }), [parentContext, value])\n\n return <FrameworkContext.Provider value={mergedContext}>{children}</FrameworkContext.Provider>\n}\n\nconst defaultContext: FrameworkContext = {\n Head: DefaultHead,\n HeadSnippet: DefaultHeadSnippet,\n Image: DefaultImage,\n Link: DefaultLink,\n}\n\nexport function useFrameworkContext(): FrameworkContext {\n return { ...defaultContext, ...useContext(FrameworkContext) }\n}\n"],"mappings":";AAkDyD;AAhDzD;AAAA,EAQE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,uBAAuB;AA8BhC,MAAM,cAAc,CAAC,EAAE,SAAS,MAAyB,gCAAG,UAAS;AAErE,MAAM,qBAAqB;AAE3B,MAAM,eAA+B,CAAC,EAAE,UAAU,MAAM,OAAO,GAAG,MAAM,MACtE;AAAA,EAAC;AAAA;AAAA,IACE,GAAG;AAAA,IACJ,OAAO;AAAA,MACL,GAAI,OACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MACb,IACA,CAAC;AAAA,MACL,GAAG;AAAA,IACL;AAAA,IACA,SAAS,WAAW,UAAU;AAAA;AAChC;AAGF,MAAM,cAA6B;AAAA,EACjC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,oBAAC,OAAG,GAAG,OAAO,KAAU;AAC3D;AAEA,MAAM,mBAAmB,cAAyC,CAAC,CAAC;AAE7D,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AACF,MAA+D;AAC7D,QAAM,gBAAgB,WAAW,gBAAgB;AACjD,QAAM,gBAAgB,QAAQ,OAAO,EAAE,GAAG,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,KAAK,CAAC;AAE5F,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,eAAgB,UAAS;AACpE;AAEA,MAAM,iBAAmC;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AACR;AAEO,SAAS,sBAAwC;AACtD,SAAO,EAAE,GAAG,gBAAgB,GAAG,WAAW,gBAAgB,EAAE;AAC9D;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/components/framework-context.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ReactNode,\n type PropsWithChildren,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ForwardRefExoticComponent,\n type RefAttributes,\n forwardRef,\n createContext,\n useContext,\n useMemo,\n} from 'react'\n\nimport { type LinkData } from '@makeswift/prop-controllers'\n\nimport { type Snippet } from '../../../client/page-snapshot'\n\nimport { type RenderElementPayload } from '../server/render-element-payload'\n\nimport { BaseHeadSnippet } from './page/HeadSnippet'\n\ntype HeadComponent = (props: { children: ReactNode }) => ReactNode\ntype HeadSnippet = (props: { snippet: Snippet }) => ReactNode\ntype ImageComponent = (props: {\n src: string\n alt: string\n sizes?: string\n width?: number\n height?: number\n priority?: boolean\n fill?: boolean\n style?: CSSProperties\n}) => ReactNode\n\ntype LinkProps = Omit<ComponentPropsWithoutRef<'a'>, 'onClick'> & {\n linkType?: LinkData['type']\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => unknown\n}\n\ntype LinkComponent = ForwardRefExoticComponent<RefAttributes<HTMLAnchorElement> & LinkProps>\n\nexport type FrameworkContext = {\n Head: HeadComponent\n HeadSnippet: HeadSnippet\n Image: ImageComponent\n Link: LinkComponent\n /**\n * Callback to render a single RSC element on the server and return the result.\n */\n renderRSCElement?: (args: RenderElementPayload) => Promise<ReactNode>\n}\n\n// React 19 automatically hoists metadata tags to the <head>\nconst DefaultHead = ({ children }: PropsWithChildren) => <>{children}</>\n\nconst DefaultHeadSnippet = BaseHeadSnippet\n\nconst DefaultImage: ImageComponent = ({ priority, fill, style, ...props }) => (\n <img\n {...props}\n style={{\n ...(fill\n ? {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n }\n : {}),\n ...style,\n }}\n loading={priority ? 'eager' : 'lazy'}\n />\n)\n\nconst DefaultLink: LinkComponent = forwardRef<HTMLAnchorElement, LinkProps>(\n ({ linkType, ...props }, ref) => <a {...props} ref={ref} />,\n)\n\nconst FrameworkContext = createContext<Partial<FrameworkContext>>({})\n\nexport const FrameworkContextProvider = ({\n value,\n children,\n}: PropsWithChildren<{ value: Partial<FrameworkContext> }>) => {\n const parentContext = useContext(FrameworkContext)\n const mergedContext = useMemo(() => ({ ...parentContext, ...value }), [parentContext, value])\n\n return <FrameworkContext.Provider value={mergedContext}>{children}</FrameworkContext.Provider>\n}\n\nconst defaultContext: FrameworkContext = {\n Head: DefaultHead,\n HeadSnippet: DefaultHeadSnippet,\n Image: DefaultImage,\n Link: DefaultLink,\n}\n\nexport function useFrameworkContext(): FrameworkContext {\n return { ...defaultContext, ...useContext(FrameworkContext) }\n}\n"],"mappings":";AAwDyD;AAtDzD;AAAA,EAQE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,uBAAuB;AAkChC,MAAM,cAAc,CAAC,EAAE,SAAS,MAAyB,gCAAG,UAAS;AAErE,MAAM,qBAAqB;AAE3B,MAAM,eAA+B,CAAC,EAAE,UAAU,MAAM,OAAO,GAAG,MAAM,MACtE;AAAA,EAAC;AAAA;AAAA,IACE,GAAG;AAAA,IACJ,OAAO;AAAA,MACL,GAAI,OACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MACb,IACA,CAAC;AAAA,MACL,GAAG;AAAA,IACL;AAAA,IACA,SAAS,WAAW,UAAU;AAAA;AAChC;AAGF,MAAM,cAA6B;AAAA,EACjC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,oBAAC,OAAG,GAAG,OAAO,KAAU;AAC3D;AAEA,MAAM,mBAAmB,cAAyC,CAAC,CAAC;AAE7D,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AACF,MAA+D;AAC7D,QAAM,gBAAgB,WAAW,gBAAgB;AACjD,QAAM,gBAAgB,QAAQ,OAAO,EAAE,GAAG,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,KAAK,CAAC;AAE5F,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,eAAgB,UAAS;AACpE;AAEA,MAAM,iBAAmC;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AACR;AAEO,SAAS,sBAAwC;AACtD,SAAO,EAAE,GAAG,gBAAgB,GAAG,WAAW,gBAAgB,EAAE;AAC9D;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { useMemo } from "react";
2
+ import { StylesheetEngine } from "../server/css/css-runtime";
3
+ import { useClientCSS } from "../server/css/client-css";
4
+ import { useBreakpoints } from "./use-breakpoints";
5
+ const useEditableElementStylesheetFactory = ({
6
+ elementKey: baseElementKey
7
+ }) => {
8
+ const { updateStyle } = useClientCSS();
9
+ const breakpoints = useBreakpoints();
10
+ const stylesheetEngine = useMemo(
11
+ () => new StylesheetEngine(
12
+ breakpoints,
13
+ baseElementKey,
14
+ void 0,
15
+ (_className, css, elementKey, propName) => {
16
+ if (elementKey && propName)
17
+ updateStyle(elementKey, propName, css);
18
+ }
19
+ ),
20
+ [breakpoints, baseElementKey, updateStyle]
21
+ );
22
+ return useMemo(
23
+ () => ({
24
+ get: (propName) => stylesheetEngine.child(propName),
25
+ useDefinedStyles: () => {
26
+ }
27
+ }),
28
+ [stylesheetEngine]
29
+ );
30
+ };
31
+ export {
32
+ useEditableElementStylesheetFactory
33
+ };
34
+ //# sourceMappingURL=use-editable-element-stylesheet-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-editable-element-stylesheet-factory.tsx"],"sourcesContent":["import { useMemo } from 'react'\n\nimport { StylesheetEngine } from '../server/css/css-runtime'\nimport { useClientCSS } from '../server/css/client-css'\n\nimport { type StylesheetFactory } from '../stylesheet-factory'\n\nimport { useBreakpoints } from './use-breakpoints'\n\nexport const useEditableElementStylesheetFactory = ({\n elementKey: baseElementKey,\n}: {\n elementKey: string\n}): StylesheetFactory => {\n const { updateStyle } = useClientCSS()\n const breakpoints = useBreakpoints()\n\n const stylesheetEngine = useMemo(\n () =>\n new StylesheetEngine(\n breakpoints,\n baseElementKey,\n undefined,\n (_className, css, elementKey, propName) => {\n if (elementKey && propName) updateStyle(elementKey, propName, css)\n },\n ),\n [breakpoints, baseElementKey, updateStyle],\n )\n\n return useMemo(\n () => ({\n get: (propName: string) => stylesheetEngine.child(propName),\n useDefinedStyles: () => {\n // No-op, the styles are updated as they are defined\n },\n }),\n [stylesheetEngine],\n )\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAI7B,SAAS,sBAAsB;AAExB,MAAM,sCAAsC,CAAC;AAAA,EAClD,YAAY;AACd,MAEyB;AACvB,QAAM,EAAE,YAAY,IAAI,aAAa;AACrC,QAAM,cAAc,eAAe;AAEnC,QAAM,mBAAmB;AAAA,IACvB,MACE,IAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,YAAY,KAAK,YAAY,aAAa;AACzC,YAAI,cAAc;AAAU,sBAAY,YAAY,UAAU,GAAG;AAAA,MACnE;AAAA,IACF;AAAA,IACF,CAAC,aAAa,gBAAgB,WAAW;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,KAAK,CAAC,aAAqB,iBAAiB,MAAM,QAAQ;AAAA,MAC1D,kBAAkB,MAAM;AAAA,MAExB;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\n\nimport { type StylesheetFactory } from '../stylesheet-factory'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nimport { useResolvableRecord } from './use-resolvable-record'\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\nexport function useResolvedProps({\n elementKey,\n propDefs,\n propData,\n controlInstances,\n stylesheetFactory,\n}: {\n elementKey: string\n propDefs: Record<string, ControlDefinition>\n propData: Record<string, Data>\n controlInstances: Record<string, ControlInstance> | null\n stylesheetFactory: StylesheetFactory\n}): Record<string, unknown> {\n const resourceResolver = useResourceResolver()\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = propData[propName]\n const control = controlInstances?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [propData, cache, resourceResolver, controlInstances, stylesheetFactory],\n )\n\n const resolvables = useMemo<Record<string, Resolvable<unknown>>>(\n () =>\n mapValues(propDefs, (def, propName) => {\n const defaultValue = (def.config as any)?.defaultValue\n return propErrorHandlingProxy(resolveProp(def, propName), defaultValue, error => {\n console.warn(\n `Error reading value for prop \"${propName}\" of element ${elementKey}, falling back to \\`${defaultValue}\\`.`,\n { control: def, error },\n )\n })\n }),\n [propDefs, resolveProp, elementKey],\n )\n\n const props = useResolvableRecord(resolvables)\n\n // no need to call `triggerResolve` on the server, all the resources should already be in\n // the host API client's cache (populated from the snapshot's cache)\n useEffect(() => {\n props.triggerResolve().catch(err => {\n console.log(`Error while resolving props for element ${elementKey}`, err)\n })\n }, [props, elementKey])\n\n // the order is important here, the styles are defined in the process of the props resolution,\n // calling `useDefinedStyles` before the props are resolved would effectively be a noop\n const resolvedProps = useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n\n stylesheetFactory.useDefinedStyles()\n\n return resolvedProps\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,QAAQ,sBAAsB,mBAAmB;AAC9E;AAAA,EAGE;AAAA,OAGK;AAEP,SAAS,2BAA2B;AAGpC,SAAS,8BAA8B;AAEvC,SAAS,2BAA2B;AAQ7B,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAM4B;AAC1B,QAAM,mBAAmB,oBAAoB;AAE7C,QAAM,QAAQ,OAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,cAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,SAAS,QAAQ;AAC9B,YAAM,UAAU,mBAAmB,QAAQ;AAE3C,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,OAAO,kBAAkB,kBAAkB,iBAAiB;AAAA,EACzE;AAEA,QAAM,cAAc;AAAA,IAClB,MACE,UAAU,UAAU,CAAC,KAAK,aAAa;AACrC,YAAM,eAAgB,IAAI,QAAgB;AAC1C,aAAO,uBAAuB,YAAY,KAAK,QAAQ,GAAG,cAAc,WAAS;AAC/E,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,gBAAgB,UAAU,uBAAuB,YAAY;AAAA,UACtG,EAAE,SAAS,KAAK,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IACH,CAAC,UAAU,aAAa,UAAU;AAAA,EACpC;AAEA,QAAM,QAAQ,oBAAoB,WAAW;AAI7C,YAAU,MAAM;AACd,UAAM,eAAe,EAAE,MAAM,SAAO;AAClC,cAAQ,IAAI,2CAA2C,UAAU,IAAI,GAAG;AAAA,IAC1E,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,UAAU,CAAC;AAItB,QAAM,gBAAgB,qBAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AAE9F,oBAAkB,iBAAiB;AAEnC,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-resolved-props.ts"],"sourcesContent":["import { useMemo, useEffect, useRef, useSyncExternalStore, useCallback } from 'react'\nimport {\n ControlDefinition,\n ControlInstance,\n mapValues,\n type Data,\n type Resolvable,\n} from '@makeswift/controls'\n\nimport { useResourceResolver } from './use-resource-resolver'\n\nimport { type StylesheetFactory } from '../stylesheet-factory'\nimport { propErrorHandlingProxy } from '../utils/prop-error-handling-proxy'\n\nimport { useResolvableRecord } from './use-resolvable-record'\n\ntype CacheItem = {\n data: Data\n control: ControlInstance | undefined\n resolvedValue: Resolvable<unknown>\n}\n\n/**\n * Client-side prop resolution. See `resolveProps` for server-side counterpart.\n */\nexport function useResolvedProps({\n elementKey,\n propDefs,\n propData,\n controlInstances,\n stylesheetFactory,\n}: {\n elementKey: string\n propDefs: Record<string, ControlDefinition>\n propData: Record<string, Data>\n controlInstances: Record<string, ControlInstance> | null\n stylesheetFactory: StylesheetFactory\n}): Record<string, unknown> {\n const resourceResolver = useResourceResolver()\n\n const cache = useRef<Record<string, CacheItem>>({}).current\n const resolveProp = useCallback(\n (def: ControlDefinition, propName: string) => {\n const data = propData[propName]\n const control = controlInstances?.[propName]\n\n if (\n cache[propName] != null &&\n data === cache[propName].data &&\n control === cache[propName].control\n ) {\n return cache[propName].resolvedValue\n }\n\n const resolvedValue = def.resolveValue(\n data,\n resourceResolver,\n stylesheetFactory.get(propName),\n control,\n )\n\n cache[propName] = { data, control, resolvedValue }\n return resolvedValue\n },\n [propData, cache, resourceResolver, controlInstances, stylesheetFactory],\n )\n\n const resolvables = useMemo<Record<string, Resolvable<unknown>>>(\n () =>\n mapValues(propDefs, (def, propName) => {\n const defaultValue = (def.config as any)?.defaultValue\n return propErrorHandlingProxy(resolveProp(def, propName), defaultValue, error => {\n console.warn(\n `Error reading value for prop \"${propName}\" of element ${elementKey}, falling back to \\`${defaultValue}\\`.`,\n { control: def, error },\n )\n })\n }),\n [propDefs, resolveProp, elementKey],\n )\n\n const props = useResolvableRecord(resolvables)\n\n // no need to call `triggerResolve` on the server, all the resources should already be in\n // the host API client's cache (populated from the snapshot's cache)\n useEffect(() => {\n props.triggerResolve().catch(err => {\n console.log(`Error while resolving props for element ${elementKey}`, err)\n })\n }, [props, elementKey])\n\n // the order is important here, the styles are defined in the process of the props resolution,\n // calling `useDefinedStyles` before the props are resolved would effectively be a noop\n const resolvedProps = useSyncExternalStore(props.subscribe, props.readStable, props.readStable)\n\n stylesheetFactory.useDefinedStyles()\n\n return resolvedProps\n}\n"],"mappings":"AAAA,SAAS,SAAS,WAAW,QAAQ,sBAAsB,mBAAmB;AAC9E;AAAA,EAGE;AAAA,OAGK;AAEP,SAAS,2BAA2B;AAGpC,SAAS,8BAA8B;AAEvC,SAAS,2BAA2B;AAW7B,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAM4B;AAC1B,QAAM,mBAAmB,oBAAoB;AAE7C,QAAM,QAAQ,OAAkC,CAAC,CAAC,EAAE;AACpD,QAAM,cAAc;AAAA,IAClB,CAAC,KAAwB,aAAqB;AAC5C,YAAM,OAAO,SAAS,QAAQ;AAC9B,YAAM,UAAU,mBAAmB,QAAQ;AAE3C,UACE,MAAM,QAAQ,KAAK,QACnB,SAAS,MAAM,QAAQ,EAAE,QACzB,YAAY,MAAM,QAAQ,EAAE,SAC5B;AACA,eAAO,MAAM,QAAQ,EAAE;AAAA,MACzB;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,cAAc;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,OAAO,kBAAkB,kBAAkB,iBAAiB;AAAA,EACzE;AAEA,QAAM,cAAc;AAAA,IAClB,MACE,UAAU,UAAU,CAAC,KAAK,aAAa;AACrC,YAAM,eAAgB,IAAI,QAAgB;AAC1C,aAAO,uBAAuB,YAAY,KAAK,QAAQ,GAAG,cAAc,WAAS;AAC/E,gBAAQ;AAAA,UACN,iCAAiC,QAAQ,gBAAgB,UAAU,uBAAuB,YAAY;AAAA,UACtG,EAAE,SAAS,KAAK,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IACH,CAAC,UAAU,aAAa,UAAU;AAAA,EACpC;AAEA,QAAM,QAAQ,oBAAoB,WAAW;AAI7C,YAAU,MAAM;AACd,UAAM,eAAe,EAAE,MAAM,SAAO;AAClC,cAAQ,IAAI,2CAA2C,UAAU,IAAI,GAAG;AAAA,IAC1E,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,UAAU,CAAC;AAItB,QAAM,gBAAgB,qBAAqB,MAAM,WAAW,MAAM,YAAY,MAAM,UAAU;AAE9F,oBAAkB,iBAAiB;AAEnC,SAAO;AACT;","names":[]}
@@ -0,0 +1,66 @@
1
+ import { useCallback, useEffect, useRef } from "react";
2
+ import { useFrameworkContext } from "../components/hooks/use-framework-context";
3
+ import { useServerElementsCache } from "../server/components/server-elements-cache";
4
+ import { useDocumentKey, useDocumentLocale } from "./use-document-context";
5
+ import { useApiResourcesClient } from "./use-api-resources-client";
6
+ const useServerElementRefresh = ({
7
+ elementKey
8
+ }) => {
9
+ const requestIdRef = useRef(0);
10
+ const lastAppliedRequestId = useRef(0);
11
+ const { renderRSCElement } = useFrameworkContext();
12
+ const { updateElement } = useServerElementsCache();
13
+ const documentKey = useDocumentKey();
14
+ const documentLocale = useDocumentLocale();
15
+ const apiResourcesClient = useApiResourcesClient();
16
+ useEffect(() => {
17
+ return () => {
18
+ lastAppliedRequestId.current = ++requestIdRef.current;
19
+ };
20
+ }, []);
21
+ return useCallback(
22
+ async (elementData) => {
23
+ if (!documentKey)
24
+ return false;
25
+ if (elementData.key !== elementKey) {
26
+ console.error(
27
+ `Cannot refresh server element: mismatching element key '${elementData.key}' != '${elementKey}'`
28
+ );
29
+ return false;
30
+ }
31
+ if (!renderRSCElement) {
32
+ console.error(
33
+ `Cannot refresh server element '${elementKey}' of type '${elementData.type}': \`renderRSCElement\` callback is null`
34
+ );
35
+ return false;
36
+ }
37
+ try {
38
+ const requestId = ++requestIdRef.current;
39
+ const reactNode = await renderRSCElement({
40
+ elementData,
41
+ cacheData: apiResourcesClient.cacheData,
42
+ documentContext: {
43
+ key: documentKey,
44
+ locale: documentLocale ?? void 0
45
+ }
46
+ });
47
+ if (requestId > lastAppliedRequestId.current) {
48
+ updateElement(elementKey, reactNode);
49
+ lastAppliedRequestId.current = requestId;
50
+ return true;
51
+ }
52
+ } catch (error) {
53
+ console.error(
54
+ `Failed to refresh server element '${elementKey}' of type '${elementData.type}'`,
55
+ error
56
+ );
57
+ }
58
+ return false;
59
+ },
60
+ [renderRSCElement, documentKey, documentLocale, elementKey, apiResourcesClient, updateElement]
61
+ );
62
+ };
63
+ export {
64
+ useServerElementRefresh
65
+ };
66
+ //# sourceMappingURL=use-server-element-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/runtimes/react/hooks/use-server-element-refresh.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react'\n\nimport { type ElementData } from '../../../state/read-only-state'\n\nimport { useFrameworkContext } from '../components/hooks/use-framework-context'\nimport { useServerElementsCache } from '../server/components/server-elements-cache'\n\nimport { useDocumentKey, useDocumentLocale } from './use-document-context'\nimport { useApiResourcesClient } from './use-api-resources-client'\n\n/**\n * Returns a element-scoped callback that renders the provided element data on\n * the server and stores the result in the server element cache under the\n * provided element key.\n *\n * The callback returns true only if the element render succeeds and is committed\n * to the cache. Returns false when rendering is unavailable, fails, or produces a\n * stale/out-of-order result.\n */\nexport const useServerElementRefresh = ({\n elementKey,\n}: {\n elementKey: string\n}): ((elementData: ElementData) => Promise<boolean>) => {\n const requestIdRef = useRef(0)\n const lastAppliedRequestId = useRef(0)\n\n const { renderRSCElement } = useFrameworkContext()\n const { updateElement } = useServerElementsCache()\n\n const documentKey = useDocumentKey()\n const documentLocale = useDocumentLocale()\n const apiResourcesClient = useApiResourcesClient()\n\n useEffect(() => {\n // Invalidate all in-flight requests on unmount so they cannot update the cache\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n lastAppliedRequestId.current = ++requestIdRef.current\n }\n }, [])\n\n return useCallback(\n async (elementData: ElementData): Promise<boolean> => {\n if (!documentKey) return false\n if (elementData.key !== elementKey) {\n console.error(\n `Cannot refresh server element: mismatching element key '${elementData.key}' != '${elementKey}'`,\n )\n return false\n }\n\n if (!renderRSCElement) {\n console.error(\n `Cannot refresh server element '${elementKey}' of type '${elementData.type}': \\`renderRSCElement\\` callback is null`,\n )\n return false\n }\n\n try {\n // Assign each server refresh a sequential ID so we can track response\n // arrival and ignore out-of-order results\n const requestId = ++requestIdRef.current\n const reactNode = await renderRSCElement({\n elementData,\n cacheData: apiResourcesClient.cacheData,\n documentContext: {\n key: documentKey,\n locale: documentLocale ?? undefined,\n },\n })\n\n if (requestId > lastAppliedRequestId.current) {\n updateElement(elementKey, reactNode)\n lastAppliedRequestId.current = requestId\n return true\n }\n } catch (error) {\n console.error(\n `Failed to refresh server element '${elementKey}' of type '${elementData.type}'`,\n error,\n )\n }\n\n return false\n },\n [renderRSCElement, documentKey, documentLocale, elementKey, apiResourcesClient, updateElement],\n )\n}\n"],"mappings":"AAAA,SAAS,aAAa,WAAW,cAAc;AAI/C,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AAEvC,SAAS,gBAAgB,yBAAyB;AAClD,SAAS,6BAA6B;AAW/B,MAAM,0BAA0B,CAAC;AAAA,EACtC;AACF,MAEwD;AACtD,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,uBAAuB,OAAO,CAAC;AAErC,QAAM,EAAE,iBAAiB,IAAI,oBAAoB;AACjD,QAAM,EAAE,cAAc,IAAI,uBAAuB;AAEjD,QAAM,cAAc,eAAe;AACnC,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,qBAAqB,sBAAsB;AAEjD,YAAU,MAAM;AAEd,WAAO,MAAM;AAEX,2BAAqB,UAAU,EAAE,aAAa;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,OAAO,gBAA+C;AACpD,UAAI,CAAC;AAAa,eAAO;AACzB,UAAI,YAAY,QAAQ,YAAY;AAClC,gBAAQ;AAAA,UACN,2DAA2D,YAAY,GAAG,SAAS,UAAU;AAAA,QAC/F;AACA,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,kBAAkB;AACrB,gBAAQ;AAAA,UACN,kCAAkC,UAAU,cAAc,YAAY,IAAI;AAAA,QAC5E;AACA,eAAO;AAAA,MACT;AAEA,UAAI;AAGF,cAAM,YAAY,EAAE,aAAa;AACjC,cAAM,YAAY,MAAM,iBAAiB;AAAA,UACvC;AAAA,UACA,WAAW,mBAAmB;AAAA,UAC9B,iBAAiB;AAAA,YACf,KAAK;AAAA,YACL,QAAQ,kBAAkB;AAAA,UAC5B;AAAA,QACF,CAAC;AAED,YAAI,YAAY,qBAAqB,SAAS;AAC5C,wBAAc,YAAY,SAAS;AACnC,+BAAqB,UAAU;AAC/B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,qCAAqC,UAAU,cAAc,YAAY,IAAI;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,kBAAkB,aAAa,gBAAgB,YAAY,oBAAoB,aAAa;AAAA,EAC/F;AACF;","names":[]}
@@ -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,21 @@ 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
+ validateComponentType(
31
+ // make sure we don't access `component?.name` and trigger loading of the server
32
+ // component unless we're running in the RSC environment
33
+ server && !this.isRSCEnv() ? { type, componentName: label || "Unknown server component" } : {
34
+ type,
35
+ componentName: component?.name || label || "Unknown component"
36
+ }
37
+ );
28
38
  const unregisterComponent = this.protoStore.dispatch(
29
39
  registerComponentEffect(
30
40
  type,
31
- { label, icon, hidden, description, builtinSuspense, unstable_migration },
41
+ { label, icon, hidden, description, builtinSuspense, unstable_migration, server },
32
42
  props ?? {}
33
43
  )
34
44
  );
@@ -37,6 +47,11 @@ class ReactRuntimeCore extends RuntimeCore {
37
47
  "builtinSuspense is ignored in React >= 19.2; components are always wrapped in <Activity>."
38
48
  );
39
49
  }
50
+ if (server && !this.isRSCEnv()) {
51
+ return () => {
52
+ unregisterComponent();
53
+ };
54
+ }
40
55
  const unregisterReactComponent = this.protoStore.dispatch(
41
56
  registerReactComponentEffect(type, component)
42
57
  );
@@ -45,6 +60,9 @@ class ReactRuntimeCore extends RuntimeCore {
45
60
  unregisterReactComponent();
46
61
  };
47
62
  }
63
+ isRSCEnv() {
64
+ return false;
65
+ }
48
66
  }
49
67
  export {
50
68
  ReactRuntimeCore