camox 0.44.0 → 0.46.0

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 (407) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1401 -0
  68. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  69. package/dist/features/canvas/CanvasOverlays.js +254 -0
  70. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  71. package/dist/features/canvas/CanvasPageFrame.js +333 -0
  72. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  73. package/dist/features/canvas/CanvasPreviewPageSlot.js +123 -0
  74. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  75. package/dist/features/canvas/canvasCamera.js +229 -0
  76. package/dist/features/canvas/canvasFlight.js +104 -0
  77. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  78. package/dist/features/canvas/canvasFrameDocument.js +302 -0
  79. package/dist/features/canvas/canvasFrameMode.js +53 -0
  80. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  81. package/dist/features/canvas/canvasItems.js +30 -0
  82. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  83. package/dist/features/canvas/canvasPages.js +79 -0
  84. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  85. package/dist/features/canvas/canvasSelection.js +18 -0
  86. package/dist/features/canvas/canvasStore.js +60 -0
  87. package/dist/features/canvas/canvasThumbnails.js +304 -0
  88. package/dist/features/canvas/canvasZoom.js +10 -0
  89. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  90. package/dist/features/canvas/sidebar/CanvasNavigator.js +124 -0
  91. package/dist/features/canvas/sidebar/CanvasSidebar.js +54 -0
  92. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  93. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  94. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  95. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  96. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  97. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  98. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  99. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  100. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  101. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  102. package/dist/features/canvas/useCanvasCamera.js +783 -0
  103. package/dist/features/canvas/useCanvasFrame.js +148 -0
  104. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  105. package/dist/features/canvas/useCanvasNearness.js +57 -0
  106. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  107. package/dist/features/content/CamoxContent.d.ts +2 -5
  108. package/dist/features/content/CamoxContent.js +174 -271
  109. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  110. package/dist/features/content/ContentAssets.js +315 -0
  111. package/dist/features/content/ContentCollection.js +663 -0
  112. package/dist/features/content/collection-form.js +58 -0
  113. package/dist/features/content/components/AssetCard.js +80 -84
  114. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  115. package/dist/features/content/components/ContentSidebar.js +129 -18
  116. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  117. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  118. package/dist/features/content/components/MissingFromLocale.js +282 -0
  119. package/dist/features/content/components/UploadDropZone.js +27 -31
  120. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  121. package/dist/features/navigation/navigation.d.ts +66 -20
  122. package/dist/features/navigation/navigation.js +257 -90
  123. package/dist/features/og/defaultFonts.js +8 -8
  124. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  125. package/dist/features/og/imageResponse.d.ts +8 -0
  126. package/dist/features/og/imageResponse.js +26 -0
  127. package/dist/features/page/CuratedPageContent.js +167 -0
  128. package/dist/features/page/DerivedPageContent.js +26 -30
  129. package/dist/features/page/SharedLayoutContent.js +25 -27
  130. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  131. package/dist/features/preview/CamoxPreview.js +816 -537
  132. package/dist/features/preview/EditablePageContent.js +1 -1
  133. package/dist/features/preview/EditablePageExperience.js +16 -22
  134. package/dist/features/preview/components/AddBlockSheet.js +273 -0
  135. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  136. package/dist/features/preview/components/AssetLightbox.js +181 -134
  137. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  138. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  139. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  140. package/dist/features/preview/components/BlockThumbnail.js +172 -98
  141. package/dist/features/preview/components/CanvasPreview.js +243 -0
  142. package/dist/features/preview/components/CreatePageModal.js +128 -137
  143. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  144. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  145. package/dist/features/preview/components/DrillRow.js +150 -0
  146. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  147. package/dist/features/preview/components/FieldToolbar.js +160 -110
  148. package/dist/features/preview/components/Frame.js +108 -20
  149. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  150. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  151. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  152. package/dist/features/preview/components/Metadata.js +22 -30
  153. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  154. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  155. package/dist/features/preview/components/OverlayTracker.js +9 -41
  156. package/dist/features/preview/components/Overlays.js +81 -69
  157. package/dist/features/preview/components/PageInfo.js +1748 -0
  158. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  159. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  160. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  161. package/dist/features/preview/components/PageNicknameField.js +22 -26
  162. package/dist/features/preview/components/PagePicker.js +128 -130
  163. package/dist/features/preview/components/PageTree.js +525 -532
  164. package/dist/features/preview/components/PreviewActivation.js +28 -32
  165. package/dist/features/preview/components/PreviewPanel.js +620 -319
  166. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  167. package/dist/features/preview/components/RecordCard.js +80 -0
  168. package/dist/features/preview/components/RecordCombobox.js +178 -0
  169. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  170. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  171. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  172. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  173. package/dist/features/preview/components/SelectionEditor.js +993 -0
  174. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  175. package/dist/features/preview/components/SidebarSection.js +52 -64
  176. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  177. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  178. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  179. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  180. package/dist/features/preview/components/useFieldWriter.js +200 -0
  181. package/dist/features/preview/components/useRecordView.js +383 -0
  182. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  183. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  184. package/dist/features/preview/editingFrame.js +197 -0
  185. package/dist/features/preview/overlayHighlights.js +17 -44
  186. package/dist/features/preview/overlayMessages.js +72 -1
  187. package/dist/features/preview/pageRecord.js +189 -0
  188. package/dist/features/preview/previewConstants.js +6 -2
  189. package/dist/features/preview/previewPageFrame.js +95 -0
  190. package/dist/features/preview/previewPreparation.js +7 -0
  191. package/dist/features/preview/previewSelection.js +32 -63
  192. package/dist/features/preview/previewStore.js +225 -123
  193. package/dist/features/preview/referencePickerFocus.js +29 -0
  194. package/dist/features/preview/repeatableItemTargets.js +56 -0
  195. package/dist/features/preview/selectionReveal.js +21 -0
  196. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  197. package/dist/features/preview/viewportContinuity.js +109 -0
  198. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  199. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  200. package/dist/features/provider/CamoxProvider.js +38 -50
  201. package/dist/features/provider/CoreCamoxProvider.js +69 -50
  202. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  203. package/dist/features/provider/PreviewSignInPage.js +54 -0
  204. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  205. package/dist/features/provider/components/CommandPalette.js +75 -82
  206. package/dist/features/provider/useAdminShortcuts.js +7 -11
  207. package/dist/features/routes/pageRuntime.d.ts +44 -4
  208. package/dist/features/routes/pageRuntime.js +244 -137
  209. package/dist/features/runtime/RuntimeChrome.js +117 -115
  210. package/dist/features/runtime/alternates.js +64 -0
  211. package/dist/features/runtime/analytics.d.ts +7 -0
  212. package/dist/features/runtime/analytics.js +66 -0
  213. package/dist/features/runtime/artifactSources.js +87 -0
  214. package/dist/features/runtime/editingFallback.js +20 -0
  215. package/dist/features/runtime/linkPrefetch.js +97 -0
  216. package/dist/features/runtime/livePages.js +62 -0
  217. package/dist/features/runtime/llmsTxt.js +40 -0
  218. package/dist/features/runtime/loopbackFetch.js +18 -0
  219. package/dist/features/runtime/navigationAccessibility.js +51 -0
  220. package/dist/features/runtime/navigationTarget.js +23 -2
  221. package/dist/features/runtime/pageApp.js +229 -158
  222. package/dist/features/runtime/pageBlockTypes.js +20 -0
  223. package/dist/features/runtime/pageClient.d.ts +2 -4
  224. package/dist/features/runtime/pageClient.js +18 -3
  225. package/dist/features/runtime/pageNavigation.js +254 -32
  226. package/dist/features/runtime/pageServer.d.ts +2 -4
  227. package/dist/features/runtime/pageServer.js +6 -2
  228. package/dist/features/runtime/pageViewport.js +7 -0
  229. package/dist/features/runtime/runtime.d.ts +54 -24
  230. package/dist/features/runtime/runtime.js +766 -191
  231. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  232. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  233. package/dist/features/runtime/runtimeRoutes.js +25 -0
  234. package/dist/features/runtime/scrollRestoration.js +133 -0
  235. package/dist/features/runtime/studioApp.d.ts +4 -3
  236. package/dist/features/runtime/studioApp.js +5 -9
  237. package/dist/features/runtime/studioClient.d.ts +2 -4
  238. package/dist/features/runtime/studioClient.js +12 -3
  239. package/dist/features/runtime/studioServer.d.ts +2 -4
  240. package/dist/features/runtime/studioServer.js +6 -1
  241. package/dist/features/runtime/worker.d.ts +6 -0
  242. package/dist/features/runtime/worker.js +23 -0
  243. package/dist/features/runtime/workerRequest.js +44 -0
  244. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  245. package/dist/features/studio/CamoxStudio.js +34 -49
  246. package/dist/features/studio/FollowAgentProvider.js +327 -0
  247. package/dist/features/studio/components/ChatSidebar.js +356 -0
  248. package/dist/features/studio/components/DraftsControl.js +676 -0
  249. package/dist/features/studio/components/FaviconDialog.js +318 -0
  250. package/dist/features/studio/components/LocalePicker.js +785 -0
  251. package/dist/features/studio/components/Navbar.js +123 -103
  252. package/dist/features/studio/components/ProjectMenu.js +239 -260
  253. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  254. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  255. package/dist/features/studio/components/ThreadComposer.js +157 -0
  256. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  257. package/dist/features/studio/components/ThreadMessages.js +270 -0
  258. package/dist/features/studio/components/UserButton.js +34 -23
  259. package/dist/features/studio/draftLabel.js +33 -0
  260. package/dist/features/studio/draftNotice.js +13 -0
  261. package/dist/features/studio/followAgent.js +241 -0
  262. package/dist/features/studio/followAgentContext.js +7 -0
  263. package/dist/features/studio/localeOptions.js +118 -0
  264. package/dist/features/studio/localeSwitch.js +19 -0
  265. package/dist/features/studio/routes.js +26 -1
  266. package/dist/features/studio/studioStore.js +64 -1
  267. package/dist/features/studio/useTheme.js +24 -27
  268. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  269. package/dist/features/vite/blockBoilerplate.js +6 -5
  270. package/dist/features/vite/blockChunks.js +31 -0
  271. package/dist/features/vite/bundlerLogs.js +17 -0
  272. package/dist/features/vite/definitionsSync.js +158 -226
  273. package/dist/features/vite/devAuthentication.js +4 -16
  274. package/dist/features/vite/devSignIn.js +87 -0
  275. package/dist/features/vite/iconGeneration.js +1 -1
  276. package/dist/features/vite/layoutGeneration.js +11 -1
  277. package/dist/features/vite/publishSeededContent.js +30 -0
  278. package/dist/features/vite/routeGeneration.js +6 -7
  279. package/dist/features/vite/runtimeDev.js +80 -99
  280. package/dist/features/vite/vite.d.ts +51 -31
  281. package/dist/features/vite/vite.js +224 -127
  282. package/dist/features/vite/workerBuild.js +39 -0
  283. package/dist/hooks/use-debounced-field.js +116 -47
  284. package/dist/hooks/use-file-upload.js +114 -67
  285. package/dist/hooks/use-marquee-selection.js +32 -36
  286. package/dist/hooks/use-page-destinations.js +69 -37
  287. package/dist/lib/api-client-server.d.ts +5 -0
  288. package/dist/lib/api-client-server.js +10 -4
  289. package/dist/lib/api-client.d.ts +6 -0
  290. package/dist/lib/api-client.js +51 -16
  291. package/dist/lib/api-socket.js +17 -0
  292. package/dist/lib/auth-page-styles.js +39 -0
  293. package/dist/lib/auth.js +129 -61
  294. package/dist/lib/collection-cache.js +23 -0
  295. package/dist/lib/draft-scope.d.ts +4 -0
  296. package/dist/lib/draft-scope.js +222 -0
  297. package/dist/lib/html.js +12 -0
  298. package/dist/lib/link-pages.js +154 -0
  299. package/dist/lib/locale-path.d.ts +22 -0
  300. package/dist/lib/locale-path.js +57 -0
  301. package/dist/lib/normalized-data.js +252 -152
  302. package/dist/lib/preview-handoff.js +2 -2
  303. package/dist/lib/queries.d.ts +11 -0
  304. package/dist/lib/queries.js +70 -141
  305. package/dist/lib/studio-reads.d.ts +14 -0
  306. package/dist/lib/studio-reads.js +554 -0
  307. package/dist/lib/use-project-room.js +50 -50
  308. package/dist/lib/use-thread.js +310 -0
  309. package/dist/lib/utils.js +25 -29
  310. package/dist/lib/view-locale-context.js +22 -0
  311. package/dist/lib/view-locale.js +46 -0
  312. package/dist/package.js +5 -0
  313. package/dist/studio-overlays.css +41 -151
  314. package/dist/studio.css +2 -2
  315. package/package.json +70 -73
  316. package/skills/camox/SKILL.md +16 -11
  317. package/skills/camox/references/artifacts.md +179 -0
  318. package/skills/camox/references/block-definitions.md +75 -59
  319. package/skills/camox/references/cli-common.md +9 -11
  320. package/skills/camox/references/cli-content.md +92 -69
  321. package/skills/camox/references/cli-publishing.md +26 -0
  322. package/skills/camox/references/dom-integrations.md +27 -0
  323. package/skills/camox/references/field-styling.md +4 -4
  324. package/skills/camox/references/layout-definitions.md +16 -14
  325. package/skills/camox/references/localization.md +56 -0
  326. package/skills/camox/references/routed-layouts.md +133 -15
  327. package/skills/camox-expand/SKILL.md +70 -0
  328. package/skills/camox-expand/references/jobs.md +39 -0
  329. package/skills/camoxify/SKILL.md +29 -7
  330. package/dist/core/components/AddBlockControlBar.js +0 -78
  331. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  332. package/dist/features/metadata/sitemap.d.ts +0 -8
  333. package/dist/features/metadata/sitemap.js +0 -17
  334. package/dist/features/og/imageResponse.node.d.ts +0 -12
  335. package/dist/features/og/imageResponse.node.js +0 -49
  336. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  337. package/dist/features/og/imageResponse.workerd.js +0 -40
  338. package/dist/features/page/PublishedPageContent.js +0 -205
  339. package/dist/features/page/PublishedPageExperience.js +0 -23
  340. package/dist/features/preview/DerivedPreview.js +0 -134
  341. package/dist/features/preview/commentsEnabled.js +0 -8
  342. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  343. package/dist/features/preview/components/AttachedComments.js +0 -331
  344. package/dist/features/preview/components/CommentHeader.js +0 -122
  345. package/dist/features/preview/components/CommentSidebar.js +0 -29
  346. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  347. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  348. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  349. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  350. package/dist/features/preview/components/LeftSidebar.js +0 -68
  351. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  352. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  353. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  354. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  355. package/dist/features/preview/components/PeekedBlock.js +0 -217
  356. package/dist/features/preview/components/PreviewComments.js +0 -56
  357. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  358. package/dist/features/preview/components/PublicationRow.js +0 -422
  359. package/dist/features/preview/components/PublishDialog.js +0 -194
  360. package/dist/features/preview/components/RightSidebar.js +0 -59
  361. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  362. package/dist/features/preview/previewCommentsStore.js +0 -135
  363. package/dist/features/preview/publication.js +0 -81
  364. package/dist/features/preview/usePageComments.js +0 -39
  365. package/dist/features/runtime/SharedChromeContext.js +0 -7
  366. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  367. package/dist/features/vite/appGeneration.js +0 -89
  368. package/dist/lib/view-queries.js +0 -28
  369. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  370. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  371. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  372. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  407. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,12 +1,22 @@
1
- import { generateAppFile, watchAppFile } from "./appGeneration.js";
1
+ import { createServerApiClient } from "../../lib/api-client-server.js";
2
+ import { transformArtifactRuntime } from "./artifactRuntimeMinification.js";
2
3
  import { readAuthTokenForUrl } from "./auth.js";
3
4
  import { watchNewBlockFiles } from "./blockBoilerplate.js";
5
+ import { collectBlockChunks } from "./blockChunks.js";
6
+ import { withoutExpectedCamoxLogs } from "./bundlerLogs.js";
4
7
  import { installDevAuthenticationMiddleware } from "./devAuthentication.js";
8
+ import { installDevSignInLink } from "./devSignIn.js";
5
9
  import { generateIconTypes } from "./iconGeneration.js";
6
- import { syncDefinitions, syncDefinitionsToApi } from "./definitionsSync.js";
10
+ import { generateLayoutFiles, watchLayoutFiles } from "./layoutGeneration.js";
11
+ import { buildClientThenWorker } from "./workerBuild.js";
12
+ import { VIRTUAL_CAMOX_APP, syncDefinitions, syncDefinitionsToApi } from "./definitionsSync.js";
13
+ import { publishSeededContent } from "./publishSeededContent.js";
7
14
  import { cleanupGeneratedRouteFiles } from "./routeGeneration.js";
8
- import { installRuntimeNitroRoutes, loadRuntimeDevModule, resolveRuntimeDevId } from "./runtimeDev.js";
9
- import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { RESOLVED_VIRTUAL_DEV_HTML, createRuntimeRegistryPlugin, loadRuntimeDevModule, resolveRuntimeDevId } from "./runtimeDev.js";
16
+ import { projectIdSchema } from "@camox/api-contract/ids";
17
+ import { DEVELOPMENT_DRAFT } from "@camox/api-contract/drafts";
18
+ import { createHash } from "node:crypto";
19
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
20
  import { dirname, join, resolve } from "node:path";
11
21
  import { fileURLToPath } from "node:url";
12
22
  import { createServer } from "vite-plus";
@@ -23,24 +33,136 @@ const VIRTUAL_PAGE_CLIENT = "virtual:camox/page-client";
23
33
  const RESOLVED_VIRTUAL_PAGE_CLIENT_URL = "\0virtual:camox/page-client-url";
24
34
  const VIRTUAL_STUDIO_CLIENT = "virtual:camox/studio-client";
25
35
  const RESOLVED_VIRTUAL_STUDIO_CLIENT_URL = "\0virtual:camox/studio-client-url";
36
+ const RESOLVED_VIRTUAL_BLOCK_CHUNKS = "\0virtual:camox/block-chunks";
26
37
  const PRODUCTION_API_URL = "https://api.camox.dev";
27
38
  /** Authentication URL to use for Camox authentication (production Camox Dashboard) */
28
39
  const DEFAULT_AUTHENTICATION_URL = "https://app.camox.dev";
40
+ /** What Vite injects into HTML in dev, which the Worker can't ask Vite for itself. */
41
+ async function getDevHtml(server) {
42
+ const html = await server.transformIndexHtml("/", "<html><head></head><body></body></html>");
43
+ return {
44
+ head: /<head[^>]*>([\s\S]*)<\/head>/i.exec(html)?.[1] ?? "",
45
+ body: /<body[^>]*>([\s\S]*)<\/body>/i.exec(html)?.[1] ?? ""
46
+ };
47
+ }
48
+ /** The `onLog` the app set for its client build, which Camox wraps rather than replaces. */
49
+ function findClientOnLog(config) {
50
+ const clientBuild = config.environments?.client?.build;
51
+ return clientBuild?.rolldownOptions?.onLog ?? clientBuild?.rollupOptions?.onLog ?? config.build?.rolldownOptions?.onLog ?? config.build?.rollupOptions?.onLog;
52
+ }
29
53
  /**
30
54
  * Drop a sidecar at `<root>/node_modules/.camox/runtime.json` so the `camox`
31
- * CLI can pick up the same projectSlug / apiUrl / authenticationUrl the
55
+ * CLI can pick up the same Project ID / apiUrl / authenticationUrl the
32
56
  * plugin actually used. The CLI treats the vite config as the source of
33
57
  * truth for those values — there is no other reliable way to recover them
34
- * from outside vite. The environment is *not* written here: the CLI derives
35
- * `dev:<email>` from auth at call time and requires `--production` for prod,
36
- * so a stale build sidecar can't silently route writes to production.
58
+ * from outside vite. No draft is written here: the CLI always works in the
59
+ * developer's development draft (ADR 0010).
37
60
  */
38
61
  function writeRuntimeSidecar(root, data) {
39
62
  const dir = join(root, "node_modules", ".camox");
40
63
  mkdirSync(dir, { recursive: true });
41
64
  writeFileSync(join(dir, "runtime.json"), `${JSON.stringify(data, null, 2)}\n`);
42
65
  }
66
+ const CAMOX_OPTIMIZED_DEPS = [
67
+ "react",
68
+ "react-dom",
69
+ "react-dom/client",
70
+ "react/jsx-runtime",
71
+ "react/jsx-dev-runtime",
72
+ "camox > @base-ui/react/accordion",
73
+ "camox > @base-ui/react/alert-dialog",
74
+ "camox > @base-ui/react/avatar",
75
+ "camox > @base-ui/react/button",
76
+ "camox > @base-ui/react/checkbox",
77
+ "camox > @base-ui/react/combobox",
78
+ "camox > @base-ui/react/dialog",
79
+ "camox > @base-ui/react/input",
80
+ "camox > @base-ui/react/menu",
81
+ "camox > @base-ui/react/merge-props",
82
+ "camox > @base-ui/react/popover",
83
+ "camox > @base-ui/react/select",
84
+ "camox > @base-ui/react/separator",
85
+ "camox > @base-ui/react/switch",
86
+ "camox > @base-ui/react/tabs",
87
+ "camox > @base-ui/react/toggle",
88
+ "camox > @base-ui/react/tooltip",
89
+ "camox > @base-ui/react/use-render",
90
+ "camox > @camox/ui > class-variance-authority",
91
+ "camox > @camox/ui > clsx",
92
+ "camox > @camox/ui > cmdk",
93
+ "camox > @camox/ui > lucide-react",
94
+ "camox > @camox/ui > @shadcn/react/message-scroller",
95
+ "camox > @camox/ui > sonner",
96
+ "camox > @camox/ui > tailwind-merge",
97
+ "camox > @dnd-kit/core",
98
+ "camox > @dnd-kit/modifiers",
99
+ "camox > @dnd-kit/sortable",
100
+ "camox > @dnd-kit/utilities",
101
+ "camox > @lexical/react/LexicalComposer",
102
+ "camox > @lexical/react/LexicalComposerContext",
103
+ "camox > @lexical/react/LexicalContentEditable",
104
+ "camox > @lexical/react/LexicalHistoryPlugin",
105
+ "camox > @lexical/react/LexicalLinkPlugin",
106
+ "camox > @lexical/react/LexicalOnChangePlugin",
107
+ "camox > @lexical/react/LexicalRichTextPlugin",
108
+ "camox > @lexical/link",
109
+ "camox > @lexical/utils",
110
+ "camox > @orpc/client",
111
+ "camox > @orpc/client/fetch",
112
+ "camox > @orpc/tanstack-query",
113
+ "camox > @shikijs/core",
114
+ "camox > @shikijs/engine-javascript",
115
+ "camox > @shikijs/langs/markdown",
116
+ "camox > @shikijs/themes/github-dark-high-contrast",
117
+ "camox > @shikijs/themes/github-light",
118
+ "camox > @sinclair/typebox",
119
+ "camox > @takumi-rs/image-response",
120
+ "camox > @tanstack/react-form",
121
+ "camox > @tanstack/react-query",
122
+ "camox > @tanstack/react-router",
123
+ "camox > @tanstack/react-virtual",
124
+ "camox > @unhead/react/client",
125
+ "camox > @unhead/react/server",
126
+ "camox > @xstate/store",
127
+ "camox > @xstate/store-react",
128
+ "camox > better-auth/client/plugins",
129
+ "camox > better-auth/react",
130
+ "camox > better-auth > @better-auth/core/env",
131
+ "camox > better-auth > @better-auth/core/error",
132
+ "camox > better-auth > @better-auth/core/utils/error-codes",
133
+ "camox > better-auth > @better-auth/core/utils/string",
134
+ "camox > better-auth > @better-fetch/fetch",
135
+ "camox > better-auth > defu",
136
+ "camox > better-auth > nanostores",
137
+ "camox > fractional-indexing",
138
+ "camox > lexical",
139
+ "camox > lucide-react",
140
+ "camox > marked",
141
+ "camox > @tanstack/react-query-devtools/production",
142
+ "camox > partysocket/react",
143
+ "camox > zod"
144
+ ];
145
+ /**
146
+ * The Worker runs in workerd, so its dependencies are pre-bundled too. Discovering them one
147
+ * request at a time would reload the Worker for each, so start from the browser's list.
148
+ */
149
+ const CAMOX_WORKER_OPTIMIZED_DEPS = [
150
+ ...CAMOX_OPTIMIZED_DEPS,
151
+ "react-dom/server",
152
+ "react/compiler-runtime",
153
+ "camox > @unhead/react/server"
154
+ ];
155
+ /**
156
+ * The Project ID a config names, refused on startup when it is missing or malformed, or when the
157
+ * config still names its project by its Project Slug.
158
+ */
159
+ function projectIdOf(options) {
160
+ if ("projectSlug" in options) throw new Error("Camox: `projectSlug` was replaced by `projectId`. Replace it in your camox() config with the Project ID shown in the Camox dashboard, on your project's page.");
161
+ if (!projectIdSchema.safeParse(options.projectId).success) throw new Error(`Camox: ${JSON.stringify(options.projectId)} is not a Project ID. Copy your project's Project ID, a lowercase UUIDv7, from the Camox dashboard into your camox() config.`);
162
+ return options.projectId;
163
+ }
43
164
  function camox(options) {
165
+ const projectUuid = projectIdOf(options);
44
166
  const apiUrl = options._internal?.apiUrl ?? PRODUCTION_API_URL;
45
167
  const authenticationUrl = options._internal?.authenticationUrl ?? DEFAULT_AUTHENTICATION_URL;
46
168
  const enableTanstackDevtools = options._internal?.enableTanstackDevtools ?? false;
@@ -48,9 +170,12 @@ function camox(options) {
48
170
  const runtimeBasePath = options._internal?.runtimeBasePath;
49
171
  let isBuild = false;
50
172
  let isRelease = false;
173
+ /** A release's build, without syncing to Live: what the upgrade job checks a project with. */
174
+ let isDryRun = false;
51
175
  let resolvedConfig;
52
- let environmentName;
53
176
  let localAuth = null;
177
+ let blockChunks = {};
178
+ let devServer;
54
179
  return {
55
180
  name: "camox",
56
181
  enforce: "pre",
@@ -60,65 +185,72 @@ function camox(options) {
60
185
  if (id === VIRTUAL_STUDIO_CSS) return RESOLVED_VIRTUAL_STUDIO_CSS;
61
186
  if (id === VIRTUAL_OVERLAY_CSS) return RESOLVED_VIRTUAL_OVERLAY_CSS;
62
187
  },
63
- load(id) {
188
+ async load(id, loadOptions) {
64
189
  const stylesDir = resolve(sdkRoot, !isBuild && isSdkSource ? ".dev" : "dist");
65
190
  if (id === RESOLVED_VIRTUAL_STUDIO_CSS) {
66
191
  const cssPath = resolve(stylesDir, "studio.css");
67
192
  if (isBuild) {
68
193
  const css = readFileSync(cssPath, "utf-8");
69
- const dataUrl = `data:text/css;base64,${Buffer.from(css).toString("base64")}`;
70
- return `export default ${JSON.stringify(dataUrl)};`;
194
+ const fileName = `assets/camox-studio-${createHash("sha256").update(css).digest("hex").slice(0, 8)}.css`;
195
+ this.emitFile({
196
+ type: "asset",
197
+ fileName,
198
+ source: css
199
+ });
200
+ return `export default ${JSON.stringify(`/${fileName}`)};`;
71
201
  }
72
202
  const cssUrl = `/@fs/${cssPath.replaceAll("\\", "/").replace(/^\/+/, "")}`;
73
203
  return `export default ${JSON.stringify(cssUrl)};`;
74
204
  }
75
205
  if (id === RESOLVED_VIRTUAL_OVERLAY_CSS) {
76
- const css = readFileSync(resolve(stylesDir, "studio-overlays.css"), "utf-8");
206
+ const cssPath = resolve(stylesDir, "studio-overlays.css");
207
+ const css = readFileSync(cssPath, "utf-8");
77
208
  return `export default ${JSON.stringify(css)};`;
78
209
  }
79
210
  if (id === RESOLVED_VIRTUAL_PAGE_CLIENT_URL && isBuild) return "export default \"/_chunks/camox-page-client.mjs\";";
80
211
  if (id === RESOLVED_VIRTUAL_STUDIO_CLIENT_URL && isBuild) return "export default \"/_chunks/camox-studio-client.mjs\";";
81
- return loadRuntimeDevModule(id, { runtimeBasePath });
82
- },
83
- nitro: { setup(nitro) {
84
- if (nitro.options.noExternals !== true) {
85
- const noExternals = Array.isArray(nitro.options.noExternals) ? nitro.options.noExternals : [];
86
- nitro.options.noExternals = [
87
- ...noExternals,
88
- "camox",
89
- "tslib"
90
- ];
212
+ if (id === RESOLVED_VIRTUAL_BLOCK_CHUNKS && isBuild) return `export default ${JSON.stringify(blockChunks)};`;
213
+ if (id === "\0virtual:camox/dev-html") {
214
+ if (!devServer) return "export default null;";
215
+ return `export default ${JSON.stringify(await getDevHtml(devServer))};`;
91
216
  }
92
- installRuntimeNitroRoutes(nitro, { runtimeBasePath });
93
- nitro.hooks.hook("compiled", ({ options }) => {
94
- const serverAssets = join(options.output.serverDir, "assets");
95
- if (!existsSync(serverAssets)) return;
96
- cpSync(serverAssets, join(options.output.publicDir, "assets"), { recursive: true });
217
+ return loadRuntimeDevModule(id, {
218
+ runtimeBasePath,
219
+ ssr: loadOptions?.ssr
97
220
  });
98
- } },
221
+ },
222
+ transform(code, id) {
223
+ return transformArtifactRuntime(code, id);
224
+ },
225
+ generateBundle(_outputOptions, bundle) {
226
+ if (this.environment.name !== "client") return;
227
+ blockChunks = collectBlockChunks(bundle, resolvedConfig.root);
228
+ },
99
229
  async config(_config, env) {
100
230
  const iconIds = await generateIconTypes(resolve(_config.root ?? process.cwd()), options.icons);
101
231
  isBuild = env.command === "build";
102
- isRelease = isBuild && process.env.CAMOX_INTERNAL_RELEASE === "1";
103
- if (isRelease) environmentName = "production";
104
- else {
232
+ const release = process.env.CAMOX_INTERNAL_RELEASE;
233
+ isRelease = isBuild && (release === "1" || release === "dry-run");
234
+ isDryRun = isRelease && release === "dry-run";
235
+ if (!isRelease) {
105
236
  localAuth = readAuthTokenForUrl(authenticationUrl);
106
237
  if (isBuild && !localAuth) throw new Error("Camox: not authenticated. Run `npx camox login` before building the site.");
107
- environmentName = localAuth ? `dev:${localAuth.email}` : "dev:unauthenticated";
108
238
  }
109
239
  return {
110
240
  build: { emitAssets: true },
241
+ ..._config.builder?.buildApp ? {} : { builder: { buildApp: buildClientThenWorker } },
111
242
  define: {
112
243
  __CAMOX_ICON_IDS__: JSON.stringify(iconIds),
113
244
  __CAMOX_TELEMETRY_DISABLED__: JSON.stringify(!!options.disableTelemetry),
114
245
  __ENABLE_TANSTACK_DEVTOOLS__: JSON.stringify(enableTanstackDevtools),
115
246
  __CAMOX_ENABLE_EXPERIMENTAL_FEATURES__: JSON.stringify(options._internal?.enableExperimentalFeatures ?? false),
116
- __CAMOX_ENVIRONMENT_NAME__: JSON.stringify(environmentName),
247
+ __CAMOX_DEVELOPMENT_DRAFT__: JSON.stringify(!isRelease),
117
248
  __CAMOX_API_URL__: JSON.stringify(apiUrl),
118
249
  __CAMOX_AUTHENTICATION_URL__: JSON.stringify(authenticationUrl),
119
- __CAMOX_PROJECT_SLUG__: JSON.stringify(options.projectSlug)
250
+ __CAMOX_PROJECT_ID__: JSON.stringify(projectUuid)
120
251
  },
121
252
  environments: { client: { build: { rollupOptions: {
253
+ onLog: withoutExpectedCamoxLogs(findClientOnLog(_config)),
122
254
  input: {
123
255
  "camox-page-client": VIRTUAL_PAGE_CLIENT,
124
256
  "camox-studio-client": VIRTUAL_STUDIO_CLIENT
@@ -133,147 +265,112 @@ function camox(options) {
133
265
  find: /^tslib$/,
134
266
  replacement: "tslib/tslib.es6.mjs"
135
267
  }] },
136
- optimizeDeps: { include: [
137
- "react",
138
- "react-dom",
139
- "react-dom/client",
140
- "react/jsx-runtime",
141
- "react/jsx-dev-runtime",
142
- "camox > @base-ui/react/accordion",
143
- "camox > @base-ui/react/alert-dialog",
144
- "camox > @base-ui/react/avatar",
145
- "camox > @base-ui/react/button",
146
- "camox > @base-ui/react/combobox",
147
- "camox > @base-ui/react/dialog",
148
- "camox > @base-ui/react/input",
149
- "camox > @base-ui/react/menu",
150
- "camox > @base-ui/react/merge-props",
151
- "camox > @base-ui/react/popover",
152
- "camox > @base-ui/react/select",
153
- "camox > @base-ui/react/separator",
154
- "camox > @base-ui/react/switch",
155
- "camox > @base-ui/react/tabs",
156
- "camox > @base-ui/react/toggle",
157
- "camox > @base-ui/react/tooltip",
158
- "camox > @base-ui/react/use-render",
159
- "camox > @camox/api-contract",
160
- "camox > @camox/api-contract/query-keys",
161
- "camox > @camox/ui > class-variance-authority",
162
- "camox > @camox/ui > clsx",
163
- "camox > @camox/ui > cmdk",
164
- "camox > @camox/ui > lucide-react",
165
- "camox > @camox/ui > sonner",
166
- "camox > @camox/ui > tailwind-merge",
167
- "camox > @dnd-kit/core",
168
- "camox > @dnd-kit/modifiers",
169
- "camox > @dnd-kit/sortable",
170
- "camox > @dnd-kit/utilities",
171
- "camox > @lexical/react/LexicalComposer",
172
- "camox > @lexical/react/LexicalComposerContext",
173
- "camox > @lexical/react/LexicalContentEditable",
174
- "camox > @lexical/react/LexicalHistoryPlugin",
175
- "camox > @lexical/react/LexicalLinkPlugin",
176
- "camox > @lexical/react/LexicalOnChangePlugin",
177
- "camox > @lexical/react/LexicalRichTextPlugin",
178
- "camox > @lexical/link",
179
- "camox > @orpc/client",
180
- "camox > @orpc/client/fetch",
181
- "camox > @orpc/tanstack-query",
182
- "camox > @shikijs/core",
183
- "camox > @shikijs/engine-javascript",
184
- "camox > @shikijs/langs/markdown",
185
- "camox > @shikijs/themes/github-dark-high-contrast",
186
- "camox > @shikijs/themes/github-light",
187
- "camox > @sinclair/typebox",
188
- "camox > @takumi-rs/image-response",
189
- "camox > @tanstack/react-form",
190
- "camox > @tanstack/react-query",
191
- "camox > @tanstack/react-router",
192
- "camox > @tanstack/react-virtual",
193
- "camox > @unhead/react/client",
194
- "camox > @unhead/react/server",
195
- "camox > @xstate/store-react",
196
- "camox > better-auth/client/plugins",
197
- "camox > better-auth/react",
198
- "camox > better-auth > @better-auth/core/env",
199
- "camox > better-auth > @better-auth/core/error",
200
- "camox > better-auth > @better-auth/core/utils/error-codes",
201
- "camox > better-auth > @better-auth/core/utils/string",
202
- "camox > better-auth > @better-fetch/fetch",
203
- "camox > better-auth > defu",
204
- "camox > better-auth > nanostores",
205
- "camox > fractional-indexing",
206
- "camox > lexical",
207
- "camox > lucide-react",
208
- "camox > marked",
209
- "camox > @tanstack/react-query-devtools/production",
210
- "camox > partysocket/react"
211
- ] }
268
+ optimizeDeps: {
269
+ include: CAMOX_OPTIMIZED_DEPS,
270
+ exclude: ["@camox/api-contract", "@camox/api-contract/query-keys"]
271
+ }
272
+ };
273
+ },
274
+ configEnvironment(name, config) {
275
+ if (name === "client") return;
276
+ const build = config.build;
277
+ return {
278
+ optimizeDeps: {
279
+ entries: ["src/**/*.{ts,tsx}"],
280
+ include: CAMOX_WORKER_OPTIMIZED_DEPS,
281
+ exclude: ["camox"]
282
+ },
283
+ build: { rollupOptions: { onLog: withoutExpectedCamoxLogs(build?.rolldownOptions?.onLog ?? build?.rollupOptions?.onLog) } }
212
284
  };
213
285
  },
214
286
  configResolved(config) {
215
287
  resolvedConfig = config;
288
+ if (!config.plugins.some((plugin) => plugin.name.startsWith("vite-plugin-cloudflare"))) throw new Error("Camox: Camox apps run on Cloudflare Workers. Add `cloudflare()` from `@cloudflare/vite-plugin` to your Vite plugins, and point `main` in `wrangler.jsonc` at `camox/worker`.");
216
289
  const routesDir = resolve(config.root, "src/routes");
217
290
  writeRuntimeSidecar(config.root, {
218
- projectSlug: options.projectSlug,
291
+ projectId: projectUuid,
219
292
  apiUrl,
220
293
  authenticationUrl,
221
294
  disableTelemetry: !!options.disableTelemetry
222
295
  });
223
296
  if (!disableCodeGen) {
224
- generateAppFile(config.root);
297
+ generateLayoutFiles(config.root);
225
298
  cleanupGeneratedRouteFiles(routesDir);
226
299
  }
227
300
  if (disableCodeGen) config.logger.warn("⚠️ Code generation is disabled (_internal.disableCodeGen). This option is only meant for momentary debugging — do not deploy or commit your app with it enabled.", { timestamp: true });
228
301
  const mode = config.command === "serve" ? "Running" : "Building";
229
- const environmentLabel = localAuth || isRelease ? environmentName : "authentication required";
230
- config.logger.info(`${mode} Camox app (${environmentLabel})`, { timestamp: true });
302
+ let target = "your development draft";
303
+ if (isDryRun) target = "Live, dry run";
304
+ else if (isRelease) target = "Live";
305
+ else if (!localAuth) target = "authentication required";
306
+ config.logger.info(`${mode} Camox app (${target})`, { timestamp: true });
231
307
  },
232
308
  configureServer(server) {
309
+ devServer = server;
233
310
  const routesDir = resolve(server.config.root, "src/routes");
234
311
  installDevAuthenticationMiddleware(server, {
235
312
  apiUrl,
236
313
  authenticationUrl,
237
314
  isAuthenticated: localAuth !== null
238
315
  });
316
+ if (localAuth?.email) installDevSignInLink(server, {
317
+ projectUuid,
318
+ apiUrl,
319
+ authToken: localAuth.token,
320
+ open: options._internal?.devSignIn?.open,
321
+ openOnceFile: options._internal?.devSignIn?.openOnceFile
322
+ });
239
323
  if (!disableCodeGen) {
240
- watchAppFile(server, server.config.root);
324
+ watchLayoutFiles(server, server.config.root);
241
325
  cleanupGeneratedRouteFiles(routesDir);
242
326
  watchNewBlockFiles(server);
243
327
  }
244
328
  server.httpServer?.once("listening", () => {
245
329
  if (!localAuth) return;
330
+ const authToken = localAuth.token;
246
331
  syncDefinitions(server, {
247
- projectSlug: options.projectSlug,
332
+ projectUuid,
248
333
  apiUrl,
249
- environmentName,
250
334
  autoCreate: true,
251
- authToken: localAuth?.token
335
+ authToken,
336
+ releaseToEmptyLive: options._internal?.seedLiveDeployToken
337
+ }).then(async ({ synced, releasedToLive }) => {
338
+ if (!synced) return;
339
+ const context = {
340
+ client: createServerApiClient(apiUrl, authToken, DEVELOPMENT_DRAFT),
341
+ projectUuid,
342
+ logger: server.config.logger
343
+ };
344
+ const afterSync = options._internal?.afterSync;
345
+ if (afterSync) try {
346
+ await afterSync(context);
347
+ } catch (error) {
348
+ context.logger.warn(`[camox] afterSync failed: ${String(error)}`, { timestamp: true });
349
+ }
350
+ if (releasedToLive) await publishSeededContent(context);
252
351
  });
253
352
  });
254
353
  },
255
354
  async closeBundle() {
256
- if (!isRelease) return;
355
+ if (!isRelease || isDryRun) return;
257
356
  const deployToken = process.env.CAMOX_DEPLOY_TOKEN;
258
357
  if (!deployToken) throw new Error("Camox: CAMOX_DEPLOY_TOKEN is required to release to production.");
259
- const camoxAppPath = "./src/camox/app.ts";
260
358
  const tempServer = await createServer({
261
359
  configFile: false,
262
360
  root: resolvedConfig.root,
263
361
  cacheDir: resolve(resolvedConfig.root, "node_modules", ".vite-camox-temp"),
264
362
  resolve: resolvedConfig.resolve,
265
363
  define: resolvedConfig.define,
364
+ plugins: [createRuntimeRegistryPlugin({ runtimeBasePath })],
266
365
  server: { middlewareMode: true },
267
366
  logLevel: "silent"
268
367
  });
269
368
  try {
270
- const camoxModule = await tempServer.ssrLoadModule(camoxAppPath);
271
- if (!camoxModule.camoxApp) throw new Error(`No camoxApp export found in ${camoxAppPath}`);
369
+ const camoxModule = await tempServer.ssrLoadModule(VIRTUAL_CAMOX_APP);
272
370
  await syncDefinitionsToApi({
273
- camoxApp: camoxModule.camoxApp,
274
- projectSlug: options.projectSlug,
371
+ definitionSet: await camoxModule.camoxApp.getDefinitionSet(),
372
+ projectUuid,
275
373
  apiUrl,
276
- environmentName,
277
374
  autoCreate: false,
278
375
  deployToken,
279
376
  logger: resolvedConfig.logger
@@ -286,4 +383,4 @@ function camox(options) {
286
383
  }
287
384
 
288
385
  //#endregion
289
- export { camox };
386
+ export { CAMOX_OPTIMIZED_DEPS, CAMOX_WORKER_OPTIMIZED_DEPS, camox };
@@ -0,0 +1,39 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+
4
+ //#region src/features/vite/workerBuild.ts
5
+ /**
6
+ * Builds the client first: the Worker's build reads where each block's chunk ended up.
7
+ * This replaces the Cloudflare plugin's order, which builds the Worker first.
8
+ */
9
+ async function buildClientThenWorker(builder) {
10
+ const { client, ...servers } = builder.environments;
11
+ await builder.build(client);
12
+ const clientDir = resolve(builder.config.root, client.config.build.outDir);
13
+ for (const server of Object.values(servers)) {
14
+ await builder.build(server);
15
+ moveImportedAssets(resolve(builder.config.root, server.config.build.outDir), clientDir);
16
+ }
17
+ }
18
+ /**
19
+ * Moves the files the Worker imports as URLs, such as stylesheets, to the client's
20
+ * static assets, which serve them. The Cloudflare plugin's own build does the same.
21
+ */
22
+ function moveImportedAssets(serverDir, clientDir) {
23
+ const manifestPath = join(serverDir, ".vite", "manifest.json");
24
+ if (!existsSync(manifestPath)) return;
25
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
26
+ for (const asset of new Set(Object.values(manifest).flatMap((chunk) => chunk.assets ?? []))) {
27
+ const from = join(serverDir, asset);
28
+ const to = join(clientDir, asset);
29
+ if (!existsSync(from)) continue;
30
+ if (existsSync(to)) rmSync(from);
31
+ else {
32
+ mkdirSync(dirname(to), { recursive: true });
33
+ renameSync(from, to);
34
+ }
35
+ }
36
+ }
37
+
38
+ //#endregion
39
+ export { buildClientThenWorker };