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