alinea 2.0.0-preview.12 → 2.0.0-preview.14

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 (421) hide show
  1. package/dist/.init/content/pages/welcome.json +1 -1
  2. package/dist/.mcp/later/dev.json +1 -1
  3. package/dist/.mcp/online/dev.json +1 -1
  4. package/dist/adapter/next/cms.js +22 -10
  5. package/dist/adapter/next/context.js +1 -4
  6. package/dist/adapter/next/dashboardUrl.d.ts +6 -0
  7. package/dist/adapter/next/dashboardUrl.js +13 -0
  8. package/dist/adapter/next/handler.js +12 -1
  9. package/dist/adapter/next/syncCheck.d.ts +15 -2
  10. package/dist/adapter/next/syncCheck.js +26 -9
  11. package/dist/backend/CommitEntries.d.ts +17 -0
  12. package/dist/backend/CommitEntries.js +39 -0
  13. package/dist/backend/Handler.d.ts +9 -0
  14. package/dist/backend/Handler.js +84 -20
  15. package/dist/backend/api/BasicAuth.js +5 -1
  16. package/dist/backend/api/BlobStore.d.ts +21 -0
  17. package/dist/backend/api/BlobStore.js +63 -0
  18. package/dist/backend/api/CreateBackend.js +10 -8
  19. package/dist/backend/api/DatabaseApi.d.ts +4 -1
  20. package/dist/backend/api/DatabaseApi.js +104 -7
  21. package/dist/backend/api/GithubApi.d.ts +13 -0
  22. package/dist/backend/api/GithubApi.js +213 -50
  23. package/dist/backend/api/database.js +6 -6
  24. package/dist/backend/util/Syncable.d.ts +6 -0
  25. package/dist/backend/util/Syncable.js +3 -1
  26. package/dist/bundled.d.ts +1582 -426
  27. package/dist/chunks/{bun-sqlite-5SHXN3AT.js → bun-sqlite-RI6BYU5S.js} +3 -3
  28. package/dist/chunks/{chunk-ASYKC6IE.js → chunk-2PP7WJUJ.js} +2 -12
  29. package/dist/chunks/{chunk-QJGGYF6E.js → chunk-6FQ5IMNA.js} +7 -7
  30. package/dist/chunks/{chunk-JOF663EG.js → chunk-7DDPSWRY.js} +465 -2
  31. package/dist/chunks/{chunk-ETWOY4AL.js → chunk-A2I6MCCS.js} +1 -1
  32. package/dist/chunks/{chunk-W5AXN7GH.js → chunk-CYVOGRSD.js} +1 -2
  33. package/dist/chunks/{chunk-TIJTT5ZI.js → chunk-G43W7AME.js} +1 -0
  34. package/dist/chunks/{chunk-RE523BQ7.js → chunk-PMGIIYDD.js} +5830 -5830
  35. package/dist/chunks/{chunk-AIU6CMVT.js → chunk-PTYZMV5G.js} +1 -1
  36. package/dist/chunks/{chunk-66YZ47TY.js → chunk-RAR44T5O.js} +1 -1
  37. package/dist/chunks/{chunk-OHGAVV4G.js → chunk-SCV3TEXM.js} +2 -3
  38. package/dist/chunks/{chunk-UPY2RUZF.js → chunk-TWBREZWC.js} +30 -0
  39. package/dist/chunks/{chunk-QSN6RH6X.js → chunk-VA6NC3MI.js} +1 -1
  40. package/dist/chunks/{node-sqlite-XVNTNMCY.js → node-sqlite-C7VJ2NSN.js} +3 -3
  41. package/dist/cli/Generate.js +20 -7
  42. package/dist/cli/Mcp.js +1 -1
  43. package/dist/cli/Serve.js +1 -1
  44. package/dist/cli/bin.js +2 -3
  45. package/dist/cli/build/BuildEmitter.d.ts +5 -1
  46. package/dist/cli/build/BuildEmitter.js +8 -3
  47. package/dist/cli/generate/CompileConfig.js +10 -6
  48. package/dist/cli/generate/DevDB.d.ts +4 -1
  49. package/dist/cli/generate/DevDB.js +15 -7
  50. package/dist/cli/generate/GenerateDashboard.js +1 -0
  51. package/dist/cli/generate/MediaLocations.d.ts +18 -0
  52. package/dist/cli/generate/MediaLocations.js +69 -0
  53. package/dist/cli/serve/CreateLocalServer.js +1 -0
  54. package/dist/cli/serve/mcp/DevMcp.js +1 -1
  55. package/dist/cli/serve/mcp/McpTools.js +29 -1
  56. package/dist/cloud/CloudRemote.js +21 -7
  57. package/dist/cms.d.ts +4 -2
  58. package/dist/components/Alert.js +3 -3
  59. package/dist/components/AsyncList.d.ts +52 -0
  60. package/dist/components/AsyncList.js +69 -0
  61. package/dist/components/Badge.d.ts +3 -1
  62. package/dist/components/Badge.js +5 -3
  63. package/dist/components/Breadcrumbs.js +4 -4
  64. package/dist/components/Button.d.ts +6 -1
  65. package/dist/components/Button.js +14 -5
  66. package/dist/components/Calendar.js +20 -20
  67. package/dist/components/Checkbox.js +10 -10
  68. package/dist/components/CheckboxGroup.js +4 -4
  69. package/dist/components/Code.js +2 -2
  70. package/dist/components/Collapsible.js +3 -3
  71. package/dist/components/ColorSwatch.js +2 -2
  72. package/dist/components/ColorSwatchPicker.js +4 -4
  73. package/dist/components/ComboBox.d.ts +27 -9
  74. package/dist/components/ComboBox.js +42 -11
  75. package/dist/components/Command.js +14 -13
  76. package/dist/components/ContentCard.d.ts +3 -1
  77. package/dist/components/ContentCard.js +46 -24
  78. package/dist/components/ContentGrid.js +17 -17
  79. package/dist/components/DataList.js +3 -3
  80. package/dist/components/DateField.d.ts +4 -0
  81. package/dist/components/DateField.js +2 -2
  82. package/dist/components/DatePicker.js +2 -2
  83. package/dist/components/DateRangePicker.js +2 -2
  84. package/dist/components/Dialog.d.ts +14 -3
  85. package/dist/components/Dialog.js +36 -9
  86. package/dist/components/DropZone.js +5 -5
  87. package/dist/components/DropdownMenu.js +9 -9
  88. package/dist/components/Empty.js +4 -4
  89. package/dist/components/Field.d.ts +1 -1
  90. package/dist/components/Field.js +17 -11
  91. package/dist/components/Form.d.ts +23 -0
  92. package/dist/components/Form.js +64 -0
  93. package/dist/components/Link.d.ts +8 -1
  94. package/dist/components/List.js +24 -24
  95. package/dist/components/MediaPreview.js +7 -7
  96. package/dist/components/MultipleSelect.d.ts +13 -8
  97. package/dist/components/MultipleSelect.js +21 -21
  98. package/dist/components/NavRail.js +6 -6
  99. package/dist/components/NumberField.d.ts +5 -1
  100. package/dist/components/NumberField.js +6 -4
  101. package/dist/components/Page.js +6 -6
  102. package/dist/components/Popover.js +2 -2
  103. package/dist/components/PreviewFrame.js +6 -6
  104. package/dist/components/RadioGroup.js +9 -9
  105. package/dist/components/Resizable.js +4 -4
  106. package/dist/components/SearchField.d.ts +6 -1
  107. package/dist/components/SearchField.js +10 -8
  108. package/dist/components/Select.d.ts +13 -10
  109. package/dist/components/Select.js +16 -30
  110. package/dist/components/Sheet.d.ts +50 -0
  111. package/dist/components/Sheet.js +202 -0
  112. package/dist/components/Sidebar.js +5 -5
  113. package/dist/components/SortableList.d.ts +34 -30
  114. package/dist/components/SortableList.js +160 -263
  115. package/dist/components/Spinner.js +4 -4
  116. package/dist/components/Stack.d.ts +20 -0
  117. package/dist/components/Stack.js +45 -0
  118. package/dist/components/Surface.js +2 -2
  119. package/dist/components/Switch.js +6 -6
  120. package/dist/components/Table.d.ts +14 -2
  121. package/dist/components/Table.js +90 -51
  122. package/dist/components/Tabs.js +4 -4
  123. package/dist/components/TagGroup.js +10 -10
  124. package/dist/components/TextField.d.ts +7 -1
  125. package/dist/components/TextField.js +19 -10
  126. package/dist/components/TimeField.d.ts +6 -1
  127. package/dist/components/TimeField.js +48 -23
  128. package/dist/components/Timestamp.js +1 -1
  129. package/dist/components/ToggleGroup.js +2 -2
  130. package/dist/components/Toolbar.js +3 -3
  131. package/dist/components/Tooltip.js +6 -5
  132. package/dist/components/Tree.js +24 -24
  133. package/dist/components/internal/DateControl.js +9 -9
  134. package/dist/components/internal/FormScope.d.ts +2 -0
  135. package/dist/components/internal/FormScope.js +8 -0
  136. package/dist/components/internal/ListBoxGroup.d.ts +12 -0
  137. package/dist/components/internal/ListBoxGroup.js +46 -0
  138. package/dist/components/internal/ListBoxOption.d.ts +2 -2
  139. package/dist/components/internal/ListBoxOption.js +7 -7
  140. package/dist/components/internal/Locale.js +2 -2
  141. package/dist/components/internal/PopoverSurface.js +3 -2
  142. package/dist/components/internal/SelectionCheckbox.js +6 -6
  143. package/dist/components/internal/Slot.js +1 -1
  144. package/dist/components/internal/ToggleButton.js +4 -4
  145. package/dist/components/internal/Trigger.js +2 -2
  146. package/dist/components/internal/sortableDrag.d.ts +19 -0
  147. package/dist/components/internal/sortableDrag.js +175 -0
  148. package/dist/components/internal/useDragDrop.js +2 -2
  149. package/dist/components/types.d.ts +4 -0
  150. package/dist/components.d.ts +4 -0
  151. package/dist/components.js +4 -0
  152. package/dist/core/Client.js +12 -1
  153. package/dist/core/Config.d.ts +12 -1
  154. package/dist/core/Config.js +12 -0
  155. package/dist/core/DashboardEntry.d.ts +19 -0
  156. package/dist/core/DashboardEntry.js +0 -0
  157. package/dist/core/Document.d.ts +9 -1
  158. package/dist/core/Document.js +40 -8
  159. package/dist/core/EntryFields.d.ts +8 -2
  160. package/dist/core/Field.d.ts +5 -0
  161. package/dist/core/Filter.d.ts +19 -2
  162. package/dist/core/Filter.js +5 -0
  163. package/dist/core/Graph.d.ts +10 -2
  164. package/dist/core/Overview.d.ts +76 -9
  165. package/dist/core/Overview.js +1 -0
  166. package/dist/core/Root.js +1 -1
  167. package/dist/core/Scope.d.ts +5 -0
  168. package/dist/core/Scope.js +22 -5
  169. package/dist/core/TextDoc.d.ts +4 -0
  170. package/dist/core/Type.d.ts +25 -6
  171. package/dist/core/Type.js +25 -7
  172. package/dist/core/Validation.d.ts +0 -1
  173. package/dist/core/Validation.js +0 -6
  174. package/dist/core/db/LocalStore.d.ts +7 -0
  175. package/dist/core/field/CreateField.d.ts +1 -2
  176. package/dist/core/field/RichTextField.js +23 -4
  177. package/dist/core/media/MediaTypes.js +1 -1
  178. package/dist/core/source/GithubSource.d.ts +4 -0
  179. package/dist/core/source/GithubSource.js +127 -25
  180. package/dist/core/source/GithubUsage.d.ts +21 -0
  181. package/dist/core/source/GithubUsage.js +47 -0
  182. package/dist/core/source/Source.d.ts +2 -0
  183. package/dist/core/source/Source.js +11 -0
  184. package/dist/core/util/Async.d.ts +2 -0
  185. package/dist/core/util/Async.js +12 -1
  186. package/dist/core/util/Checks.js +1 -1
  187. package/dist/core/util/Slugs.js +4 -3
  188. package/dist/dashboard/App.css +13 -11
  189. package/dist/dashboard/App.d.ts +3 -2
  190. package/dist/dashboard/App.js +24 -6
  191. package/dist/dashboard/Href.d.ts +37 -0
  192. package/dist/dashboard/Href.js +46 -0
  193. package/dist/dashboard/ViewKeys.d.ts +1 -0
  194. package/dist/dashboard/ViewKeys.js +1 -0
  195. package/dist/dashboard/app/ActivityStatus.js +34 -12
  196. package/dist/dashboard/app/AuthView.js +6 -6
  197. package/dist/dashboard/app/BlockSettings.d.ts +9 -0
  198. package/dist/dashboard/app/BlockSettings.js +16 -0
  199. package/dist/dashboard/app/BlockSheet.d.ts +50 -0
  200. package/dist/dashboard/app/BlockSheet.js +207 -0
  201. package/dist/dashboard/app/BlockSheetStoryFrame.d.ts +6 -0
  202. package/dist/dashboard/app/BlockSheetStoryFrame.js +29 -0
  203. package/dist/dashboard/app/CompactField.js +14 -14
  204. package/dist/dashboard/app/CroppedImage.js +2 -2
  205. package/dist/dashboard/app/DashboardLayout.d.ts +1 -1
  206. package/dist/dashboard/app/DashboardLayout.js +15 -1
  207. package/dist/dashboard/app/EntryActions.d.ts +11 -0
  208. package/dist/dashboard/app/EntryActions.js +30 -0
  209. package/dist/dashboard/app/EntryFields.d.ts +15 -2
  210. package/dist/dashboard/app/EntryFields.js +24 -3
  211. package/dist/dashboard/app/EntryHeader.js +45 -36
  212. package/dist/dashboard/app/EntryReferences.js +5 -5
  213. package/dist/dashboard/app/EntrySidebar.js +24 -22
  214. package/dist/dashboard/app/EntrySidebarPreview.js +2 -2
  215. package/dist/dashboard/app/EntryStatusIcon.d.ts +23 -0
  216. package/dist/dashboard/app/EntryStatusIcon.js +58 -0
  217. package/dist/dashboard/app/EntryValidationModal.d.ts +6 -5
  218. package/dist/dashboard/app/EntryValidationModal.js +17 -17
  219. package/dist/dashboard/app/Explorer.d.ts +3 -1
  220. package/dist/dashboard/app/Explorer.js +90 -47
  221. package/dist/dashboard/app/ExplorerBatchActions.d.ts +3 -1
  222. package/dist/dashboard/app/ExplorerBatchActions.js +70 -45
  223. package/dist/dashboard/app/ExplorerCards.js +7 -1
  224. package/dist/dashboard/app/ExplorerControls.js +4 -4
  225. package/dist/dashboard/app/ExplorerList.js +7 -7
  226. package/dist/dashboard/app/ExplorerModal.js +4 -4
  227. package/dist/dashboard/app/ExplorerOverviewHeader.d.ts +6 -0
  228. package/dist/dashboard/app/ExplorerOverviewHeader.js +28 -0
  229. package/dist/dashboard/app/ExplorerTable.js +11 -8
  230. package/dist/dashboard/app/ExplorerTabs.d.ts +12 -0
  231. package/dist/dashboard/app/ExplorerTabs.js +42 -0
  232. package/dist/dashboard/app/ImageEditor.js +26 -26
  233. package/dist/dashboard/app/ImagePicker.js +3 -13
  234. package/dist/dashboard/app/LinkPicker.js +27 -25
  235. package/dist/dashboard/app/LocaleMenu.js +7 -7
  236. package/dist/dashboard/app/MediaPreviewCell.js +4 -4
  237. package/dist/dashboard/app/MoveConfirmDialog.d.ts +5 -0
  238. package/dist/dashboard/app/MoveConfirmDialog.js +79 -0
  239. package/dist/dashboard/app/OverviewCell.js +11 -14
  240. package/dist/dashboard/app/PendingUploadsView.js +3 -3
  241. package/dist/dashboard/app/ReadOnlyBadge.d.ts +1 -1
  242. package/dist/dashboard/app/RemoveDialog.d.ts +17 -0
  243. package/dist/dashboard/app/{DeleteDialog.js → RemoveDialog.js} +72 -27
  244. package/dist/dashboard/app/RemoveRedirect.d.ts +7 -0
  245. package/dist/dashboard/app/RemoveRedirect.js +123 -0
  246. package/dist/dashboard/app/SearchBar.d.ts +9 -0
  247. package/dist/dashboard/app/SearchBar.js +31 -0
  248. package/dist/dashboard/app/SettingsTab.d.ts +6 -0
  249. package/dist/dashboard/app/SettingsTab.js +27 -0
  250. package/dist/dashboard/app/SidebarTree.js +26 -71
  251. package/dist/dashboard/app/WorkspaceMenu.js +9 -9
  252. package/dist/dashboard/app/WorkspaceRoots.js +108 -104
  253. package/dist/dashboard/app/editor/FileEditor.js +17 -17
  254. package/dist/dashboard/app/modals/CreateEntry.js +3 -3
  255. package/dist/dashboard/app/pages/EntryPage.d.ts +2 -1
  256. package/dist/dashboard/app/pages/EntryPage.js +65 -43
  257. package/dist/dashboard/app/pages/RootPage.js +3 -3
  258. package/dist/dashboard/app/pages/SplashPage.js +91 -76
  259. package/dist/dashboard/app/pages/UsersPage.js +11 -11
  260. package/dist/dashboard/app/ui/DashboardModal.js +14 -13
  261. package/dist/dashboard/atoms/activity.d.ts +1 -0
  262. package/dist/dashboard/atoms/activity.js +8 -5
  263. package/dist/dashboard/atoms/config.d.ts +2 -0
  264. package/dist/dashboard/atoms/dashboard.d.ts +11 -0
  265. package/dist/dashboard/atoms/dashboard.js +9 -1
  266. package/dist/dashboard/atoms/editor.d.ts +7 -1
  267. package/dist/dashboard/atoms/editor.js +14 -2
  268. package/dist/dashboard/atoms/entry.js +1 -14
  269. package/dist/dashboard/atoms/entryTable.js +1 -0
  270. package/dist/dashboard/atoms/explorer.d.ts +19 -0
  271. package/dist/dashboard/atoms/explorer.js +62 -21
  272. package/dist/dashboard/atoms/graph.d.ts +5 -0
  273. package/dist/dashboard/atoms/graph.js +27 -2
  274. package/dist/dashboard/atoms/link.js +5 -2
  275. package/dist/dashboard/atoms/move.d.ts +5 -0
  276. package/dist/dashboard/atoms/move.js +29 -3
  277. package/dist/dashboard/atoms/moveConfirmation.d.ts +34 -0
  278. package/dist/dashboard/atoms/moveConfirmation.js +95 -0
  279. package/dist/dashboard/atoms/nav.d.ts +22 -12
  280. package/dist/dashboard/atoms/nav.js +200 -65
  281. package/dist/dashboard/atoms/overview.d.ts +32 -9
  282. package/dist/dashboard/atoms/overview.js +43 -28
  283. package/dist/dashboard/atoms/remove.d.ts +112 -0
  284. package/dist/dashboard/atoms/remove.js +268 -0
  285. package/dist/dashboard/atoms/root.d.ts +2 -2
  286. package/dist/dashboard/atoms/root.js +48 -27
  287. package/dist/dashboard/atoms/user.js +1 -1
  288. package/dist/dashboard/atoms/utils.js +1 -1
  289. package/dist/dashboard/boot/ActivityEvent.d.ts +1 -1
  290. package/dist/dashboard/boot/Boot.js +31 -17
  291. package/dist/dashboard/boot/DashboardWorker.d.ts +7 -0
  292. package/dist/dashboard/boot/DashboardWorker.js +99 -54
  293. package/dist/dashboard/boot/LoadWorker.js +20 -10
  294. package/dist/dashboard/boot/SyncEvent.d.ts +7 -0
  295. package/dist/dashboard/boot/SyncEvent.js +14 -0
  296. package/dist/dashboard/boot/WorkerDB.d.ts +1 -0
  297. package/dist/dashboard/boot/WorkerDB.js +3 -0
  298. package/dist/dashboard/cms/EntryTable.d.ts +4 -3
  299. package/dist/dashboard/cms/EntryTable.js +6 -3
  300. package/dist/dashboard/cms/ViewProps.d.ts +3 -2
  301. package/dist/dashboard/cms/hooks.d.ts +34 -18
  302. package/dist/dashboard/cms/hooks.js +43 -18
  303. package/dist/dashboard/contexts.d.ts +3 -2
  304. package/dist/dashboard/contexts.js +3 -2
  305. package/dist/dashboard/hook/UseEntryEditor.d.ts +1 -1
  306. package/dist/dashboard/hook/UseEntryEditor.js +7 -3
  307. package/dist/dashboard/icons.d.ts +1 -0
  308. package/dist/dashboard/icons.js +15 -0
  309. package/dist/database/BrowserEntryStore.d.ts +12 -62
  310. package/dist/database/BrowserEntryStore.js +116 -193
  311. package/dist/database/DatabaseTables.js +2 -2
  312. package/dist/database/EntryDatabase.d.ts +10 -1
  313. package/dist/database/EntryDatabase.js +45 -4
  314. package/dist/database/EntryStore.js +1 -11
  315. package/dist/database/EntryTransaction.js +0 -35
  316. package/dist/database/EntryUrlAliases.d.ts +4 -0
  317. package/dist/database/EntryUrlAliases.js +16 -10
  318. package/dist/database/driver/RuntimeDatabase.js +3 -3
  319. package/dist/database/driver/WasmDatabase.d.ts +5 -18
  320. package/dist/database/driver/WasmDatabase.js +15 -16
  321. package/dist/database/entry/EntryTable.d.ts +5 -3
  322. package/dist/database/entry/EntryTable.js +26 -9
  323. package/dist/database/query/Condition.d.ts +4 -1
  324. package/dist/database/query/Condition.js +16 -5
  325. package/dist/database/query/EntryQuery.js +60 -8
  326. package/dist/database/query/Relation.d.ts +13 -1
  327. package/dist/database/query/Relation.js +20 -2
  328. package/dist/database/query/Search.d.ts +7 -1
  329. package/dist/database/query/Search.js +55 -10
  330. package/dist/database/sync/EntrySyncer.d.ts +2 -0
  331. package/dist/database/sync/EntrySyncer.js +4 -2
  332. package/dist/database/sync/Ingest.d.ts +2 -1
  333. package/dist/database/sync/Ingest.js +20 -6
  334. package/dist/field/code/CodeField.view.js +13 -13
  335. package/dist/field/link/EntryLink.d.ts +8 -9
  336. package/dist/field/link/FileLink.d.ts +6 -6
  337. package/dist/field/link/ImageLink.d.ts +6 -9
  338. package/dist/field/link/ImageLink.js +0 -1
  339. package/dist/field/link/Link.d.ts +1 -1
  340. package/dist/field/link/LinkField.d.ts +5 -0
  341. package/dist/field/link/LinkField.view.js +251 -374
  342. package/dist/field/link/UrlLink.d.ts +4 -4
  343. package/dist/field/list/ListField.d.ts +2 -0
  344. package/dist/field/list/ListField.view.d.ts +15 -0
  345. package/dist/field/list/ListField.view.js +356 -299
  346. package/dist/field/metadata/MetadataField.d.ts +17 -7
  347. package/dist/field/metadata/MetadataField.js +14 -3
  348. package/dist/field/metadata/MetadataField.view.d.ts +1 -0
  349. package/dist/field/metadata/MetadataField.view.js +24 -20
  350. package/dist/field/richtext/RichTextBlock.d.ts +3 -1
  351. package/dist/field/richtext/RichTextBlock.js +181 -74
  352. package/dist/field/richtext/RichTextBlockHost.js +1 -1
  353. package/dist/field/richtext/RichTextExtensions.js +28 -28
  354. package/dist/field/richtext/RichTextField.view.js +10 -4
  355. package/dist/field/richtext/RichTextInsertMenu.js +45 -29
  356. package/dist/field/richtext/RichTextToolbar.js +26 -1
  357. package/dist/field/richtext/Toolbar.d.ts +9 -1
  358. package/dist/field/richtext/Toolbar.js +12 -2
  359. package/dist/field/select/SelectField.view.js +1 -0
  360. package/dist/field/views.js +2 -0
  361. package/dist/index.css +664 -332
  362. package/dist/index.d.ts +1 -0
  363. package/dist/index.js +3 -1
  364. package/dist/next.d.ts +2 -0
  365. package/dist/next.edge.d.ts +2 -0
  366. package/dist/picker/entry/EntryPicker.d.ts +3 -1
  367. package/dist/picker/entry/EntryPicker.js +15 -1
  368. package/dist/picker/url/UrlPicker.js +1 -0
  369. package/dist/preview/react.js +3 -0
  370. package/dist/query.d.ts +26 -14
  371. package/dist/query.js +4 -0
  372. package/dist/types.d.ts +8 -5
  373. package/dist/ui/Stack.d.ts +4 -2
  374. package/docs/ai-setup.md +3 -3
  375. package/docs/cli.md +4 -2
  376. package/docs/components/badge.md +1 -0
  377. package/docs/components/button.md +1 -0
  378. package/docs/components/combo-box.md +105 -16
  379. package/docs/components/content-card.md +1 -0
  380. package/docs/components/date-field.md +1 -1
  381. package/docs/components/dialog.md +51 -0
  382. package/docs/components/form.md +67 -0
  383. package/docs/components/link.md +10 -0
  384. package/docs/components/multiple-select.md +9 -17
  385. package/docs/components/number-field.md +5 -1
  386. package/docs/components/search-field.md +1 -0
  387. package/docs/components/select.md +9 -20
  388. package/docs/components/sortable-list.md +5 -20
  389. package/docs/components/stack.md +42 -0
  390. package/docs/components/table.md +84 -0
  391. package/docs/components/text-field.md +9 -1
  392. package/docs/components/time-field.md +5 -1
  393. package/docs/components.md +39 -1
  394. package/docs/configuration.md +4 -2
  395. package/docs/custom-fields.md +135 -7
  396. package/docs/deploy/self-host.md +3 -1
  397. package/docs/deploy.md +9 -5
  398. package/docs/fields/image.md +0 -1
  399. package/docs/fields/list.md +19 -0
  400. package/docs/fields/object.md +5 -3
  401. package/docs/fields/rich-text.md +31 -0
  402. package/docs/fields.md +1 -1
  403. package/docs/index.md +9 -7
  404. package/docs/instant-publishing.md +17 -11
  405. package/docs/overviews.md +131 -8
  406. package/docs/query/filtering.md +2 -0
  407. package/docs/query/related.md +58 -9
  408. package/docs/query.md +52 -1
  409. package/docs/quickstart.md +5 -5
  410. package/docs/schema/document.md +2 -0
  411. package/docs/schema/type.md +3 -1
  412. package/docs/upgrading.md +101 -19
  413. package/llms-full.txt +1036 -163
  414. package/package.json +2 -3
  415. package/readme.md +2 -2
  416. package/dist/core/db/EntryValidationError.d.ts +0 -13
  417. package/dist/core/db/EntryValidationError.js +0 -23
  418. package/dist/dashboard/app/DeleteDialog.d.ts +0 -11
  419. package/dist/dashboard/atoms/delete.d.ts +0 -68
  420. package/dist/dashboard/atoms/delete.js +0 -143
  421. package/dist/chunks/{chunk-MOWR65LM.js → chunk-PYDOMKJZ.js} +71 -71
@@ -0,0 +1,63 @@
1
+ import "../../chunks/chunk-CQ52GEHY.js";
2
+
3
+ // src/backend/api/BlobStore.ts
4
+ import { hashBlob } from "alinea/core/source/GitUtils";
5
+ var storeBatch = 100;
6
+ function isBlobStore(value) {
7
+ return "readBlobs" in value && typeof value.readBlobs === "function" && "storeBlobs" in value && typeof value.storeBlobs === "function";
8
+ }
9
+ function storedBlobs(store, getBlobs) {
10
+ return async function* (shas, options) {
11
+ const stored = await store.readBlobs(shas).catch((error) => {
12
+ console.warn("Alinea could not read stored blobs", error);
13
+ return /* @__PURE__ */ new Map();
14
+ });
15
+ for (const sha of shas) {
16
+ const blob = stored.get(sha);
17
+ if (blob) yield [sha, blob];
18
+ }
19
+ const missing = shas.filter((sha) => !stored.has(sha));
20
+ if (missing.length === 0) return;
21
+ let fetched = Array();
22
+ const keep = async () => {
23
+ const blobs = fetched;
24
+ fetched = [];
25
+ if (blobs.length > 0) await keepBlobs(store, blobs);
26
+ };
27
+ try {
28
+ for await (const entry of getBlobs(missing, options)) {
29
+ fetched.push(entry);
30
+ if (fetched.length >= storeBatch) await keep();
31
+ yield entry;
32
+ }
33
+ } finally {
34
+ await keep();
35
+ }
36
+ };
37
+ }
38
+ function storedWrites(store, write) {
39
+ return async (request) => {
40
+ const result = await write(request);
41
+ const encoder = new TextEncoder();
42
+ const blobs = Array();
43
+ for (const change of request.changes) {
44
+ if (change.op !== "addContent") continue;
45
+ const blob = encoder.encode(change.contents);
46
+ if (await hashBlob(blob) === change.sha) blobs.push([change.sha, blob]);
47
+ }
48
+ if (blobs.length > 0) await keepBlobs(store, blobs);
49
+ return result;
50
+ };
51
+ }
52
+ async function keepBlobs(store, blobs) {
53
+ try {
54
+ await store.storeBlobs(blobs);
55
+ } catch (error) {
56
+ console.warn("Alinea could not store blobs", error);
57
+ }
58
+ }
59
+ export {
60
+ isBlobStore,
61
+ storedBlobs,
62
+ storedWrites
63
+ };
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  driver_exports
3
- } from "../../chunks/chunk-QJGGYF6E.js";
4
- import "../../chunks/chunk-QSN6RH6X.js";
5
- import "../../chunks/chunk-ETWOY4AL.js";
6
- import "../../chunks/chunk-66YZ47TY.js";
7
- import "../../chunks/chunk-AIU6CMVT.js";
3
+ } from "../../chunks/chunk-6FQ5IMNA.js";
4
+ import "../../chunks/chunk-A2I6MCCS.js";
5
+ import "../../chunks/chunk-VA6NC3MI.js";
6
+ import "../../chunks/chunk-RAR44T5O.js";
7
+ import "../../chunks/chunk-PTYZMV5G.js";
8
8
  import "../../chunks/chunk-N47Y62CI.js";
9
9
  import "../../chunks/chunk-QBPYWU6C.js";
10
10
  import "../../chunks/chunk-2BJ2IFQM.js";
11
11
  import "../../chunks/chunk-XCZXR3C2.js";
12
- import "../../chunks/chunk-MOWR65LM.js";
12
+ import "../../chunks/chunk-PYDOMKJZ.js";
13
13
  import "../../chunks/chunk-76VMZTLN.js";
14
14
  import "../../chunks/chunk-2PIFHEYR.js";
15
15
  import "../../chunks/chunk-K62JP6HR.js";
@@ -20,6 +20,7 @@ import "../../chunks/chunk-CQ52GEHY.js";
20
20
  // src/backend/api/CreateBackend.ts
21
21
  import { assert } from "alinea/core/util/Assert";
22
22
  import { BasicAuth } from "./BasicAuth.js";
23
+ import { isBlobStore, storedBlobs, storedWrites } from "./BlobStore.js";
23
24
  import { DatabaseApi } from "./DatabaseApi.js";
24
25
  import { GithubApi } from "./GithubApi.js";
25
26
  import { OAuth2 } from "./OAuth2.js";
@@ -65,13 +66,14 @@ function composeBackend(...impl) {
65
66
  throw new Error(`Backend does not implement ${name}`);
66
67
  };
67
68
  };
69
+ const blobStore = impl.find(isBlobStore);
68
70
  return {
69
71
  authenticate: call("authenticate"),
70
72
  verify: call("verify"),
71
73
  capabilities: call("capabilities"),
72
74
  getTreeIfDifferent: call("getTreeIfDifferent"),
73
- getBlobs: call("getBlobs"),
74
- write: call("write"),
75
+ getBlobs: blobStore ? storedBlobs(blobStore, call("getBlobs")) : call("getBlobs"),
76
+ write: blobStore ? storedWrites(blobStore, call("write")) : call("write"),
75
77
  revisions: call("revisions"),
76
78
  revisionData: call("revisionData"),
77
79
  getDraft: call("getDraft"),
@@ -2,10 +2,11 @@ import type { DraftsApi, RequestContext, UploadResponse, UploadsApi, UserApi } f
2
2
  import { type Draft, type DraftKey } from 'alinea/core/Draft';
3
3
  import type { User, UserInput } from 'alinea/core/User';
4
4
  import { type Database } from 'rado';
5
+ import type { BlobStore } from './BlobStore.js';
5
6
  export interface DatabaseOptions {
6
7
  db: Database;
7
8
  }
8
- export declare class DatabaseApi implements DraftsApi, UploadsApi, UserApi {
9
+ export declare class DatabaseApi implements DraftsApi, UploadsApi, UserApi, BlobStore {
9
10
  #private;
10
11
  constructor(context: RequestContext, { db }: DatabaseOptions);
11
12
  getDraft(draftKey: DraftKey): Promise<Draft | undefined>;
@@ -13,6 +14,8 @@ export declare class DatabaseApi implements DraftsApi, UploadsApi, UserApi {
13
14
  prepareUpload(file: string): Promise<UploadResponse>;
14
15
  handleUpload(entryId: string, file: Blob): Promise<void>;
15
16
  previewUpload(entryId: string): Promise<Response>;
17
+ readBlobs(shas: ReadonlyArray<string>): Promise<Map<string, Uint8Array>>;
18
+ storeBlobs(blobs: ReadonlyArray<[sha: string, blob: Uint8Array]>): Promise<void>;
16
19
  enrichUser(user: User): Promise<User>;
17
20
  listUsers(): Promise<Array<User>>;
18
21
  createUser(user: UserInput): Promise<User>;
@@ -2,21 +2,25 @@ import {
2
2
  include
3
3
  } from "../../chunks/chunk-XTWYBWP2.js";
4
4
  import {
5
- blob,
6
5
  id,
7
6
  integer,
8
7
  text,
9
8
  varchar
10
- } from "../../chunks/chunk-ASYKC6IE.js";
9
+ } from "../../chunks/chunk-2PP7WJUJ.js";
11
10
  import {
12
11
  Builder
13
12
  } from "../../chunks/chunk-2BJ2IFQM.js";
14
13
  import {
15
- eq
14
+ and,
15
+ eq,
16
+ inArray,
17
+ lt
16
18
  } from "../../chunks/chunk-XCZXR3C2.js";
17
19
  import {
20
+ Column,
21
+ ColumnType,
18
22
  table
19
- } from "../../chunks/chunk-MOWR65LM.js";
23
+ } from "../../chunks/chunk-PYDOMKJZ.js";
20
24
  import "../../chunks/chunk-76VMZTLN.js";
21
25
  import "../../chunks/chunk-2PIFHEYR.js";
22
26
  import "../../chunks/chunk-K62JP6HR.js";
@@ -33,22 +37,35 @@ import "../../chunks/chunk-CQ52GEHY.js";
33
37
  import { createId } from "alinea/core/Id";
34
38
  import { assert } from "alinea/core/util/Assert";
35
39
  import { basename, extname } from "alinea/core/util/Paths";
40
+ import { chunks } from "alinea/core/util/Arrays";
36
41
  import { slugify } from "alinea/core/util/Slugs";
37
42
  import { HandleAction } from "../HandleAction.js";
38
43
  var UploadTable = table("alinea_upload", {
39
44
  entryId: varchar(void 0, { length: 27 }).primaryKey(),
40
- content: blob().notNull()
45
+ content: largeBlob().notNull()
41
46
  });
42
47
  var UserTable = table("alinea_user", {
43
48
  id: id(),
44
- email: text().notNull().unique(),
49
+ email: indexedText().notNull().unique(),
45
50
  name: text()
46
51
  });
47
52
  var UserRoleTable = table("alinea_user_role", {
48
53
  userId: integer().notNull().references(UserTable.id),
49
54
  role: text().notNull()
50
55
  });
51
- var tables = [UploadTable, UserTable, UserRoleTable];
56
+ var BlobTable = table("alinea_blob", {
57
+ sha: varchar(void 0, { length: 40 }).primaryKey(),
58
+ content: largeBlob().notNull(),
59
+ /** When the blob was last stored or read, in seconds */
60
+ usedAt: integer().notNull()
61
+ });
62
+ var tables = [UploadTable, UserTable, UserRoleTable, BlobTable];
63
+ var maxParams = 100;
64
+ var blobsPerStatement = 50;
65
+ var blobsPerInsert = Math.floor(maxParams / 3);
66
+ var day = 24 * 60 * 60;
67
+ var blobRetention = 30 * day;
68
+ var blobCleanups = /* @__PURE__ */ new WeakMap();
52
69
  var preparedDatabases = /* @__PURE__ */ new WeakMap();
53
70
  var selectUser = {
54
71
  ...UserTable,
@@ -108,6 +125,35 @@ var DatabaseApi = class {
108
125
  }
109
126
  });
110
127
  }
128
+ async readBlobs(shas) {
129
+ const db = await this.#db;
130
+ const found = /* @__PURE__ */ new Map();
131
+ for (const batch of chunks(shas, blobsPerStatement)) {
132
+ const rows = await db.select({ sha: BlobTable.sha, content: BlobTable.content }).from(BlobTable).where(inArray(BlobTable.sha, batch));
133
+ for (const row of rows) found.set(row.sha, row.content);
134
+ }
135
+ const now = seconds();
136
+ for (const batch of chunks([...found.keys()], blobsPerStatement))
137
+ await renewBlobs(db, batch, now);
138
+ await removeUnusedBlobs(db, now);
139
+ return found;
140
+ }
141
+ async storeBlobs(blobs) {
142
+ const db = await this.#db;
143
+ const now = seconds();
144
+ const unique = [...new Map(blobs)];
145
+ for (const batch of chunks(unique, blobsPerInsert)) {
146
+ const shas = batch.map(([sha]) => sha);
147
+ const stored = new Set(
148
+ await db.select(BlobTable.sha).from(BlobTable).where(inArray(BlobTable.sha, shas))
149
+ );
150
+ await renewBlobs(db, [...stored], now);
151
+ const rows = batch.filter(([sha]) => !stored.has(sha)).map(([sha, content]) => ({ sha, content, usedAt: now }));
152
+ if (rows.length === 0) continue;
153
+ await db.insert(BlobTable).values(rows).catch(() => insertMissingBlobs(db, rows));
154
+ }
155
+ await removeUnusedBlobs(db, now);
156
+ }
111
157
  async enrichUser(user) {
112
158
  const normalized = normalizeUser(user);
113
159
  const found = await this.#getUser(normalized.email);
@@ -191,6 +237,57 @@ function prepareDatabase(db) {
191
237
  preparedDatabases.set(db, prepared);
192
238
  return prepared;
193
239
  }
240
+ function largeBlob() {
241
+ return new Column({
242
+ type: new ColumnType(
243
+ "blob",
244
+ [],
245
+ sql.universal({
246
+ postgres: sql`bytea`,
247
+ mysql: sql`longblob`,
248
+ default: sql`blob`
249
+ })
250
+ ),
251
+ mapFromDriverValue(value) {
252
+ return new Uint8Array(value);
253
+ }
254
+ });
255
+ }
256
+ function indexedText() {
257
+ return new Column({
258
+ type: new ColumnType(
259
+ "text",
260
+ [],
261
+ sql.universal({
262
+ mysql: sql`varchar(255)`,
263
+ default: sql`text`
264
+ })
265
+ )
266
+ });
267
+ }
268
+ async function renewBlobs(db, shas, now) {
269
+ if (shas.length === 0) return;
270
+ await db.update(BlobTable).set({ usedAt: now }).where(and(inArray(BlobTable.sha, shas), lt(BlobTable.usedAt, now - day)));
271
+ }
272
+ async function insertMissingBlobs(db, rows) {
273
+ for (const row of rows) {
274
+ try {
275
+ await db.insert(BlobTable).values(row);
276
+ } catch (error) {
277
+ const stored = await db.select(BlobTable.sha).from(BlobTable).where(eq(BlobTable.sha, row.sha)).get();
278
+ if (!stored) throw error;
279
+ }
280
+ }
281
+ }
282
+ async function removeUnusedBlobs(db, now) {
283
+ const last = blobCleanups.get(db) ?? 0;
284
+ if (now - last < 60 * 60) return;
285
+ blobCleanups.set(db, now);
286
+ await db.delete(BlobTable).where(lt(BlobTable.usedAt, now - blobRetention));
287
+ }
288
+ function seconds() {
289
+ return Math.floor(Date.now() / 1e3);
290
+ }
194
291
  async function enablePostgresRowLevelSecurity(db) {
195
292
  if (db.dialect.runtime !== "postgres") return;
196
293
  for (const table2 of tables) {
@@ -3,6 +3,19 @@ import type { EntryRecord } from 'alinea/core/EntryRecord';
3
3
  import type { CommitRequest } from 'alinea/core/db/CommitRequest';
4
4
  import { GithubSource, type GithubSourceOptions } from 'alinea/core/source/GithubSource';
5
5
  export interface GithubOptions extends GithubSourceOptions {
6
+ /**
7
+ * Commit as this author instead of the account that owns the token. Such
8
+ * commits are written through the REST API, which GraphQL commits do not
9
+ * allow, so GitHub does not mark them as verified. A save usually spends
10
+ * three REST requests, plus one per uploaded file. Removing a file that is
11
+ * already gone costs one more tree request, and a branch that moved in
12
+ * the meantime repeats the save.
13
+ */
14
+ author?: GithubCommitAuthor;
15
+ }
16
+ export interface GithubCommitAuthor {
17
+ name: string;
18
+ email: string;
6
19
  }
7
20
  export declare class GithubApi extends GithubSource implements HistoryApi, CommitApi, SyncApi {
8
21
  #private;