camox 0.44.0 → 0.45.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 (411) 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 +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. 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
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. 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
  398. 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
  399. 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
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. 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 };