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
@@ -0,0 +1,60 @@
1
+ import type { Config } from './Config.js';
2
+ import { Field, type FieldOptions } from './Field.js';
3
+ import type { RootI18n } from './Root.js';
4
+ import type { Policy, Resource } from './Role.js';
5
+ import { type FieldGetter } from './Tracker.js';
6
+ import { Type } from './Type.js';
7
+ /** Keys into the entry data, list rows and rich text blocks by index */
8
+ export type FieldPath = Array<string | number>;
9
+ export interface FieldValidationError {
10
+ path: FieldPath;
11
+ /** Labels of the fields (and row types) along the path */
12
+ labels: Array<string>;
13
+ message: string;
14
+ }
15
+ /** Adjusts the options of a field before it is validated, eg. for policies */
16
+ export interface FieldOptionsResolver {
17
+ (field: Field, options: FieldOptions<unknown>): FieldOptions<unknown>;
18
+ }
19
+ export interface ValidationScope {
20
+ type: Type;
21
+ value: Record<string, unknown>;
22
+ }
23
+ export interface FieldValidationContext {
24
+ path: FieldPath;
25
+ labels: Array<string>;
26
+ /** The records enclosing the field, outermost first, to resolve trackers */
27
+ scopes: Array<ValidationScope>;
28
+ fieldOptions?: FieldOptionsResolver;
29
+ /** The locales of a root that translates fields, see `Field.localised` */
30
+ fieldI18n?: RootI18n;
31
+ }
32
+ export interface ValidateEntryOptions {
33
+ /** @deprecated Unused, validation does not depend on the locale */
34
+ locale?: string | null;
35
+ fieldOptions?: FieldOptionsResolver;
36
+ /** The locales of the entry's root, if it translates fields */
37
+ fieldI18n?: RootI18n;
38
+ }
39
+ /**
40
+ * The error message for a single field value, or undefined if it is valid.
41
+ * Nested fields (list rows, object fields, blocks) are not checked here.
42
+ */
43
+ export declare function fieldError(field: Field, options: FieldOptions<unknown>, value: unknown): string | undefined;
44
+ /** A getter for option trackers, reading from the innermost scope first */
45
+ export declare function scopeGetter(scopes: Array<ValidationScope>): FieldGetter;
46
+ /** Field options with tracked options applied */
47
+ export declare function trackedFieldOptions(field: Field, getter: FieldGetter): FieldOptions<unknown>;
48
+ /**
49
+ * Hides fields the policy does not allow reading and makes fields read-only
50
+ * which the policy does not allow updating, like the dashboard shows them.
51
+ */
52
+ export declare function policyFieldOptions(config: Config, policy: Policy, resource: Resource): FieldOptionsResolver;
53
+ /**
54
+ * Validate the fields of a type. Hidden and read-only fields (and anything
55
+ * nested in them) are skipped: editors cannot see or change them.
56
+ */
57
+ export declare function validateType(type: Type, value: unknown, context: FieldValidationContext): Array<FieldValidationError>;
58
+ /** Validate entry data: required, min, max and validate options */
59
+ export declare function validateEntry(type: Type, data: unknown, options?: ValidateEntryOptions): Array<FieldValidationError>;
60
+ export declare function formatFieldPath(path: FieldPath): string;
@@ -0,0 +1,116 @@
1
+ import "../chunks/chunk-CQ52GEHY.js";
2
+
3
+ // src/core/Validation.ts
4
+ import { Field } from "./Field.js";
5
+ import { getScope } from "./Scope.js";
6
+ import { optionTrackerOf } from "./Tracker.js";
7
+ import { Type } from "./Type.js";
8
+ import { entries, isRecord } from "./util/Objects.js";
9
+ function fieldError(field, options, value) {
10
+ if (Field.hasValueErrors(field)) return void 0;
11
+ const { min, max } = options;
12
+ if (Array.isArray(value)) {
13
+ if (typeof min === "number" && value.length < min)
14
+ return `Add at least ${min} ${min === 1 ? "item" : "items"}`;
15
+ if (typeof max === "number" && value.length > max)
16
+ return `Add at most ${max} ${max === 1 ? "item" : "items"}`;
17
+ }
18
+ if (options.validate) {
19
+ let result;
20
+ try {
21
+ result = options.validate(value);
22
+ } catch (error) {
23
+ return error instanceof Error ? error.message : String(error);
24
+ }
25
+ if (result === false) return "Field is invalid";
26
+ if (typeof result === "string") return result;
27
+ }
28
+ if (options.required && Field.isEmpty(field, value))
29
+ return "Field is required";
30
+ return void 0;
31
+ }
32
+ function scopeGetter(scopes) {
33
+ return ((field) => {
34
+ const ref = Field.ref(field);
35
+ for (let i = scopes.length - 1; i >= 0; i--) {
36
+ const { type, value } = scopes[i];
37
+ for (const [key, candidate] of entries(Type.fields(type)))
38
+ if (Field.ref(candidate) === ref) return value[key];
39
+ }
40
+ return void 0;
41
+ });
42
+ }
43
+ function trackedFieldOptions(field, getter) {
44
+ const options = Field.options(field);
45
+ const tracker = optionTrackerOf(field);
46
+ if (!tracker) return options;
47
+ return { ...options, ...tracker(getter) };
48
+ }
49
+ function policyFieldOptions(config, policy, resource) {
50
+ const scope = getScope(config);
51
+ return (field, options) => {
52
+ const location = scope.fieldOf(field);
53
+ if (!location || location[0] !== resource.type) return options;
54
+ const fieldResource = { ...resource, field: location[1] };
55
+ return {
56
+ ...options,
57
+ hidden: options.hidden || !policy.canRead(fieldResource),
58
+ readOnly: options.readOnly || !policy.canUpdate(fieldResource)
59
+ };
60
+ };
61
+ }
62
+ function validateType(type, value, context) {
63
+ const record = isRecord(value) ? value : {};
64
+ const scopes = [...context.scopes, { type, value: record }];
65
+ const getter = scopeGetter(scopes);
66
+ const result = Array();
67
+ for (const [key, field] of entries(Type.fields(type))) {
68
+ const tracked = trackedFieldOptions(field, getter);
69
+ const options = context.fieldOptions?.(field, tracked) ?? tracked;
70
+ if (options.hidden || options.readOnly) continue;
71
+ const path = [...context.path, key];
72
+ const labels = [...context.labels, options.label];
73
+ const fieldValue = record[key];
74
+ const fieldContext = { ...context, path, labels, scopes };
75
+ const valueErrors = Field.valueErrors(
76
+ field,
77
+ fieldValue,
78
+ options,
79
+ fieldContext
80
+ );
81
+ if (valueErrors) {
82
+ result.push(...valueErrors);
83
+ continue;
84
+ }
85
+ const message = fieldError(field, options, fieldValue);
86
+ if (message) result.push({ path, labels, message });
87
+ result.push(...Field.nestedErrors(field, fieldValue, fieldContext));
88
+ }
89
+ return result;
90
+ }
91
+ function validateEntry(type, data, options = {}) {
92
+ return validateType(type, data, {
93
+ path: [],
94
+ labels: [],
95
+ scopes: [],
96
+ fieldOptions: options.fieldOptions,
97
+ fieldI18n: options.fieldI18n
98
+ });
99
+ }
100
+ function formatFieldPath(path) {
101
+ let result = "";
102
+ for (const segment of path) {
103
+ if (typeof segment === "number") result += `[${segment}]`;
104
+ else result += result ? `.${segment}` : segment;
105
+ }
106
+ return result;
107
+ }
108
+ export {
109
+ fieldError,
110
+ formatFieldPath,
111
+ policyFieldOptions,
112
+ scopeGetter,
113
+ trackedFieldOptions,
114
+ validateEntry,
115
+ validateType
116
+ };
@@ -29,6 +29,7 @@ export declare namespace Workspace {
29
29
  function preview(workspace: Workspace): Preview | undefined;
30
30
  function isWorkspace(value: any): value is Workspace;
31
31
  function defaultMediaRoot(workspace: Workspace): string;
32
+ /** The first root marked `openByDefault`, or the first root */
32
33
  function defaultRoot(workspace: Workspace): string;
33
34
  function validate(workspace: Workspace, schema: Schema): void;
34
35
  function referencedViews(workspace: Workspace): string[];
@@ -2,6 +2,7 @@ import "../chunks/chunk-CQ52GEHY.js";
2
2
 
3
3
  // src/core/Workspace.ts
4
4
  import {
5
+ getRoot,
5
6
  getWorkspace,
6
7
  hasWorkspace,
7
8
  internalWorkspace
@@ -40,7 +41,10 @@ var Workspace;
40
41
  }
41
42
  Workspace2.defaultMediaRoot = defaultMediaRoot;
42
43
  function defaultRoot(workspace2) {
43
- return Object.keys(getWorkspace(workspace2).roots)[0];
44
+ const { roots: roots2 } = getWorkspace(workspace2);
45
+ for (const [name, root] of entries(roots2))
46
+ if (getRoot(root).openByDefault) return name;
47
+ return Object.keys(roots2)[0];
44
48
  }
45
49
  Workspace2.defaultRoot = defaultRoot;
46
50
  function validate(workspace2, schema) {
@@ -5,6 +5,8 @@ export interface EntryReferenceTarget {
5
5
  targetId: string;
6
6
  fieldPath: string;
7
7
  fieldLabel?: string;
8
+ /** Labels of the fields (and row types) along the path to the field */
9
+ fieldLabels?: Array<string>;
8
10
  linkId?: string;
9
11
  linkType?: EntryReferenceLinkType;
10
12
  }
@@ -19,11 +21,14 @@ export interface EntryReference {
19
21
  sourceMain: boolean;
20
22
  fieldPath: string;
21
23
  fieldLabel?: string;
24
+ /** Labels of the fields (and row types) along the path to the field */
25
+ fieldLabels?: Array<string>;
22
26
  linkId?: string;
23
27
  linkType?: EntryReferenceLinkType;
24
28
  }
25
29
  export interface EntryReferenceQuery {
26
- targetId: string;
30
+ /** The entry, or entries, the references point to */
31
+ targetId: string | Array<string>;
27
32
  status?: Status;
28
33
  locale?: string | null;
29
34
  }
@@ -34,5 +39,7 @@ export interface EntryReferenceResult {
34
39
  export interface FieldReferenceContext {
35
40
  path: Array<string>;
36
41
  label?: string;
42
+ /** Labels of the fields (and row types) along the path, ending in label */
43
+ labels: Array<string>;
37
44
  }
38
45
  export declare function referenceFieldPath(path: Array<string>): string;
@@ -1,5 +1,6 @@
1
1
  import type { InferProjection, Projection } from 'alinea/core/Graph';
2
2
  import type { Config } from 'alinea/core/Config';
3
+ import type { RootI18n } from 'alinea/core/Root';
3
4
  export interface LinkTarget {
4
5
  entryId: string;
5
6
  locale?: string;
@@ -8,6 +9,8 @@ export interface LinkTarget {
8
9
  export interface LinkResolver {
9
10
  config: Config;
10
11
  locale: string | null;
12
+ /** The locales of the root of the entry being read, if it translates fields */
13
+ fieldI18n?: RootI18n;
11
14
  includedAtBuild(filePath: string): boolean | Promise<boolean>;
12
15
  resolveLinks<P extends Projection>(projection: P, entryIds: ReadonlyArray<string>, locale?: string | null): Promise<Array<InferProjection<P>>>;
13
16
  resolveTargets<P extends Projection & {
@@ -6,6 +6,25 @@ import type { WriteableGraph } from './WriteableGraph.js';
6
6
  export interface SyncOptions {
7
7
  /** Skip entry validation for a remote whose entries were already validated. */
8
8
  validate?: boolean;
9
+ /** Called as files arrive from the remote, once there are files to fetch. */
10
+ onProgress?(progress: SyncProgress): void;
11
+ /** Filled in with where the sync spent its time, see `loggedSync`. */
12
+ stats?: SyncStats;
13
+ }
14
+ /** Files fetched from the remote during a sync. */
15
+ export interface SyncProgress {
16
+ loaded: number;
17
+ total: number;
18
+ }
19
+ export type SyncStep = 'tree' | 'blobs' | 'parse' | 'write' | 'derive' | 'analyze';
20
+ /** Where a sync spent its time and how much it changed. */
21
+ export interface SyncStats {
22
+ /** Milliseconds per step: tree and blobs wait for the remote. */
23
+ steps: Partial<Record<SyncStep, number>>;
24
+ /** Files fetched from the remote */
25
+ files: number;
26
+ /** Entry versions derived again */
27
+ versions: number;
9
28
  }
10
29
  /**
11
30
  * A locally available entry store: a writeable graph backed by a source that
@@ -1,6 +1,8 @@
1
1
  import type { CreateInputRow, StoredRow } from '../Infer.js';
2
2
  import type { ImagePreviewDetails } from '../media/CreatePreview.js';
3
+ import { type ImageEdit, type ImageTransform } from '../media/ImageTransform.js';
3
4
  import { Type } from '../Type.js';
5
+ import type { User } from '../User.js';
4
6
  import type { Mutation } from './Mutation.js';
5
7
  import type { WriteableGraph } from './WriteableGraph.js';
6
8
  type Awaitable<T> = T | Promise<T>;
@@ -20,6 +22,8 @@ export interface CreateQuery<Fields> {
20
22
  set: Partial<CreateInputRow<Fields>>;
21
23
  insertOrder?: 'first' | 'last';
22
24
  overwrite?: boolean;
25
+ /** Recorded as the creator, or the last editor of an overwritten entry */
26
+ user?: User | null;
23
27
  }
24
28
  export declare class CreateOp<Fields> extends Operation {
25
29
  id: string;
@@ -43,6 +47,8 @@ export interface UpdateQuery<Fields> {
43
47
  set: Partial<StoredRow<Fields>>;
44
48
  status?: 'draft' | 'published' | 'archived';
45
49
  locale?: string | null;
50
+ /** Recorded as the last editor */
51
+ user?: User | null;
46
52
  }
47
53
  export declare class UpdateOperation<Definition> extends Operation {
48
54
  constructor(query: UpdateQuery<Definition>);
@@ -83,9 +89,30 @@ export interface UploadQuery {
83
89
  workspace?: string;
84
90
  root?: string;
85
91
  parentId?: string | null;
86
- createPreview?(blob: Blob): Promise<ImagePreviewDetails>;
92
+ /**
93
+ * The file type the upload becomes, one of those the location contains.
94
+ * Defaults to the first of them that accepts the file, a replaced file
95
+ * keeps its type.
96
+ */
97
+ type?: string;
98
+ createPreview?(blob: Blob): Promise<ImagePreviewDetails | undefined>;
99
+ /** Rotate and crop the image before it is uploaded */
100
+ edit?: ImageEdit;
101
+ /**
102
+ * Applies the edit and scales down images larger than the resizeImages
103
+ * option of the config: `alinea/core/media/TransformImage` does so in the
104
+ * browser or with sharp
105
+ */
106
+ transformImage?(blob: Blob, fileName: string, transform: ImageTransform): Promise<Blob>;
107
+ /**
108
+ * Recompresses the images of a pdf: `alinea/core/media/CompressPdf` does
109
+ * so in the browser or with sharp
110
+ */
111
+ compressPdf?(blob: Blob): Promise<Blob>;
87
112
  onProgress?(progress: UploadProgress): void;
88
113
  replaceId?: string;
114
+ /** Recorded as the creator, or the last editor of a replaced file */
115
+ user?: User | null;
89
116
  }
90
117
  export interface UploadProgress {
91
118
  loaded: number;
@@ -1,16 +1,26 @@
1
1
  import "../../chunks/chunk-CQ52GEHY.js";
2
2
 
3
3
  // src/core/db/Operation.ts
4
+ import { Config } from "../Config.js";
5
+ import { Entry } from "../Entry.js";
4
6
  import { Field } from "../Field.js";
5
7
  import { HttpError } from "../HttpError.js";
6
8
  import { createId } from "../Id.js";
9
+ import {
10
+ hasImageEdit,
11
+ imageResizeOptions,
12
+ isTransformableImage
13
+ } from "../media/ImageTransform.js";
7
14
  import { isImage } from "../media/IsImage.js";
15
+ import { isPdf } from "../media/Pdf.js";
8
16
  import { MediaLocation } from "../media/MediaLocation.js";
17
+ import { fileTypeAccepts } from "../media/MediaTypes.js";
9
18
  import { assertUploadSize } from "../media/UploadLimits.js";
19
+ import { assert } from "../util/Assert.js";
10
20
  import { Schema } from "../Schema.js";
11
21
  import { Type } from "../Type.js";
12
22
  import { createFileHash } from "../util/ContentHash.js";
13
- import { keys } from "../util/Objects.js";
23
+ import { entries, fromEntries, keys } from "../util/Objects.js";
14
24
  import { basename, extname } from "../util/Paths.js";
15
25
  import { slugify } from "../util/Slugs.js";
16
26
  import { Workspace } from "../Workspace.js";
@@ -39,7 +49,11 @@ var CreateOp = class extends Operation {
39
49
  locale: op.locale ?? null,
40
50
  parentId: op.parentId ?? null,
41
51
  type: typeName(config, op.type),
42
- data: initializeSet(op.type, op.set),
52
+ data: Type.beforeSave(op.type, initializeSet(op.type, op.set), {
53
+ action: !op.overwrite ? "create" : (op.status ?? "published") === "published" ? "publish" : "update",
54
+ user: op.user,
55
+ now: /* @__PURE__ */ new Date()
56
+ }),
43
57
  insertOrder: op.insertOrder,
44
58
  status: op.status,
45
59
  overwrite: op.overwrite,
@@ -87,7 +101,7 @@ var DiscardOp = class extends Operation {
87
101
  };
88
102
  var UpdateOperation = class extends Operation {
89
103
  constructor(query) {
90
- super(() => {
104
+ super(async (db) => {
91
105
  const { status = "published", locale = null, id, set } = query;
92
106
  return [
93
107
  {
@@ -95,12 +109,32 @@ var UpdateOperation = class extends Operation {
95
109
  id,
96
110
  locale,
97
111
  status,
98
- set
112
+ set: await beforeUpdate(db, query)
99
113
  }
100
114
  ];
101
115
  });
102
116
  }
103
117
  };
118
+ async function beforeUpdate(db, { status = "published", locale = null, id, set, user }) {
119
+ const current = await db.first({
120
+ select: { type: Entry.type, data: Entry.data },
121
+ id,
122
+ locale,
123
+ status
124
+ });
125
+ const type = current && db.config.schema[current.type];
126
+ if (!type) return set;
127
+ const updated = { ...current.data, ...set };
128
+ const saved = Type.beforeSave(type, updated, {
129
+ action: status === "published" ? "publish" : "update",
130
+ user,
131
+ now: /* @__PURE__ */ new Date()
132
+ });
133
+ const changed = entries(saved).filter(([key, value]) => {
134
+ return value !== updated[key];
135
+ });
136
+ return { ...set, ...fromEntries(changed) };
137
+ }
104
138
  var MoveOperation = class extends Operation {
105
139
  constructor(query) {
106
140
  super(() => {
@@ -134,15 +168,45 @@ var UploadOperation = class extends Operation {
134
168
  constructor(query) {
135
169
  super(async (db) => {
136
170
  const entryId = this.id;
137
- const { file, createPreview } = query;
171
+ const { file, createPreview, edit, transformImage, compressPdf } = query;
138
172
  const { workspace: _workspace, root: _root, parentId: _parentId } = query;
139
173
  const fileName = Array.isArray(file) ? file[0] : file.name;
140
174
  const workspace = _workspace ?? Object.keys(db.config.workspaces)[0];
141
175
  const root = _root ?? Workspace.defaultMediaRoot(db.config.workspaces[workspace]);
142
- const fileSize = Array.isArray(file) ? file[1].byteLength : file.size;
176
+ let blob = Array.isArray(file) ? new Blob([file[1]]) : file;
177
+ let contentType = file instanceof Blob ? file.type : "application/octet-stream";
178
+ const typeName2 = await uploadType(db, query, {
179
+ workspace,
180
+ root,
181
+ fileName,
182
+ mimeType: file instanceof Blob ? file.type : void 0
183
+ });
184
+ const source = blob;
185
+ const edited = hasImageEdit(edit);
186
+ assert(
187
+ !edited || transformImage,
188
+ "Editing an upload needs transformImage"
189
+ );
190
+ const resize = imageResizeOptions(db.config.resizeImages);
191
+ const bytes = new Uint8Array(await source.arrayBuffer());
192
+ if (transformImage && (edited || resize) && isTransformableImage(fileName, bytes)) {
193
+ const transformed = await transformImage(blob, fileName, { edit, resize });
194
+ if (edited || transformed.size < blob.size) {
195
+ blob = transformed;
196
+ contentType = transformed.type;
197
+ }
198
+ }
199
+ if (compressPdf && isPdf(fileName)) {
200
+ const compressed = await compressPdf(blob);
201
+ if (compressed.size < blob.size) {
202
+ blob = compressed;
203
+ contentType = "application/pdf";
204
+ }
205
+ }
206
+ const sourceHash = blob !== source && !edited ? await createFileHash(bytes) : void 0;
207
+ const fileSize = blob.size;
143
208
  assertUploadSize(fileName, fileSize, db.config.maxUploadSize);
144
- const body = Array.isArray(file) ? file[1] : await file.arrayBuffer();
145
- const contentType = file instanceof Blob ? file.type : "application/octet-stream";
209
+ const body = await blob.arrayBuffer();
146
210
  const originalExtension = extname(fileName);
147
211
  const title = basename(fileName, originalExtension);
148
212
  const extension = originalExtension.toLowerCase();
@@ -155,10 +219,12 @@ var UploadOperation = class extends Operation {
155
219
  const info = await db.prepareUpload(uploadLocation, {
156
220
  size: fileSize
157
221
  });
158
- const previewData = isImage(fileName) ? await createPreview?.(
159
- file instanceof Blob ? file : new Blob([body])
222
+ const previewData = isImage(fileName) ? await createPreview?.(blob) : isPdf(fileName) ? (
223
+ // A pdf uploads without a preview when its page can't be read
224
+ pagePreview(await createPreview?.(blob).catch(() => void 0))
160
225
  ) : void 0;
161
226
  await sendUpload(info.url, info.method ?? "POST", contentType, body, {
227
+ headers: info.headers,
162
228
  onProgress: query.onProgress
163
229
  });
164
230
  const hash = await createFileHash(new Uint8Array(body));
@@ -172,23 +238,39 @@ var UploadOperation = class extends Operation {
172
238
  url: info.previewUrl,
173
239
  location: MediaLocation.storagePath(db.config, workspace, fileLocation)
174
240
  };
241
+ const fileType = db.config.schema[typeName2];
242
+ const uploaded = {
243
+ title,
244
+ location: fileLocation,
245
+ // Local uploads have no preview url, leave the empty value out
246
+ ...info.previewUrl ? { previewUrl: info.previewUrl } : {},
247
+ extension,
248
+ size: body.byteLength,
249
+ hash,
250
+ ...sourceHash ? { sourceHash } : {},
251
+ ...previewData
252
+ };
175
253
  const createEntry = {
176
254
  op: "create",
177
255
  id: entryId,
178
256
  locale: null,
179
257
  parentId: _parentId ?? null,
180
- type: "MediaFile",
258
+ type: typeName2,
181
259
  root,
182
260
  workspace,
183
- data: {
184
- title,
185
- location: fileLocation,
186
- previewUrl: info.previewUrl,
187
- extension,
188
- size: body.byteLength,
189
- hash,
190
- ...previewData
191
- },
261
+ data: Type.beforeSave(
262
+ fileType,
263
+ // A replaced file keeps the fields stored with it, see overwrite
264
+ query.replaceId ? uploaded : Type.withInitialValue(fileType, uploaded, {
265
+ fieldI18n: Config.fieldI18n(db.config, workspace, root)
266
+ }),
267
+ {
268
+ action: query.replaceId ? "update" : "create",
269
+ user: query.user,
270
+ now: /* @__PURE__ */ new Date()
271
+ }
272
+ ),
273
+ // The server keeps the stored details of the file this replaces
192
274
  overwrite: query.replaceId !== void 0
193
275
  };
194
276
  return [uploadFile, createEntry];
@@ -196,26 +278,80 @@ var UploadOperation = class extends Operation {
196
278
  this.id = query.replaceId ?? createId();
197
279
  }
198
280
  };
281
+ async function uploadType(db, query, { workspace, root, fileName, mimeType }) {
282
+ const { config } = db;
283
+ if (query.replaceId) {
284
+ const current = await db.first({
285
+ id: query.replaceId,
286
+ select: Entry.type,
287
+ status: "preferDraft"
288
+ });
289
+ if (current) {
290
+ const type = config.schema[current];
291
+ if (type && !fileTypeAccepts(type, fileName, mimeType))
292
+ throw new HttpError(400, `"${current}" does not accept ${fileName}`);
293
+ return current;
294
+ }
295
+ }
296
+ const parentType = query.parentId ? await db.first({
297
+ id: query.parentId,
298
+ select: Entry.type,
299
+ status: "preferDraft"
300
+ }) : void 0;
301
+ const location = { workspace, root, parentType: parentType ?? void 0 };
302
+ const types = Config.uploadCandidates(config, location);
303
+ const accepting = types.filter(
304
+ (name) => fileTypeAccepts(config.schema[name], fileName, mimeType)
305
+ );
306
+ if (query.type) {
307
+ if (!types.includes(query.type))
308
+ throw new HttpError(
309
+ 400,
310
+ `"${query.type}" can't be uploaded here, use one of ${types.join(", ")}`
311
+ );
312
+ if (!accepting.includes(query.type))
313
+ throw new HttpError(400, `"${query.type}" does not accept ${fileName}`);
314
+ return query.type;
315
+ }
316
+ if (accepting.length === 0)
317
+ throw new HttpError(
318
+ 400,
319
+ `No file type here accepts ${fileName}, the types are ${types.join(", ")}`
320
+ );
321
+ return accepting[0];
322
+ }
323
+ function pagePreview(preview) {
324
+ if (!preview) return void 0;
325
+ const { preview: image, thumbHash, averageColor } = preview;
326
+ return { preview: image, thumbHash, averageColor };
327
+ }
199
328
  async function sendUpload(url, method, contentType, body, options) {
200
- const { onProgress } = options;
329
+ const { headers = {}, onProgress } = options;
201
330
  if (onProgress && typeof XMLHttpRequest !== "undefined") {
202
- await uploadFileWithProgress(url, method, contentType, body, onProgress);
331
+ await uploadFileWithProgress(
332
+ url,
333
+ method,
334
+ { ...headers, "Content-Type": contentType },
335
+ body,
336
+ onProgress
337
+ );
203
338
  return;
204
339
  }
205
340
  await fetch(url, {
206
341
  method,
207
- headers: { "Content-Type": contentType },
342
+ headers: { ...headers, "Content-Type": contentType },
208
343
  body
209
344
  }).then((result) => {
210
345
  if (!result.ok)
211
346
  throw new HttpError(result.status, "Could not reach server for upload");
212
347
  });
213
348
  }
214
- function uploadFileWithProgress(url, method, contentType, body, onProgress) {
349
+ function uploadFileWithProgress(url, method, headers, body, onProgress) {
215
350
  return new Promise((resolve, reject) => {
216
351
  const request = new XMLHttpRequest();
217
352
  request.open(method, url);
218
- request.setRequestHeader("Content-Type", contentType);
353
+ for (const [name, value] of Object.entries(headers))
354
+ request.setRequestHeader(name, value);
219
355
  request.upload.addEventListener("progress", (event) => {
220
356
  onProgress({
221
357
  loaded: event.loaded,
@@ -0,0 +1,16 @@
1
+ import type { RemoteSource } from 'alinea/core/source/Source';
2
+ import type { LocalStore, SyncOptions, SyncStats, SyncStep } from './LocalStore.js';
3
+ export declare const syncSteps: Array<SyncStep>;
4
+ export declare function syncStats(): SyncStats;
5
+ /** Add the time `run` takes to a step, when the sync is measured. */
6
+ export declare function timeStep<T>(stats: SyncStats | undefined, step: SyncStep, run: () => T | Promise<T>): Promise<T>;
7
+ /**
8
+ * Sync and log why, between which revisions and where the time went, also
9
+ * when it fails: slow syncs are found in the server logs.
10
+ */
11
+ export declare function loggedSync(store: Pick<LocalStore, 'sha' | 'syncWith'>, remote: RemoteSource, reason: string, options?: SyncOptions): Promise<string>;
12
+ /**
13
+ * Such as `Alinea synced 1a2b3c4 → 5d6e7f8 (interval) in 812 ms: tree 80 ms,
14
+ * blobs 410 ms, …, 1 file, 4 versions derived`.
15
+ */
16
+ export declare function describeSync(reason: string, from: string, to: string | undefined, durationMs: number, stats: SyncStats): string;