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.
- package/dist/.init/content/pages/welcome.json +1 -1
- package/dist/.mcp/later/dev.json +1 -1
- package/dist/.mcp/online/dev.json +1 -1
- package/dist/adapter/next/cms.js +22 -10
- package/dist/adapter/next/context.js +1 -4
- package/dist/adapter/next/dashboardUrl.d.ts +6 -0
- package/dist/adapter/next/dashboardUrl.js +13 -0
- package/dist/adapter/next/handler.js +12 -1
- package/dist/adapter/next/syncCheck.d.ts +15 -2
- package/dist/adapter/next/syncCheck.js +26 -9
- package/dist/backend/CommitEntries.d.ts +17 -0
- package/dist/backend/CommitEntries.js +39 -0
- package/dist/backend/Handler.d.ts +9 -0
- package/dist/backend/Handler.js +84 -20
- package/dist/backend/api/BasicAuth.js +5 -1
- package/dist/backend/api/BlobStore.d.ts +21 -0
- package/dist/backend/api/BlobStore.js +63 -0
- package/dist/backend/api/CreateBackend.js +10 -8
- package/dist/backend/api/DatabaseApi.d.ts +4 -1
- package/dist/backend/api/DatabaseApi.js +104 -7
- package/dist/backend/api/GithubApi.d.ts +13 -0
- package/dist/backend/api/GithubApi.js +213 -50
- package/dist/backend/api/database.js +6 -6
- package/dist/backend/util/Syncable.d.ts +6 -0
- package/dist/backend/util/Syncable.js +3 -1
- package/dist/bundled.d.ts +1582 -426
- package/dist/chunks/{bun-sqlite-5SHXN3AT.js → bun-sqlite-RI6BYU5S.js} +3 -3
- package/dist/chunks/{chunk-ASYKC6IE.js → chunk-2PP7WJUJ.js} +2 -12
- package/dist/chunks/{chunk-QJGGYF6E.js → chunk-6FQ5IMNA.js} +7 -7
- package/dist/chunks/{chunk-JOF663EG.js → chunk-7DDPSWRY.js} +465 -2
- package/dist/chunks/{chunk-ETWOY4AL.js → chunk-A2I6MCCS.js} +1 -1
- package/dist/chunks/{chunk-W5AXN7GH.js → chunk-CYVOGRSD.js} +1 -2
- package/dist/chunks/{chunk-TIJTT5ZI.js → chunk-G43W7AME.js} +1 -0
- package/dist/chunks/{chunk-RE523BQ7.js → chunk-PMGIIYDD.js} +5830 -5830
- package/dist/chunks/{chunk-AIU6CMVT.js → chunk-PTYZMV5G.js} +1 -1
- package/dist/chunks/{chunk-66YZ47TY.js → chunk-RAR44T5O.js} +1 -1
- package/dist/chunks/{chunk-OHGAVV4G.js → chunk-SCV3TEXM.js} +2 -3
- package/dist/chunks/{chunk-UPY2RUZF.js → chunk-TWBREZWC.js} +30 -0
- package/dist/chunks/{chunk-QSN6RH6X.js → chunk-VA6NC3MI.js} +1 -1
- package/dist/chunks/{node-sqlite-XVNTNMCY.js → node-sqlite-C7VJ2NSN.js} +3 -3
- package/dist/cli/Generate.js +20 -7
- package/dist/cli/Mcp.js +1 -1
- package/dist/cli/Serve.js +1 -1
- package/dist/cli/bin.js +2 -3
- package/dist/cli/build/BuildEmitter.d.ts +5 -1
- package/dist/cli/build/BuildEmitter.js +8 -3
- package/dist/cli/generate/CompileConfig.js +10 -6
- package/dist/cli/generate/DevDB.d.ts +4 -1
- package/dist/cli/generate/DevDB.js +15 -7
- package/dist/cli/generate/GenerateDashboard.js +1 -0
- package/dist/cli/generate/MediaLocations.d.ts +18 -0
- package/dist/cli/generate/MediaLocations.js +69 -0
- package/dist/cli/serve/CreateLocalServer.js +1 -0
- package/dist/cli/serve/mcp/DevMcp.js +1 -1
- package/dist/cli/serve/mcp/McpTools.js +29 -1
- package/dist/cloud/CloudRemote.js +21 -7
- package/dist/cms.d.ts +4 -2
- package/dist/components/Alert.js +3 -3
- package/dist/components/AsyncList.d.ts +52 -0
- package/dist/components/AsyncList.js +69 -0
- package/dist/components/Badge.d.ts +3 -1
- package/dist/components/Badge.js +5 -3
- package/dist/components/Breadcrumbs.js +4 -4
- package/dist/components/Button.d.ts +6 -1
- package/dist/components/Button.js +14 -5
- package/dist/components/Calendar.js +20 -20
- package/dist/components/Checkbox.js +10 -10
- package/dist/components/CheckboxGroup.js +4 -4
- package/dist/components/Code.js +2 -2
- package/dist/components/Collapsible.js +3 -3
- package/dist/components/ColorSwatch.js +2 -2
- package/dist/components/ColorSwatchPicker.js +4 -4
- package/dist/components/ComboBox.d.ts +27 -9
- package/dist/components/ComboBox.js +42 -11
- package/dist/components/Command.js +14 -13
- package/dist/components/ContentCard.d.ts +3 -1
- package/dist/components/ContentCard.js +46 -24
- package/dist/components/ContentGrid.js +17 -17
- package/dist/components/DataList.js +3 -3
- package/dist/components/DateField.d.ts +4 -0
- package/dist/components/DateField.js +2 -2
- package/dist/components/DatePicker.js +2 -2
- package/dist/components/DateRangePicker.js +2 -2
- package/dist/components/Dialog.d.ts +14 -3
- package/dist/components/Dialog.js +36 -9
- package/dist/components/DropZone.js +5 -5
- package/dist/components/DropdownMenu.js +9 -9
- package/dist/components/Empty.js +4 -4
- package/dist/components/Field.d.ts +1 -1
- package/dist/components/Field.js +17 -11
- package/dist/components/Form.d.ts +23 -0
- package/dist/components/Form.js +64 -0
- package/dist/components/Link.d.ts +8 -1
- package/dist/components/List.js +24 -24
- package/dist/components/MediaPreview.js +7 -7
- package/dist/components/MultipleSelect.d.ts +13 -8
- package/dist/components/MultipleSelect.js +21 -21
- package/dist/components/NavRail.js +6 -6
- package/dist/components/NumberField.d.ts +5 -1
- package/dist/components/NumberField.js +6 -4
- package/dist/components/Page.js +6 -6
- package/dist/components/Popover.js +2 -2
- package/dist/components/PreviewFrame.js +6 -6
- package/dist/components/RadioGroup.js +9 -9
- package/dist/components/Resizable.js +4 -4
- package/dist/components/SearchField.d.ts +6 -1
- package/dist/components/SearchField.js +10 -8
- package/dist/components/Select.d.ts +13 -10
- package/dist/components/Select.js +16 -30
- package/dist/components/Sheet.d.ts +50 -0
- package/dist/components/Sheet.js +202 -0
- package/dist/components/Sidebar.js +5 -5
- package/dist/components/SortableList.d.ts +34 -30
- package/dist/components/SortableList.js +160 -263
- package/dist/components/Spinner.js +4 -4
- package/dist/components/Stack.d.ts +20 -0
- package/dist/components/Stack.js +45 -0
- package/dist/components/Surface.js +2 -2
- package/dist/components/Switch.js +6 -6
- package/dist/components/Table.d.ts +14 -2
- package/dist/components/Table.js +90 -51
- package/dist/components/Tabs.js +4 -4
- package/dist/components/TagGroup.js +10 -10
- package/dist/components/TextField.d.ts +7 -1
- package/dist/components/TextField.js +19 -10
- package/dist/components/TimeField.d.ts +6 -1
- package/dist/components/TimeField.js +48 -23
- package/dist/components/Timestamp.js +1 -1
- package/dist/components/ToggleGroup.js +2 -2
- package/dist/components/Toolbar.js +3 -3
- package/dist/components/Tooltip.js +6 -5
- package/dist/components/Tree.js +24 -24
- package/dist/components/internal/DateControl.js +9 -9
- package/dist/components/internal/FormScope.d.ts +2 -0
- package/dist/components/internal/FormScope.js +8 -0
- package/dist/components/internal/ListBoxGroup.d.ts +12 -0
- package/dist/components/internal/ListBoxGroup.js +46 -0
- package/dist/components/internal/ListBoxOption.d.ts +2 -2
- package/dist/components/internal/ListBoxOption.js +7 -7
- package/dist/components/internal/Locale.js +2 -2
- package/dist/components/internal/PopoverSurface.js +3 -2
- package/dist/components/internal/SelectionCheckbox.js +6 -6
- package/dist/components/internal/Slot.js +1 -1
- package/dist/components/internal/ToggleButton.js +4 -4
- package/dist/components/internal/Trigger.js +2 -2
- package/dist/components/internal/sortableDrag.d.ts +19 -0
- package/dist/components/internal/sortableDrag.js +175 -0
- package/dist/components/internal/useDragDrop.js +2 -2
- package/dist/components/types.d.ts +4 -0
- package/dist/components.d.ts +4 -0
- package/dist/components.js +4 -0
- package/dist/core/Client.js +12 -1
- package/dist/core/Config.d.ts +12 -1
- package/dist/core/Config.js +12 -0
- package/dist/core/DashboardEntry.d.ts +19 -0
- package/dist/core/DashboardEntry.js +0 -0
- package/dist/core/Document.d.ts +9 -1
- package/dist/core/Document.js +40 -8
- package/dist/core/EntryFields.d.ts +8 -2
- package/dist/core/Field.d.ts +5 -0
- package/dist/core/Filter.d.ts +19 -2
- package/dist/core/Filter.js +5 -0
- package/dist/core/Graph.d.ts +10 -2
- package/dist/core/Overview.d.ts +76 -9
- package/dist/core/Overview.js +1 -0
- package/dist/core/Root.js +1 -1
- package/dist/core/Scope.d.ts +5 -0
- package/dist/core/Scope.js +22 -5
- package/dist/core/TextDoc.d.ts +4 -0
- package/dist/core/Type.d.ts +25 -6
- package/dist/core/Type.js +25 -7
- package/dist/core/Validation.d.ts +0 -1
- package/dist/core/Validation.js +0 -6
- package/dist/core/db/LocalStore.d.ts +7 -0
- package/dist/core/field/CreateField.d.ts +1 -2
- package/dist/core/field/RichTextField.js +23 -4
- package/dist/core/media/MediaTypes.js +1 -1
- package/dist/core/source/GithubSource.d.ts +4 -0
- package/dist/core/source/GithubSource.js +127 -25
- package/dist/core/source/GithubUsage.d.ts +21 -0
- package/dist/core/source/GithubUsage.js +47 -0
- package/dist/core/source/Source.d.ts +2 -0
- package/dist/core/source/Source.js +11 -0
- package/dist/core/util/Async.d.ts +2 -0
- package/dist/core/util/Async.js +12 -1
- package/dist/core/util/Checks.js +1 -1
- package/dist/core/util/Slugs.js +4 -3
- package/dist/dashboard/App.css +13 -11
- package/dist/dashboard/App.d.ts +3 -2
- package/dist/dashboard/App.js +24 -6
- package/dist/dashboard/Href.d.ts +37 -0
- package/dist/dashboard/Href.js +46 -0
- package/dist/dashboard/ViewKeys.d.ts +1 -0
- package/dist/dashboard/ViewKeys.js +1 -0
- package/dist/dashboard/app/ActivityStatus.js +34 -12
- package/dist/dashboard/app/AuthView.js +6 -6
- package/dist/dashboard/app/BlockSettings.d.ts +9 -0
- package/dist/dashboard/app/BlockSettings.js +16 -0
- package/dist/dashboard/app/BlockSheet.d.ts +50 -0
- package/dist/dashboard/app/BlockSheet.js +207 -0
- package/dist/dashboard/app/BlockSheetStoryFrame.d.ts +6 -0
- package/dist/dashboard/app/BlockSheetStoryFrame.js +29 -0
- package/dist/dashboard/app/CompactField.js +14 -14
- package/dist/dashboard/app/CroppedImage.js +2 -2
- package/dist/dashboard/app/DashboardLayout.d.ts +1 -1
- package/dist/dashboard/app/DashboardLayout.js +15 -1
- package/dist/dashboard/app/EntryActions.d.ts +11 -0
- package/dist/dashboard/app/EntryActions.js +30 -0
- package/dist/dashboard/app/EntryFields.d.ts +15 -2
- package/dist/dashboard/app/EntryFields.js +24 -3
- package/dist/dashboard/app/EntryHeader.js +45 -36
- package/dist/dashboard/app/EntryReferences.js +5 -5
- package/dist/dashboard/app/EntrySidebar.js +24 -22
- package/dist/dashboard/app/EntrySidebarPreview.js +2 -2
- package/dist/dashboard/app/EntryStatusIcon.d.ts +23 -0
- package/dist/dashboard/app/EntryStatusIcon.js +58 -0
- package/dist/dashboard/app/EntryValidationModal.d.ts +6 -5
- package/dist/dashboard/app/EntryValidationModal.js +17 -17
- package/dist/dashboard/app/Explorer.d.ts +3 -1
- package/dist/dashboard/app/Explorer.js +90 -47
- package/dist/dashboard/app/ExplorerBatchActions.d.ts +3 -1
- package/dist/dashboard/app/ExplorerBatchActions.js +70 -45
- package/dist/dashboard/app/ExplorerCards.js +7 -1
- package/dist/dashboard/app/ExplorerControls.js +4 -4
- package/dist/dashboard/app/ExplorerList.js +7 -7
- package/dist/dashboard/app/ExplorerModal.js +4 -4
- package/dist/dashboard/app/ExplorerOverviewHeader.d.ts +6 -0
- package/dist/dashboard/app/ExplorerOverviewHeader.js +28 -0
- package/dist/dashboard/app/ExplorerTable.js +11 -8
- package/dist/dashboard/app/ExplorerTabs.d.ts +12 -0
- package/dist/dashboard/app/ExplorerTabs.js +42 -0
- package/dist/dashboard/app/ImageEditor.js +26 -26
- package/dist/dashboard/app/ImagePicker.js +3 -13
- package/dist/dashboard/app/LinkPicker.js +27 -25
- package/dist/dashboard/app/LocaleMenu.js +7 -7
- package/dist/dashboard/app/MediaPreviewCell.js +4 -4
- package/dist/dashboard/app/MoveConfirmDialog.d.ts +5 -0
- package/dist/dashboard/app/MoveConfirmDialog.js +79 -0
- package/dist/dashboard/app/OverviewCell.js +11 -14
- package/dist/dashboard/app/PendingUploadsView.js +3 -3
- package/dist/dashboard/app/ReadOnlyBadge.d.ts +1 -1
- package/dist/dashboard/app/RemoveDialog.d.ts +17 -0
- package/dist/dashboard/app/{DeleteDialog.js → RemoveDialog.js} +72 -27
- package/dist/dashboard/app/RemoveRedirect.d.ts +7 -0
- package/dist/dashboard/app/RemoveRedirect.js +123 -0
- package/dist/dashboard/app/SearchBar.d.ts +9 -0
- package/dist/dashboard/app/SearchBar.js +31 -0
- package/dist/dashboard/app/SettingsTab.d.ts +6 -0
- package/dist/dashboard/app/SettingsTab.js +27 -0
- package/dist/dashboard/app/SidebarTree.js +26 -71
- package/dist/dashboard/app/WorkspaceMenu.js +9 -9
- package/dist/dashboard/app/WorkspaceRoots.js +108 -104
- package/dist/dashboard/app/editor/FileEditor.js +17 -17
- package/dist/dashboard/app/modals/CreateEntry.js +3 -3
- package/dist/dashboard/app/pages/EntryPage.d.ts +2 -1
- package/dist/dashboard/app/pages/EntryPage.js +65 -43
- package/dist/dashboard/app/pages/RootPage.js +3 -3
- package/dist/dashboard/app/pages/SplashPage.js +91 -76
- package/dist/dashboard/app/pages/UsersPage.js +11 -11
- package/dist/dashboard/app/ui/DashboardModal.js +14 -13
- package/dist/dashboard/atoms/activity.d.ts +1 -0
- package/dist/dashboard/atoms/activity.js +8 -5
- package/dist/dashboard/atoms/config.d.ts +2 -0
- package/dist/dashboard/atoms/dashboard.d.ts +11 -0
- package/dist/dashboard/atoms/dashboard.js +9 -1
- package/dist/dashboard/atoms/editor.d.ts +7 -1
- package/dist/dashboard/atoms/editor.js +14 -2
- package/dist/dashboard/atoms/entry.js +1 -14
- package/dist/dashboard/atoms/entryTable.js +1 -0
- package/dist/dashboard/atoms/explorer.d.ts +19 -0
- package/dist/dashboard/atoms/explorer.js +62 -21
- package/dist/dashboard/atoms/graph.d.ts +5 -0
- package/dist/dashboard/atoms/graph.js +27 -2
- package/dist/dashboard/atoms/link.js +5 -2
- package/dist/dashboard/atoms/move.d.ts +5 -0
- package/dist/dashboard/atoms/move.js +29 -3
- package/dist/dashboard/atoms/moveConfirmation.d.ts +34 -0
- package/dist/dashboard/atoms/moveConfirmation.js +95 -0
- package/dist/dashboard/atoms/nav.d.ts +22 -12
- package/dist/dashboard/atoms/nav.js +200 -65
- package/dist/dashboard/atoms/overview.d.ts +32 -9
- package/dist/dashboard/atoms/overview.js +43 -28
- package/dist/dashboard/atoms/remove.d.ts +112 -0
- package/dist/dashboard/atoms/remove.js +268 -0
- package/dist/dashboard/atoms/root.d.ts +2 -2
- package/dist/dashboard/atoms/root.js +48 -27
- package/dist/dashboard/atoms/user.js +1 -1
- package/dist/dashboard/atoms/utils.js +1 -1
- package/dist/dashboard/boot/ActivityEvent.d.ts +1 -1
- package/dist/dashboard/boot/Boot.js +31 -17
- package/dist/dashboard/boot/DashboardWorker.d.ts +7 -0
- package/dist/dashboard/boot/DashboardWorker.js +99 -54
- package/dist/dashboard/boot/LoadWorker.js +20 -10
- package/dist/dashboard/boot/SyncEvent.d.ts +7 -0
- package/dist/dashboard/boot/SyncEvent.js +14 -0
- package/dist/dashboard/boot/WorkerDB.d.ts +1 -0
- package/dist/dashboard/boot/WorkerDB.js +3 -0
- package/dist/dashboard/cms/EntryTable.d.ts +4 -3
- package/dist/dashboard/cms/EntryTable.js +6 -3
- package/dist/dashboard/cms/ViewProps.d.ts +3 -2
- package/dist/dashboard/cms/hooks.d.ts +34 -18
- package/dist/dashboard/cms/hooks.js +43 -18
- package/dist/dashboard/contexts.d.ts +3 -2
- package/dist/dashboard/contexts.js +3 -2
- package/dist/dashboard/hook/UseEntryEditor.d.ts +1 -1
- package/dist/dashboard/hook/UseEntryEditor.js +7 -3
- package/dist/dashboard/icons.d.ts +1 -0
- package/dist/dashboard/icons.js +15 -0
- package/dist/database/BrowserEntryStore.d.ts +12 -62
- package/dist/database/BrowserEntryStore.js +116 -193
- package/dist/database/DatabaseTables.js +2 -2
- package/dist/database/EntryDatabase.d.ts +10 -1
- package/dist/database/EntryDatabase.js +45 -4
- package/dist/database/EntryStore.js +1 -11
- package/dist/database/EntryTransaction.js +0 -35
- package/dist/database/EntryUrlAliases.d.ts +4 -0
- package/dist/database/EntryUrlAliases.js +16 -10
- package/dist/database/driver/RuntimeDatabase.js +3 -3
- package/dist/database/driver/WasmDatabase.d.ts +5 -18
- package/dist/database/driver/WasmDatabase.js +15 -16
- package/dist/database/entry/EntryTable.d.ts +5 -3
- package/dist/database/entry/EntryTable.js +26 -9
- package/dist/database/query/Condition.d.ts +4 -1
- package/dist/database/query/Condition.js +16 -5
- package/dist/database/query/EntryQuery.js +60 -8
- package/dist/database/query/Relation.d.ts +13 -1
- package/dist/database/query/Relation.js +20 -2
- package/dist/database/query/Search.d.ts +7 -1
- package/dist/database/query/Search.js +55 -10
- package/dist/database/sync/EntrySyncer.d.ts +2 -0
- package/dist/database/sync/EntrySyncer.js +4 -2
- package/dist/database/sync/Ingest.d.ts +2 -1
- package/dist/database/sync/Ingest.js +20 -6
- package/dist/field/code/CodeField.view.js +13 -13
- package/dist/field/link/EntryLink.d.ts +8 -9
- package/dist/field/link/FileLink.d.ts +6 -6
- package/dist/field/link/ImageLink.d.ts +6 -9
- package/dist/field/link/ImageLink.js +0 -1
- package/dist/field/link/Link.d.ts +1 -1
- package/dist/field/link/LinkField.d.ts +5 -0
- package/dist/field/link/LinkField.view.js +251 -374
- package/dist/field/link/UrlLink.d.ts +4 -4
- package/dist/field/list/ListField.d.ts +2 -0
- package/dist/field/list/ListField.view.d.ts +15 -0
- package/dist/field/list/ListField.view.js +356 -299
- package/dist/field/metadata/MetadataField.d.ts +17 -7
- package/dist/field/metadata/MetadataField.js +14 -3
- package/dist/field/metadata/MetadataField.view.d.ts +1 -0
- package/dist/field/metadata/MetadataField.view.js +24 -20
- package/dist/field/richtext/RichTextBlock.d.ts +3 -1
- package/dist/field/richtext/RichTextBlock.js +181 -74
- package/dist/field/richtext/RichTextBlockHost.js +1 -1
- package/dist/field/richtext/RichTextExtensions.js +28 -28
- package/dist/field/richtext/RichTextField.view.js +10 -4
- package/dist/field/richtext/RichTextInsertMenu.js +45 -29
- package/dist/field/richtext/RichTextToolbar.js +26 -1
- package/dist/field/richtext/Toolbar.d.ts +9 -1
- package/dist/field/richtext/Toolbar.js +12 -2
- package/dist/field/select/SelectField.view.js +1 -0
- package/dist/field/views.js +2 -0
- package/dist/index.css +664 -332
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/next.d.ts +2 -0
- package/dist/next.edge.d.ts +2 -0
- package/dist/picker/entry/EntryPicker.d.ts +3 -1
- package/dist/picker/entry/EntryPicker.js +15 -1
- package/dist/picker/url/UrlPicker.js +1 -0
- package/dist/preview/react.js +3 -0
- package/dist/query.d.ts +26 -14
- package/dist/query.js +4 -0
- package/dist/types.d.ts +8 -5
- package/dist/ui/Stack.d.ts +4 -2
- package/docs/ai-setup.md +3 -3
- package/docs/cli.md +4 -2
- package/docs/components/badge.md +1 -0
- package/docs/components/button.md +1 -0
- package/docs/components/combo-box.md +105 -16
- package/docs/components/content-card.md +1 -0
- package/docs/components/date-field.md +1 -1
- package/docs/components/dialog.md +51 -0
- package/docs/components/form.md +67 -0
- package/docs/components/link.md +10 -0
- package/docs/components/multiple-select.md +9 -17
- package/docs/components/number-field.md +5 -1
- package/docs/components/search-field.md +1 -0
- package/docs/components/select.md +9 -20
- package/docs/components/sortable-list.md +5 -20
- package/docs/components/stack.md +42 -0
- package/docs/components/table.md +84 -0
- package/docs/components/text-field.md +9 -1
- package/docs/components/time-field.md +5 -1
- package/docs/components.md +39 -1
- package/docs/configuration.md +4 -2
- package/docs/custom-fields.md +135 -7
- package/docs/deploy/self-host.md +3 -1
- package/docs/deploy.md +9 -5
- package/docs/fields/image.md +0 -1
- package/docs/fields/list.md +19 -0
- package/docs/fields/object.md +5 -3
- package/docs/fields/rich-text.md +31 -0
- package/docs/fields.md +1 -1
- package/docs/index.md +9 -7
- package/docs/instant-publishing.md +17 -11
- package/docs/overviews.md +131 -8
- package/docs/query/filtering.md +2 -0
- package/docs/query/related.md +58 -9
- package/docs/query.md +52 -1
- package/docs/quickstart.md +5 -5
- package/docs/schema/document.md +2 -0
- package/docs/schema/type.md +3 -1
- package/docs/upgrading.md +101 -19
- package/llms-full.txt +1036 -163
- package/package.json +2 -3
- package/readme.md +2 -2
- package/dist/core/db/EntryValidationError.d.ts +0 -13
- package/dist/core/db/EntryValidationError.js +0 -23
- package/dist/dashboard/app/DeleteDialog.d.ts +0 -11
- package/dist/dashboard/atoms/delete.d.ts +0 -68
- package/dist/dashboard/atoms/delete.js +0 -143
- 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-
|
|
4
|
-
import "../../chunks/chunk-
|
|
5
|
-
import "../../chunks/chunk-
|
|
6
|
-
import "../../chunks/chunk-
|
|
7
|
-
import "../../chunks/chunk-
|
|
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-
|
|
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-
|
|
9
|
+
} from "../../chunks/chunk-2PP7WJUJ.js";
|
|
11
10
|
import {
|
|
12
11
|
Builder
|
|
13
12
|
} from "../../chunks/chunk-2BJ2IFQM.js";
|
|
14
13
|
import {
|
|
15
|
-
|
|
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-
|
|
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:
|
|
45
|
+
content: largeBlob().notNull()
|
|
41
46
|
});
|
|
42
47
|
var UserTable = table("alinea_user", {
|
|
43
48
|
id: id(),
|
|
44
|
-
email:
|
|
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
|
|
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;
|