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.
- package/dist/.init/.mcp.json +11 -0
- package/dist/.init/AGENTS.md +17 -0
- package/dist/.init/CLAUDE.md +1 -0
- package/dist/.init/content/pages/welcome.json +1 -1
- package/dist/.init/package.json +1 -1
- package/dist/.init/src/cms.ts +4 -2
- package/dist/.init-pm/bun.lock +0 -0
- package/dist/.mcp/later/dev.json +1 -0
- package/dist/.mcp/lock/dev.json +1 -0
- package/dist/.mcp/online/dev.json +1 -0
- package/dist/LICENSES.md +2239 -294
- package/dist/adapter/next/cms.d.ts +2 -2
- package/dist/adapter/next/cms.js +66 -32
- package/dist/adapter/next/context.js +5 -6
- package/dist/adapter/next/dashboardUrl.d.ts +6 -0
- package/dist/adapter/next/dashboardUrl.js +13 -0
- package/dist/adapter/next/devCache.d.ts +16 -0
- package/dist/adapter/next/devCache.js +32 -0
- package/dist/adapter/next/handler.js +18 -4
- package/dist/adapter/next/syncCheck.d.ts +15 -2
- package/dist/adapter/next/syncCheck.js +26 -9
- package/dist/adapter/next/with-alinea.js +27 -20
- package/dist/backend/CommitEntries.d.ts +17 -0
- package/dist/backend/CommitEntries.js +39 -0
- package/dist/backend/Handler.d.ts +15 -1
- package/dist/backend/Handler.js +106 -32
- 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 +217 -54
- package/dist/backend/api/OAuth2.js +21 -26
- package/dist/backend/api/ProxyMedia.js +3 -0
- package/dist/backend/api/database.js +6 -6
- package/dist/backend/store/GeneratedDatabase.js +4 -2
- package/dist/backend/store/GeneratedDatabaseNode.d.ts +5 -1
- package/dist/backend/store/GeneratedDatabaseNode.js +9 -19
- package/dist/backend/store/GeneratedRelease.d.ts +1 -1
- package/dist/backend/store/GeneratedRelease.js +3 -4
- package/dist/backend/util/JWKS.d.ts +4 -0
- package/dist/backend/util/JWKS.js +40 -0
- package/dist/backend/util/Syncable.d.ts +6 -0
- package/dist/backend/util/Syncable.js +3 -1
- package/dist/bundled.d.ts +7124 -1459
- package/dist/chunks/{node-sqlite-XVNTNMCY.js → bun-sqlite-RI6BYU5S.js} +3 -3
- package/dist/chunks/ccitt-Y7TDCCPM.js +90 -0
- package/dist/chunks/{chunk-ASYKC6IE.js → chunk-2PP7WJUJ.js} +2 -12
- package/dist/chunks/{chunk-DWR5A5KL.js → chunk-4VKHBA57.js} +25 -6
- package/dist/chunks/{chunk-QJGGYF6E.js → chunk-4ZA6KZHS.js} +5 -5
- package/dist/chunks/{chunk-OFEKTDRF.js → chunk-7DDPSWRY.js} +8383 -5156
- package/dist/chunks/{chunk-ETWOY4AL.js → chunk-A2I6MCCS.js} +1 -1
- package/dist/chunks/chunk-CYVOGRSD.js +218 -0
- package/dist/chunks/{chunk-TIJTT5ZI.js → chunk-G43W7AME.js} +1 -0
- package/dist/chunks/{chunk-KMLLLZ6X.js → chunk-NP4M2257.js} +1 -0
- package/dist/chunks/{chunk-D6RGFNUW.js → chunk-PMGIIYDD.js} +14215 -8950
- package/dist/chunks/{chunk-IYAQC63Y.js → chunk-PSSMQKAH.js} +1607 -744
- 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-RE6CDK2M.js +254 -0
- 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/dist-IDG44KDI.js +7499 -0
- package/dist/chunks/jpeg-OJTBZV3C.js +292 -0
- package/dist/chunks/jpx-4VRYG2JB.js +667 -0
- package/dist/chunks/{bun-sqlite-5SHXN3AT.js → node-sqlite-C7VJ2NSN.js} +3 -3
- package/dist/cli/Generate.d.ts +2 -1
- package/dist/cli/Generate.js +55 -24
- package/dist/cli/Init.d.ts +43 -2
- package/dist/cli/Init.js +144 -28
- package/dist/cli/Mcp.d.ts +25 -0
- package/dist/cli/Mcp.js +106 -0
- package/dist/cli/Serve.d.ts +1 -1
- package/dist/cli/Serve.js +14 -6
- package/dist/cli/bin.js +33 -11
- 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/CopyStaticFiles.d.ts +1 -1
- package/dist/cli/generate/CopyStaticFiles.js +27 -14
- package/dist/cli/generate/DevDB.d.ts +4 -1
- package/dist/cli/generate/DevDB.js +15 -7
- package/dist/cli/generate/GenerateContext.d.ts +3 -0
- package/dist/cli/generate/GenerateDashboard.d.ts +1 -1
- package/dist/cli/generate/GenerateDashboard.js +20 -6
- package/dist/cli/generate/GeneratedPaths.d.ts +21 -0
- package/dist/cli/generate/GeneratedPaths.js +33 -0
- package/dist/cli/generate/LinkMediaFiles.d.ts +7 -0
- package/dist/cli/generate/LinkMediaFiles.js +52 -0
- package/dist/cli/generate/MediaLocations.d.ts +18 -0
- package/dist/cli/generate/MediaLocations.js +69 -0
- package/dist/cli/serve/CreateLocalServer.d.ts +2 -1
- package/dist/cli/serve/CreateLocalServer.js +41 -11
- package/dist/cli/serve/DevLock.d.ts +11 -0
- package/dist/cli/serve/DevLock.js +42 -0
- package/dist/cli/serve/DevServer.d.ts +3 -2
- package/dist/cli/serve/DevServer.js +18 -6
- package/dist/cli/serve/LiveReload.d.ts +1 -1
- package/dist/cli/serve/LiveReload.js +3 -2
- package/dist/cli/serve/ServeContext.d.ts +0 -1
- package/dist/cli/serve/StartServer.d.ts +2 -1
- package/dist/cli/serve/StartServer.js +4 -2
- package/dist/cli/serve/mcp/DevMcp.d.ts +16 -0
- package/dist/cli/serve/mcp/DevMcp.js +50 -0
- package/dist/cli/serve/mcp/McpGraph.d.ts +35 -0
- package/dist/cli/serve/mcp/McpGraph.js +64 -0
- package/dist/cli/serve/mcp/McpInput.d.ts +11 -0
- package/dist/cli/serve/mcp/McpInput.js +254 -0
- package/dist/cli/serve/mcp/McpInstructions.d.ts +1 -0
- package/dist/cli/serve/mcp/McpInstructions.js +16 -0
- package/dist/cli/serve/mcp/McpSchema.d.ts +31 -0
- package/dist/cli/serve/mcp/McpSchema.js +184 -0
- package/dist/cli/serve/mcp/McpServer.d.ts +47 -0
- package/dist/cli/serve/mcp/McpServer.js +112 -0
- package/dist/cli/serve/mcp/McpTools.d.ts +25 -0
- package/dist/cli/serve/mcp/McpTools.js +618 -0
- package/dist/cli/static/dashboard/entry.js +2 -1
- package/dist/cli/static/init/agents.md +13 -0
- package/dist/cli/static/init/cms.js +4 -2
- package/dist/cli/util/ForwardCommand.js +4 -12
- package/dist/cli/util/PublicDefines.d.ts +1 -0
- package/dist/cli/util/PublicDefines.js +2 -1
- package/dist/cli/util/RunForwarded.d.ts +13 -0
- package/dist/cli/util/RunForwarded.js +166 -0
- package/dist/cli/util/WarnPublicEnv.js +2 -0
- package/dist/cloud/CloudHandshake.js +9 -46
- package/dist/cloud/CloudRemote.js +21 -7
- package/dist/cms.d.ts +21 -0
- package/dist/cms.js +49 -0
- package/dist/components/Alert.d.ts +29 -0
- package/dist/components/Alert.js +86 -0
- package/dist/components/AppShell.d.ts +15 -0
- package/dist/components/AppShell.js +38 -0
- package/dist/components/AsyncList.d.ts +52 -0
- package/dist/components/AsyncList.js +69 -0
- package/dist/components/Badge.d.ts +13 -0
- package/dist/components/Badge.js +53 -0
- package/dist/components/Blockquote.d.ts +7 -0
- package/dist/components/Blockquote.js +26 -0
- package/dist/components/Breadcrumbs.d.ts +39 -3
- package/dist/components/Breadcrumbs.js +103 -22
- package/dist/components/Button.d.ts +33 -8
- package/dist/components/Button.js +73 -23
- package/dist/components/Calendar.d.ts +28 -3
- package/dist/components/Calendar.js +163 -54
- package/dist/components/Checkbox.d.ts +18 -7
- package/dist/components/Checkbox.js +84 -38
- package/dist/components/CheckboxGroup.d.ts +11 -5
- package/dist/components/CheckboxGroup.js +55 -19
- package/dist/components/Code.d.ts +10 -0
- package/dist/components/Code.js +49 -0
- package/dist/components/Collapsible.d.ts +25 -0
- package/dist/components/Collapsible.js +146 -0
- package/dist/components/ColorSwatch.d.ts +9 -2
- package/dist/components/ColorSwatch.js +20 -20
- package/dist/components/ColorSwatchPicker.d.ts +18 -3
- package/dist/components/ColorSwatchPicker.js +31 -27
- package/dist/components/ComboBox.d.ts +46 -10
- package/dist/components/ComboBox.js +223 -94
- package/dist/components/Command.d.ts +66 -0
- package/dist/components/Command.js +237 -0
- package/dist/components/ContentCard.d.ts +32 -0
- package/dist/components/ContentCard.js +221 -0
- package/dist/components/ContentGrid.d.ts +58 -0
- package/dist/components/ContentGrid.js +220 -0
- package/dist/components/DataList.d.ts +27 -0
- package/dist/components/DataList.js +68 -0
- package/dist/components/DateField.d.ts +19 -4
- package/dist/components/DateField.js +51 -44
- package/dist/components/DatePicker.d.ts +17 -4
- package/dist/components/DatePicker.js +61 -68
- package/dist/components/DateRangePicker.d.ts +19 -4
- package/dist/components/DateRangePicker.js +69 -80
- package/dist/components/Dialog.d.ts +64 -3
- package/dist/components/Dialog.js +215 -20
- package/dist/components/DropZone.d.ts +25 -3
- package/dist/components/DropZone.js +99 -18
- package/dist/components/DropdownMenu.d.ts +78 -0
- package/dist/components/DropdownMenu.js +318 -0
- package/dist/components/Empty.d.ts +46 -0
- package/dist/components/Empty.js +93 -0
- package/dist/components/Field.d.ts +34 -0
- package/dist/components/Field.js +166 -0
- package/dist/components/FileTrigger.d.ts +21 -0
- package/dist/components/FileTrigger.js +53 -0
- package/dist/components/FoldIcon.js +2 -1
- package/dist/components/Form.d.ts +23 -0
- package/dist/components/Form.js +64 -0
- package/dist/components/Heading.d.ts +13 -0
- package/dist/components/Heading.js +48 -0
- package/dist/components/Icon.d.ts +1 -1
- package/dist/components/Icon.js +3 -3
- package/dist/components/Kbd.d.ts +8 -0
- package/dist/components/Kbd.js +27 -0
- package/dist/components/Link.d.ts +21 -4
- package/dist/components/Link.js +22 -20
- package/dist/components/List.d.ts +23 -63
- package/dist/components/List.js +131 -251
- package/dist/components/MediaPreview.d.ts +35 -0
- package/dist/components/MediaPreview.js +227 -0
- package/dist/components/MultipleSelect.d.ts +27 -20
- package/dist/components/MultipleSelect.js +234 -216
- package/dist/components/NavRail.d.ts +41 -0
- package/dist/components/NavRail.js +121 -0
- package/dist/components/NumberField.d.ts +23 -5
- package/dist/components/NumberField.js +103 -60
- package/dist/components/Page.d.ts +57 -0
- package/dist/components/Page.js +130 -0
- package/dist/components/Popover.d.ts +39 -5
- package/dist/components/Popover.js +146 -22
- package/dist/components/PreviewFrame.d.ts +46 -0
- package/dist/components/PreviewFrame.js +182 -0
- package/dist/components/RadioGroup.d.ts +20 -7
- package/dist/components/RadioGroup.js +121 -31
- package/dist/components/Resizable.d.ts +51 -0
- package/dist/components/Resizable.js +1349 -0
- package/dist/components/SearchField.d.ts +42 -6
- package/dist/components/SearchField.js +117 -56
- package/dist/components/Select.d.ts +38 -10
- package/dist/components/Select.js +179 -101
- package/dist/components/Sheet.d.ts +52 -0
- package/dist/components/Sheet.js +216 -0
- package/dist/components/Sidebar.d.ts +56 -0
- package/dist/components/Sidebar.js +136 -0
- package/dist/components/SortableList.d.ts +84 -0
- package/dist/components/SortableList.js +368 -0
- package/dist/components/Spinner.d.ts +8 -0
- package/dist/components/Spinner.js +86 -0
- package/dist/components/Stack.d.ts +20 -0
- package/dist/components/Stack.js +45 -0
- package/dist/components/Surface.js +13 -3
- package/dist/components/Switch.d.ts +15 -4
- package/dist/components/Switch.js +30 -18
- package/dist/components/Table.d.ts +121 -14
- package/dist/components/Table.js +537 -96
- package/dist/components/Tabs.d.ts +33 -12
- package/dist/components/Tabs.js +68 -51
- package/dist/components/TagGroup.d.ts +26 -9
- package/dist/components/TagGroup.js +97 -31
- package/dist/components/Text.d.ts +16 -0
- package/dist/components/Text.js +44 -0
- package/dist/components/TextField.d.ts +33 -9
- package/dist/components/TextField.js +152 -47
- package/dist/components/TimeField.d.ts +25 -4
- package/dist/components/TimeField.js +82 -42
- package/dist/components/Timestamp.d.ts +17 -0
- package/dist/components/Timestamp.js +131 -0
- package/dist/components/Toggle.d.ts +15 -7
- package/dist/components/Toggle.js +4 -54
- package/dist/components/ToggleGroup.d.ts +33 -0
- package/dist/components/ToggleGroup.js +90 -0
- package/dist/components/Toolbar.d.ts +27 -8
- package/dist/components/Toolbar.js +51 -40
- package/dist/components/Tooltip.d.ts +22 -4
- package/dist/components/Tooltip.js +78 -34
- package/dist/components/Tree.d.ts +47 -20
- package/dist/components/Tree.js +230 -98
- package/dist/components/internal/Accept.d.ts +5 -0
- package/dist/components/internal/Accept.js +17 -0
- package/dist/components/internal/DateControl.d.ts +18 -0
- package/dist/components/internal/DateControl.js +92 -0
- package/dist/components/internal/DateValue.d.ts +16 -0
- package/dist/components/internal/DateValue.js +40 -0
- 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 +20 -0
- package/dist/components/internal/ListBoxOption.js +111 -0
- package/dist/components/internal/Locale.d.ts +7 -0
- package/dist/components/internal/Locale.js +18 -0
- package/dist/components/internal/Placement.d.ts +3 -0
- package/dist/components/internal/Placement.js +13 -0
- package/dist/components/internal/PopoverSurface.d.ts +21 -0
- package/dist/components/internal/PopoverSurface.js +67 -0
- package/dist/components/internal/SelectionCheckbox.d.ts +8 -0
- package/dist/components/internal/SelectionCheckbox.js +57 -0
- package/dist/components/internal/Slot.d.ts +7 -0
- package/dist/components/internal/Slot.js +26 -0
- package/dist/components/internal/ToggleButton.d.ts +26 -0
- package/dist/components/internal/ToggleButton.js +68 -0
- package/dist/components/internal/Trigger.d.ts +16 -0
- package/dist/components/internal/Trigger.js +34 -0
- package/dist/components/internal/sortableDrag.d.ts +19 -0
- package/dist/components/internal/sortableDrag.js +175 -0
- package/dist/components/internal/useDragDrop.d.ts +22 -0
- package/dist/components/internal/useDragDrop.js +110 -0
- package/dist/components/types.d.ts +110 -0
- package/dist/components/types.js +0 -0
- package/dist/components.d.ts +33 -5
- package/dist/components.js +32 -5
- package/dist/config.d.ts +2 -0
- package/dist/config.js +12 -0
- package/dist/core/Client.js +12 -1
- package/dist/core/Config.d.ts +60 -2
- package/dist/core/Config.js +162 -9
- package/dist/core/Connection.d.ts +13 -1
- package/dist/core/Connection.js +9 -1
- package/dist/core/DashboardEntry.d.ts +19 -0
- package/dist/core/DashboardEntry.js +0 -0
- package/dist/core/Document.d.ts +12 -2
- package/dist/core/Document.js +39 -7
- package/dist/core/EntryFields.d.ts +11 -0
- package/dist/core/EntrySeed.d.ts +5 -1
- package/dist/core/EntrySeed.js +5 -6
- package/dist/core/Expr.d.ts +11 -0
- package/dist/core/Field.d.ts +39 -3
- package/dist/core/Field.js +25 -2
- package/dist/core/Filter.d.ts +31 -1
- package/dist/core/Filter.js +5 -0
- package/dist/core/Graph.d.ts +36 -8
- package/dist/core/Infer.d.ts +17 -0
- package/dist/core/Internal.d.ts +3 -0
- package/dist/core/Internal.js +4 -0
- package/dist/core/Overview.d.ts +315 -0
- package/dist/core/Overview.js +48 -0
- package/dist/core/Role.d.ts +6 -1
- package/dist/core/Role.js +55 -53
- package/dist/core/Root.d.ts +32 -3
- package/dist/core/Root.js +17 -7
- package/dist/core/Schema.js +7 -2
- package/dist/core/Scope.d.ts +14 -0
- package/dist/core/Scope.js +88 -10
- package/dist/core/TextDoc.d.ts +14 -1
- package/dist/core/Type.d.ts +71 -11
- package/dist/core/Type.js +67 -17
- package/dist/core/Validation.d.ts +60 -0
- package/dist/core/Validation.js +116 -0
- package/dist/core/Workspace.d.ts +1 -0
- package/dist/core/Workspace.js +5 -1
- package/dist/core/db/EntryReference.d.ts +8 -1
- package/dist/core/db/LinkResolver.d.ts +3 -0
- package/dist/core/db/LocalStore.d.ts +19 -0
- package/dist/core/db/Operation.d.ts +28 -1
- package/dist/core/db/Operation.js +161 -25
- package/dist/core/db/SyncStats.d.ts +16 -0
- package/dist/core/db/SyncStats.js +56 -0
- package/dist/core/db/WriteableGraph.d.ts +6 -14
- package/dist/core/db/WriteableGraph.js +5 -3
- package/dist/core/field/CreateField.d.ts +2 -3
- package/dist/core/field/ListField.js +29 -10
- package/dist/core/field/RecordField.js +12 -4
- package/dist/core/field/RichTextField.js +81 -24
- package/dist/core/field/ScalarField.d.ts +2 -2
- package/dist/core/field/UnionField.js +27 -4
- package/dist/core/media/CompressPdf.browser.d.ts +5 -0
- package/dist/core/media/CompressPdf.browser.js +13 -0
- package/dist/core/media/CompressPdf.d.ts +6 -0
- package/dist/core/media/CompressPdf.js +45 -0
- package/dist/core/media/CreatePreview.browser.d.ts +5 -1
- package/dist/core/media/CreatePreview.browser.js +16 -0
- package/dist/core/media/CreatePreview.d.ts +2 -1
- package/dist/core/media/CreatePreview.js +2 -0
- package/dist/core/media/FileAccept.d.ts +7 -0
- package/dist/core/media/FileAccept.js +29 -0
- package/dist/core/media/FileKinds.d.ts +10 -0
- package/dist/core/media/FileKinds.js +25 -0
- package/dist/core/media/ImageTransform.d.ts +78 -0
- package/dist/core/media/ImageTransform.js +108 -0
- package/dist/core/media/MediaRoot.js +4 -4
- package/dist/core/media/MediaTypes.d.ts +137 -9
- package/dist/core/media/MediaTypes.js +277 -51
- package/dist/core/media/Pdf.d.ts +15 -0
- package/dist/core/media/Pdf.js +31 -0
- package/dist/core/media/Summary.d.ts +9 -9
- package/dist/core/media/Summary.js +10 -10
- package/dist/core/media/TransformImage.browser.d.ts +7 -0
- package/dist/core/media/TransformImage.browser.js +38 -0
- package/dist/core/media/TransformImage.d.ts +7 -0
- package/dist/core/media/TransformImage.js +38 -0
- 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/text/MarkdownToTextDoc.d.ts +29 -0
- package/dist/core/text/MarkdownToTextDoc.js +524 -0
- package/dist/core/text/TextDocToMarkdown.d.ts +20 -0
- package/dist/core/text/TextDocToMarkdown.js +316 -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/JWT.d.ts +1 -1
- package/dist/core/util/Objects.d.ts +2 -0
- package/dist/core/util/Objects.js +7 -0
- package/dist/core/util/OrderKeys.d.ts +11 -0
- package/dist/core/util/OrderKeys.js +64 -0
- package/dist/core/util/Slugs.js +4 -3
- package/dist/core.d.ts +3 -0
- package/dist/core.js +8 -1
- package/dist/dashboard/App.css +56 -86
- package/dist/dashboard/App.d.ts +6 -2
- package/dist/dashboard/App.js +41 -20
- package/dist/dashboard/Href.d.ts +37 -0
- package/dist/dashboard/Href.js +46 -0
- package/dist/dashboard/ViewKeys.d.ts +2 -0
- package/dist/dashboard/ViewKeys.js +2 -0
- package/dist/dashboard/app/AccessDenied.js +26 -18
- package/dist/dashboard/app/ActivityStatus.d.ts +5 -4
- package/dist/dashboard/app/ActivityStatus.js +138 -153
- package/dist/dashboard/app/AppearanceToggle.js +31 -12
- package/dist/dashboard/app/AuthView.js +75 -63
- 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/BlockTabs.d.ts +12 -0
- package/dist/dashboard/app/BlockTabs.js +26 -0
- package/dist/dashboard/app/CompactField.d.ts +19 -6
- package/dist/dashboard/app/CompactField.js +177 -50
- package/dist/dashboard/app/CroppedImage.d.ts +17 -0
- package/dist/dashboard/app/CroppedImage.js +73 -0
- package/dist/dashboard/app/DashboardErrorBoundary.js +27 -15
- package/dist/dashboard/app/DashboardLayout.d.ts +5 -3
- package/dist/dashboard/app/DashboardLayout.js +59 -37
- package/dist/dashboard/app/EntryActions.d.ts +11 -0
- package/dist/dashboard/app/EntryActions.js +30 -0
- package/dist/dashboard/app/EntryFields.d.ts +26 -13
- package/dist/dashboard/app/EntryFields.js +19 -9
- package/dist/dashboard/app/EntryForm.d.ts +6 -0
- package/dist/dashboard/app/EntryForm.js +28 -0
- package/dist/dashboard/app/EntryHeader.d.ts +2 -2
- package/dist/dashboard/app/EntryHeader.js +226 -144
- package/dist/dashboard/app/EntryHeaderActions.d.ts +4 -1
- package/dist/dashboard/app/EntryHeaderActions.js +8 -12
- package/dist/dashboard/app/EntryReferences.d.ts +13 -1
- package/dist/dashboard/app/EntryReferences.js +62 -55
- package/dist/dashboard/app/EntrySidebar.d.ts +7 -5
- package/dist/dashboard/app/EntrySidebar.js +104 -98
- package/dist/dashboard/app/EntrySidebarPreview.d.ts +4 -1
- package/dist/dashboard/app/EntrySidebarPreview.js +37 -106
- package/dist/dashboard/app/EntrySidebarToggle.js +5 -6
- package/dist/dashboard/app/EntryStatusIcon.d.ts +23 -0
- package/dist/dashboard/app/EntryStatusIcon.js +58 -0
- package/dist/dashboard/app/EntryTranslationBanner.js +37 -45
- package/dist/dashboard/app/EntryValidationModal.d.ts +13 -0
- package/dist/dashboard/app/EntryValidationModal.js +77 -0
- package/dist/dashboard/app/Explorer.d.ts +15 -6
- package/dist/dashboard/app/Explorer.js +276 -520
- package/dist/dashboard/app/ExplorerBatchActions.d.ts +19 -0
- package/dist/dashboard/app/ExplorerBatchActions.js +183 -0
- package/dist/dashboard/app/ExplorerBreadcrumbs.d.ts +13 -0
- package/dist/dashboard/app/ExplorerBreadcrumbs.js +119 -0
- package/dist/dashboard/app/ExplorerCards.d.ts +8 -3
- package/dist/dashboard/app/ExplorerCards.js +91 -289
- package/dist/dashboard/app/ExplorerControls.d.ts +20 -0
- package/dist/dashboard/app/ExplorerControls.js +170 -0
- package/dist/dashboard/app/ExplorerList.d.ts +7 -4
- package/dist/dashboard/app/ExplorerList.js +160 -95
- package/dist/dashboard/app/ExplorerModal.d.ts +2 -5
- package/dist/dashboard/app/ExplorerModal.js +7 -19
- package/dist/dashboard/app/ExplorerOverviewHeader.d.ts +6 -0
- package/dist/dashboard/app/ExplorerOverviewHeader.js +28 -0
- package/dist/dashboard/app/ExplorerPickerContent.d.ts +19 -3
- package/dist/dashboard/app/ExplorerPickerContent.js +87 -5
- package/dist/dashboard/app/ExplorerScope.d.ts +7 -0
- package/dist/dashboard/app/ExplorerScope.js +159 -0
- package/dist/dashboard/app/ExplorerTable.d.ts +8 -4
- package/dist/dashboard/app/ExplorerTable.js +150 -359
- package/dist/dashboard/app/ExplorerTabs.d.ts +12 -0
- package/dist/dashboard/app/ExplorerTabs.js +42 -0
- package/dist/dashboard/app/ExternalLinkPicker.js +45 -55
- package/dist/dashboard/app/FileKind.d.ts +8 -0
- package/dist/dashboard/app/FileKind.js +40 -0
- package/dist/dashboard/app/ImageEditor.d.ts +13 -0
- package/dist/dashboard/app/ImageEditor.js +302 -0
- package/dist/dashboard/app/ImageEditorCrop.d.ts +19 -0
- package/dist/dashboard/app/ImageEditorCrop.js +90 -0
- package/dist/dashboard/app/ImagePicker.d.ts +1 -1
- package/dist/dashboard/app/ImagePicker.js +30 -89
- package/dist/dashboard/app/LinkPicker.d.ts +1 -1
- package/dist/dashboard/app/LinkPicker.js +108 -126
- package/dist/dashboard/app/LocaleMenu.d.ts +4 -2
- package/dist/dashboard/app/LocaleMenu.js +59 -48
- package/dist/dashboard/app/MediaPreviewCell.d.ts +8 -0
- package/dist/dashboard/app/MediaPreviewCell.js +50 -0
- package/dist/dashboard/app/MoveConfirmDialog.d.ts +5 -0
- package/dist/dashboard/app/MoveConfirmDialog.js +79 -0
- package/dist/dashboard/app/MoveDialog.d.ts +10 -0
- package/dist/dashboard/app/MoveDialog.js +161 -0
- package/dist/dashboard/app/NodeEditor.d.ts +11 -0
- package/dist/dashboard/app/NodeEditor.js +13 -0
- package/dist/dashboard/app/OverviewCell.d.ts +15 -0
- package/dist/dashboard/app/OverviewCell.js +249 -0
- package/dist/dashboard/app/PendingUploadsDialog.d.ts +2 -0
- package/dist/dashboard/app/PendingUploadsDialog.js +49 -0
- package/dist/dashboard/app/PendingUploadsView.d.ts +20 -0
- package/dist/dashboard/app/PendingUploadsView.js +233 -0
- package/dist/dashboard/app/ReadOnlyBadge.d.ts +1 -1
- package/dist/dashboard/app/ReadOnlyBadge.js +1 -1
- package/dist/dashboard/app/RemoveDialog.d.ts +17 -0
- package/dist/dashboard/app/RemoveDialog.js +294 -0
- 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/SidebarLayout.d.ts +2 -1
- package/dist/dashboard/app/SidebarLayout.js +28 -1133
- package/dist/dashboard/app/SidebarTree.d.ts +12 -6
- package/dist/dashboard/app/SidebarTree.js +220 -295
- package/dist/dashboard/app/ViewToggle.d.ts +1 -1
- package/dist/dashboard/app/ViewToggle.js +17 -10
- package/dist/dashboard/app/WorkspaceMenu.d.ts +5 -6
- package/dist/dashboard/app/WorkspaceMenu.js +76 -111
- package/dist/dashboard/app/WorkspaceRoots.d.ts +2 -4
- package/dist/dashboard/app/WorkspaceRoots.js +144 -172
- package/dist/dashboard/app/editor/FileEditor.js +161 -125
- package/dist/dashboard/app/editor/FilePreview.d.ts +8 -6
- package/dist/dashboard/app/editor/FilePreview.js +16 -143
- package/dist/dashboard/app/editor/MediaAltField.view.js +5 -5
- package/dist/dashboard/app/modals/CreateEntry.js +98 -106
- package/dist/dashboard/app/pages/EntryPage.d.ts +2 -1
- package/dist/dashboard/app/pages/EntryPage.js +139 -97
- package/dist/dashboard/app/pages/RootPage.js +4 -6
- package/dist/dashboard/app/pages/SplashPage.d.ts +19 -0
- package/dist/dashboard/app/pages/SplashPage.js +208 -193
- package/dist/dashboard/app/pages/UsersPage.d.ts +20 -1
- package/dist/dashboard/app/pages/UsersPage.js +182 -255
- package/dist/dashboard/app/ui/DashboardModal.d.ts +18 -12
- package/dist/dashboard/app/ui/DashboardModal.js +54 -69
- package/dist/dashboard/atoms/ReactiveNode.js +58 -19
- package/dist/dashboard/atoms/activity.d.ts +1 -0
- package/dist/dashboard/atoms/activity.js +8 -5
- package/dist/dashboard/atoms/auth.js +2 -2
- package/dist/dashboard/atoms/config.d.ts +5 -1
- package/dist/dashboard/atoms/core.d.ts +16 -2
- package/dist/dashboard/atoms/core.js +19 -7
- package/dist/dashboard/atoms/create.js +15 -14
- package/dist/dashboard/atoms/dashboard.d.ts +16 -0
- package/dist/dashboard/atoms/dashboard.js +11 -1
- package/dist/dashboard/atoms/editor.d.ts +7 -1
- package/dist/dashboard/atoms/editor.js +29 -42
- package/dist/dashboard/atoms/entry.d.ts +32 -42
- package/dist/dashboard/atoms/entry.js +240 -182
- package/dist/dashboard/atoms/entryTable.d.ts +10 -0
- package/dist/dashboard/atoms/entryTable.js +43 -0
- package/dist/dashboard/atoms/explorer.d.ts +212 -36
- package/dist/dashboard/atoms/explorer.js +597 -259
- package/dist/dashboard/atoms/graph.d.ts +5 -0
- package/dist/dashboard/atoms/graph.js +27 -2
- package/dist/dashboard/atoms/link.d.ts +2 -0
- package/dist/dashboard/atoms/link.js +11 -5
- package/dist/dashboard/atoms/move.d.ts +64 -0
- package/dist/dashboard/atoms/move.js +128 -0
- package/dist/dashboard/atoms/moveConfirmation.d.ts +34 -0
- package/dist/dashboard/atoms/moveConfirmation.js +95 -0
- package/dist/dashboard/atoms/nav.d.ts +36 -12
- package/dist/dashboard/atoms/nav.js +280 -53
- package/dist/dashboard/atoms/overview.d.ts +228 -0
- package/dist/dashboard/atoms/overview.js +519 -0
- package/dist/dashboard/atoms/remove.d.ts +112 -0
- package/dist/dashboard/atoms/remove.js +268 -0
- package/dist/dashboard/atoms/root.d.ts +44 -22
- package/dist/dashboard/atoms/root.js +294 -164
- package/dist/dashboard/atoms/upload.d.ts +105 -3
- package/dist/dashboard/atoms/upload.js +266 -11
- package/dist/dashboard/atoms/user.js +1 -1
- package/dist/dashboard/atoms/utils.d.ts +12 -4
- package/dist/dashboard/atoms/utils.js +35 -2
- package/dist/dashboard/boot/ActivityEvent.d.ts +1 -1
- package/dist/dashboard/boot/Boot.d.ts +2 -0
- package/dist/dashboard/boot/Boot.js +33 -18
- package/dist/dashboard/boot/BootDev.js +13 -10
- package/dist/dashboard/boot/BootProd.d.ts +6 -1
- package/dist/dashboard/boot/BootProd.js +3 -2
- package/dist/dashboard/boot/DashboardWorker.d.ts +7 -0
- package/dist/dashboard/boot/DashboardWorker.js +108 -24
- package/dist/dashboard/boot/LoadWorker.js +21 -11
- 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 +56 -0
- package/dist/dashboard/cms/EntryTable.js +273 -0
- package/dist/dashboard/cms/FieldChrome.d.ts +21 -0
- package/dist/dashboard/cms/FieldChrome.js +26 -0
- package/dist/dashboard/cms/ViewProps.d.ts +42 -0
- package/dist/dashboard/cms/ViewProps.js +0 -0
- package/dist/dashboard/cms/hooks.d.ts +120 -0
- package/dist/dashboard/cms/hooks.js +132 -0
- package/dist/dashboard/contexts.d.ts +59 -0
- package/dist/dashboard/contexts.js +43 -0
- package/dist/dashboard/editor/UseField.d.ts +29 -6
- package/dist/dashboard/fixture/cms.d.ts +2 -2
- package/dist/dashboard/hook/UseEntryEditor.d.ts +4 -1
- package/dist/dashboard/hook/UseEntryEditor.js +7 -3
- package/dist/dashboard/hook/UseGraph.d.ts +3 -1
- package/dist/dashboard/hook/UseLocale.d.ts +3 -1
- package/dist/dashboard/hook/UseRoot.d.ts +3 -1
- package/dist/dashboard/hook/UseSearchShortcut.d.ts +11 -0
- package/dist/dashboard/hook/UseSearchShortcut.js +32 -0
- package/dist/dashboard/hook/UseWorkspace.d.ts +3 -1
- package/dist/dashboard/hooks.d.ts +16 -98
- package/dist/dashboard/hooks.js +15 -90
- package/dist/dashboard/icons.d.ts +11 -0
- package/dist/dashboard/icons.js +125 -0
- package/dist/dashboard.d.ts +23 -1
- package/dist/dashboard.js +5 -2
- package/dist/database/BrowserEntryStore.d.ts +17 -24
- package/dist/database/BrowserEntryStore.js +139 -137
- package/dist/database/DatabaseTables.js +2 -2
- package/dist/database/EntryDatabase.d.ts +15 -1
- package/dist/database/EntryDatabase.js +61 -10
- package/dist/database/EntryStore.js +32 -20
- package/dist/database/EntryTransaction.d.ts +0 -5
- package/dist/database/EntryTransaction.js +173 -58
- package/dist/database/EntryUrlAliases.d.ts +4 -0
- package/dist/database/EntryUrlAliases.js +16 -10
- package/dist/database/Version.d.ts +2 -2
- package/dist/database/Version.js +1 -1
- package/dist/database/driver/RuntimeDatabase.js +3 -3
- package/dist/database/driver/WasmDatabase.d.ts +5 -18
- package/dist/database/driver/WasmDatabase.js +16 -15
- package/dist/database/entry/EntryTable.d.ts +5 -3
- package/dist/database/entry/EntryTable.js +34 -10
- package/dist/database/query/Condition.d.ts +9 -1
- package/dist/database/query/Condition.js +25 -6
- package/dist/database/query/EntryQuery.d.ts +4 -0
- package/dist/database/query/EntryQuery.js +148 -25
- package/dist/database/query/EntryReferences.d.ts +1 -1
- package/dist/database/query/EntryReferences.js +3 -2
- package/dist/database/query/Relation.d.ts +13 -1
- package/dist/database/query/Relation.js +33 -5
- package/dist/database/query/ResolveQuery.d.ts +1 -1
- package/dist/database/query/ResolveQuery.js +27 -18
- package/dist/database/query/Search.d.ts +10 -1
- package/dist/database/query/Search.js +83 -10
- package/dist/database/sync/Derive.d.ts +2 -1
- package/dist/database/sync/Derive.js +15 -10
- package/dist/database/sync/EntryParser.js +8 -7
- package/dist/database/sync/EntrySyncer.d.ts +3 -0
- package/dist/database/sync/EntrySyncer.js +10 -7
- package/dist/database/sync/Ingest.d.ts +2 -1
- package/dist/database/sync/Ingest.js +79 -49
- package/dist/database/sync/SyncQueries.d.ts +3 -2
- package/dist/database/sync/SyncQueries.js +19 -19
- package/dist/field/check/CheckField.js +3 -1
- package/dist/field/check/CheckField.view.js +13 -11
- package/dist/field/code/CodeField.d.ts +9 -0
- package/dist/field/code/CodeField.view.d.ts +3 -1
- package/dist/field/code/CodeField.view.js +30 -20
- package/dist/field/code/SimpleCodeEditor.js +0 -18
- package/dist/field/date/DateField.view.js +9 -25
- package/dist/field/link/EntryLink.d.ts +8 -9
- package/dist/field/link/FileLink.d.ts +11 -8
- package/dist/field/link/FileLink.js +7 -6
- package/dist/field/link/ImageLink.d.ts +16 -16
- package/dist/field/link/ImageLink.js +14 -23
- package/dist/field/link/Link.d.ts +1 -1
- package/dist/field/link/Link.js +2 -2
- package/dist/field/link/LinkField.d.ts +10 -5
- package/dist/field/link/LinkField.js +2 -0
- package/dist/field/link/LinkField.view.js +501 -684
- package/dist/field/link/UrlLink.d.ts +5 -4
- package/dist/field/link.d.ts +1 -0
- package/dist/field/list/ListField.d.ts +9 -5
- package/dist/field/list/ListField.js +10 -5
- package/dist/field/list/ListField.view.d.ts +15 -0
- package/dist/field/list/ListField.view.js +525 -645
- package/dist/field/localiser/LocalisedField.view.js +37 -88
- package/dist/field/localiser/LocalisedFieldTab.d.ts +7 -0
- package/dist/field/localiser/LocalisedFieldTab.js +30 -0
- package/dist/field/localiser/LocalisedFieldTabs.js +5 -5
- package/dist/field/localiser/Localiser.d.ts +17 -1
- package/dist/field/localiser/Localiser.js +152 -7
- package/dist/field/localiser/SelectLocale.d.ts +5 -0
- package/dist/field/localiser/SelectLocale.js +12 -0
- package/dist/field/metadata/MetadataAudit.d.ts +39 -0
- package/dist/field/metadata/MetadataAudit.js +124 -0
- package/dist/field/metadata/MetadataField.d.ts +20 -30
- package/dist/field/metadata/MetadataField.js +24 -107
- package/dist/field/metadata/MetadataField.view.d.ts +1 -0
- package/dist/field/metadata/MetadataField.view.js +36 -38
- package/dist/field/number/NumberField.view.js +9 -9
- package/dist/field/object/ObjectField.d.ts +3 -1
- package/dist/field/object/ObjectField.view.js +35 -25
- package/dist/field/path/PathField.view.js +3 -3
- package/dist/field/path/SlugField.d.ts +1 -2
- package/dist/field/path/SlugField.js +5 -7
- package/dist/field/richtext/PickTextAnchor.js +10 -10
- package/dist/field/richtext/PickTextLink.js +28 -41
- package/dist/field/richtext/RichTextBlock.d.ts +3 -1
- package/dist/field/richtext/RichTextBlock.js +190 -78
- package/dist/field/richtext/RichTextBlockHost.js +1 -1
- package/dist/field/richtext/RichTextExtensions.js +26 -20
- package/dist/field/richtext/RichTextField.story.d.ts +1 -0
- package/dist/field/richtext/RichTextField.view.js +13 -6
- package/dist/field/richtext/RichTextInsertMenu.js +59 -36
- package/dist/field/richtext/RichTextToolbar.js +82 -34
- package/dist/field/richtext/Toolbar.d.ts +9 -1
- package/dist/field/richtext/Toolbar.js +12 -2
- package/dist/field/richtext.d.ts +2 -0
- package/dist/field/richtext.js +2 -0
- package/dist/field/select/SelectField.view.js +15 -79
- package/dist/field/tabs/Tabs.d.ts +12 -3
- package/dist/field/tabs/Tabs.js +11 -2
- package/dist/field/tabs/Tabs.view.js +8 -8
- package/dist/field/text/TextField.view.js +9 -8
- package/dist/field/time/TimeField.view.js +10 -18
- package/dist/field/views.js +4 -0
- package/dist/field.d.ts +2 -2
- package/dist/field.js +3 -2
- package/dist/index.css +5408 -5223
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/next.cjs +27 -20
- package/dist/next.d.ts +2 -0
- package/dist/next.edge.d.ts +2 -0
- package/dist/picker/entry/EntryPicker.d.ts +11 -4
- 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/preview/widget.d.ts +3 -0
- package/dist/preview/widget.js +26 -8
- package/dist/query.d.ts +41 -266
- package/dist/query.js +4 -0
- package/dist/types.d.ts +12 -5
- package/dist/ui/RichText.js +31 -1
- package/dist/ui/Stack.d.ts +4 -2
- package/docs/ai-agents.md +316 -0
- package/docs/ai-setup.md +297 -0
- package/docs/cli.md +96 -0
- package/docs/components/alert.md +122 -0
- package/docs/components/app-shell.md +77 -0
- package/docs/components/badge.md +89 -0
- package/docs/components/blockquote.md +24 -0
- package/docs/components/breadcrumb.md +83 -0
- package/docs/components/button.md +142 -0
- package/docs/components/calendar.md +32 -0
- package/docs/components/checkbox-group.md +38 -0
- package/docs/components/checkbox.md +61 -0
- package/docs/components/code.md +37 -0
- package/docs/components/collapsible.md +53 -0
- package/docs/components/color-swatch-picker.md +47 -0
- package/docs/components/combo-box.md +146 -0
- package/docs/components/command.md +101 -0
- package/docs/components/content-card.md +64 -0
- package/docs/components/content-grid.md +71 -0
- package/docs/components/data-list.md +64 -0
- package/docs/components/date-field.md +34 -0
- package/docs/components/date-picker.md +35 -0
- package/docs/components/date-range-picker.md +34 -0
- package/docs/components/dialog.md +233 -0
- package/docs/components/drop-zone.md +45 -0
- package/docs/components/dropdown-menu.md +223 -0
- package/docs/components/empty.md +81 -0
- package/docs/components/field.md +66 -0
- package/docs/components/file-trigger.md +33 -0
- package/docs/components/fold-icon.md +34 -0
- package/docs/components/form.md +67 -0
- package/docs/components/heading.md +33 -0
- package/docs/components/icon.md +43 -0
- package/docs/components/kbd.md +29 -0
- package/docs/components/link.md +45 -0
- package/docs/components/list.md +105 -0
- package/docs/components/media-preview.md +43 -0
- package/docs/components/multiple-select.md +48 -0
- package/docs/components/nav-rail.md +79 -0
- package/docs/components/number-field.md +53 -0
- package/docs/components/page.md +97 -0
- package/docs/components/popover.md +71 -0
- package/docs/components/preview-frame.md +63 -0
- package/docs/components/radio-group.md +47 -0
- package/docs/components/resizable-panel-group.md +63 -0
- package/docs/components/search-field.md +54 -0
- package/docs/components/select.md +127 -0
- package/docs/components/sidebar.md +104 -0
- package/docs/components/sortable-list.md +110 -0
- package/docs/components/spinner.md +29 -0
- package/docs/components/stack.md +42 -0
- package/docs/components/surface.md +54 -0
- package/docs/components/switch.md +52 -0
- package/docs/components/table.md +262 -0
- package/docs/components/tabs.md +120 -0
- package/docs/components/tag-group.md +56 -0
- package/docs/components/text-field.md +142 -0
- package/docs/components/text.md +44 -0
- package/docs/components/time-field.md +41 -0
- package/docs/components/timestamp.md +45 -0
- package/docs/components/toggle-group.md +46 -0
- package/docs/components/toggle.md +37 -0
- package/docs/components/toolbar.md +96 -0
- package/docs/components/tooltip.md +78 -0
- package/docs/components/tree.md +67 -0
- package/docs/components.md +169 -0
- package/docs/configuration.md +177 -0
- package/docs/content-model.md +87 -0
- package/docs/custom-fields.md +359 -0
- package/docs/dashboard-ui.md +3 -0
- package/docs/deploy/alinea-cloud.md +26 -0
- package/docs/deploy/self-host.md +195 -0
- package/docs/deploy.md +127 -0
- package/docs/editing-content.md +195 -0
- package/docs/fields/check.md +40 -0
- package/docs/fields/code.md +35 -0
- package/docs/fields/date.md +90 -0
- package/docs/fields/entry.md +179 -0
- package/docs/fields/file.md +60 -0
- package/docs/fields/image.md +138 -0
- package/docs/fields/link.md +121 -0
- package/docs/fields/list.md +149 -0
- package/docs/fields/number.md +58 -0
- package/docs/fields/object.md +93 -0
- package/docs/fields/path.md +105 -0
- package/docs/fields/rich-text.md +267 -0
- package/docs/fields/select.md +99 -0
- package/docs/fields/tabs.md +111 -0
- package/docs/fields/text.md +46 -0
- package/docs/fields/url.md +51 -0
- package/docs/fields.md +231 -0
- package/docs/get-started.md +3 -0
- package/docs/guides.md +3 -0
- package/docs/index.md +140 -0
- package/docs/instant-publishing.md +61 -0
- package/docs/internationalization.md +218 -0
- package/docs/introduction.md +5 -0
- package/docs/live-previews.md +151 -0
- package/docs/mcp.md +500 -0
- package/docs/overviews.md +580 -0
- package/docs/query/advanced.md +123 -0
- package/docs/query/examples.md +231 -0
- package/docs/query/filtering.md +162 -0
- package/docs/query/related.md +178 -0
- package/docs/query/structural.md +165 -0
- package/docs/query.md +190 -0
- package/docs/quickstart.md +203 -0
- package/docs/reference.md +3 -0
- package/docs/roles-permissions.md +234 -0
- package/docs/schema/document.md +100 -0
- package/docs/schema/type.md +133 -0
- package/docs/schema.md +66 -0
- package/docs/tutorial/step-1-landing-page.md +244 -0
- package/docs/tutorial/step-2-block-list.md +364 -0
- package/docs/tutorial/step-3-layout-root.md +200 -0
- package/docs/tutorial/step-4-blog.md +384 -0
- package/docs/tutorial/step-5-catch-all.md +222 -0
- package/docs/tutorial.md +21 -0
- package/docs/typescript.md +115 -0
- package/docs/upgrading.md +368 -0
- package/docs/workspaces/media.md +134 -0
- package/docs/workspaces/root.md +127 -0
- package/docs/workspaces.md +98 -0
- package/llms-full.txt +13007 -3217
- package/package.json +25 -6
- package/readme.md +136 -55
- package/dist/adapter/next/previews.spec.d.ts +0 -1
- package/dist/chunks/chunk-AC4U3IMS.js +0 -205
- package/dist/chunks/chunk-DNJX6CRV.js +0 -129
- package/dist/chunks/chunk-NIVGVRDS.js +0 -6363
- package/dist/chunks/chunk-S4AU6SRS.js +0 -5503
- package/dist/chunks/chunk-SJBZFMQ2.js +0 -2966
- package/dist/components/Disclosure.d.ts +0 -5
- package/dist/components/Disclosure.js +0 -106
- package/dist/components/Label.d.ts +0 -48
- package/dist/components/Label.js +0 -210
- package/dist/components/Menu.d.ts +0 -16
- package/dist/components/Menu.js +0 -95
- package/dist/components/Modal.d.ts +0 -7
- package/dist/components/Modal.js +0 -58
- package/dist/components/ProgressCircle.d.ts +0 -6
- package/dist/components/ProgressCircle.js +0 -96
- package/dist/dashboard/app/AppShell.d.ts +0 -4
- package/dist/dashboard/app/AppShell.js +0 -29
- package/dist/dashboard/app/Badge.d.ts +0 -8
- package/dist/dashboard/app/Badge.js +0 -42
- package/dist/dashboard/app/EditorBackButton.d.ts +0 -5
- package/dist/dashboard/app/EditorBackButton.js +0 -33
- package/dist/dashboard/app/EntrySidebarPreview.spec.d.ts +0 -1
- package/dist/dashboard/app/ExplorerFileCard.d.ts +0 -10
- package/dist/dashboard/app/ExplorerFileCard.js +0 -115
- package/dist/dashboard/app/StatusBadge.d.ts +0 -6
- package/dist/dashboard/app/StatusBadge.js +0 -26
- package/dist/dashboard/app/WorkspaceMenu.spec.d.ts +0 -1
- package/dist/dashboard/app/WorkspaceMenu.stories.d.ts +0 -7
- package/dist/dashboard/app/ui/Rail.d.ts +0 -18
- package/dist/dashboard/app/ui/Rail.js +0 -41
- package/dist/dashboard/app/ui/Sidebar.d.ts +0 -15
- package/dist/dashboard/app/ui/Sidebar.js +0 -55
- package/dist/field/link/LinkField.spec.d.ts +0 -1
- package/dist/field/link/LinkField.stories.d.ts +0 -15
- package/dist/field/list/ListField.spec.d.ts +0 -1
- package/dist/field/list/ListField.stories.d.ts +0 -7
- package/dist/field/richtext/RichTextField.spec.d.ts +0 -1
- 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
|
+
};
|
package/dist/core/Workspace.d.ts
CHANGED
|
@@ -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[];
|
package/dist/core/Workspace.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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:
|
|
258
|
+
type: typeName2,
|
|
181
259
|
root,
|
|
182
260
|
workspace,
|
|
183
|
-
data:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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;
|