alinea 2.0.0-preview.9 → 2.0.0-rc2

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 (887) hide show
  1. package/dist/.init/.mcp.json +11 -0
  2. package/dist/.init/AGENTS.md +17 -0
  3. package/dist/.init/CLAUDE.md +1 -0
  4. package/dist/.init/content/pages/welcome.json +1 -1
  5. package/dist/.init/package.json +1 -1
  6. package/dist/.init/src/cms.ts +4 -2
  7. package/dist/.init-pm/bun.lock +0 -0
  8. package/dist/.mcp/later/dev.json +1 -0
  9. package/dist/.mcp/lock/dev.json +1 -0
  10. package/dist/.mcp/online/dev.json +1 -0
  11. package/dist/LICENSES.md +2239 -294
  12. package/dist/adapter/next/cms.d.ts +2 -2
  13. package/dist/adapter/next/cms.js +66 -32
  14. package/dist/adapter/next/context.js +5 -6
  15. package/dist/adapter/next/dashboardUrl.d.ts +6 -0
  16. package/dist/adapter/next/dashboardUrl.js +13 -0
  17. package/dist/adapter/next/devCache.d.ts +16 -0
  18. package/dist/adapter/next/devCache.js +32 -0
  19. package/dist/adapter/next/handler.js +18 -4
  20. package/dist/adapter/next/syncCheck.d.ts +15 -2
  21. package/dist/adapter/next/syncCheck.js +26 -9
  22. package/dist/adapter/next/with-alinea.js +27 -20
  23. package/dist/backend/CommitEntries.d.ts +17 -0
  24. package/dist/backend/CommitEntries.js +39 -0
  25. package/dist/backend/Handler.d.ts +15 -1
  26. package/dist/backend/Handler.js +106 -32
  27. package/dist/backend/api/BasicAuth.js +5 -1
  28. package/dist/backend/api/BlobStore.d.ts +21 -0
  29. package/dist/backend/api/BlobStore.js +63 -0
  30. package/dist/backend/api/CreateBackend.js +10 -8
  31. package/dist/backend/api/DatabaseApi.d.ts +4 -1
  32. package/dist/backend/api/DatabaseApi.js +104 -7
  33. package/dist/backend/api/GithubApi.d.ts +13 -0
  34. package/dist/backend/api/GithubApi.js +217 -54
  35. package/dist/backend/api/OAuth2.js +21 -26
  36. package/dist/backend/api/ProxyMedia.js +3 -0
  37. package/dist/backend/api/database.js +6 -6
  38. package/dist/backend/store/GeneratedDatabase.js +4 -2
  39. package/dist/backend/store/GeneratedDatabaseNode.d.ts +5 -1
  40. package/dist/backend/store/GeneratedDatabaseNode.js +9 -19
  41. package/dist/backend/store/GeneratedRelease.d.ts +1 -1
  42. package/dist/backend/store/GeneratedRelease.js +3 -4
  43. package/dist/backend/util/JWKS.d.ts +4 -0
  44. package/dist/backend/util/JWKS.js +40 -0
  45. package/dist/backend/util/Syncable.d.ts +6 -0
  46. package/dist/backend/util/Syncable.js +3 -1
  47. package/dist/bundled.d.ts +7124 -1459
  48. package/dist/chunks/{node-sqlite-XVNTNMCY.js → bun-sqlite-RI6BYU5S.js} +3 -3
  49. package/dist/chunks/ccitt-Y7TDCCPM.js +90 -0
  50. package/dist/chunks/{chunk-ASYKC6IE.js → chunk-2PP7WJUJ.js} +2 -12
  51. package/dist/chunks/{chunk-DWR5A5KL.js → chunk-4VKHBA57.js} +25 -6
  52. package/dist/chunks/{chunk-QJGGYF6E.js → chunk-4ZA6KZHS.js} +5 -5
  53. package/dist/chunks/{chunk-OFEKTDRF.js → chunk-7DDPSWRY.js} +8383 -5156
  54. package/dist/chunks/{chunk-ETWOY4AL.js → chunk-A2I6MCCS.js} +1 -1
  55. package/dist/chunks/chunk-CYVOGRSD.js +218 -0
  56. package/dist/chunks/{chunk-TIJTT5ZI.js → chunk-G43W7AME.js} +1 -0
  57. package/dist/chunks/{chunk-KMLLLZ6X.js → chunk-NP4M2257.js} +1 -0
  58. package/dist/chunks/{chunk-D6RGFNUW.js → chunk-PMGIIYDD.js} +14215 -8950
  59. package/dist/chunks/{chunk-IYAQC63Y.js → chunk-PSSMQKAH.js} +1607 -744
  60. package/dist/chunks/{chunk-AIU6CMVT.js → chunk-PTYZMV5G.js} +1 -1
  61. package/dist/chunks/{chunk-66YZ47TY.js → chunk-RAR44T5O.js} +1 -1
  62. package/dist/chunks/chunk-RE6CDK2M.js +254 -0
  63. package/dist/chunks/{chunk-UPY2RUZF.js → chunk-TWBREZWC.js} +30 -0
  64. package/dist/chunks/{chunk-QSN6RH6X.js → chunk-VA6NC3MI.js} +1 -1
  65. package/dist/chunks/dist-IDG44KDI.js +7499 -0
  66. package/dist/chunks/jpeg-OJTBZV3C.js +292 -0
  67. package/dist/chunks/jpx-4VRYG2JB.js +667 -0
  68. package/dist/chunks/{bun-sqlite-5SHXN3AT.js → node-sqlite-C7VJ2NSN.js} +3 -3
  69. package/dist/cli/Generate.d.ts +2 -1
  70. package/dist/cli/Generate.js +55 -24
  71. package/dist/cli/Init.d.ts +43 -2
  72. package/dist/cli/Init.js +144 -28
  73. package/dist/cli/Mcp.d.ts +25 -0
  74. package/dist/cli/Mcp.js +106 -0
  75. package/dist/cli/Serve.d.ts +1 -1
  76. package/dist/cli/Serve.js +14 -6
  77. package/dist/cli/bin.js +33 -11
  78. package/dist/cli/build/BuildEmitter.d.ts +5 -1
  79. package/dist/cli/build/BuildEmitter.js +8 -3
  80. package/dist/cli/generate/CompileConfig.js +10 -6
  81. package/dist/cli/generate/CopyStaticFiles.d.ts +1 -1
  82. package/dist/cli/generate/CopyStaticFiles.js +27 -14
  83. package/dist/cli/generate/DevDB.d.ts +4 -1
  84. package/dist/cli/generate/DevDB.js +15 -7
  85. package/dist/cli/generate/GenerateContext.d.ts +3 -0
  86. package/dist/cli/generate/GenerateDashboard.d.ts +1 -1
  87. package/dist/cli/generate/GenerateDashboard.js +20 -6
  88. package/dist/cli/generate/GeneratedPaths.d.ts +21 -0
  89. package/dist/cli/generate/GeneratedPaths.js +33 -0
  90. package/dist/cli/generate/LinkMediaFiles.d.ts +7 -0
  91. package/dist/cli/generate/LinkMediaFiles.js +52 -0
  92. package/dist/cli/generate/MediaLocations.d.ts +18 -0
  93. package/dist/cli/generate/MediaLocations.js +69 -0
  94. package/dist/cli/serve/CreateLocalServer.d.ts +2 -1
  95. package/dist/cli/serve/CreateLocalServer.js +41 -11
  96. package/dist/cli/serve/DevLock.d.ts +11 -0
  97. package/dist/cli/serve/DevLock.js +42 -0
  98. package/dist/cli/serve/DevServer.d.ts +3 -2
  99. package/dist/cli/serve/DevServer.js +18 -6
  100. package/dist/cli/serve/LiveReload.d.ts +1 -1
  101. package/dist/cli/serve/LiveReload.js +3 -2
  102. package/dist/cli/serve/ServeContext.d.ts +0 -1
  103. package/dist/cli/serve/StartServer.d.ts +2 -1
  104. package/dist/cli/serve/StartServer.js +4 -2
  105. package/dist/cli/serve/mcp/DevMcp.d.ts +16 -0
  106. package/dist/cli/serve/mcp/DevMcp.js +50 -0
  107. package/dist/cli/serve/mcp/McpGraph.d.ts +35 -0
  108. package/dist/cli/serve/mcp/McpGraph.js +64 -0
  109. package/dist/cli/serve/mcp/McpInput.d.ts +11 -0
  110. package/dist/cli/serve/mcp/McpInput.js +254 -0
  111. package/dist/cli/serve/mcp/McpInstructions.d.ts +1 -0
  112. package/dist/cli/serve/mcp/McpInstructions.js +16 -0
  113. package/dist/cli/serve/mcp/McpSchema.d.ts +31 -0
  114. package/dist/cli/serve/mcp/McpSchema.js +184 -0
  115. package/dist/cli/serve/mcp/McpServer.d.ts +47 -0
  116. package/dist/cli/serve/mcp/McpServer.js +112 -0
  117. package/dist/cli/serve/mcp/McpTools.d.ts +25 -0
  118. package/dist/cli/serve/mcp/McpTools.js +618 -0
  119. package/dist/cli/static/dashboard/entry.js +2 -1
  120. package/dist/cli/static/init/agents.md +13 -0
  121. package/dist/cli/static/init/cms.js +4 -2
  122. package/dist/cli/util/ForwardCommand.js +4 -12
  123. package/dist/cli/util/PublicDefines.d.ts +1 -0
  124. package/dist/cli/util/PublicDefines.js +2 -1
  125. package/dist/cli/util/RunForwarded.d.ts +13 -0
  126. package/dist/cli/util/RunForwarded.js +166 -0
  127. package/dist/cli/util/WarnPublicEnv.js +2 -0
  128. package/dist/cloud/CloudHandshake.js +9 -46
  129. package/dist/cloud/CloudRemote.js +21 -7
  130. package/dist/cms.d.ts +21 -0
  131. package/dist/cms.js +49 -0
  132. package/dist/components/Alert.d.ts +29 -0
  133. package/dist/components/Alert.js +86 -0
  134. package/dist/components/AppShell.d.ts +15 -0
  135. package/dist/components/AppShell.js +38 -0
  136. package/dist/components/AsyncList.d.ts +52 -0
  137. package/dist/components/AsyncList.js +69 -0
  138. package/dist/components/Badge.d.ts +13 -0
  139. package/dist/components/Badge.js +53 -0
  140. package/dist/components/Blockquote.d.ts +7 -0
  141. package/dist/components/Blockquote.js +26 -0
  142. package/dist/components/Breadcrumbs.d.ts +39 -3
  143. package/dist/components/Breadcrumbs.js +103 -22
  144. package/dist/components/Button.d.ts +33 -8
  145. package/dist/components/Button.js +73 -23
  146. package/dist/components/Calendar.d.ts +28 -3
  147. package/dist/components/Calendar.js +163 -54
  148. package/dist/components/Checkbox.d.ts +18 -7
  149. package/dist/components/Checkbox.js +84 -38
  150. package/dist/components/CheckboxGroup.d.ts +11 -5
  151. package/dist/components/CheckboxGroup.js +55 -19
  152. package/dist/components/Code.d.ts +10 -0
  153. package/dist/components/Code.js +49 -0
  154. package/dist/components/Collapsible.d.ts +25 -0
  155. package/dist/components/Collapsible.js +146 -0
  156. package/dist/components/ColorSwatch.d.ts +9 -2
  157. package/dist/components/ColorSwatch.js +20 -20
  158. package/dist/components/ColorSwatchPicker.d.ts +18 -3
  159. package/dist/components/ColorSwatchPicker.js +31 -27
  160. package/dist/components/ComboBox.d.ts +46 -10
  161. package/dist/components/ComboBox.js +223 -94
  162. package/dist/components/Command.d.ts +66 -0
  163. package/dist/components/Command.js +237 -0
  164. package/dist/components/ContentCard.d.ts +32 -0
  165. package/dist/components/ContentCard.js +221 -0
  166. package/dist/components/ContentGrid.d.ts +58 -0
  167. package/dist/components/ContentGrid.js +220 -0
  168. package/dist/components/DataList.d.ts +27 -0
  169. package/dist/components/DataList.js +68 -0
  170. package/dist/components/DateField.d.ts +19 -4
  171. package/dist/components/DateField.js +51 -44
  172. package/dist/components/DatePicker.d.ts +17 -4
  173. package/dist/components/DatePicker.js +61 -68
  174. package/dist/components/DateRangePicker.d.ts +19 -4
  175. package/dist/components/DateRangePicker.js +69 -80
  176. package/dist/components/Dialog.d.ts +64 -3
  177. package/dist/components/Dialog.js +215 -20
  178. package/dist/components/DropZone.d.ts +25 -3
  179. package/dist/components/DropZone.js +99 -18
  180. package/dist/components/DropdownMenu.d.ts +78 -0
  181. package/dist/components/DropdownMenu.js +318 -0
  182. package/dist/components/Empty.d.ts +46 -0
  183. package/dist/components/Empty.js +93 -0
  184. package/dist/components/Field.d.ts +34 -0
  185. package/dist/components/Field.js +166 -0
  186. package/dist/components/FileTrigger.d.ts +21 -0
  187. package/dist/components/FileTrigger.js +53 -0
  188. package/dist/components/FoldIcon.js +2 -1
  189. package/dist/components/Form.d.ts +23 -0
  190. package/dist/components/Form.js +64 -0
  191. package/dist/components/Heading.d.ts +13 -0
  192. package/dist/components/Heading.js +48 -0
  193. package/dist/components/Icon.d.ts +1 -1
  194. package/dist/components/Icon.js +3 -3
  195. package/dist/components/Kbd.d.ts +8 -0
  196. package/dist/components/Kbd.js +27 -0
  197. package/dist/components/Link.d.ts +21 -4
  198. package/dist/components/Link.js +22 -20
  199. package/dist/components/List.d.ts +23 -63
  200. package/dist/components/List.js +131 -251
  201. package/dist/components/MediaPreview.d.ts +35 -0
  202. package/dist/components/MediaPreview.js +227 -0
  203. package/dist/components/MultipleSelect.d.ts +27 -20
  204. package/dist/components/MultipleSelect.js +234 -216
  205. package/dist/components/NavRail.d.ts +41 -0
  206. package/dist/components/NavRail.js +121 -0
  207. package/dist/components/NumberField.d.ts +23 -5
  208. package/dist/components/NumberField.js +103 -60
  209. package/dist/components/Page.d.ts +57 -0
  210. package/dist/components/Page.js +130 -0
  211. package/dist/components/Popover.d.ts +39 -5
  212. package/dist/components/Popover.js +146 -22
  213. package/dist/components/PreviewFrame.d.ts +46 -0
  214. package/dist/components/PreviewFrame.js +182 -0
  215. package/dist/components/RadioGroup.d.ts +20 -7
  216. package/dist/components/RadioGroup.js +121 -31
  217. package/dist/components/Resizable.d.ts +51 -0
  218. package/dist/components/Resizable.js +1349 -0
  219. package/dist/components/SearchField.d.ts +42 -6
  220. package/dist/components/SearchField.js +117 -56
  221. package/dist/components/Select.d.ts +38 -10
  222. package/dist/components/Select.js +179 -101
  223. package/dist/components/Sheet.d.ts +52 -0
  224. package/dist/components/Sheet.js +216 -0
  225. package/dist/components/Sidebar.d.ts +56 -0
  226. package/dist/components/Sidebar.js +136 -0
  227. package/dist/components/SortableList.d.ts +84 -0
  228. package/dist/components/SortableList.js +368 -0
  229. package/dist/components/Spinner.d.ts +8 -0
  230. package/dist/components/Spinner.js +86 -0
  231. package/dist/components/Stack.d.ts +20 -0
  232. package/dist/components/Stack.js +45 -0
  233. package/dist/components/Surface.js +13 -3
  234. package/dist/components/Switch.d.ts +15 -4
  235. package/dist/components/Switch.js +30 -18
  236. package/dist/components/Table.d.ts +121 -14
  237. package/dist/components/Table.js +537 -96
  238. package/dist/components/Tabs.d.ts +33 -12
  239. package/dist/components/Tabs.js +68 -51
  240. package/dist/components/TagGroup.d.ts +26 -9
  241. package/dist/components/TagGroup.js +97 -31
  242. package/dist/components/Text.d.ts +16 -0
  243. package/dist/components/Text.js +44 -0
  244. package/dist/components/TextField.d.ts +33 -9
  245. package/dist/components/TextField.js +152 -47
  246. package/dist/components/TimeField.d.ts +25 -4
  247. package/dist/components/TimeField.js +82 -42
  248. package/dist/components/Timestamp.d.ts +17 -0
  249. package/dist/components/Timestamp.js +131 -0
  250. package/dist/components/Toggle.d.ts +15 -7
  251. package/dist/components/Toggle.js +4 -54
  252. package/dist/components/ToggleGroup.d.ts +33 -0
  253. package/dist/components/ToggleGroup.js +90 -0
  254. package/dist/components/Toolbar.d.ts +27 -8
  255. package/dist/components/Toolbar.js +51 -40
  256. package/dist/components/Tooltip.d.ts +22 -4
  257. package/dist/components/Tooltip.js +78 -34
  258. package/dist/components/Tree.d.ts +47 -20
  259. package/dist/components/Tree.js +230 -98
  260. package/dist/components/internal/Accept.d.ts +5 -0
  261. package/dist/components/internal/Accept.js +17 -0
  262. package/dist/components/internal/DateControl.d.ts +18 -0
  263. package/dist/components/internal/DateControl.js +92 -0
  264. package/dist/components/internal/DateValue.d.ts +16 -0
  265. package/dist/components/internal/DateValue.js +40 -0
  266. package/dist/components/internal/FormScope.d.ts +2 -0
  267. package/dist/components/internal/FormScope.js +8 -0
  268. package/dist/components/internal/ListBoxGroup.d.ts +12 -0
  269. package/dist/components/internal/ListBoxGroup.js +46 -0
  270. package/dist/components/internal/ListBoxOption.d.ts +20 -0
  271. package/dist/components/internal/ListBoxOption.js +111 -0
  272. package/dist/components/internal/Locale.d.ts +7 -0
  273. package/dist/components/internal/Locale.js +18 -0
  274. package/dist/components/internal/Placement.d.ts +3 -0
  275. package/dist/components/internal/Placement.js +13 -0
  276. package/dist/components/internal/PopoverSurface.d.ts +21 -0
  277. package/dist/components/internal/PopoverSurface.js +67 -0
  278. package/dist/components/internal/SelectionCheckbox.d.ts +8 -0
  279. package/dist/components/internal/SelectionCheckbox.js +57 -0
  280. package/dist/components/internal/Slot.d.ts +7 -0
  281. package/dist/components/internal/Slot.js +26 -0
  282. package/dist/components/internal/ToggleButton.d.ts +26 -0
  283. package/dist/components/internal/ToggleButton.js +68 -0
  284. package/dist/components/internal/Trigger.d.ts +16 -0
  285. package/dist/components/internal/Trigger.js +34 -0
  286. package/dist/components/internal/sortableDrag.d.ts +19 -0
  287. package/dist/components/internal/sortableDrag.js +175 -0
  288. package/dist/components/internal/useDragDrop.d.ts +22 -0
  289. package/dist/components/internal/useDragDrop.js +110 -0
  290. package/dist/components/types.d.ts +110 -0
  291. package/dist/components/types.js +0 -0
  292. package/dist/components.d.ts +33 -5
  293. package/dist/components.js +32 -5
  294. package/dist/config.d.ts +2 -0
  295. package/dist/config.js +12 -0
  296. package/dist/core/Client.js +12 -1
  297. package/dist/core/Config.d.ts +60 -2
  298. package/dist/core/Config.js +162 -9
  299. package/dist/core/Connection.d.ts +13 -1
  300. package/dist/core/Connection.js +9 -1
  301. package/dist/core/DashboardEntry.d.ts +19 -0
  302. package/dist/core/DashboardEntry.js +0 -0
  303. package/dist/core/Document.d.ts +12 -2
  304. package/dist/core/Document.js +39 -7
  305. package/dist/core/EntryFields.d.ts +11 -0
  306. package/dist/core/EntrySeed.d.ts +5 -1
  307. package/dist/core/EntrySeed.js +5 -6
  308. package/dist/core/Expr.d.ts +11 -0
  309. package/dist/core/Field.d.ts +39 -3
  310. package/dist/core/Field.js +25 -2
  311. package/dist/core/Filter.d.ts +31 -1
  312. package/dist/core/Filter.js +5 -0
  313. package/dist/core/Graph.d.ts +36 -8
  314. package/dist/core/Infer.d.ts +17 -0
  315. package/dist/core/Internal.d.ts +3 -0
  316. package/dist/core/Internal.js +4 -0
  317. package/dist/core/Overview.d.ts +315 -0
  318. package/dist/core/Overview.js +48 -0
  319. package/dist/core/Role.d.ts +6 -1
  320. package/dist/core/Role.js +55 -53
  321. package/dist/core/Root.d.ts +32 -3
  322. package/dist/core/Root.js +17 -7
  323. package/dist/core/Schema.js +7 -2
  324. package/dist/core/Scope.d.ts +14 -0
  325. package/dist/core/Scope.js +88 -10
  326. package/dist/core/TextDoc.d.ts +14 -1
  327. package/dist/core/Type.d.ts +71 -11
  328. package/dist/core/Type.js +67 -17
  329. package/dist/core/Validation.d.ts +60 -0
  330. package/dist/core/Validation.js +116 -0
  331. package/dist/core/Workspace.d.ts +1 -0
  332. package/dist/core/Workspace.js +5 -1
  333. package/dist/core/db/EntryReference.d.ts +8 -1
  334. package/dist/core/db/LinkResolver.d.ts +3 -0
  335. package/dist/core/db/LocalStore.d.ts +19 -0
  336. package/dist/core/db/Operation.d.ts +28 -1
  337. package/dist/core/db/Operation.js +161 -25
  338. package/dist/core/db/SyncStats.d.ts +16 -0
  339. package/dist/core/db/SyncStats.js +56 -0
  340. package/dist/core/db/WriteableGraph.d.ts +6 -14
  341. package/dist/core/db/WriteableGraph.js +5 -3
  342. package/dist/core/field/CreateField.d.ts +2 -3
  343. package/dist/core/field/ListField.js +29 -10
  344. package/dist/core/field/RecordField.js +12 -4
  345. package/dist/core/field/RichTextField.js +81 -24
  346. package/dist/core/field/ScalarField.d.ts +2 -2
  347. package/dist/core/field/UnionField.js +27 -4
  348. package/dist/core/media/CompressPdf.browser.d.ts +5 -0
  349. package/dist/core/media/CompressPdf.browser.js +13 -0
  350. package/dist/core/media/CompressPdf.d.ts +6 -0
  351. package/dist/core/media/CompressPdf.js +45 -0
  352. package/dist/core/media/CreatePreview.browser.d.ts +5 -1
  353. package/dist/core/media/CreatePreview.browser.js +16 -0
  354. package/dist/core/media/CreatePreview.d.ts +2 -1
  355. package/dist/core/media/CreatePreview.js +2 -0
  356. package/dist/core/media/FileAccept.d.ts +7 -0
  357. package/dist/core/media/FileAccept.js +29 -0
  358. package/dist/core/media/FileKinds.d.ts +10 -0
  359. package/dist/core/media/FileKinds.js +25 -0
  360. package/dist/core/media/ImageTransform.d.ts +78 -0
  361. package/dist/core/media/ImageTransform.js +108 -0
  362. package/dist/core/media/MediaRoot.js +4 -4
  363. package/dist/core/media/MediaTypes.d.ts +137 -9
  364. package/dist/core/media/MediaTypes.js +277 -51
  365. package/dist/core/media/Pdf.d.ts +15 -0
  366. package/dist/core/media/Pdf.js +31 -0
  367. package/dist/core/media/Summary.d.ts +9 -9
  368. package/dist/core/media/Summary.js +10 -10
  369. package/dist/core/media/TransformImage.browser.d.ts +7 -0
  370. package/dist/core/media/TransformImage.browser.js +38 -0
  371. package/dist/core/media/TransformImage.d.ts +7 -0
  372. package/dist/core/media/TransformImage.js +38 -0
  373. package/dist/core/source/GithubSource.d.ts +4 -0
  374. package/dist/core/source/GithubSource.js +127 -25
  375. package/dist/core/source/GithubUsage.d.ts +21 -0
  376. package/dist/core/source/GithubUsage.js +47 -0
  377. package/dist/core/source/Source.d.ts +2 -0
  378. package/dist/core/source/Source.js +11 -0
  379. package/dist/core/text/MarkdownToTextDoc.d.ts +29 -0
  380. package/dist/core/text/MarkdownToTextDoc.js +524 -0
  381. package/dist/core/text/TextDocToMarkdown.d.ts +20 -0
  382. package/dist/core/text/TextDocToMarkdown.js +316 -0
  383. package/dist/core/util/Async.d.ts +2 -0
  384. package/dist/core/util/Async.js +12 -1
  385. package/dist/core/util/Checks.js +1 -1
  386. package/dist/core/util/JWT.d.ts +1 -1
  387. package/dist/core/util/Objects.d.ts +2 -0
  388. package/dist/core/util/Objects.js +7 -0
  389. package/dist/core/util/OrderKeys.d.ts +11 -0
  390. package/dist/core/util/OrderKeys.js +64 -0
  391. package/dist/core/util/Slugs.js +4 -3
  392. package/dist/core.d.ts +3 -0
  393. package/dist/core.js +8 -1
  394. package/dist/dashboard/App.css +56 -86
  395. package/dist/dashboard/App.d.ts +6 -2
  396. package/dist/dashboard/App.js +41 -20
  397. package/dist/dashboard/Href.d.ts +37 -0
  398. package/dist/dashboard/Href.js +46 -0
  399. package/dist/dashboard/ViewKeys.d.ts +2 -0
  400. package/dist/dashboard/ViewKeys.js +2 -0
  401. package/dist/dashboard/app/AccessDenied.js +26 -18
  402. package/dist/dashboard/app/ActivityStatus.d.ts +5 -4
  403. package/dist/dashboard/app/ActivityStatus.js +138 -153
  404. package/dist/dashboard/app/AppearanceToggle.js +31 -12
  405. package/dist/dashboard/app/AuthView.js +75 -63
  406. package/dist/dashboard/app/BlockSheet.d.ts +50 -0
  407. package/dist/dashboard/app/BlockSheet.js +207 -0
  408. package/dist/dashboard/app/BlockSheetStoryFrame.d.ts +6 -0
  409. package/dist/dashboard/app/BlockSheetStoryFrame.js +29 -0
  410. package/dist/dashboard/app/BlockTabs.d.ts +12 -0
  411. package/dist/dashboard/app/BlockTabs.js +26 -0
  412. package/dist/dashboard/app/CompactField.d.ts +19 -6
  413. package/dist/dashboard/app/CompactField.js +177 -50
  414. package/dist/dashboard/app/CroppedImage.d.ts +17 -0
  415. package/dist/dashboard/app/CroppedImage.js +73 -0
  416. package/dist/dashboard/app/DashboardErrorBoundary.js +27 -15
  417. package/dist/dashboard/app/DashboardLayout.d.ts +5 -3
  418. package/dist/dashboard/app/DashboardLayout.js +59 -37
  419. package/dist/dashboard/app/EntryActions.d.ts +11 -0
  420. package/dist/dashboard/app/EntryActions.js +30 -0
  421. package/dist/dashboard/app/EntryFields.d.ts +26 -13
  422. package/dist/dashboard/app/EntryFields.js +19 -9
  423. package/dist/dashboard/app/EntryForm.d.ts +6 -0
  424. package/dist/dashboard/app/EntryForm.js +28 -0
  425. package/dist/dashboard/app/EntryHeader.d.ts +2 -2
  426. package/dist/dashboard/app/EntryHeader.js +226 -144
  427. package/dist/dashboard/app/EntryHeaderActions.d.ts +4 -1
  428. package/dist/dashboard/app/EntryHeaderActions.js +8 -12
  429. package/dist/dashboard/app/EntryReferences.d.ts +13 -1
  430. package/dist/dashboard/app/EntryReferences.js +62 -55
  431. package/dist/dashboard/app/EntrySidebar.d.ts +7 -5
  432. package/dist/dashboard/app/EntrySidebar.js +104 -98
  433. package/dist/dashboard/app/EntrySidebarPreview.d.ts +4 -1
  434. package/dist/dashboard/app/EntrySidebarPreview.js +37 -106
  435. package/dist/dashboard/app/EntrySidebarToggle.js +5 -6
  436. package/dist/dashboard/app/EntryStatusIcon.d.ts +23 -0
  437. package/dist/dashboard/app/EntryStatusIcon.js +58 -0
  438. package/dist/dashboard/app/EntryTranslationBanner.js +37 -45
  439. package/dist/dashboard/app/EntryValidationModal.d.ts +13 -0
  440. package/dist/dashboard/app/EntryValidationModal.js +77 -0
  441. package/dist/dashboard/app/Explorer.d.ts +15 -6
  442. package/dist/dashboard/app/Explorer.js +276 -520
  443. package/dist/dashboard/app/ExplorerBatchActions.d.ts +19 -0
  444. package/dist/dashboard/app/ExplorerBatchActions.js +183 -0
  445. package/dist/dashboard/app/ExplorerBreadcrumbs.d.ts +13 -0
  446. package/dist/dashboard/app/ExplorerBreadcrumbs.js +119 -0
  447. package/dist/dashboard/app/ExplorerCards.d.ts +8 -3
  448. package/dist/dashboard/app/ExplorerCards.js +91 -289
  449. package/dist/dashboard/app/ExplorerControls.d.ts +20 -0
  450. package/dist/dashboard/app/ExplorerControls.js +170 -0
  451. package/dist/dashboard/app/ExplorerList.d.ts +7 -4
  452. package/dist/dashboard/app/ExplorerList.js +160 -95
  453. package/dist/dashboard/app/ExplorerModal.d.ts +2 -5
  454. package/dist/dashboard/app/ExplorerModal.js +7 -19
  455. package/dist/dashboard/app/ExplorerOverviewHeader.d.ts +6 -0
  456. package/dist/dashboard/app/ExplorerOverviewHeader.js +28 -0
  457. package/dist/dashboard/app/ExplorerPickerContent.d.ts +19 -3
  458. package/dist/dashboard/app/ExplorerPickerContent.js +87 -5
  459. package/dist/dashboard/app/ExplorerScope.d.ts +7 -0
  460. package/dist/dashboard/app/ExplorerScope.js +159 -0
  461. package/dist/dashboard/app/ExplorerTable.d.ts +8 -4
  462. package/dist/dashboard/app/ExplorerTable.js +150 -359
  463. package/dist/dashboard/app/ExplorerTabs.d.ts +12 -0
  464. package/dist/dashboard/app/ExplorerTabs.js +42 -0
  465. package/dist/dashboard/app/ExternalLinkPicker.js +45 -55
  466. package/dist/dashboard/app/FileKind.d.ts +8 -0
  467. package/dist/dashboard/app/FileKind.js +40 -0
  468. package/dist/dashboard/app/ImageEditor.d.ts +13 -0
  469. package/dist/dashboard/app/ImageEditor.js +302 -0
  470. package/dist/dashboard/app/ImageEditorCrop.d.ts +19 -0
  471. package/dist/dashboard/app/ImageEditorCrop.js +90 -0
  472. package/dist/dashboard/app/ImagePicker.d.ts +1 -1
  473. package/dist/dashboard/app/ImagePicker.js +30 -89
  474. package/dist/dashboard/app/LinkPicker.d.ts +1 -1
  475. package/dist/dashboard/app/LinkPicker.js +108 -126
  476. package/dist/dashboard/app/LocaleMenu.d.ts +4 -2
  477. package/dist/dashboard/app/LocaleMenu.js +59 -48
  478. package/dist/dashboard/app/MediaPreviewCell.d.ts +8 -0
  479. package/dist/dashboard/app/MediaPreviewCell.js +50 -0
  480. package/dist/dashboard/app/MoveConfirmDialog.d.ts +5 -0
  481. package/dist/dashboard/app/MoveConfirmDialog.js +79 -0
  482. package/dist/dashboard/app/MoveDialog.d.ts +10 -0
  483. package/dist/dashboard/app/MoveDialog.js +161 -0
  484. package/dist/dashboard/app/NodeEditor.d.ts +11 -0
  485. package/dist/dashboard/app/NodeEditor.js +13 -0
  486. package/dist/dashboard/app/OverviewCell.d.ts +15 -0
  487. package/dist/dashboard/app/OverviewCell.js +249 -0
  488. package/dist/dashboard/app/PendingUploadsDialog.d.ts +2 -0
  489. package/dist/dashboard/app/PendingUploadsDialog.js +49 -0
  490. package/dist/dashboard/app/PendingUploadsView.d.ts +20 -0
  491. package/dist/dashboard/app/PendingUploadsView.js +233 -0
  492. package/dist/dashboard/app/ReadOnlyBadge.d.ts +1 -1
  493. package/dist/dashboard/app/ReadOnlyBadge.js +1 -1
  494. package/dist/dashboard/app/RemoveDialog.d.ts +17 -0
  495. package/dist/dashboard/app/RemoveDialog.js +294 -0
  496. package/dist/dashboard/app/RemoveRedirect.d.ts +7 -0
  497. package/dist/dashboard/app/RemoveRedirect.js +123 -0
  498. package/dist/dashboard/app/SearchBar.d.ts +9 -0
  499. package/dist/dashboard/app/SearchBar.js +31 -0
  500. package/dist/dashboard/app/SidebarLayout.d.ts +2 -1
  501. package/dist/dashboard/app/SidebarLayout.js +28 -1133
  502. package/dist/dashboard/app/SidebarTree.d.ts +12 -6
  503. package/dist/dashboard/app/SidebarTree.js +220 -295
  504. package/dist/dashboard/app/ViewToggle.d.ts +1 -1
  505. package/dist/dashboard/app/ViewToggle.js +17 -10
  506. package/dist/dashboard/app/WorkspaceMenu.d.ts +5 -6
  507. package/dist/dashboard/app/WorkspaceMenu.js +76 -111
  508. package/dist/dashboard/app/WorkspaceRoots.d.ts +2 -4
  509. package/dist/dashboard/app/WorkspaceRoots.js +144 -172
  510. package/dist/dashboard/app/editor/FileEditor.js +161 -125
  511. package/dist/dashboard/app/editor/FilePreview.d.ts +8 -6
  512. package/dist/dashboard/app/editor/FilePreview.js +16 -143
  513. package/dist/dashboard/app/editor/MediaAltField.view.js +5 -5
  514. package/dist/dashboard/app/modals/CreateEntry.js +98 -106
  515. package/dist/dashboard/app/pages/EntryPage.d.ts +2 -1
  516. package/dist/dashboard/app/pages/EntryPage.js +139 -97
  517. package/dist/dashboard/app/pages/RootPage.js +4 -6
  518. package/dist/dashboard/app/pages/SplashPage.d.ts +19 -0
  519. package/dist/dashboard/app/pages/SplashPage.js +208 -193
  520. package/dist/dashboard/app/pages/UsersPage.d.ts +20 -1
  521. package/dist/dashboard/app/pages/UsersPage.js +182 -255
  522. package/dist/dashboard/app/ui/DashboardModal.d.ts +18 -12
  523. package/dist/dashboard/app/ui/DashboardModal.js +54 -69
  524. package/dist/dashboard/atoms/ReactiveNode.js +58 -19
  525. package/dist/dashboard/atoms/activity.d.ts +1 -0
  526. package/dist/dashboard/atoms/activity.js +8 -5
  527. package/dist/dashboard/atoms/auth.js +2 -2
  528. package/dist/dashboard/atoms/config.d.ts +5 -1
  529. package/dist/dashboard/atoms/core.d.ts +16 -2
  530. package/dist/dashboard/atoms/core.js +19 -7
  531. package/dist/dashboard/atoms/create.js +15 -14
  532. package/dist/dashboard/atoms/dashboard.d.ts +16 -0
  533. package/dist/dashboard/atoms/dashboard.js +11 -1
  534. package/dist/dashboard/atoms/editor.d.ts +7 -1
  535. package/dist/dashboard/atoms/editor.js +29 -42
  536. package/dist/dashboard/atoms/entry.d.ts +32 -42
  537. package/dist/dashboard/atoms/entry.js +240 -182
  538. package/dist/dashboard/atoms/entryTable.d.ts +10 -0
  539. package/dist/dashboard/atoms/entryTable.js +43 -0
  540. package/dist/dashboard/atoms/explorer.d.ts +212 -36
  541. package/dist/dashboard/atoms/explorer.js +597 -259
  542. package/dist/dashboard/atoms/graph.d.ts +5 -0
  543. package/dist/dashboard/atoms/graph.js +27 -2
  544. package/dist/dashboard/atoms/link.d.ts +2 -0
  545. package/dist/dashboard/atoms/link.js +11 -5
  546. package/dist/dashboard/atoms/move.d.ts +64 -0
  547. package/dist/dashboard/atoms/move.js +128 -0
  548. package/dist/dashboard/atoms/moveConfirmation.d.ts +34 -0
  549. package/dist/dashboard/atoms/moveConfirmation.js +95 -0
  550. package/dist/dashboard/atoms/nav.d.ts +36 -12
  551. package/dist/dashboard/atoms/nav.js +280 -53
  552. package/dist/dashboard/atoms/overview.d.ts +228 -0
  553. package/dist/dashboard/atoms/overview.js +519 -0
  554. package/dist/dashboard/atoms/remove.d.ts +112 -0
  555. package/dist/dashboard/atoms/remove.js +268 -0
  556. package/dist/dashboard/atoms/root.d.ts +44 -22
  557. package/dist/dashboard/atoms/root.js +294 -164
  558. package/dist/dashboard/atoms/upload.d.ts +105 -3
  559. package/dist/dashboard/atoms/upload.js +266 -11
  560. package/dist/dashboard/atoms/user.js +1 -1
  561. package/dist/dashboard/atoms/utils.d.ts +12 -4
  562. package/dist/dashboard/atoms/utils.js +35 -2
  563. package/dist/dashboard/boot/ActivityEvent.d.ts +1 -1
  564. package/dist/dashboard/boot/Boot.d.ts +2 -0
  565. package/dist/dashboard/boot/Boot.js +33 -18
  566. package/dist/dashboard/boot/BootDev.js +13 -10
  567. package/dist/dashboard/boot/BootProd.d.ts +6 -1
  568. package/dist/dashboard/boot/BootProd.js +3 -2
  569. package/dist/dashboard/boot/DashboardWorker.d.ts +7 -0
  570. package/dist/dashboard/boot/DashboardWorker.js +108 -24
  571. package/dist/dashboard/boot/LoadWorker.js +21 -11
  572. package/dist/dashboard/boot/SyncEvent.d.ts +7 -0
  573. package/dist/dashboard/boot/SyncEvent.js +14 -0
  574. package/dist/dashboard/boot/WorkerDB.d.ts +1 -0
  575. package/dist/dashboard/boot/WorkerDB.js +3 -0
  576. package/dist/dashboard/cms/EntryTable.d.ts +56 -0
  577. package/dist/dashboard/cms/EntryTable.js +273 -0
  578. package/dist/dashboard/cms/FieldChrome.d.ts +21 -0
  579. package/dist/dashboard/cms/FieldChrome.js +26 -0
  580. package/dist/dashboard/cms/ViewProps.d.ts +42 -0
  581. package/dist/dashboard/cms/ViewProps.js +0 -0
  582. package/dist/dashboard/cms/hooks.d.ts +120 -0
  583. package/dist/dashboard/cms/hooks.js +132 -0
  584. package/dist/dashboard/contexts.d.ts +59 -0
  585. package/dist/dashboard/contexts.js +43 -0
  586. package/dist/dashboard/editor/UseField.d.ts +29 -6
  587. package/dist/dashboard/fixture/cms.d.ts +2 -2
  588. package/dist/dashboard/hook/UseEntryEditor.d.ts +4 -1
  589. package/dist/dashboard/hook/UseEntryEditor.js +7 -3
  590. package/dist/dashboard/hook/UseGraph.d.ts +3 -1
  591. package/dist/dashboard/hook/UseLocale.d.ts +3 -1
  592. package/dist/dashboard/hook/UseRoot.d.ts +3 -1
  593. package/dist/dashboard/hook/UseSearchShortcut.d.ts +11 -0
  594. package/dist/dashboard/hook/UseSearchShortcut.js +32 -0
  595. package/dist/dashboard/hook/UseWorkspace.d.ts +3 -1
  596. package/dist/dashboard/hooks.d.ts +16 -98
  597. package/dist/dashboard/hooks.js +15 -90
  598. package/dist/dashboard/icons.d.ts +11 -0
  599. package/dist/dashboard/icons.js +125 -0
  600. package/dist/dashboard.d.ts +23 -1
  601. package/dist/dashboard.js +5 -2
  602. package/dist/database/BrowserEntryStore.d.ts +17 -24
  603. package/dist/database/BrowserEntryStore.js +139 -137
  604. package/dist/database/DatabaseTables.js +2 -2
  605. package/dist/database/EntryDatabase.d.ts +15 -1
  606. package/dist/database/EntryDatabase.js +61 -10
  607. package/dist/database/EntryStore.js +32 -20
  608. package/dist/database/EntryTransaction.d.ts +0 -5
  609. package/dist/database/EntryTransaction.js +173 -58
  610. package/dist/database/EntryUrlAliases.d.ts +4 -0
  611. package/dist/database/EntryUrlAliases.js +16 -10
  612. package/dist/database/Version.d.ts +2 -2
  613. package/dist/database/Version.js +1 -1
  614. package/dist/database/driver/RuntimeDatabase.js +3 -3
  615. package/dist/database/driver/WasmDatabase.d.ts +5 -18
  616. package/dist/database/driver/WasmDatabase.js +16 -15
  617. package/dist/database/entry/EntryTable.d.ts +5 -3
  618. package/dist/database/entry/EntryTable.js +34 -10
  619. package/dist/database/query/Condition.d.ts +9 -1
  620. package/dist/database/query/Condition.js +25 -6
  621. package/dist/database/query/EntryQuery.d.ts +4 -0
  622. package/dist/database/query/EntryQuery.js +148 -25
  623. package/dist/database/query/EntryReferences.d.ts +1 -1
  624. package/dist/database/query/EntryReferences.js +3 -2
  625. package/dist/database/query/Relation.d.ts +13 -1
  626. package/dist/database/query/Relation.js +33 -5
  627. package/dist/database/query/ResolveQuery.d.ts +1 -1
  628. package/dist/database/query/ResolveQuery.js +27 -18
  629. package/dist/database/query/Search.d.ts +10 -1
  630. package/dist/database/query/Search.js +83 -10
  631. package/dist/database/sync/Derive.d.ts +2 -1
  632. package/dist/database/sync/Derive.js +15 -10
  633. package/dist/database/sync/EntryParser.js +8 -7
  634. package/dist/database/sync/EntrySyncer.d.ts +3 -0
  635. package/dist/database/sync/EntrySyncer.js +10 -7
  636. package/dist/database/sync/Ingest.d.ts +2 -1
  637. package/dist/database/sync/Ingest.js +79 -49
  638. package/dist/database/sync/SyncQueries.d.ts +3 -2
  639. package/dist/database/sync/SyncQueries.js +19 -19
  640. package/dist/field/check/CheckField.js +3 -1
  641. package/dist/field/check/CheckField.view.js +13 -11
  642. package/dist/field/code/CodeField.d.ts +9 -0
  643. package/dist/field/code/CodeField.view.d.ts +3 -1
  644. package/dist/field/code/CodeField.view.js +30 -20
  645. package/dist/field/code/SimpleCodeEditor.js +0 -18
  646. package/dist/field/date/DateField.view.js +9 -25
  647. package/dist/field/link/EntryLink.d.ts +8 -9
  648. package/dist/field/link/FileLink.d.ts +11 -8
  649. package/dist/field/link/FileLink.js +7 -6
  650. package/dist/field/link/ImageLink.d.ts +16 -16
  651. package/dist/field/link/ImageLink.js +14 -23
  652. package/dist/field/link/Link.d.ts +1 -1
  653. package/dist/field/link/Link.js +2 -2
  654. package/dist/field/link/LinkField.d.ts +10 -5
  655. package/dist/field/link/LinkField.js +2 -0
  656. package/dist/field/link/LinkField.view.js +501 -684
  657. package/dist/field/link/UrlLink.d.ts +5 -4
  658. package/dist/field/link.d.ts +1 -0
  659. package/dist/field/list/ListField.d.ts +9 -5
  660. package/dist/field/list/ListField.js +10 -5
  661. package/dist/field/list/ListField.view.d.ts +15 -0
  662. package/dist/field/list/ListField.view.js +525 -645
  663. package/dist/field/localiser/LocalisedField.view.js +37 -88
  664. package/dist/field/localiser/LocalisedFieldTab.d.ts +7 -0
  665. package/dist/field/localiser/LocalisedFieldTab.js +30 -0
  666. package/dist/field/localiser/LocalisedFieldTabs.js +5 -5
  667. package/dist/field/localiser/Localiser.d.ts +17 -1
  668. package/dist/field/localiser/Localiser.js +152 -7
  669. package/dist/field/localiser/SelectLocale.d.ts +5 -0
  670. package/dist/field/localiser/SelectLocale.js +12 -0
  671. package/dist/field/metadata/MetadataAudit.d.ts +39 -0
  672. package/dist/field/metadata/MetadataAudit.js +124 -0
  673. package/dist/field/metadata/MetadataField.d.ts +20 -30
  674. package/dist/field/metadata/MetadataField.js +24 -107
  675. package/dist/field/metadata/MetadataField.view.d.ts +1 -0
  676. package/dist/field/metadata/MetadataField.view.js +36 -38
  677. package/dist/field/number/NumberField.view.js +9 -9
  678. package/dist/field/object/ObjectField.d.ts +3 -1
  679. package/dist/field/object/ObjectField.view.js +35 -25
  680. package/dist/field/path/PathField.view.js +3 -3
  681. package/dist/field/path/SlugField.d.ts +1 -2
  682. package/dist/field/path/SlugField.js +5 -7
  683. package/dist/field/richtext/PickTextAnchor.js +10 -10
  684. package/dist/field/richtext/PickTextLink.js +28 -41
  685. package/dist/field/richtext/RichTextBlock.d.ts +3 -1
  686. package/dist/field/richtext/RichTextBlock.js +190 -78
  687. package/dist/field/richtext/RichTextBlockHost.js +1 -1
  688. package/dist/field/richtext/RichTextExtensions.js +26 -20
  689. package/dist/field/richtext/RichTextField.story.d.ts +1 -0
  690. package/dist/field/richtext/RichTextField.view.js +13 -6
  691. package/dist/field/richtext/RichTextInsertMenu.js +59 -36
  692. package/dist/field/richtext/RichTextToolbar.js +82 -34
  693. package/dist/field/richtext/Toolbar.d.ts +9 -1
  694. package/dist/field/richtext/Toolbar.js +12 -2
  695. package/dist/field/richtext.d.ts +2 -0
  696. package/dist/field/richtext.js +2 -0
  697. package/dist/field/select/SelectField.view.js +15 -79
  698. package/dist/field/tabs/Tabs.d.ts +12 -3
  699. package/dist/field/tabs/Tabs.js +11 -2
  700. package/dist/field/tabs/Tabs.view.js +8 -8
  701. package/dist/field/text/TextField.view.js +9 -8
  702. package/dist/field/time/TimeField.view.js +10 -18
  703. package/dist/field/views.js +4 -0
  704. package/dist/field.d.ts +2 -2
  705. package/dist/field.js +3 -2
  706. package/dist/index.css +5408 -5223
  707. package/dist/index.d.ts +1 -0
  708. package/dist/index.js +3 -1
  709. package/dist/next.cjs +27 -20
  710. package/dist/next.d.ts +2 -0
  711. package/dist/next.edge.d.ts +2 -0
  712. package/dist/picker/entry/EntryPicker.d.ts +11 -4
  713. package/dist/picker/entry/EntryPicker.js +15 -1
  714. package/dist/picker/url/UrlPicker.js +1 -0
  715. package/dist/preview/react.js +3 -0
  716. package/dist/preview/widget.d.ts +3 -0
  717. package/dist/preview/widget.js +26 -8
  718. package/dist/query.d.ts +41 -266
  719. package/dist/query.js +4 -0
  720. package/dist/types.d.ts +12 -5
  721. package/dist/ui/RichText.js +31 -1
  722. package/dist/ui/Stack.d.ts +4 -2
  723. package/docs/ai-agents.md +316 -0
  724. package/docs/ai-setup.md +297 -0
  725. package/docs/cli.md +96 -0
  726. package/docs/components/alert.md +122 -0
  727. package/docs/components/app-shell.md +77 -0
  728. package/docs/components/badge.md +89 -0
  729. package/docs/components/blockquote.md +24 -0
  730. package/docs/components/breadcrumb.md +83 -0
  731. package/docs/components/button.md +142 -0
  732. package/docs/components/calendar.md +32 -0
  733. package/docs/components/checkbox-group.md +38 -0
  734. package/docs/components/checkbox.md +61 -0
  735. package/docs/components/code.md +37 -0
  736. package/docs/components/collapsible.md +53 -0
  737. package/docs/components/color-swatch-picker.md +47 -0
  738. package/docs/components/combo-box.md +146 -0
  739. package/docs/components/command.md +101 -0
  740. package/docs/components/content-card.md +64 -0
  741. package/docs/components/content-grid.md +71 -0
  742. package/docs/components/data-list.md +64 -0
  743. package/docs/components/date-field.md +34 -0
  744. package/docs/components/date-picker.md +35 -0
  745. package/docs/components/date-range-picker.md +34 -0
  746. package/docs/components/dialog.md +233 -0
  747. package/docs/components/drop-zone.md +45 -0
  748. package/docs/components/dropdown-menu.md +223 -0
  749. package/docs/components/empty.md +81 -0
  750. package/docs/components/field.md +66 -0
  751. package/docs/components/file-trigger.md +33 -0
  752. package/docs/components/fold-icon.md +34 -0
  753. package/docs/components/form.md +67 -0
  754. package/docs/components/heading.md +33 -0
  755. package/docs/components/icon.md +43 -0
  756. package/docs/components/kbd.md +29 -0
  757. package/docs/components/link.md +45 -0
  758. package/docs/components/list.md +105 -0
  759. package/docs/components/media-preview.md +43 -0
  760. package/docs/components/multiple-select.md +48 -0
  761. package/docs/components/nav-rail.md +79 -0
  762. package/docs/components/number-field.md +53 -0
  763. package/docs/components/page.md +97 -0
  764. package/docs/components/popover.md +71 -0
  765. package/docs/components/preview-frame.md +63 -0
  766. package/docs/components/radio-group.md +47 -0
  767. package/docs/components/resizable-panel-group.md +63 -0
  768. package/docs/components/search-field.md +54 -0
  769. package/docs/components/select.md +127 -0
  770. package/docs/components/sidebar.md +104 -0
  771. package/docs/components/sortable-list.md +110 -0
  772. package/docs/components/spinner.md +29 -0
  773. package/docs/components/stack.md +42 -0
  774. package/docs/components/surface.md +54 -0
  775. package/docs/components/switch.md +52 -0
  776. package/docs/components/table.md +262 -0
  777. package/docs/components/tabs.md +120 -0
  778. package/docs/components/tag-group.md +56 -0
  779. package/docs/components/text-field.md +142 -0
  780. package/docs/components/text.md +44 -0
  781. package/docs/components/time-field.md +41 -0
  782. package/docs/components/timestamp.md +45 -0
  783. package/docs/components/toggle-group.md +46 -0
  784. package/docs/components/toggle.md +37 -0
  785. package/docs/components/toolbar.md +96 -0
  786. package/docs/components/tooltip.md +78 -0
  787. package/docs/components/tree.md +67 -0
  788. package/docs/components.md +169 -0
  789. package/docs/configuration.md +177 -0
  790. package/docs/content-model.md +87 -0
  791. package/docs/custom-fields.md +359 -0
  792. package/docs/dashboard-ui.md +3 -0
  793. package/docs/deploy/alinea-cloud.md +26 -0
  794. package/docs/deploy/self-host.md +195 -0
  795. package/docs/deploy.md +127 -0
  796. package/docs/editing-content.md +195 -0
  797. package/docs/fields/check.md +40 -0
  798. package/docs/fields/code.md +35 -0
  799. package/docs/fields/date.md +90 -0
  800. package/docs/fields/entry.md +179 -0
  801. package/docs/fields/file.md +60 -0
  802. package/docs/fields/image.md +138 -0
  803. package/docs/fields/link.md +121 -0
  804. package/docs/fields/list.md +149 -0
  805. package/docs/fields/number.md +58 -0
  806. package/docs/fields/object.md +93 -0
  807. package/docs/fields/path.md +105 -0
  808. package/docs/fields/rich-text.md +267 -0
  809. package/docs/fields/select.md +99 -0
  810. package/docs/fields/tabs.md +111 -0
  811. package/docs/fields/text.md +46 -0
  812. package/docs/fields/url.md +51 -0
  813. package/docs/fields.md +231 -0
  814. package/docs/get-started.md +3 -0
  815. package/docs/guides.md +3 -0
  816. package/docs/index.md +140 -0
  817. package/docs/instant-publishing.md +61 -0
  818. package/docs/internationalization.md +218 -0
  819. package/docs/introduction.md +5 -0
  820. package/docs/live-previews.md +151 -0
  821. package/docs/mcp.md +500 -0
  822. package/docs/overviews.md +580 -0
  823. package/docs/query/advanced.md +123 -0
  824. package/docs/query/examples.md +231 -0
  825. package/docs/query/filtering.md +162 -0
  826. package/docs/query/related.md +178 -0
  827. package/docs/query/structural.md +165 -0
  828. package/docs/query.md +190 -0
  829. package/docs/quickstart.md +203 -0
  830. package/docs/reference.md +3 -0
  831. package/docs/roles-permissions.md +234 -0
  832. package/docs/schema/document.md +100 -0
  833. package/docs/schema/type.md +133 -0
  834. package/docs/schema.md +66 -0
  835. package/docs/tutorial/step-1-landing-page.md +244 -0
  836. package/docs/tutorial/step-2-block-list.md +364 -0
  837. package/docs/tutorial/step-3-layout-root.md +200 -0
  838. package/docs/tutorial/step-4-blog.md +384 -0
  839. package/docs/tutorial/step-5-catch-all.md +222 -0
  840. package/docs/tutorial.md +21 -0
  841. package/docs/typescript.md +115 -0
  842. package/docs/upgrading.md +368 -0
  843. package/docs/workspaces/media.md +134 -0
  844. package/docs/workspaces/root.md +127 -0
  845. package/docs/workspaces.md +98 -0
  846. package/llms-full.txt +13007 -3217
  847. package/package.json +25 -6
  848. package/readme.md +136 -55
  849. package/dist/adapter/next/previews.spec.d.ts +0 -1
  850. package/dist/chunks/chunk-AC4U3IMS.js +0 -205
  851. package/dist/chunks/chunk-DNJX6CRV.js +0 -129
  852. package/dist/chunks/chunk-NIVGVRDS.js +0 -6363
  853. package/dist/chunks/chunk-S4AU6SRS.js +0 -5503
  854. package/dist/chunks/chunk-SJBZFMQ2.js +0 -2966
  855. package/dist/components/Disclosure.d.ts +0 -5
  856. package/dist/components/Disclosure.js +0 -106
  857. package/dist/components/Label.d.ts +0 -48
  858. package/dist/components/Label.js +0 -210
  859. package/dist/components/Menu.d.ts +0 -16
  860. package/dist/components/Menu.js +0 -95
  861. package/dist/components/Modal.d.ts +0 -7
  862. package/dist/components/Modal.js +0 -58
  863. package/dist/components/ProgressCircle.d.ts +0 -6
  864. package/dist/components/ProgressCircle.js +0 -96
  865. package/dist/dashboard/app/AppShell.d.ts +0 -4
  866. package/dist/dashboard/app/AppShell.js +0 -29
  867. package/dist/dashboard/app/Badge.d.ts +0 -8
  868. package/dist/dashboard/app/Badge.js +0 -42
  869. package/dist/dashboard/app/EditorBackButton.d.ts +0 -5
  870. package/dist/dashboard/app/EditorBackButton.js +0 -33
  871. package/dist/dashboard/app/EntrySidebarPreview.spec.d.ts +0 -1
  872. package/dist/dashboard/app/ExplorerFileCard.d.ts +0 -10
  873. package/dist/dashboard/app/ExplorerFileCard.js +0 -115
  874. package/dist/dashboard/app/StatusBadge.d.ts +0 -6
  875. package/dist/dashboard/app/StatusBadge.js +0 -26
  876. package/dist/dashboard/app/WorkspaceMenu.spec.d.ts +0 -1
  877. package/dist/dashboard/app/WorkspaceMenu.stories.d.ts +0 -7
  878. package/dist/dashboard/app/ui/Rail.d.ts +0 -18
  879. package/dist/dashboard/app/ui/Rail.js +0 -41
  880. package/dist/dashboard/app/ui/Sidebar.d.ts +0 -15
  881. package/dist/dashboard/app/ui/Sidebar.js +0 -55
  882. package/dist/field/link/LinkField.spec.d.ts +0 -1
  883. package/dist/field/link/LinkField.stories.d.ts +0 -15
  884. package/dist/field/list/ListField.spec.d.ts +0 -1
  885. package/dist/field/list/ListField.stories.d.ts +0 -7
  886. package/dist/field/richtext/RichTextField.spec.d.ts +0 -1
  887. package/dist/chunks/{chunk-MOWR65LM.js → chunk-PYDOMKJZ.js} +71 -71
@@ -1,6 +1,6 @@
1
1
  import { CMS } from 'alinea/core/CMS';
2
2
  import { Config } from 'alinea/core/Config';
3
- import type { UploadResponse } from 'alinea/core/Connection';
3
+ import { type UploadMetadata, type UploadResponse } from 'alinea/core/Connection';
4
4
  import type { LocalStore } from 'alinea/core/db/LocalStore';
5
5
  import type { Mutation } from 'alinea/core/db/Mutation';
6
6
  import type { GraphQuery } from 'alinea/core/Graph';
@@ -35,7 +35,7 @@ export declare class NextCMS<Definition extends Config = Config> extends CMS<Def
35
35
  mutate(mutations: Array<Mutation>): Promise<{
36
36
  sha: string;
37
37
  }>;
38
- prepareUpload(file: string): Promise<UploadResponse>;
38
+ prepareUpload(file: string, metadata?: UploadMetadata): Promise<UploadResponse>;
39
39
  previews: ({ widget, stats: showStats, workspace, root }: PreviewProps) => Promise<import("react").JSX.Element | null>;
40
40
  }
41
41
  export declare function createCMS<Definition extends Config>(config: Definition): NextCMS<Definition>;
@@ -8,18 +8,25 @@ import {
8
8
  applyPreview as applyPreviewUpdate,
9
9
  decodePreviewRequest
10
10
  } from "alinea/backend/resolver/ParsePreview";
11
- import { createThrottledSync } from "alinea/backend/util/Syncable";
11
+ import { dashboardUrl } from "./dashboardUrl.js";
12
+ import { createThrottledSync, syncWait } from "alinea/backend/util/Syncable";
12
13
  import { Client } from "alinea/core/Client";
13
14
  import { CMS } from "alinea/core/CMS";
14
- import { Config } from "alinea/core/Config";
15
+ import {
16
+ withDevelopmentKey
17
+ } from "alinea/core/Connection";
18
+ import { loggedSync, syncStats } from "alinea/core/db/SyncStats";
15
19
  import { outcome } from "alinea/core/Outcome";
20
+ import { getScope } from "alinea/core/Scope";
16
21
  import { trace } from "alinea/core/Trace";
22
+ import { within } from "alinea/core/util/Async";
17
23
  import { getPreviewPayloadFromCookies } from "alinea/preview/PreviewCookies";
18
24
  import { Headers } from "@alinea/iso";
19
25
  import { cache } from "react";
20
26
  import { requestContext } from "./context.js";
27
+ import { cachedResolve, developmentRevision } from "./devCache.js";
21
28
  import { RenderStats, summarizeQuery, timed } from "./renderStats.js";
22
- import { syncIfStale } from "./syncCheck.js";
29
+ import { contentShaWindow, syncIfStale, tagContentSha } from "./syncCheck.js";
23
30
  import { jsx } from "react/jsx-runtime";
24
31
  var preValidatedRemote = { validate: false };
25
32
  var NextCMS = class extends CMS {
@@ -61,9 +68,16 @@ var NextCMS = class extends CMS {
61
68
  * returns a fresh holder, so nothing is recorded there.
62
69
  */
63
70
  #render = cache(() => ({}));
71
+ /** Build renders join the content sha tag once, see `tagContentSha`. */
72
+ #tagContent = cache(
73
+ () => tagContentSha(contentShaWindow(this.config.syncInterval))
74
+ );
75
+ /** One content revision per render, see `developmentRevision`. */
76
+ #devRevision = cache(() => developmentRevision());
64
77
  #isDraft = cache(async () => {
65
- const { draftMode } = await import("next/headers.js");
78
+ const { cookies, draftMode } = await import("next/headers.js");
66
79
  const [isDraft] = await outcome(async () => (await draftMode()).isEnabled);
80
+ if (isDraft) await outcome(cookies);
67
81
  return Boolean(isDraft);
68
82
  });
69
83
  /** Draft renders collect their queries and syncs for the preview widget. */
@@ -80,22 +94,27 @@ var NextCMS = class extends CMS {
80
94
  return { isBuild, useLocalDb: !isEdge && (!context.isDev || isBuild) };
81
95
  }
82
96
  /** Renders keep serving the current content when the handler is unreachable. */
83
- async #syncDb(db, client, stats) {
84
- if (stats)
85
- return stats.track(
86
- { kind: "sync", summary: "sync" },
87
- (row) => timed(row, () => this.#syncDb(db, client, void 0))
88
- );
89
- try {
90
- const sha = await db.syncWith(client, preValidatedRemote);
91
- this.#syncedAt = Date.now();
92
- return sha;
93
- } catch (error) {
94
- console.warn(
95
- `Alinea could not sync with the handler, serving current content: ${error instanceof Error ? error.message : String(error)}`
96
- );
97
- return db.sha;
98
- }
97
+ async #syncDb(db, client, reason, render) {
98
+ const stats = syncStats();
99
+ const sync = async () => {
100
+ try {
101
+ const options = { ...preValidatedRemote, stats };
102
+ const synced = process.env.NODE_ENV === "production" ? loggedSync(db, client, reason, options) : db.syncWith(client, options);
103
+ const sha = await within(synced, syncWait);
104
+ this.#syncedAt = Date.now();
105
+ return sha;
106
+ } catch (error) {
107
+ console.warn(
108
+ `Alinea could not sync with the handler, serving current content: ${error instanceof Error ? error.message : String(error)}`
109
+ );
110
+ return db.sha;
111
+ }
112
+ };
113
+ if (!render) return sync();
114
+ return render.track(
115
+ { kind: "sync", summary: `sync (${reason})`, sync: stats },
116
+ (row) => timed(row, sync)
117
+ );
99
118
  }
100
119
  #applyPreview = cache(async () => {
101
120
  const context = await requestContext(this.config);
@@ -137,6 +156,7 @@ var NextCMS = class extends CMS {
137
156
  await this.#syncDb(
138
157
  db,
139
158
  createClient(this.config, context),
159
+ `preview at ${decoded.contentHash.slice(0, 7)}`,
140
160
  this.#render().stats
141
161
  );
142
162
  return applyPreviewUpdate(db, decoded);
@@ -168,13 +188,18 @@ var NextCMS = class extends CMS {
168
188
  async #resolve(query, row) {
169
189
  let status = query.status;
170
190
  const { context, hasPreview, isDraft, isBuild, preview, useLocalDb } = await this.#applyPreview();
171
- if (isDraft && !status) status = "preferDraft";
191
+ if (isDraft && !status) status = "preview";
172
192
  const request = { ...query, preview, status };
173
193
  const client = createClient(this.config, context);
174
194
  if (row) row.source = useLocalDb ? "database" : "handler";
175
195
  if (!useLocalDb) {
176
196
  const span = trace(this.config, "alinea.cms.resolve.client");
177
- return timed(row, () => span(() => client.resolve(request)));
197
+ const answer2 = () => client.resolve(request);
198
+ const revision = context.isDev && !isDraft && this.#devRevision();
199
+ if (!revision) return timed(row, () => span(answer2));
200
+ const key = [context.handlerUrl.href, revision];
201
+ const body = getScope(this.config).stringify(request);
202
+ return span(() => cachedResolve(key, body, answer2));
178
203
  }
179
204
  const db = await this.bundledDb;
180
205
  const stats = this.#render().stats;
@@ -188,14 +213,24 @@ var NextCMS = class extends CMS {
188
213
  const answer = () => stats && row ? stats.executed(row, () => db.resolve(request)) : db.resolve(request);
189
214
  const syncInterval = request.disableSync ? Number.POSITIVE_INFINITY : request.syncInterval ?? this.config.syncInterval;
190
215
  if (hasPreview) return answer();
191
- if (!isBuild) {
216
+ if (isBuild) {
217
+ await this.#tagContent();
218
+ } else {
192
219
  const tracked = {
193
220
  sha: db.sha,
194
- syncWith: () => this.#syncDb(db, client, stats)
221
+ syncWith: () => this.#syncDb(db, client, "stale", stats)
195
222
  };
196
- const settled = !isDraft && await syncIfStale(tracked, client, syncInterval);
223
+ const settled = !isDraft && await syncIfStale(
224
+ tracked,
225
+ client,
226
+ syncInterval,
227
+ contentShaWindow(this.config.syncInterval)
228
+ );
197
229
  if (!settled)
198
- await this.throttle(() => this.#syncDb(db, client, stats), syncInterval);
230
+ await this.throttle(
231
+ () => this.#syncDb(db, client, "interval", stats),
232
+ syncInterval
233
+ );
199
234
  }
200
235
  return answer();
201
236
  }
@@ -235,9 +270,11 @@ var NextCMS = class extends CMS {
235
270
  const client = await this.#authenticatedClient();
236
271
  return client.mutate(mutations);
237
272
  }
238
- async prepareUpload(file) {
273
+ async prepareUpload(file, metadata) {
274
+ const context = await requestContext(this.config);
239
275
  const client = await this.#authenticatedClient();
240
- return client.prepareUpload(file);
276
+ const upload = await client.prepareUpload(file, metadata);
277
+ return context.isDev ? withDevelopmentKey(upload, context.apiKey) : upload;
241
278
  }
242
279
  previews = async ({
243
280
  widget,
@@ -249,16 +286,13 @@ var NextCMS = class extends CMS {
249
286
  if (!stats) return null;
250
287
  const { default: dynamic } = await import("next/dynamic.js");
251
288
  const { isDev, handlerUrl } = await requestContext(this.config);
252
- let file = `${Config.adminPath(this.config)}.html`;
253
- if (!file.startsWith("/")) file = `/${file}`;
254
- const dashboardUrl = isDev ? new URL("/", handlerUrl) : new URL(file, handlerUrl);
255
289
  const NextPreviews = dynamic(() => import("./previews.js"), {
256
290
  ssr: false
257
291
  });
258
292
  return /* @__PURE__ */ jsx(
259
293
  NextPreviews,
260
294
  {
261
- dashboardUrl: dashboardUrl.href,
295
+ dashboardUrl: dashboardUrl(this.config, isDev, handlerUrl),
262
296
  widget,
263
297
  stats: widget && showStats ? stats.settled() : void 0,
264
298
  workspace,
@@ -5,7 +5,7 @@ import { generatedRelease } from "alinea/backend/store/GeneratedRelease";
5
5
  import { Config } from "alinea/core/Config";
6
6
  import { forwardDevelopmentCredentials } from "./ForwardCredentials.js";
7
7
  async function requestContext(config, request) {
8
- const apiKey = process.env.ALINEA_API_KEY || (process.env.NODE_ENV === "development" ? "dev" : await generatedRelease);
8
+ const apiKey = process.env.ALINEA_API_KEY || (process.env.NODE_ENV === "development" ? "dev" : await generatedRelease());
9
9
  const dev = process.env.ALINEA_DEV_SERVER;
10
10
  if (dev) {
11
11
  return {
@@ -15,13 +15,12 @@ async function requestContext(config, request) {
15
15
  applyAuth: (init) => forwardDevelopmentCredentials(request, apiKey, init)
16
16
  };
17
17
  }
18
- const nodeEnv = process.env.NODE_ENV;
19
- const baseUrl = Config.baseUrl(config, nodeEnv);
20
- if (!baseUrl) throw new Error(`Missing baseUrl in config for ${nodeEnv}`);
18
+ const localOrigin = process.env.__NEXT_PRIVATE_ORIGIN;
21
19
  return {
22
20
  isDev: false,
23
- handlerUrl: new URL(Config.handlerUrl(config), baseUrl),
24
- apiKey
21
+ handlerUrl: Config.serverHandlerUrl(config),
22
+ apiKey,
23
+ publicUrl: localOrigin ? new URL(localOrigin) : void 0
25
24
  };
26
25
  }
27
26
  export {
@@ -0,0 +1,6 @@
1
+ import { Config } from 'alinea/core/Config';
2
+ /**
3
+ * The dashboard as the site serves it: in development the site proxies the
4
+ * admin path to the dev server, in production it serves the generated file.
5
+ */
6
+ export declare function dashboardUrl(config: Config, isDev: boolean, handlerUrl: URL | string): string;
@@ -0,0 +1,13 @@
1
+ import "../../chunks/chunk-CQ52GEHY.js";
2
+
3
+ // src/adapter/next/dashboardUrl.ts
4
+ import { Config } from "alinea/core/Config";
5
+ function dashboardUrl(config, isDev, handlerUrl) {
6
+ if (!isDev)
7
+ return new URL(`/${Config.dashboardFile(config)}`, handlerUrl).href;
8
+ const adminPath = Config.adminPath(config);
9
+ return adminPath.startsWith("/") ? adminPath : `/${adminPath}`;
10
+ }
11
+ export {
12
+ dashboardUrl
13
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The revision of the database the Alinea dev server answers from: it
3
+ * commits every content change to this file, so its modification time and
4
+ * size change with the content. It is read synchronously, which keeps it out
5
+ * of the IO that Next.js tracks while it renders, and is undefined where the
6
+ * file cannot be read, such as in the Edge runtime.
7
+ */
8
+ export declare function developmentRevision(file?: string | undefined): string | undefined;
9
+ /**
10
+ * Answer a query of a development render through the Next.js data cache,
11
+ * under a key that includes the content revision, so the dev server is asked
12
+ * once per revision. With Cache Components enabled Next.js then treats the
13
+ * answer as cached data, as it does the bundled database in production,
14
+ * instead of as uncached IO that has to be wrapped in `<Suspense>`.
15
+ */
16
+ export declare function cachedResolve<T>(keyParts: Array<string>, query: string, resolve: () => Promise<T>): Promise<T>;
@@ -0,0 +1,32 @@
1
+ import "../../chunks/chunk-CQ52GEHY.js";
2
+
3
+ // src/adapter/next/devCache.ts
4
+ function developmentRevision(file = process.env.ALINEA_GENERATED_DATABASE) {
5
+ if (!file) return void 0;
6
+ const fs = process.getBuiltinModule?.("node:fs");
7
+ if (!fs) return void 0;
8
+ try {
9
+ const { mtimeMs, size } = fs.statSync(file);
10
+ return `${mtimeMs}-${size}`;
11
+ } catch {
12
+ return void 0;
13
+ }
14
+ }
15
+ async function cachedResolve(keyParts, query, resolve) {
16
+ let called = false;
17
+ const run = (_query) => {
18
+ called = true;
19
+ return resolve();
20
+ };
21
+ try {
22
+ const { unstable_cache } = await import("next/cache.js");
23
+ return await unstable_cache(run, ["alinea-resolve", ...keyParts])(query);
24
+ } catch (error) {
25
+ if (called) throw error;
26
+ return resolve();
27
+ }
28
+ }
29
+ export {
30
+ cachedResolve,
31
+ developmentRevision
32
+ };
@@ -10,6 +10,7 @@ import {
10
10
  import {
11
11
  createHandler as createCoreHandler
12
12
  } from "alinea/backend/Handler";
13
+ import { committedEntries, removedEntries } from "alinea/backend/CommitEntries";
13
14
  import { HandleAction } from "alinea/backend/HandleAction";
14
15
  import { JWTPreviews } from "alinea/backend/util/JWTPreviews";
15
16
  import { CloudRemote } from "alinea/cloud/CloudRemote";
@@ -51,6 +52,7 @@ function createHandlerWithDatabase(input, openGeneratedDatabase) {
51
52
  ...options,
52
53
  remote,
53
54
  db,
55
+ logSyncs: process.env.NODE_ENV === "production",
54
56
  afterCommit
55
57
  });
56
58
  async function handleDevelopment(request, context) {
@@ -67,8 +69,6 @@ function createHandlerWithDatabase(input, openGeneratedDatabase) {
67
69
  return failure(400, "Expected JSON");
68
70
  }
69
71
  if (!Array.isArray(mutations)) return failure(400, "Expected mutations");
70
- const adjusted = await options.beforeCommit?.({ mutations });
71
- if (adjusted) mutations = [...adjusted];
72
72
  const devServer = new Client({
73
73
  config,
74
74
  url: context.handlerUrl.href,
@@ -80,15 +80,29 @@ function createHandlerWithDatabase(input, openGeneratedDatabase) {
80
80
  }
81
81
  });
82
82
  let sha;
83
+ let user;
84
+ let before = [];
83
85
  try {
84
- ;
86
+ user = await devServer.user();
87
+ if (!user) return failure(401, "Unauthorized");
88
+ const adjusted = await options.beforeCommit?.({ mutations, user });
89
+ if (adjusted) mutations = [...adjusted];
90
+ if (options.afterCommit)
91
+ before = await committedEntries(devServer, mutations).catch(() => []);
85
92
  ({ sha } = await devServer.mutate(mutations));
86
93
  } catch (error) {
87
94
  if (error instanceof HttpError) return failure(error.code, error.message);
88
95
  throw error;
89
96
  }
90
97
  try {
91
- await afterCommit({ mutations, sha });
98
+ const entries = options.afterCommit ? await committedEntries(devServer, mutations) : [];
99
+ await afterCommit({
100
+ mutations,
101
+ sha,
102
+ user,
103
+ entries,
104
+ removed: removedEntries(before, entries)
105
+ });
92
106
  } catch (error) {
93
107
  console.error("Alinea afterCommit hook failed", error);
94
108
  }
@@ -6,13 +6,26 @@ interface SyncableDB {
6
6
  syncWith(source: RemoteSource, options?: SyncOptions): Promise<string>;
7
7
  }
8
8
  export declare const CONTENT_SHA_TAG = "alinea-content-sha";
9
+ /**
10
+ * How long renders share the latest content sha. Configured through the
11
+ * config's `syncInterval`, never a query's: all renders share one entry.
12
+ */
13
+ export declare function contentShaWindow(syncInterval?: number): number;
14
+ /**
15
+ * Tag a static render with the content sha without looking it up. Renders at
16
+ * build skip `syncIfStale`, so this is how their pages join the tag that
17
+ * commits revalidate, and get the same time-based safety net as pages
18
+ * rendered at runtime.
19
+ */
20
+ export declare function tagContentSha(revalidate?: number): Promise<void>;
9
21
  export declare function revalidateContentSha(): Promise<void>;
10
22
  /**
11
23
  * Sync the isolate-local db only when it is behind the shared content sha.
12
24
  * Returns true when the freshness question is settled here (synced, forced,
13
25
  * or explicitly disabled) and the caller can skip its throttled sync.
14
26
  * Returns false when the sha could not be determined, so the caller falls
15
- * back to its existing throttle behavior.
27
+ * back to its existing throttle behavior. `shaWindow` is how long renders
28
+ * share the latest sha, see `contentShaWindow`.
16
29
  */
17
- export declare function syncIfStale(db: SyncableDB, client: Client, syncInterval?: number, options?: SyncOptions): Promise<boolean>;
30
+ export declare function syncIfStale(db: SyncableDB, client: Client, syncInterval?: number, shaWindow?: number, options?: SyncOptions): Promise<boolean>;
18
31
  export {};
@@ -2,22 +2,27 @@ import "../../chunks/chunk-CQ52GEHY.js";
2
2
 
3
3
  // src/adapter/next/syncCheck.ts
4
4
  var CONTENT_SHA_TAG = "alinea-content-sha";
5
- var SHA_REVALIDATE_SECONDS = 60;
5
+ var SHA_REVALIDATE_SECONDS = 300;
6
+ function contentShaWindow(syncInterval) {
7
+ if (syncInterval !== void 0 && syncInterval > 0 && Number.isFinite(syncInterval))
8
+ return syncInterval;
9
+ return SHA_REVALIDATE_SECONDS;
10
+ }
6
11
  var inflight;
7
- function latestSha(client) {
12
+ function latestSha(client, revalidate) {
8
13
  if (inflight) return inflight;
9
- inflight = loadLatestSha(client).finally(() => {
14
+ inflight = loadLatestSha(client, revalidate).finally(() => {
10
15
  inflight = void 0;
11
16
  });
12
17
  return inflight;
13
18
  }
14
- async function loadLatestSha(client) {
19
+ async function loadLatestSha(client, revalidate) {
15
20
  try {
16
21
  const { unstable_cache } = await import("next/cache.js");
17
22
  const getSha = unstable_cache(
18
23
  () => client.getSha(),
19
24
  ["alinea-content-sha"],
20
- { revalidate: SHA_REVALIDATE_SECONDS, tags: [CONTENT_SHA_TAG] }
25
+ { revalidate, tags: [CONTENT_SHA_TAG] }
21
26
  );
22
27
  return await getSha();
23
28
  } catch {
@@ -28,26 +33,38 @@ async function loadLatestSha(client) {
28
33
  }
29
34
  }
30
35
  }
36
+ async function tagContentSha(revalidate = SHA_REVALIDATE_SECONDS) {
37
+ try {
38
+ const { unstable_cache } = await import("next/cache.js");
39
+ await unstable_cache(async () => true, ["alinea-content-sha-tag"], {
40
+ revalidate,
41
+ tags: [CONTENT_SHA_TAG]
42
+ })();
43
+ } catch {
44
+ }
45
+ }
31
46
  async function revalidateContentSha() {
32
47
  try {
33
48
  const { revalidateTag } = await import("next/cache.js");
34
- revalidateTag(CONTENT_SHA_TAG, { expire: 0 });
49
+ revalidateTag(CONTENT_SHA_TAG, "max");
35
50
  } catch {
36
51
  }
37
52
  }
38
- async function syncIfStale(db, client, syncInterval, options) {
53
+ async function syncIfStale(db, client, syncInterval, shaWindow = SHA_REVALIDATE_SECONDS, options) {
39
54
  if (syncInterval === Number.POSITIVE_INFINITY) return true;
40
55
  if (syncInterval === 0) {
41
56
  await db.syncWith(client, options);
42
57
  return true;
43
58
  }
44
- const expected = await latestSha(client);
59
+ const expected = await latestSha(client, shaWindow);
45
60
  if (!expected) return false;
46
61
  if (expected !== await db.sha) await db.syncWith(client, options);
47
62
  return true;
48
63
  }
49
64
  export {
50
65
  CONTENT_SHA_TAG,
66
+ contentShaWindow,
51
67
  revalidateContentSha,
52
- syncIfStale
68
+ syncIfStale,
69
+ tagContentSha
53
70
  };
@@ -64,24 +64,18 @@ function withAlinea(config = {}) {
64
64
  };
65
65
  }
66
66
  function createImages(config, adminPath) {
67
- const filePattern = `${adminPath}/file/**`;
67
+ const filePattern = { pathname: `${adminPath}/file/**` };
68
68
  const localPatterns = config.images?.localPatterns;
69
69
  if (!localPatterns)
70
70
  return {
71
71
  ...config.images,
72
- localPatterns: [{ pathname: filePattern }, { pathname: "/**" }]
72
+ localPatterns: [filePattern, { pathname: "**", search: "" }]
73
73
  };
74
- if (localPatterns.some((pattern) => pattern.pathname === filePattern))
74
+ if (localPatterns.some(
75
+ (pattern) => pattern.pathname === filePattern.pathname && pattern.search === void 0
76
+ ))
75
77
  return config.images;
76
- return {
77
- ...config.images,
78
- localPatterns: [
79
- ...localPatterns,
80
- {
81
- pathname: filePattern
82
- }
83
- ]
84
- };
78
+ return { ...config.images, localPatterns: [...localPatterns, filePattern] };
85
79
  }
86
80
  var emptyRewrites = {
87
81
  beforeFiles: [],
@@ -122,16 +116,15 @@ function createRewrites(config, adminPath, handlerUrl) {
122
116
  }
123
117
  return {
124
118
  ...rewrites,
125
- beforeFiles: [
126
- ...rewrites.beforeFiles,
119
+ afterFiles: [
120
+ ...rewrites.afterFiles,
127
121
  {
122
+ // The build links media files on disk into the public dir, so only
123
+ // files synced after it reach the handler.
128
124
  source: `${adminPath}/file/:file*`,
129
125
  // Next's internal image optimizer does not follow redirects.
130
126
  destination: `${handlerUrl}?file=:file*&delivery=proxy`
131
- }
132
- ],
133
- afterFiles: [
134
- ...rewrites.afterFiles,
127
+ },
135
128
  {
136
129
  source: adminPath,
137
130
  destination: `${adminPath}.html`
@@ -141,13 +134,27 @@ function createRewrites(config, adminPath, handlerUrl) {
141
134
  };
142
135
  }
143
136
  function resolveSettings(config) {
144
- const adminPath = config.env?.ALINEA_ADMIN_PATH ?? process.env.ALINEA_ADMIN_PATH;
137
+ const built = builtEnv(config);
138
+ const adminPath = config.env?.ALINEA_ADMIN_PATH ?? process.env.ALINEA_ADMIN_PATH ?? built?.ALINEA_ADMIN_PATH;
145
139
  if (!adminPath) return;
146
140
  return {
147
141
  adminPath: normalizeBasePath(adminPath),
148
- handlerUrl: config.env?.ALINEA_HANDLER_URL ?? process.env.ALINEA_HANDLER_URL ?? "/api/cms"
142
+ handlerUrl: config.env?.ALINEA_HANDLER_URL ?? process.env.ALINEA_HANDLER_URL ?? built?.ALINEA_HANDLER_URL ?? "/api/cms"
149
143
  };
150
144
  }
145
+ function builtEnv(config) {
146
+ if (process.env.NODE_ENV !== "production") return;
147
+ try {
148
+ const file = resolve(
149
+ config.distDir ?? ".next",
150
+ "required-server-files.json"
151
+ );
152
+ const built = JSON.parse(readFileSync(file, "utf-8"));
153
+ return built?.config?.env;
154
+ } catch {
155
+ return;
156
+ }
157
+ }
151
158
  function normalizeBasePath(value) {
152
159
  return join("/", value, ".");
153
160
  }
@@ -0,0 +1,17 @@
1
+ import type { DashboardEntry } from 'alinea/core/DashboardEntry';
2
+ import type { Mutation } from 'alinea/core/db/Mutation';
3
+ import type { Resolver } from 'alinea/core/Resolver';
4
+ /** An entry that no longer exists after a commit */
5
+ export interface RemovedEntry {
6
+ id: string;
7
+ type: string;
8
+ locale: string | null;
9
+ /** The url the entry had before the commit */
10
+ url: string;
11
+ }
12
+ /**
13
+ * The latest version, in every locale, of the entries that mutations change
14
+ */
15
+ export declare function committedEntries(resolver: Resolver, mutations: ReadonlyArray<Mutation>): Promise<Array<DashboardEntry>>;
16
+ /** The entries of `before` that are not in `after` */
17
+ export declare function removedEntries(before: Array<DashboardEntry>, after: Array<DashboardEntry>): Array<RemovedEntry>;
@@ -0,0 +1,39 @@
1
+ import "../chunks/chunk-CQ52GEHY.js";
2
+
3
+ // src/backend/CommitEntries.ts
4
+ import { Entry } from "alinea/core/Entry";
5
+ var select = {
6
+ id: Entry.id,
7
+ type: Entry.type,
8
+ title: Entry.title,
9
+ path: Entry.path,
10
+ url: Entry.url,
11
+ locale: Entry.locale,
12
+ status: Entry.status,
13
+ workspace: Entry.workspace,
14
+ root: Entry.root,
15
+ parentId: Entry.parentId,
16
+ data: Entry.data
17
+ };
18
+ function entryIds(mutations) {
19
+ const ids = mutations.map((mutation) => "id" in mutation ? mutation.id : "");
20
+ return [...new Set(ids.filter(Boolean))];
21
+ }
22
+ async function committedEntries(resolver, mutations) {
23
+ const ids = entryIds(mutations);
24
+ if (ids.length === 0) return [];
25
+ return await resolver.resolve({
26
+ id: { in: ids },
27
+ status: "preferDraft",
28
+ select
29
+ });
30
+ }
31
+ function removedEntries(before, after) {
32
+ const key = (entry) => `${entry.id}:${entry.locale}`;
33
+ const remaining = new Set(after.map(key));
34
+ return before.filter((entry) => !remaining.has(key(entry))).map(({ id, type, locale, url }) => ({ id, type, locale, url }));
35
+ }
36
+ export {
37
+ committedEntries,
38
+ removedEntries
39
+ };
@@ -1,16 +1,28 @@
1
1
  import type { CMS } from 'alinea/core/CMS';
2
2
  import type { AuthedContext, RemoteConnection, RequestContext } from 'alinea/core/Connection';
3
3
  import type { LocalStore } from 'alinea/core/db/LocalStore';
4
+ import type { DashboardEntry } from 'alinea/core/DashboardEntry';
5
+ import { type RemovedEntry } from './CommitEntries.js';
4
6
  import type { Mutation } from 'alinea/core/db/Mutation';
7
+ import type { User } from 'alinea/core/User';
5
8
  export interface Handler {
6
9
  (request: Request, context: RequestContext): Promise<Response>;
7
10
  }
8
11
  export type HookResponse<T = void> = void | T | Promise<void | T>;
9
12
  export interface BeforeCommitContext {
10
13
  mutations: ReadonlyArray<Mutation>;
14
+ /** The user committing the mutations */
15
+ user: User;
11
16
  }
12
17
  export interface AfterCommitContext extends BeforeCommitContext {
13
18
  sha: string;
19
+ /**
20
+ * The entries the mutations changed as they are after the commit: the
21
+ * latest version in each locale
22
+ */
23
+ entries: Array<DashboardEntry>;
24
+ /** Entries that no longer exist after the commit, with the url they had */
25
+ removed: Array<RemovedEntry>;
14
26
  }
15
27
  export interface HandlerHooks {
16
28
  beforeCommit?(context: BeforeCommitContext): HookResponse<ReadonlyArray<Mutation>>;
@@ -20,6 +32,8 @@ export interface HandlerOptions extends HandlerHooks {
20
32
  cms: CMS;
21
33
  db: LocalStore | Promise<LocalStore>;
22
34
  remote?: (context: RequestContext) => RemoteConnection;
35
+ /** Log why and how long each sync took, for a deployed handler */
36
+ logSyncs?: boolean;
23
37
  forwardMutations?(request: Request, context: AuthedContext): Promise<Response | undefined>;
24
38
  }
25
- export declare function createHandler({ cms, remote, db, forwardMutations, ...hooks }: HandlerOptions): Handler;
39
+ export declare function createHandler({ cms, remote, db, forwardMutations, logSyncs, ...hooks }: HandlerOptions): Handler;