alinea 2.0.0-preview.6 → 2.0.0-preview.8
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/LICENSES.md +109 -109
- package/dist/adapter/next/cms.d.ts +18 -4
- package/dist/adapter/next/cms.js +125 -36
- package/dist/adapter/next/handler.d.ts +5 -1
- package/dist/adapter/next/handler.js +14 -7
- package/dist/adapter/next/node.d.ts +5 -0
- package/dist/adapter/next/node.js +16 -0
- package/dist/adapter/next/previews.d.ts +4 -1
- package/dist/adapter/next/previews.js +13 -3
- package/dist/adapter/next/renderStats.d.ts +24 -0
- package/dist/adapter/next/renderStats.js +74 -0
- package/dist/adapter/next/syncCheck.d.ts +8 -2
- package/dist/adapter/next/syncCheck.js +3 -3
- package/dist/adapter/next/with-alinea.js +0 -18
- package/dist/backend/Handler.d.ts +2 -2
- package/dist/backend/Handler.js +33 -12
- package/dist/backend/api/CreateBackend.js +15 -3
- package/dist/backend/api/DatabaseApi.js +22 -135
- package/dist/backend/api/database.js +15 -3
- package/dist/backend/resolver/ParsePreview.d.ts +2 -2
- package/dist/backend/router/NodeHandler.js +2 -0
- package/dist/backend/store/GeneratedDatabase.d.ts +5 -0
- package/dist/backend/store/GeneratedDatabase.js +31 -0
- package/dist/backend/store/GeneratedDatabaseNode.d.ts +4 -0
- package/dist/backend/store/GeneratedDatabaseNode.js +35 -0
- package/dist/backend/util/ORM.js +4 -2
- package/dist/bundled.d.ts +1485 -446
- package/dist/chunks/bun-sqlite-ZZDB7YQQ.js +18 -0
- package/dist/chunks/chunk-2BJ2IFQM.js +1085 -0
- package/dist/chunks/chunk-2PIFHEYR.js +364 -0
- package/dist/chunks/{chunk-X47OVDF3.js → chunk-2U43BB6P.js} +356 -1000
- package/dist/chunks/chunk-76VMZTLN.js +55 -0
- package/dist/chunks/chunk-A42DP5T7.js +94 -0
- package/dist/chunks/chunk-ATF42T2B.js +35 -0
- package/dist/chunks/{chunk-NWQXN4SB.js → chunk-ETBQTP2S.js} +40 -29
- package/dist/chunks/chunk-IL7FJQAY.js +94 -0
- package/dist/chunks/chunk-K62JP6HR.js +22 -0
- package/dist/chunks/chunk-K7LHQXI4.js +103 -0
- package/dist/chunks/chunk-M7KDJEGH.js +495 -0
- package/dist/chunks/chunk-N47Y62CI.js +396 -0
- package/dist/chunks/chunk-NLZLRQ5U.js +100 -0
- package/dist/chunks/chunk-QBPYWU6C.js +24 -0
- package/dist/chunks/{chunk-7IOKMUKO.js → chunk-RWWYUNVX.js} +2 -1
- package/dist/chunks/chunk-TFMUSWGG.js +605 -0
- package/dist/chunks/{chunk-I4GC3E65.js → chunk-UPY2RUZF.js} +0 -1
- package/dist/chunks/chunk-XCZXR3C2.js +112 -0
- package/dist/chunks/chunk-XTWYBWP2.js +81 -0
- package/dist/chunks/node-sqlite-7CSGL27V.js +18 -0
- package/dist/cli/Generate.js +74 -64
- package/dist/cli/Serve.js +1 -1
- package/dist/cli/bin.js +2 -1
- package/dist/cli/generate/CopyStaticFiles.js +17 -14
- package/dist/cli/generate/DevDB.d.ts +22 -5
- package/dist/cli/generate/DevDB.js +136 -24
- package/dist/cli/serve/CreateLocalServer.js +22 -4
- package/dist/cli/serve/LiveReload.d.ts +1 -1
- package/dist/cli/serve/LiveReload.js +3 -0
- package/dist/cloud/CloudRemote.js +2 -1
- package/dist/components/Calendar.js +5 -5
- package/dist/components/Checkbox.js +2 -2
- package/dist/components/ComboBox.js +13 -13
- package/dist/components/DateField.js +3 -3
- package/dist/components/DatePicker.js +5 -5
- package/dist/components/DateRangePicker.js +6 -6
- package/dist/components/Disclosure.js +7 -7
- package/dist/components/Label.js +4 -4
- package/dist/components/List.js +51 -49
- package/dist/components/Menu.js +4 -4
- package/dist/components/Modal.js +2 -2
- package/dist/components/MultipleSelect.js +25 -25
- package/dist/components/NumberField.js +3 -3
- package/dist/components/ProgressCircle.js +2 -2
- package/dist/components/RadioGroup.js +2 -2
- package/dist/components/SearchField.js +8 -8
- package/dist/components/Select.js +8 -8
- package/dist/components/Surface.js +3 -3
- package/dist/components/Table.js +7 -7
- package/dist/components/Tabs.js +4 -4
- package/dist/components/TagGroup.js +3 -3
- package/dist/components/TextField.js +3 -3
- package/dist/components/TimeField.js +3 -3
- package/dist/components/Toggle.js +2 -2
- package/dist/components/Toolbar.js +2 -2
- package/dist/components/Tooltip.js +3 -3
- package/dist/components/Tree.d.ts +2 -1
- package/dist/components/Tree.js +9 -9
- package/dist/core/Document.js +15 -3
- package/dist/core/Entry.d.ts +3 -0
- package/dist/core/Entry.js +4 -0
- package/dist/core/EntrySeed.d.ts +19 -0
- package/dist/core/EntrySeed.js +136 -0
- package/dist/core/Field.d.ts +7 -0
- package/dist/core/Field.js +4 -0
- package/dist/core/Filter.d.ts +40 -2
- package/dist/core/Filter.js +145 -0
- package/dist/core/Graph.d.ts +9 -0
- package/dist/core/ListRow.d.ts +1 -0
- package/dist/core/ListRow.js +1 -0
- package/dist/core/Reference.d.ts +1 -0
- package/dist/core/Root.js +1 -1
- package/dist/core/Scope.d.ts +2 -0
- package/dist/core/Scope.js +16 -1
- package/dist/core/TextDoc.d.ts +1 -0
- package/dist/core/Type.d.ts +2 -1
- package/dist/core/Type.js +13 -1
- package/dist/core/db/EntryAliases.js +1 -11
- package/dist/core/db/EntryReference.d.ts +0 -6
- package/dist/core/db/IndexEvent.d.ts +2 -1
- package/dist/core/db/IndexEvent.js +11 -3
- package/dist/core/db/LinkResolver.d.ts +6 -6
- package/dist/core/db/LinkResolver.js +0 -52
- package/dist/core/db/LocalStore.d.ts +25 -0
- package/dist/core/field/ListField.js +19 -0
- package/dist/core/field/RecordField.js +8 -0
- package/dist/core/field/RichTextField.js +45 -3
- package/dist/core/field/UnionField.js +8 -0
- package/dist/core/source/FSSource.d.ts +14 -2
- package/dist/core/source/FSSource.js +58 -13
- package/dist/core/source/GitUtils.d.ts +4 -0
- package/dist/core/source/GitUtils.js +9 -10
- package/dist/core/source/GithubSource.js +22 -11
- package/dist/core/source/IndexedDBSource.d.ts +2 -1
- package/dist/core/source/IndexedDBSource.js +67 -53
- package/dist/core/source/MemorySource.js +5 -3
- package/dist/core/source/OverlaySource.d.ts +5 -2
- package/dist/core/source/OverlaySource.js +31 -3
- package/dist/core/source/Source.d.ts +3 -0
- package/dist/core/source/Source.js +15 -2
- package/dist/core/source/Tree.d.ts +10 -7
- package/dist/core/source/Tree.js +118 -70
- package/dist/core/source/Utils.js +6 -3
- package/dist/core/util/Arrays.d.ts +1 -0
- package/dist/core/util/Arrays.js +10 -0
- package/dist/core/util/Async.d.ts +7 -0
- package/dist/core/util/Async.js +15 -0
- package/dist/core/util/Checks.js +1 -1
- package/dist/core/util/EntryFilenames.d.ts +22 -1
- package/dist/core/util/EntryFilenames.js +56 -2
- package/dist/core/util/IndexedDB.d.ts +4 -0
- package/dist/core/util/IndexedDB.js +20 -0
- package/dist/core/util/Paths.js +5 -1
- package/dist/dashboard/App.js +5 -3
- package/dist/dashboard/ViewKeys.d.ts +1 -0
- package/dist/dashboard/ViewKeys.js +1 -0
- package/dist/dashboard/app/AccessDenied.js +3 -3
- package/dist/dashboard/app/ActivityStatus.js +17 -17
- package/dist/dashboard/app/AppShell.js +2 -2
- package/dist/dashboard/app/AuthView.js +11 -11
- package/dist/dashboard/app/CompactField.js +12 -12
- package/dist/dashboard/app/DashboardErrorBoundary.js +6 -6
- package/dist/dashboard/app/DashboardLayout.js +6 -5
- package/dist/dashboard/app/EntryHeader.js +8 -8
- package/dist/dashboard/app/EntryReferences.js +12 -17
- package/dist/dashboard/app/EntrySidebar.js +27 -13
- package/dist/dashboard/app/EntrySidebarPreview.js +12 -12
- package/dist/dashboard/app/EntryTranslationBanner.js +3 -3
- package/dist/dashboard/app/Explorer.js +41 -41
- package/dist/dashboard/app/ExplorerCards.js +33 -33
- package/dist/dashboard/app/ExplorerFileCard.js +18 -18
- package/dist/dashboard/app/ExplorerList.js +13 -13
- package/dist/dashboard/app/ExplorerModal.js +5 -5
- package/dist/dashboard/app/ExplorerTable.js +48 -48
- package/dist/dashboard/app/LinkPicker.js +3 -3
- package/dist/dashboard/app/LocaleMenu.js +7 -7
- package/dist/dashboard/app/SidebarTree.js +81 -45
- package/dist/dashboard/app/WorkspaceMenu.js +9 -9
- package/dist/dashboard/app/WorkspaceRoots.js +21 -21
- package/dist/dashboard/app/editor/FileEditor.js +26 -26
- package/dist/dashboard/app/editor/FilePreview.js +6 -6
- package/dist/dashboard/app/modals/CreateEntry.js +5 -5
- package/dist/dashboard/app/pages/EntryPage.js +15 -15
- package/dist/dashboard/app/pages/RootPage.js +3 -3
- package/dist/dashboard/app/pages/SplashPage.js +43 -43
- package/dist/dashboard/app/pages/UsersPage.js +34 -34
- package/dist/dashboard/app/ui/DashboardModal.js +17 -17
- package/dist/dashboard/app/ui/Rail.js +3 -3
- package/dist/dashboard/app/ui/Sidebar.js +2 -2
- package/dist/dashboard/atoms/config.d.ts +4 -4
- package/dist/dashboard/atoms/dashboard.js +2 -1
- package/dist/dashboard/atoms/editor.js +7 -0
- package/dist/dashboard/atoms/entry.d.ts +10 -13
- package/dist/dashboard/atoms/entry.js +42 -7
- package/dist/dashboard/atoms/explorer.d.ts +2 -0
- package/dist/dashboard/atoms/explorer.js +7 -2
- package/dist/dashboard/atoms/root.d.ts +1 -0
- package/dist/dashboard/atoms/root.js +61 -35
- package/dist/dashboard/boot/Boot.js +9 -8
- package/dist/dashboard/boot/DashboardWorker.d.ts +3 -3
- package/dist/dashboard/boot/DashboardWorker.js +78 -27
- package/dist/dashboard/boot/LoadWorker.js +2 -3
- package/dist/dashboard/icons.d.ts +2 -0
- package/dist/dashboard/icons.js +40 -0
- package/dist/dashboard/plugins/alineaFixturePlugin.js +14 -3
- package/dist/database/BrowserEntryStore.d.ts +30 -0
- package/dist/database/BrowserEntryStore.js +168 -0
- package/dist/database/DatabaseSource.d.ts +13 -0
- package/dist/database/DatabaseSource.js +25 -0
- package/dist/database/DatabaseTables.d.ts +38 -0
- package/dist/database/DatabaseTables.js +53 -0
- package/dist/database/EntryDatabase.d.ts +21 -0
- package/dist/database/EntryDatabase.js +138 -0
- package/dist/database/EntryLayer.d.ts +93 -0
- package/dist/database/EntryLayer.js +459 -0
- package/dist/database/EntryStore.d.ts +60 -0
- package/dist/database/EntryStore.js +269 -0
- package/dist/database/EntryTransaction.d.ts +33 -0
- package/dist/database/EntryTransaction.js +889 -0
- package/dist/database/EntryUrlAliases.d.ts +2 -0
- package/dist/database/EntryUrlAliases.js +69 -0
- package/dist/database/LocalDB.d.ts +39 -0
- package/dist/database/LocalDB.js +79 -0
- package/dist/database/Version.d.ts +9 -0
- package/dist/database/Version.js +13 -0
- package/dist/database/driver/RuntimeDatabase.d.ts +8 -0
- package/dist/database/driver/RuntimeDatabase.js +33 -0
- package/dist/database/driver/WasmDatabase.d.ts +8 -0
- package/dist/database/driver/WasmDatabase.js +33 -0
- package/dist/database/entry/EntryData.d.ts +13 -0
- package/dist/database/entry/EntryData.js +51 -0
- package/dist/database/entry/EntryTable.d.ts +173 -0
- package/dist/database/entry/EntryTable.js +137 -0
- package/dist/database/entry/EntryView.d.ts +22 -0
- package/dist/database/entry/EntryView.js +106 -0
- package/dist/database/query/Condition.d.ts +8 -0
- package/dist/database/query/Condition.js +117 -0
- package/dist/database/query/EntryQuery.d.ts +43 -0
- package/dist/database/query/EntryQuery.js +414 -0
- package/dist/database/query/EntryReferences.d.ts +6 -0
- package/dist/database/query/EntryReferences.js +68 -0
- package/dist/database/query/Relation.d.ts +11 -0
- package/dist/database/query/Relation.js +113 -0
- package/dist/database/query/ResolveQuery.d.ts +15 -0
- package/dist/database/query/ResolveQuery.js +154 -0
- package/dist/database/query/Search.d.ts +47 -0
- package/dist/database/query/Search.js +169 -0
- package/dist/database/sync/Derive.d.ts +8 -0
- package/dist/database/sync/Derive.js +270 -0
- package/dist/database/sync/EntryParser.d.ts +4 -0
- package/dist/database/sync/EntryParser.js +87 -0
- package/dist/database/sync/EntrySyncer.d.ts +37 -0
- package/dist/database/sync/EntrySyncer.js +117 -0
- package/dist/database/sync/Ingest.d.ts +21 -0
- package/dist/database/sync/Ingest.js +136 -0
- package/dist/database/sync/SyncQueries.d.ts +157 -0
- package/dist/database/sync/SyncQueries.js +192 -0
- package/dist/field/check/CheckField.view.js +2 -2
- package/dist/field/code/CodeField.view.js +7 -7
- package/dist/field/link/FileLink.js +1 -7
- package/dist/field/link/LinkField.js +23 -0
- package/dist/field/link/LinkField.view.js +44 -43
- package/dist/field/list/ListField.d.ts +5 -0
- package/dist/field/list/ListField.stories.d.ts +1 -0
- package/dist/field/list/ListField.view.js +190 -156
- package/dist/field/metadata/MetadataField.d.ts +28 -3
- package/dist/field/metadata/MetadataField.js +44 -7
- package/dist/field/metadata/MetadataField.view.d.ts +5 -0
- package/dist/field/metadata/MetadataField.view.js +37 -22
- package/dist/field/richtext/PickTextLink.d.ts +3 -1
- package/dist/field/richtext/PickTextLink.js +7 -6
- package/dist/field/richtext/RichTextDocument.js +12 -4
- package/dist/field/richtext/RichTextExtensions.d.ts +1 -1
- package/dist/field/richtext/RichTextExtensions.js +34 -30
- package/dist/field/richtext/RichTextField.d.ts +3 -0
- package/dist/field/richtext/RichTextField.view.js +20 -11
- package/dist/field/richtext/RichTextInsertMenu.js +3 -3
- package/dist/field/views.js +2 -0
- package/dist/index.css +17 -6
- package/dist/next.cjs +0 -18
- package/dist/next.d.ts +4 -3
- package/dist/next.edge.d.ts +1 -1
- package/dist/next.js +1 -2
- package/dist/picker/entry/EntryPicker.js +2 -1
- package/dist/picker/url/UrlPicker.js +1 -0
- package/dist/preview/widget.d.ts +16 -0
- package/dist/preview/widget.js +70 -1
- package/dist/query.d.ts +28 -0
- package/dist/ui/RichText.js +33 -18
- package/package.json +2 -1
- package/dist/backend/store/GeneratedSource.d.ts +0 -2
- package/dist/backend/store/GeneratedSource.js +0 -21
- package/dist/chunks/chunk-G6E35DMJ.js +0 -1997
- package/dist/core/db/EntryDB.d.ts +0 -19
- package/dist/core/db/EntryDB.js +0 -48
- package/dist/core/db/EntryIndex.d.ts +0 -143
- package/dist/core/db/EntryIndex.js +0 -2773
- package/dist/core/db/EntryReferenceIndex.d.ts +0 -21
- package/dist/core/db/EntryReferenceIndex.js +0 -131
- package/dist/core/db/EntryResolver.d.ts +0 -56
- package/dist/core/db/EntryResolver.js +0 -699
- package/dist/core/db/EntryTarget.d.ts +0 -5
- package/dist/core/db/EntryTransaction.d.ts +0 -31
- package/dist/core/db/EntryTransaction.js +0 -956
- package/dist/core/db/LocalDB.d.ts +0 -42
- package/dist/core/db/LocalDB.js +0 -127
- package/dist/core/db/TestDB.d.ts +0 -19
- package/dist/core/db/TestDB.js +0 -50
- /package/dist/core/db/{EntryTarget.js → LocalStore.js} +0 -0
package/dist/bundled.d.ts
CHANGED
|
@@ -44,28 +44,42 @@ declare module 'alinea/adapter/next/cms' {
|
|
|
44
44
|
import { CMS } from 'alinea/core/CMS';
|
|
45
45
|
import { Config } from 'alinea/core/Config';
|
|
46
46
|
import type { UploadResponse } from 'alinea/core/Connection';
|
|
47
|
-
import {
|
|
47
|
+
import type { LocalStore } from 'alinea/core/db/LocalStore';
|
|
48
48
|
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
49
49
|
import type { GraphQuery } from 'alinea/core/Graph';
|
|
50
50
|
import type { User } from 'alinea/core/User';
|
|
51
51
|
import PLazy from 'p-lazy';
|
|
52
|
+
import type { DatabaseOptions } from 'rado';
|
|
52
53
|
export interface PreviewProps {
|
|
53
54
|
widget?: boolean;
|
|
55
|
+
/** Show the queries and syncs of each draft render in the widget */
|
|
56
|
+
stats?: boolean;
|
|
54
57
|
workspace?: string;
|
|
55
58
|
root?: string;
|
|
56
59
|
}
|
|
60
|
+
export type OpenBundledDatabase = (config: Config, options?: DatabaseOptions) => Promise<LocalStore>;
|
|
61
|
+
export interface SyncStatus {
|
|
62
|
+
/** Whether queries are answered from the bundled database or the handler. */
|
|
63
|
+
source: 'database' | 'handler';
|
|
64
|
+
/** The content revision the answering side is at. */
|
|
65
|
+
sha: string | undefined;
|
|
66
|
+
/** When this isolate last synced its bundled database with the handler. */
|
|
67
|
+
syncedAt: Date | undefined;
|
|
68
|
+
}
|
|
57
69
|
export class NextCMS<Definition extends Config = Config> extends CMS<Definition> {
|
|
58
70
|
#private;
|
|
59
|
-
|
|
71
|
+
bundledDb: PLazy<LocalStore>;
|
|
72
|
+
constructor(config: Definition, openBundledDatabase?: OpenBundledDatabase);
|
|
60
73
|
throttle: (sync: () => Promise<unknown>, interval?: number) => Promise<void>;
|
|
61
|
-
|
|
74
|
+
/** Where queries are answered from and how fresh that side is. */
|
|
75
|
+
status(): Promise<SyncStatus>;
|
|
62
76
|
resolve<Query extends GraphQuery>(query: Query): Promise<any>;
|
|
63
77
|
user(): Promise<User | undefined>;
|
|
64
78
|
mutate(mutations: Array<Mutation>): Promise<{
|
|
65
79
|
sha: string;
|
|
66
80
|
}>;
|
|
67
81
|
prepareUpload(file: string): Promise<UploadResponse>;
|
|
68
|
-
previews: ({ widget, workspace, root }: PreviewProps) => Promise<import("react").JSX.Element | null>;
|
|
82
|
+
previews: ({ widget, stats: showStats, workspace, root }: PreviewProps) => Promise<import("react").JSX.Element | null>;
|
|
69
83
|
}
|
|
70
84
|
export function createCMS<Definition extends Config>(config: Definition): NextCMS<Definition>;
|
|
71
85
|
|
|
@@ -98,27 +112,44 @@ declare module 'alinea/adapter/next/handler' {
|
|
|
98
112
|
import { type BackendFactory, type BackendOptions } from 'alinea/backend/api/CreateBackend';
|
|
99
113
|
import { type HandlerHooks } from 'alinea/backend/Handler';
|
|
100
114
|
import { Config } from 'alinea/core/Config';
|
|
115
|
+
import type { LocalStore } from 'alinea/core/db/LocalStore';
|
|
101
116
|
import { NextCMS } from 'alinea/adapter/next/cms';
|
|
102
117
|
type Handler = (request: Request) => Promise<Response>;
|
|
103
118
|
export interface NextHandlerOptions extends HandlerHooks {
|
|
104
119
|
cms: NextCMS;
|
|
105
120
|
backend?: BackendFactory | BackendOptions;
|
|
106
121
|
}
|
|
107
|
-
export
|
|
122
|
+
export type OpenGeneratedDatabase = (config: Config) => Promise<LocalStore>;
|
|
123
|
+
export function createHandlerWithDatabase(input: NextCMS | NextHandlerOptions, openGeneratedDatabase?: OpenGeneratedDatabase): Handler;
|
|
108
124
|
export function handlerPathname(config: Config, requestUrl: URL): string;
|
|
125
|
+
/** A handler without a generated database, as used in the Edge runtime. */
|
|
126
|
+
export function createHandler(input: NextCMS | NextHandlerOptions): Handler;
|
|
109
127
|
export {};
|
|
110
128
|
|
|
111
129
|
}
|
|
112
130
|
|
|
131
|
+
declare module 'alinea/adapter/next/node' {
|
|
132
|
+
|
|
133
|
+
import type { Config } from 'alinea/core/Config';
|
|
134
|
+
import { NextCMS } from 'alinea/adapter/next/cms';
|
|
135
|
+
import { type NextHandlerOptions } from 'alinea/adapter/next/handler';
|
|
136
|
+
export function createCMS<Definition extends Config>(config: Definition): NextCMS<Definition>;
|
|
137
|
+
export function createHandler(input: NextCMS | NextHandlerOptions): (request: Request) => Promise<Response>;
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
113
141
|
declare module 'alinea/adapter/next/previews' {
|
|
114
142
|
|
|
143
|
+
import { type PreviewStats } from 'alinea/preview/widget';
|
|
115
144
|
export interface NextPreviewsProps {
|
|
116
145
|
dashboardUrl: string;
|
|
117
146
|
widget?: boolean;
|
|
147
|
+
/** Resolves once the render's CMS queries settled. */
|
|
148
|
+
stats?: Promise<PreviewStats>;
|
|
118
149
|
root?: string;
|
|
119
150
|
workspace?: string;
|
|
120
151
|
}
|
|
121
|
-
export default function NextPreviews({ dashboardUrl, widget, root, workspace }: NextPreviewsProps): import("react").JSX.Element | null;
|
|
152
|
+
export default function NextPreviews({ dashboardUrl, widget, stats, root, workspace }: NextPreviewsProps): import("react").JSX.Element | null;
|
|
122
153
|
/**
|
|
123
154
|
* Wrapper around `router.refresh()` from `next/navigation` `useRouter()` to return Promise, and resolve after refresh completed
|
|
124
155
|
* @returns Refresh function
|
|
@@ -133,10 +164,44 @@ declare module 'alinea/adapter/next/previews.spec' {
|
|
|
133
164
|
|
|
134
165
|
}
|
|
135
166
|
|
|
167
|
+
declare module 'alinea/adapter/next/renderStats' {
|
|
168
|
+
|
|
169
|
+
import type { GraphQuery } from 'alinea/core/Graph';
|
|
170
|
+
import type { PreviewStat, PreviewStats } from 'alinea/preview/widget';
|
|
171
|
+
/** Collects the CMS queries and syncs of one draft render. */
|
|
172
|
+
export class RenderStats {
|
|
173
|
+
#private;
|
|
174
|
+
rows: Array<PreviewStat>;
|
|
175
|
+
statements: number;
|
|
176
|
+
sqlMs: number;
|
|
177
|
+
/** Add a row and count it as pending until `run` settles; see `timed`. */
|
|
178
|
+
track<T>(stat: Omit<PreviewStat, 'durationMs'>, run: (row: PreviewStat) => Promise<T>): Promise<T>;
|
|
179
|
+
statement(durationMs: number): void;
|
|
180
|
+
/**
|
|
181
|
+
* Resolves once nothing ran for `quietMs`, so queries of server components
|
|
182
|
+
* that render after the caller are counted, or after `maxMs` regardless.
|
|
183
|
+
*/
|
|
184
|
+
settled(quietMs?: number, maxMs?: number): Promise<PreviewStats>;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Time the work a row stands for, such as answering a query without the sync
|
|
188
|
+
* it waited for.
|
|
189
|
+
*/
|
|
190
|
+
export function timed<T>(row: PreviewStat | undefined, run: () => Promise<T>): Promise<T>;
|
|
191
|
+
/** A short description such as `first(type, url=/about)`. */
|
|
192
|
+
export function summarizeQuery(query: GraphQuery): string;
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
136
196
|
declare module 'alinea/adapter/next/syncCheck' {
|
|
137
197
|
|
|
138
198
|
import type { Client } from 'alinea/core/Client';
|
|
139
|
-
import type {
|
|
199
|
+
import type { SyncOptions } from 'alinea/core/db/LocalStore';
|
|
200
|
+
import type { RemoteSource } from 'alinea/core/source/Source';
|
|
201
|
+
interface SyncableDB {
|
|
202
|
+
readonly sha: string | Promise<string>;
|
|
203
|
+
syncWith(source: RemoteSource, options?: SyncOptions): Promise<string>;
|
|
204
|
+
}
|
|
140
205
|
export const CONTENT_SHA_TAG = "alinea-content-sha";
|
|
141
206
|
export function revalidateContentSha(): Promise<void>;
|
|
142
207
|
/**
|
|
@@ -146,7 +211,8 @@ declare module 'alinea/adapter/next/syncCheck' {
|
|
|
146
211
|
* Returns false when the sha could not be determined, so the caller falls
|
|
147
212
|
* back to its existing throttle behavior.
|
|
148
213
|
*/
|
|
149
|
-
export function syncIfStale(db:
|
|
214
|
+
export function syncIfStale(db: SyncableDB, client: Client, syncInterval?: number, options?: SyncOptions): Promise<boolean>;
|
|
215
|
+
export {};
|
|
150
216
|
|
|
151
217
|
}
|
|
152
218
|
|
|
@@ -506,7 +572,7 @@ declare module 'alinea/backend/Handler' {
|
|
|
506
572
|
|
|
507
573
|
import type { CMS } from 'alinea/core/CMS';
|
|
508
574
|
import type { AuthedContext, RemoteConnection, RequestContext } from 'alinea/core/Connection';
|
|
509
|
-
import {
|
|
575
|
+
import type { LocalStore } from 'alinea/core/db/LocalStore';
|
|
510
576
|
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
511
577
|
export interface Handler {
|
|
512
578
|
(request: Request, context: RequestContext): Promise<Response>;
|
|
@@ -524,7 +590,7 @@ declare module 'alinea/backend/Handler' {
|
|
|
524
590
|
}
|
|
525
591
|
export interface HandlerOptions extends HandlerHooks {
|
|
526
592
|
cms: CMS;
|
|
527
|
-
db:
|
|
593
|
+
db: LocalStore | Promise<LocalStore>;
|
|
528
594
|
remote?: (context: RequestContext) => RemoteConnection;
|
|
529
595
|
forwardMutations?(request: Request, context: AuthedContext): Promise<Response | undefined>;
|
|
530
596
|
}
|
|
@@ -562,15 +628,15 @@ declare module 'alinea/backend/Previews' {
|
|
|
562
628
|
|
|
563
629
|
declare module 'alinea/backend/resolver/ParsePreview' {
|
|
564
630
|
|
|
565
|
-
import type { LocalDB } from 'alinea/core/db/LocalDB';
|
|
566
631
|
import { Entry } from 'alinea/core/Entry';
|
|
567
632
|
import type { PreviewRequest, PreviewUpdate } from 'alinea/core/Preview';
|
|
633
|
+
import type { Graph } from 'alinea/core/Graph';
|
|
568
634
|
export interface DecodedEntryPreview {
|
|
569
635
|
entry: Entry;
|
|
570
636
|
}
|
|
571
637
|
export type DecodedPreviewRequest = PreviewUpdate | DecodedEntryPreview;
|
|
572
638
|
export function decodePreviewRequest(preview: PreviewRequest): Promise<DecodedPreviewRequest>;
|
|
573
|
-
export function applyPreview(local:
|
|
639
|
+
export function applyPreview(local: Graph, preview: DecodedPreviewRequest): Promise<PreviewRequest | undefined>;
|
|
574
640
|
|
|
575
641
|
}
|
|
576
642
|
|
|
@@ -737,16 +803,28 @@ declare module 'alinea/backend/router/Router' {
|
|
|
737
803
|
|
|
738
804
|
}
|
|
739
805
|
|
|
740
|
-
declare module 'alinea/backend/store/
|
|
806
|
+
declare module 'alinea/backend/store/GeneratedDatabase' {
|
|
741
807
|
|
|
742
|
-
|
|
808
|
+
import type { Config } from 'alinea/core/Config';
|
|
809
|
+
import { EntryStore } from 'alinea/database/EntryStore';
|
|
810
|
+
import type { Database } from 'rado';
|
|
811
|
+
/** Add one writable, connection-local layer over a generated database. */
|
|
812
|
+
export function createGeneratedDatabase(config: Config, db: Database): Promise<EntryStore>;
|
|
743
813
|
|
|
744
814
|
}
|
|
745
815
|
|
|
746
|
-
declare module 'alinea/backend/store/
|
|
816
|
+
declare module 'alinea/backend/store/GeneratedDatabaseNode' {
|
|
747
817
|
|
|
748
|
-
import {
|
|
749
|
-
|
|
818
|
+
import type { Config } from 'alinea/core/Config';
|
|
819
|
+
import type { DatabaseOptions } from 'rado';
|
|
820
|
+
/** Open the traced generated file through the native SQLite driver. */
|
|
821
|
+
export function generatedDatabase(config: Config, options?: DatabaseOptions): Promise<import("alinea/database/EntryStore").EntryStore>;
|
|
822
|
+
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
declare module 'alinea/backend/store/GeneratedRelease' {
|
|
826
|
+
|
|
827
|
+
export const generatedRelease: Promise<string>;
|
|
750
828
|
|
|
751
829
|
}
|
|
752
830
|
|
|
@@ -872,23 +950,40 @@ declare module 'alinea/cli/generate/DevDB' {
|
|
|
872
950
|
|
|
873
951
|
import { Config } from 'alinea/core/Config';
|
|
874
952
|
import type { UploadResponse } from 'alinea/core/Connection';
|
|
875
|
-
import type
|
|
876
|
-
import { LocalDB } from 'alinea/core/db/LocalDB';
|
|
953
|
+
import { type CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
877
954
|
import { CachedFSSource } from 'alinea/core/source/FSSource';
|
|
955
|
+
import { EntryDatabase } from 'alinea/database/EntryDatabase';
|
|
956
|
+
import { EntryStore } from 'alinea/database/EntryStore';
|
|
878
957
|
export interface DevDBOptions {
|
|
879
958
|
config: Config;
|
|
880
959
|
rootDir: string;
|
|
960
|
+
databasePath: string;
|
|
961
|
+
configFingerprint?: string;
|
|
881
962
|
dashboardUrl: string | undefined;
|
|
882
963
|
}
|
|
883
964
|
export interface WatchFiles {
|
|
884
965
|
files: Array<string>;
|
|
885
966
|
dirs: Array<string>;
|
|
886
967
|
}
|
|
887
|
-
|
|
968
|
+
/** The persistent generated database used by dev, build and the local handler. */
|
|
969
|
+
export class DevDB extends EntryStore {
|
|
888
970
|
#private;
|
|
889
|
-
source: CachedFSSource;
|
|
890
|
-
|
|
971
|
+
readonly source: CachedFSSource;
|
|
972
|
+
readonly database: EntryDatabase;
|
|
973
|
+
private constructor();
|
|
974
|
+
/** Whether the source was restored from a previously built database. */
|
|
975
|
+
get hydrated(): boolean;
|
|
976
|
+
/** How many entries the last sync changed; zero when everything was reused. */
|
|
977
|
+
get lastSyncChanges(): number;
|
|
978
|
+
static create(options: DevDBOptions): Promise<DevDB>;
|
|
979
|
+
/**
|
|
980
|
+
* Adopt a changed config in place: every entry is derived again from the
|
|
981
|
+
* content files while the database stays open, so the dev server keeps
|
|
982
|
+
* serving through the rebuild and the hydrated file stats stay valid.
|
|
983
|
+
*/
|
|
984
|
+
reconfigure(options: Pick<DevDBOptions, 'config' | 'configFingerprint' | 'dashboardUrl'>): Promise<void>;
|
|
891
985
|
sync(): Promise<string>;
|
|
986
|
+
finalize(): Promise<number>;
|
|
892
987
|
fix(): Promise<void>;
|
|
893
988
|
watchFiles(): Promise<WatchFiles>;
|
|
894
989
|
isInMediaLocation(file: string): boolean;
|
|
@@ -1032,7 +1127,7 @@ declare module 'alinea/cli/serve/LiveReload' {
|
|
|
1032
1127
|
export class LiveReload {
|
|
1033
1128
|
clients: Array<Client>;
|
|
1034
1129
|
reload(type: 'refetch' | 'refresh' | 'reload'): void;
|
|
1035
|
-
register(client: Client): void;
|
|
1130
|
+
register(client: Client): () => void;
|
|
1036
1131
|
}
|
|
1037
1132
|
export {};
|
|
1038
1133
|
|
|
@@ -2027,11 +2122,12 @@ declare module 'alinea/components/Tooltip' {
|
|
|
2027
2122
|
|
|
2028
2123
|
declare module 'alinea/components/Tree' {
|
|
2029
2124
|
|
|
2030
|
-
import { type ReactNode } from 'react';
|
|
2125
|
+
import { type ReactNode, type Ref } from 'react';
|
|
2031
2126
|
import { type TreeItemContentProps as AriaTreeItemContentProps, type TreeItemProps as AriaTreeItemProps, type TreeProps as AriaTreeProps } from 'react-aria-components';
|
|
2032
2127
|
import { type IconProps } from 'alinea/components/Icon';
|
|
2033
2128
|
export interface TreeProps<T extends object> extends Omit<AriaTreeProps<T>, 'className'> {
|
|
2034
2129
|
className?: string;
|
|
2130
|
+
ref?: Ref<HTMLDivElement>;
|
|
2035
2131
|
}
|
|
2036
2132
|
export function Tree<T extends object>(props: TreeProps<T>): import("react").JSX.Element;
|
|
2037
2133
|
export interface TreeItemContentProps extends Omit<AriaTreeItemContentProps, 'children'> {
|
|
@@ -2394,178 +2490,6 @@ declare module 'alinea/core/db/EntryAliases' {
|
|
|
2394
2490
|
|
|
2395
2491
|
}
|
|
2396
2492
|
|
|
2397
|
-
declare module 'alinea/core/db/EntryDB' {
|
|
2398
|
-
|
|
2399
|
-
import type { Config } from 'alinea/core/Config';
|
|
2400
|
-
import type { LocalConnection, UploadMetadata, UploadResponse } from 'alinea/core/Connection';
|
|
2401
|
-
import type { Source } from 'alinea/core/source/Source';
|
|
2402
|
-
import { type CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
2403
|
-
import { LocalDB } from 'alinea/core/db/LocalDB';
|
|
2404
|
-
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
2405
|
-
export class EntryDB extends LocalDB {
|
|
2406
|
-
connect: () => Promise<LocalConnection>;
|
|
2407
|
-
constructor(config: Config, source: Source, connect: () => Promise<LocalConnection>);
|
|
2408
|
-
mutate(mutations: Array<Mutation>): Promise<{
|
|
2409
|
-
sha: string;
|
|
2410
|
-
remote: Promise<string>;
|
|
2411
|
-
}>;
|
|
2412
|
-
write(request: CommitRequest): Promise<{
|
|
2413
|
-
sha: string;
|
|
2414
|
-
}>;
|
|
2415
|
-
prepareUpload(file: string, metadata?: UploadMetadata): Promise<UploadResponse>;
|
|
2416
|
-
syncWithRemote(): Promise<string>;
|
|
2417
|
-
}
|
|
2418
|
-
|
|
2419
|
-
}
|
|
2420
|
-
|
|
2421
|
-
declare module 'alinea/core/db/EntryIndex' {
|
|
2422
|
-
|
|
2423
|
-
import { Config } from 'alinea/core/Config';
|
|
2424
|
-
import type { Entry, EntryStatus } from 'alinea/core/Entry';
|
|
2425
|
-
import type { ChangesBatch } from 'alinea/core/source/Change';
|
|
2426
|
-
import { type Source } from 'alinea/core/source/Source';
|
|
2427
|
-
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
2428
|
-
import { Type } from 'alinea/core/Type';
|
|
2429
|
-
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
2430
|
-
import { EntryReferenceIndex } from 'alinea/core/db/EntryReferenceIndex';
|
|
2431
|
-
import { EntryTransaction } from 'alinea/core/db/EntryTransaction';
|
|
2432
|
-
export interface EntryFilter {
|
|
2433
|
-
ids?: ReadonlyArray<string>;
|
|
2434
|
-
search?: string;
|
|
2435
|
-
condition?(entry: Entry): boolean;
|
|
2436
|
-
}
|
|
2437
|
-
export interface EntryCondition {
|
|
2438
|
-
search?: string;
|
|
2439
|
-
nodes?: Iterable<EntryNode>;
|
|
2440
|
-
node?(node: EntryNode): boolean;
|
|
2441
|
-
language?(language: EntryLanguageNode): boolean;
|
|
2442
|
-
entry?(entry: Entry): boolean;
|
|
2443
|
-
}
|
|
2444
|
-
interface EntryNodeQuery {
|
|
2445
|
-
ids?: ReadonlyArray<string>;
|
|
2446
|
-
parentIds?: ReadonlyArray<string | null>;
|
|
2447
|
-
urls?: ReadonlyArray<string>;
|
|
2448
|
-
workspaces?: ReadonlyArray<string>;
|
|
2449
|
-
roots?: ReadonlyArray<string>;
|
|
2450
|
-
types?: ReadonlyArray<string>;
|
|
2451
|
-
}
|
|
2452
|
-
export function combineConditions(a: EntryCondition, b: EntryCondition): EntryCondition;
|
|
2453
|
-
interface EntryVersionData {
|
|
2454
|
-
id: string;
|
|
2455
|
-
type: string;
|
|
2456
|
-
index: string;
|
|
2457
|
-
searchableText?: string;
|
|
2458
|
-
title: string;
|
|
2459
|
-
data: Record<string, unknown>;
|
|
2460
|
-
seeded: string | null;
|
|
2461
|
-
rowHash: string;
|
|
2462
|
-
fileHash: string;
|
|
2463
|
-
}
|
|
2464
|
-
interface EntryVersion extends EntryVersionData {
|
|
2465
|
-
locale: string | null;
|
|
2466
|
-
workspace: string;
|
|
2467
|
-
root: string;
|
|
2468
|
-
path: string;
|
|
2469
|
-
status: EntryStatus;
|
|
2470
|
-
parentDir: string;
|
|
2471
|
-
childrenDir: string;
|
|
2472
|
-
filePath: string;
|
|
2473
|
-
level: number;
|
|
2474
|
-
}
|
|
2475
|
-
class EntryLanguage extends Map<EntryStatus, EntryVersion> {
|
|
2476
|
-
readonly locale: string | null;
|
|
2477
|
-
readonly parentDir: string;
|
|
2478
|
-
readonly selfDir: string;
|
|
2479
|
-
constructor(versions: Array<EntryVersion>);
|
|
2480
|
-
}
|
|
2481
|
-
class EntryCollection extends Map<string | null, EntryLanguage> {
|
|
2482
|
-
versions: Array<EntryVersion>;
|
|
2483
|
-
readonly type: string;
|
|
2484
|
-
constructor(versions: Array<EntryVersion>);
|
|
2485
|
-
}
|
|
2486
|
-
class EntryLanguageNode {
|
|
2487
|
-
#private;
|
|
2488
|
-
private node;
|
|
2489
|
-
private language;
|
|
2490
|
-
inheritedStatus: EntryStatus | undefined;
|
|
2491
|
-
main: EntryVersion;
|
|
2492
|
-
active: EntryVersion;
|
|
2493
|
-
url: string;
|
|
2494
|
-
locale: string | null;
|
|
2495
|
-
path: string;
|
|
2496
|
-
readonly seeded: string | null;
|
|
2497
|
-
constructor(node: EntryNode, language: EntryLanguage);
|
|
2498
|
-
[Symbol.iterator](): MapIterator<[EntryStatus, EntryVersion]>;
|
|
2499
|
-
has(status: EntryStatus): boolean;
|
|
2500
|
-
get parentPaths(): string[];
|
|
2501
|
-
get entries(): Entry<Record<string, unknown>>[];
|
|
2502
|
-
filter(filter: EntryCondition): Generator<Entry>;
|
|
2503
|
-
}
|
|
2504
|
-
export class EntryNode extends Map<string | null, EntryLanguageNode> {
|
|
2505
|
-
graph: EntryGraph;
|
|
2506
|
-
entryType: Type;
|
|
2507
|
-
parent: EntryNode | null;
|
|
2508
|
-
children: () => Iterable<EntryNode>;
|
|
2509
|
-
readonly id: string;
|
|
2510
|
-
readonly index: string;
|
|
2511
|
-
readonly parentId: string | null;
|
|
2512
|
-
readonly parents: Array<string>;
|
|
2513
|
-
readonly workspace: string;
|
|
2514
|
-
readonly root: string;
|
|
2515
|
-
readonly type: string;
|
|
2516
|
-
readonly level: number;
|
|
2517
|
-
constructor(graph: EntryGraph, entryType: Type, parent: EntryNode | null, children: () => Iterable<EntryNode>, collection: EntryCollection);
|
|
2518
|
-
filter(filter: EntryCondition): Generator<Entry>;
|
|
2519
|
-
}
|
|
2520
|
-
export class EntryGraph {
|
|
2521
|
-
#private;
|
|
2522
|
-
nodes: Array<EntryNode>;
|
|
2523
|
-
constructor(config: Config, versionData: Map<string, EntryVersionData>, seeds: Map<string, Seed>);
|
|
2524
|
-
byId(id: string): EntryNode | undefined;
|
|
2525
|
-
candidateNodes(query: EntryNodeQuery): Array<EntryNode> | undefined;
|
|
2526
|
-
byUrl(url: string): Iterable<Entry>;
|
|
2527
|
-
byAlias(alias: string): Iterable<Entry>;
|
|
2528
|
-
get config(): Config;
|
|
2529
|
-
byDir(dir: string): EntryNode | undefined;
|
|
2530
|
-
entryByFilePath(filePath: string): Entry | undefined;
|
|
2531
|
-
withChanges(batch: ChangesBatch): EntryGraph;
|
|
2532
|
-
filter({ search, ...filter }: EntryCondition): Generator<Entry>;
|
|
2533
|
-
}
|
|
2534
|
-
export class EntryIndex extends EventTarget {
|
|
2535
|
-
#private;
|
|
2536
|
-
tree: ReadonlyTree;
|
|
2537
|
-
initialSync: ReadonlyTree | undefined;
|
|
2538
|
-
graph: EntryGraph;
|
|
2539
|
-
constructor(config: Config);
|
|
2540
|
-
clone(): EntryIndex;
|
|
2541
|
-
get sha(): string;
|
|
2542
|
-
filter(filter: EntryCondition): Iterable<Entry>;
|
|
2543
|
-
findFirst<T extends Record<string, unknown>>(filter: (entry: Entry) => boolean): Entry<T> | undefined;
|
|
2544
|
-
findMany(filter: (entry: Entry) => boolean): Iterable<Entry>;
|
|
2545
|
-
findByUrl(url: string, filter: (entry: Entry) => boolean): Entry | undefined;
|
|
2546
|
-
referencesTo(query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
2547
|
-
referencesFrom(sourceId: string): Promise<import("alinea/core/db/EntryReference").EntryReference[]>;
|
|
2548
|
-
get references(): Promise<EntryReferenceIndex>;
|
|
2549
|
-
sync(source: Source): Promise<string>;
|
|
2550
|
-
syncWith(source: Source): Promise<string>;
|
|
2551
|
-
indexChanges(batch: ChangesBatch, targetTree?: ReadonlyTree): Promise<string>;
|
|
2552
|
-
seed(source: Source): Promise<void>;
|
|
2553
|
-
byId(id: string): EntryNode | undefined;
|
|
2554
|
-
fix(source: Source): Promise<void>;
|
|
2555
|
-
transaction(source: Source): Promise<EntryTransaction>;
|
|
2556
|
-
}
|
|
2557
|
-
interface Seed {
|
|
2558
|
-
seedId: string;
|
|
2559
|
-
type: string;
|
|
2560
|
-
workspace: string;
|
|
2561
|
-
root: string;
|
|
2562
|
-
locale: string | null;
|
|
2563
|
-
data: Record<string, any>;
|
|
2564
|
-
}
|
|
2565
|
-
export {};
|
|
2566
|
-
|
|
2567
|
-
}
|
|
2568
|
-
|
|
2569
2493
|
declare module 'alinea/core/db/EntryReference' {
|
|
2570
2494
|
|
|
2571
2495
|
import type { EntryStatus } from 'alinea/core/Entry';
|
|
@@ -2600,151 +2524,12 @@ declare module 'alinea/core/db/EntryReference' {
|
|
|
2600
2524
|
export interface EntryReferenceResult {
|
|
2601
2525
|
references: Array<EntryReference>;
|
|
2602
2526
|
total: number;
|
|
2603
|
-
scan: EntryReferenceScan;
|
|
2604
2527
|
}
|
|
2605
2528
|
export interface FieldReferenceContext {
|
|
2606
2529
|
path: Array<string>;
|
|
2607
2530
|
label?: string;
|
|
2608
2531
|
}
|
|
2609
2532
|
export function referenceFieldPath(path: Array<string>): string;
|
|
2610
|
-
export interface EntryReferenceScan {
|
|
2611
|
-
scanned: number;
|
|
2612
|
-
total: number;
|
|
2613
|
-
complete: boolean;
|
|
2614
|
-
}
|
|
2615
|
-
|
|
2616
|
-
}
|
|
2617
|
-
|
|
2618
|
-
declare module 'alinea/core/db/EntryReferenceIndex' {
|
|
2619
|
-
|
|
2620
|
-
import type { Config } from 'alinea/core/Config';
|
|
2621
|
-
import type { EntryCondition } from 'alinea/core/db/EntryIndex';
|
|
2622
|
-
import { type EntryReference, type EntryReferenceQuery, type EntryReferenceResult, type EntryReferenceScan } from 'alinea/core/db/EntryReference';
|
|
2623
|
-
import type { Entry } from 'alinea/core/Entry';
|
|
2624
|
-
export interface EntryReferenceGraph {
|
|
2625
|
-
config: Config;
|
|
2626
|
-
filter(filter: EntryCondition): Iterable<Entry>;
|
|
2627
|
-
}
|
|
2628
|
-
export interface EntryReferenceBuildOptions {
|
|
2629
|
-
onProgress?: (scan: EntryReferenceScan) => void;
|
|
2630
|
-
}
|
|
2631
|
-
export class EntryReferenceIndex {
|
|
2632
|
-
#private;
|
|
2633
|
-
static build(graph: EntryReferenceGraph, options?: EntryReferenceBuildOptions): Promise<EntryReferenceIndex>;
|
|
2634
|
-
constructor(config: Config);
|
|
2635
|
-
referencesTo(query: EntryReferenceQuery): EntryReferenceResult;
|
|
2636
|
-
referencesFrom(sourceId: string): Array<EntryReference>;
|
|
2637
|
-
replaceEntry(entry: Entry): Set<string>;
|
|
2638
|
-
removeFile(filePath: string): Set<string>;
|
|
2639
|
-
replaceFile(filePath: string, references: Array<EntryReference>): Set<string>;
|
|
2640
|
-
}
|
|
2641
|
-
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
declare module 'alinea/core/db/EntryResolver' {
|
|
2645
|
-
|
|
2646
|
-
import type { Config } from 'alinea/core/Config';
|
|
2647
|
-
import { Entry as EntryExprs, type Entry } from 'alinea/core/Entry';
|
|
2648
|
-
import type { Expr } from 'alinea/core/Expr';
|
|
2649
|
-
import { Field } from 'alinea/core/Field';
|
|
2650
|
-
import type { Filter } from 'alinea/core/Filter';
|
|
2651
|
-
import { type AnyQueryResult, type Edge, type EdgeQuery, type GraphQuery, type Projection, type Status } from 'alinea/core/Graph';
|
|
2652
|
-
import { type HasExpr } from 'alinea/core/Internal';
|
|
2653
|
-
import type { Resolver } from 'alinea/core/Resolver';
|
|
2654
|
-
import type { Type } from 'alinea';
|
|
2655
|
-
import { type EntryCondition, type EntryFilter, type EntryGraph, type EntryIndex } from 'alinea/core/db/EntryIndex';
|
|
2656
|
-
import { LinkResolver } from 'alinea/core/db/LinkResolver';
|
|
2657
|
-
type Interim = any;
|
|
2658
|
-
export interface PostContext {
|
|
2659
|
-
linkResolver: LinkResolver;
|
|
2660
|
-
}
|
|
2661
|
-
export class EntryResolver implements Resolver {
|
|
2662
|
-
#private;
|
|
2663
|
-
config: Config;
|
|
2664
|
-
index: EntryIndex;
|
|
2665
|
-
constructor(config: Config, index: EntryIndex);
|
|
2666
|
-
call(ctx: ResolveContext, entry: Entry, internal: {
|
|
2667
|
-
method: string;
|
|
2668
|
-
args: Array<Expr>;
|
|
2669
|
-
}): unknown;
|
|
2670
|
-
field(entry: Entry, field: Expr): unknown;
|
|
2671
|
-
expr(ctx: ResolveContext, entry: Entry, expr: Expr): unknown;
|
|
2672
|
-
projectTypes(types: Array<Type>): Array<[string, Expr]>;
|
|
2673
|
-
projection(query: GraphQuery<Projection>): Projection;
|
|
2674
|
-
sourceFilter(ctx: ResolveContext, entry: Entry, query: EdgeQuery): EntryCondition;
|
|
2675
|
-
selectProjection(ctx: ResolveContext, entry: Entry, value: Projection): unknown;
|
|
2676
|
-
select(ctx: ResolveContext, entry: Entry | null, query: GraphQuery<Projection>): unknown;
|
|
2677
|
-
condition(ctx: ResolveContext, query: EdgeQuery): EntryFilter;
|
|
2678
|
-
isSingleResult(query: GraphQuery & Partial<Edge>): boolean;
|
|
2679
|
-
query(ctx: ResolveContext, query: GraphQuery<Projection>, preFilter?: EntryCondition): {
|
|
2680
|
-
entries: EntryExprs<Record<string, unknown>>[];
|
|
2681
|
-
getUnprocessed: () => unknown;
|
|
2682
|
-
getProcessed: () => Promise<any>;
|
|
2683
|
-
};
|
|
2684
|
-
postField(ctx: PostContext, interim: Interim, field: Field): Promise<unknown>;
|
|
2685
|
-
postExpr(ctx: PostContext, interim: Interim, expr: HasExpr): Promise<unknown>;
|
|
2686
|
-
postRow(ctx: PostContext, interim: Interim, query: GraphQuery<Projection>): Promise<unknown>;
|
|
2687
|
-
post(ctx: PostContext, interim: Interim, input: EdgeQuery<Projection>): Promise<unknown>;
|
|
2688
|
-
resolve<Query extends GraphQuery>(query: Query): Promise<AnyQueryResult<Query>>;
|
|
2689
|
-
}
|
|
2690
|
-
export interface ResolveContext {
|
|
2691
|
-
status: Status;
|
|
2692
|
-
locale?: string | null;
|
|
2693
|
-
graph: EntryGraph;
|
|
2694
|
-
searchTerms?: string;
|
|
2695
|
-
}
|
|
2696
|
-
export function statusChecker(status: Status): Check;
|
|
2697
|
-
interface Check {
|
|
2698
|
-
(input: Entry): boolean;
|
|
2699
|
-
}
|
|
2700
|
-
export function filterChecker(filter: Filter, getField?: (input: any, name: string) => any): Check;
|
|
2701
|
-
export {};
|
|
2702
|
-
|
|
2703
|
-
}
|
|
2704
|
-
|
|
2705
|
-
declare module 'alinea/core/db/EntryTarget' {
|
|
2706
|
-
|
|
2707
|
-
import type { RemoteSource } from 'alinea/core/source/Source';
|
|
2708
|
-
import type { CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
2709
|
-
export interface EntryTarget extends RemoteSource {
|
|
2710
|
-
commit(request: CommitRequest): Promise<string>;
|
|
2711
|
-
}
|
|
2712
|
-
|
|
2713
|
-
}
|
|
2714
|
-
|
|
2715
|
-
declare module 'alinea/core/db/EntryTransaction' {
|
|
2716
|
-
|
|
2717
|
-
import { Config } from 'alinea/core/Config';
|
|
2718
|
-
import { Policy } from 'alinea/core/Role';
|
|
2719
|
-
import type { Source } from 'alinea/core/source/Source';
|
|
2720
|
-
import type { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
2721
|
-
import { type CommitChange } from 'alinea/core/db/CommitRequest';
|
|
2722
|
-
import type { EntryIndex } from 'alinea/core/db/EntryIndex';
|
|
2723
|
-
import type { ArchiveMutation, CreateMutation, MoveMutation, Mutation, PublishMutation, RemoveFileMutation, RemoveMutation, UnpublishMutation, UpdateMutation, UploadFileMutation } from 'alinea/core/db/Mutation';
|
|
2724
|
-
type Op<T> = Omit<T, 'op'>;
|
|
2725
|
-
export class EntryTransaction {
|
|
2726
|
-
#private;
|
|
2727
|
-
constructor(config: Config, index: EntryIndex, source: Source, from: ReadonlyTree, policy?: Policy);
|
|
2728
|
-
get empty(): boolean;
|
|
2729
|
-
create({ locale, type, data, root, workspace, fromSeed, parentId, id, insertOrder, status, overwrite }: Op<CreateMutation>): this;
|
|
2730
|
-
update({ id, locale, status, set }: Op<UpdateMutation>): this;
|
|
2731
|
-
publish({ id, locale, status }: Op<PublishMutation>): this;
|
|
2732
|
-
unpublish({ id, locale }: Op<UnpublishMutation>): this;
|
|
2733
|
-
archive({ id, locale }: Op<ArchiveMutation>): this;
|
|
2734
|
-
move({ id, target, dropPosition, targetType }: Op<MoveMutation>): this;
|
|
2735
|
-
remove({ id, locale, status }: Op<RemoveMutation>): this;
|
|
2736
|
-
removeFile(mutation: Op<RemoveFileMutation>): this;
|
|
2737
|
-
uploadFile(mutation: Op<UploadFileMutation>): this;
|
|
2738
|
-
description(): string;
|
|
2739
|
-
apply(mutations: ReadonlyArray<Mutation>): Promise<void>;
|
|
2740
|
-
toRequest(): Promise<{
|
|
2741
|
-
fromSha: string;
|
|
2742
|
-
intoSha: string;
|
|
2743
|
-
description: string;
|
|
2744
|
-
changes: CommitChange[];
|
|
2745
|
-
}>;
|
|
2746
|
-
}
|
|
2747
|
-
export {};
|
|
2748
2533
|
|
|
2749
2534
|
}
|
|
2750
2535
|
|
|
@@ -2767,8 +2552,9 @@ declare module 'alinea/core/db/EntryUrlConflictError' {
|
|
|
2767
2552
|
declare module 'alinea/core/db/IndexEvent' {
|
|
2768
2553
|
|
|
2769
2554
|
export class IndexEvent extends Event {
|
|
2770
|
-
data: IndexOp;
|
|
2771
2555
|
static readonly type = "index";
|
|
2556
|
+
static [Symbol.hasInstance](value: unknown): boolean;
|
|
2557
|
+
data: IndexOp;
|
|
2772
2558
|
constructor(data: IndexOp);
|
|
2773
2559
|
}
|
|
2774
2560
|
export type IndexOp = {
|
|
@@ -2792,17 +2578,17 @@ declare module 'alinea/core/db/IndexEvent' {
|
|
|
2792
2578
|
declare module 'alinea/core/db/LinkResolver' {
|
|
2793
2579
|
|
|
2794
2580
|
import type { InferProjection, Projection } from 'alinea/core/Graph';
|
|
2795
|
-
import type {
|
|
2581
|
+
import type { Config } from 'alinea/core/Config';
|
|
2796
2582
|
export interface LinkTarget {
|
|
2797
2583
|
entryId: string;
|
|
2798
2584
|
locale?: string;
|
|
2799
2585
|
}
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2586
|
+
/** Field postprocessors depend on query capabilities, not an index backend. */
|
|
2587
|
+
export interface LinkResolver {
|
|
2588
|
+
config: Config;
|
|
2803
2589
|
locale: string | null;
|
|
2804
|
-
|
|
2805
|
-
resolveLinks<P extends Projection>(projection: P, entryIds: ReadonlyArray<string>, locale?: string | null
|
|
2590
|
+
includedAtBuild(filePath: string): boolean | Promise<boolean>;
|
|
2591
|
+
resolveLinks<P extends Projection>(projection: P, entryIds: ReadonlyArray<string>, locale?: string | null): Promise<Array<InferProjection<P>>>;
|
|
2806
2592
|
resolveTargets<P extends Projection & {
|
|
2807
2593
|
id: unknown;
|
|
2808
2594
|
}>(projection: P, targets: ReadonlyArray<LinkTarget>): Promise<Array<InferProjection<P> | undefined>>;
|
|
@@ -2810,49 +2596,32 @@ declare module 'alinea/core/db/LinkResolver' {
|
|
|
2810
2596
|
|
|
2811
2597
|
}
|
|
2812
2598
|
|
|
2813
|
-
declare module 'alinea/core/db/
|
|
2599
|
+
declare module 'alinea/core/db/LocalStore' {
|
|
2814
2600
|
|
|
2815
|
-
import type { Config } from 'alinea/core/Config';
|
|
2816
|
-
import type { SyncApi, UploadMetadata, UploadResponse } from 'alinea/core/Connection';
|
|
2817
|
-
import type { AnyQueryResult, GraphQuery } from 'alinea/core/Graph';
|
|
2818
2601
|
import type { Policy } from 'alinea/core/Role';
|
|
2819
|
-
import type {
|
|
2820
|
-
import type {
|
|
2821
|
-
import { type Source } from 'alinea/core/source/Source';
|
|
2822
|
-
import { type CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
2823
|
-
import { EntryIndex } from 'alinea/core/db/EntryIndex';
|
|
2824
|
-
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
2602
|
+
import type { RemoteSource, Source } from 'alinea/core/source/Source';
|
|
2603
|
+
import type { CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
2825
2604
|
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
2826
|
-
import { WriteableGraph } from 'alinea/core/db/WriteableGraph';
|
|
2827
|
-
export
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2605
|
+
import type { WriteableGraph } from 'alinea/core/db/WriteableGraph';
|
|
2606
|
+
export interface SyncOptions {
|
|
2607
|
+
/** Skip entry validation for a remote whose entries were already validated. */
|
|
2608
|
+
validate?: boolean;
|
|
2609
|
+
}
|
|
2610
|
+
/**
|
|
2611
|
+
* A locally available entry store: a writeable graph backed by a source that
|
|
2612
|
+
* can be synced against a remote and committed to. Implemented by the SQLite
|
|
2613
|
+
* engine (`EntryStore`) and the `LocalDB` convenience facade.
|
|
2614
|
+
*/
|
|
2615
|
+
export interface LocalStore extends WriteableGraph, RemoteSource {
|
|
2831
2616
|
source: Source;
|
|
2832
|
-
|
|
2833
|
-
resolve<Query extends GraphQuery>(query: Query): Promise<AnyQueryResult<Query>>;
|
|
2834
|
-
referencesTo(query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
2835
|
-
get sha(): string;
|
|
2836
|
-
indexChanges(batch: ChangesBatch): Promise<string>;
|
|
2837
|
-
applyChanges(batch: ChangesBatch): Promise<void>;
|
|
2838
|
-
getTreeIfDifferent(sha: string): Promise<import("alinea/core/source/Tree").ReadonlyTree | undefined>;
|
|
2839
|
-
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncIterable<[sha: string, blob: Uint8Array<ArrayBufferLike>]>;
|
|
2617
|
+
sha: string | Promise<string>;
|
|
2840
2618
|
sync(): Promise<string>;
|
|
2841
|
-
syncWith(remote:
|
|
2842
|
-
|
|
2843
|
-
request(mutations: ReadonlyArray<Mutation>, policy?: Policy): Promise<
|
|
2844
|
-
fromSha: string;
|
|
2845
|
-
intoSha: string;
|
|
2846
|
-
description: string;
|
|
2847
|
-
changes: import("alinea/core/db/CommitRequest").CommitChange[];
|
|
2848
|
-
}>;
|
|
2849
|
-
mutate(mutations: Array<Mutation>): Promise<{
|
|
2850
|
-
sha: string;
|
|
2851
|
-
}>;
|
|
2619
|
+
syncWith(remote: RemoteSource, options?: SyncOptions): Promise<string>;
|
|
2620
|
+
includedAtBuild(filePath: string): boolean | Promise<boolean>;
|
|
2621
|
+
request(mutations: ReadonlyArray<Mutation>, policy?: Policy): Promise<CommitRequest>;
|
|
2852
2622
|
write(request: CommitRequest): Promise<{
|
|
2853
2623
|
sha: string;
|
|
2854
2624
|
}>;
|
|
2855
|
-
prepareUpload(file: string, _metadata?: UploadMetadata): Promise<UploadResponse>;
|
|
2856
2625
|
}
|
|
2857
2626
|
|
|
2858
2627
|
}
|
|
@@ -3034,30 +2803,6 @@ declare module 'alinea/core/db/Operation' {
|
|
|
3034
2803
|
|
|
3035
2804
|
}
|
|
3036
2805
|
|
|
3037
|
-
declare module 'alinea/core/db/TestDB' {
|
|
3038
|
-
|
|
3039
|
-
import type { LocalConnection } from 'alinea/core/Connection';
|
|
3040
|
-
import { type User, type UserInput } from 'alinea/core/User';
|
|
3041
|
-
import { LocalDB } from 'alinea/core/db/LocalDB';
|
|
3042
|
-
export class TestDB extends LocalDB implements LocalConnection {
|
|
3043
|
-
capabilities(): Promise<{
|
|
3044
|
-
users: boolean;
|
|
3045
|
-
}>;
|
|
3046
|
-
previewToken(): Promise<string>;
|
|
3047
|
-
user(): Promise<User>;
|
|
3048
|
-
enrichUser(user: User): Promise<User>;
|
|
3049
|
-
listUsers(): Promise<Array<User>>;
|
|
3050
|
-
createUser(user: UserInput): Promise<User>;
|
|
3051
|
-
updateUser(user: UserInput): Promise<User>;
|
|
3052
|
-
removeUser(): Promise<void>;
|
|
3053
|
-
revisions(): Promise<never[]>;
|
|
3054
|
-
revisionData(): Promise<undefined>;
|
|
3055
|
-
getDraft(): Promise<undefined>;
|
|
3056
|
-
storeDraft(): Promise<void>;
|
|
3057
|
-
}
|
|
3058
|
-
|
|
3059
|
-
}
|
|
3060
|
-
|
|
3061
2806
|
declare module 'alinea/core/db/WriteableGraph' {
|
|
3062
2807
|
|
|
3063
2808
|
import type { Infer } from 'alinea';
|
|
@@ -3174,6 +2919,8 @@ declare module 'alinea/core/Entry' {
|
|
|
3174
2919
|
export const ALT_STATUS: Array<EntryStatus>;
|
|
3175
2920
|
export interface Entry<Data extends object = Record<string, unknown>> {
|
|
3176
2921
|
id: string;
|
|
2922
|
+
/** Physical authored version before status inheritance is applied. */
|
|
2923
|
+
versionStatus?: EntryStatus;
|
|
3177
2924
|
status: EntryStatus;
|
|
3178
2925
|
title: string;
|
|
3179
2926
|
type: string;
|
|
@@ -3206,6 +2953,7 @@ declare module 'alinea/core/Entry' {
|
|
|
3206
2953
|
}
|
|
3207
2954
|
export const Entry: {
|
|
3208
2955
|
id: Expr<string>;
|
|
2956
|
+
versionStatus: Expr<EntryStatus>;
|
|
3209
2957
|
status: Expr<EntryStatus>;
|
|
3210
2958
|
title: Expr<string>;
|
|
3211
2959
|
type: Expr<string>;
|
|
@@ -3328,6 +3076,30 @@ declare module 'alinea/core/EntryRecord' {
|
|
|
3328
3076
|
|
|
3329
3077
|
}
|
|
3330
3078
|
|
|
3079
|
+
declare module 'alinea/core/EntrySeed' {
|
|
3080
|
+
|
|
3081
|
+
import { type Config as ConfigType } from 'alinea/core/Config';
|
|
3082
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
3083
|
+
import type { Graph } from 'alinea/core/Graph';
|
|
3084
|
+
export interface EntrySeed {
|
|
3085
|
+
id: string;
|
|
3086
|
+
type: string;
|
|
3087
|
+
workspace: string;
|
|
3088
|
+
root: string;
|
|
3089
|
+
locale: string | null;
|
|
3090
|
+
filePath: string;
|
|
3091
|
+
nodePath: string;
|
|
3092
|
+
parentNodePath: string | null;
|
|
3093
|
+
seedPath: string;
|
|
3094
|
+
data: Record<string, unknown>;
|
|
3095
|
+
}
|
|
3096
|
+
export function entrySeeds(config: ConfigType): ReadonlyArray<EntrySeed>;
|
|
3097
|
+
/** Plan the creations needed to materialize every configured seed. */
|
|
3098
|
+
export function seedMutations(graph: Graph, config: ConfigType): Promise<Array<Mutation>>;
|
|
3099
|
+
export function seedData(config: ConfigType, seedPath: string | null, data: Record<string, unknown>, location: Pick<EntrySeed, 'workspace' | 'root' | 'locale'>): Record<string, unknown>;
|
|
3100
|
+
|
|
3101
|
+
}
|
|
3102
|
+
|
|
3331
3103
|
declare module 'alinea/core/Expr' {
|
|
3332
3104
|
|
|
3333
3105
|
import { type HasExpr, internalExpr } from 'alinea/core/Internal';
|
|
@@ -3390,6 +3162,10 @@ declare module 'alinea/core/Field' {
|
|
|
3390
3162
|
export interface FieldAnchorContext {
|
|
3391
3163
|
anchors: Set<string>;
|
|
3392
3164
|
}
|
|
3165
|
+
export interface FieldLocalizeContext {
|
|
3166
|
+
locale: string;
|
|
3167
|
+
entryIds: Set<string>;
|
|
3168
|
+
}
|
|
3393
3169
|
export type WithoutLabel<Options extends FieldOptions<any>> = Omit<Options, 'label'>;
|
|
3394
3170
|
export interface FieldMeta<StoredValue, QueryValue, Mutator, Options> {
|
|
3395
3171
|
options: Options & FieldOptions<StoredValue>;
|
|
@@ -3404,6 +3180,8 @@ declare module 'alinea/core/Field' {
|
|
|
3404
3180
|
references?: (value: StoredValue, context: FieldReferenceContext) => Array<EntryReferenceTarget>;
|
|
3405
3181
|
anchors?: (value: StoredValue, context: FieldReferenceContext) => Array<EntryAnchorTarget>;
|
|
3406
3182
|
normalizeAnchors?: (value: StoredValue, context: FieldAnchorContext) => StoredValue;
|
|
3183
|
+
/** Point entry links to entryIds at the given locale */
|
|
3184
|
+
localizeLinks?: (value: StoredValue, context: FieldLocalizeContext) => StoredValue;
|
|
3407
3185
|
beforeSave?: (context: FieldBeforeSaveContext<StoredValue>) => StoredValue;
|
|
3408
3186
|
}
|
|
3409
3187
|
export type FieldBeforeSaveAction = 'create' | 'update' | 'publish' | 'translate';
|
|
@@ -3450,6 +3228,7 @@ declare module 'alinea/core/Field' {
|
|
|
3450
3228
|
function references<StoredValue, QueryValue, Mutator, Options>(field: Field<StoredValue, QueryValue, Mutator, Options>, value: StoredValue, context: FieldReferenceContext): Array<EntryReferenceTarget>;
|
|
3451
3229
|
function anchors<StoredValue, QueryValue, Mutator, Options>(field: Field<StoredValue, QueryValue, Mutator, Options>, value: StoredValue, context: FieldReferenceContext): Array<EntryAnchorTarget>;
|
|
3452
3230
|
function normalizeAnchors<StoredValue>(field: HasField, value: StoredValue, context: FieldAnchorContext): StoredValue;
|
|
3231
|
+
function localizeLinks<StoredValue>(field: HasField, value: StoredValue, context: FieldLocalizeContext): StoredValue;
|
|
3453
3232
|
function isField(value: any): value is Field;
|
|
3454
3233
|
}
|
|
3455
3234
|
export {};
|
|
@@ -3619,8 +3398,6 @@ declare module 'alinea/core/Filter' {
|
|
|
3619
3398
|
type FieldOps<Fields> = {
|
|
3620
3399
|
[K in keyof Fields]?: Condition<Fields[K]>;
|
|
3621
3400
|
};
|
|
3622
|
-
export interface AnyCondition<Value> extends Ops<Value>, ArrayOps<Value>, ObjectOps<Value> {
|
|
3623
|
-
}
|
|
3624
3401
|
export type Condition<Value> = [Value] extends [Primitive] ? Ops<Value> | Value : [Value] extends [Array<any>] ? ArrayOps<Value[0]> : ObjectOps<Value>;
|
|
3625
3402
|
type AndCondition<Fields> = {
|
|
3626
3403
|
and: Array<Filter<Fields> | undefined>;
|
|
@@ -3629,6 +3406,46 @@ declare module 'alinea/core/Filter' {
|
|
|
3629
3406
|
or: Array<Filter<Fields> | undefined>;
|
|
3630
3407
|
};
|
|
3631
3408
|
export type Filter<Fields = unknown> = AndCondition<Fields> | OrCondition<Fields> | FieldOps<Fields>;
|
|
3409
|
+
/** A validated filter over named fields, shared by every filter backend. */
|
|
3410
|
+
export type FilterNode = {
|
|
3411
|
+
op: 'and';
|
|
3412
|
+
nodes: Array<FilterNode>;
|
|
3413
|
+
} | {
|
|
3414
|
+
op: 'or';
|
|
3415
|
+
nodes: Array<FilterNode>;
|
|
3416
|
+
} | {
|
|
3417
|
+
op: 'field';
|
|
3418
|
+
name: string;
|
|
3419
|
+
condition: ConditionNode;
|
|
3420
|
+
};
|
|
3421
|
+
/** A validated condition on one value. */
|
|
3422
|
+
export type ConditionNode = {
|
|
3423
|
+
op: 'and';
|
|
3424
|
+
nodes: Array<ConditionNode>;
|
|
3425
|
+
} | {
|
|
3426
|
+
op: 'or';
|
|
3427
|
+
nodes: Array<ConditionNode>;
|
|
3428
|
+
} | {
|
|
3429
|
+
op: 'is' | 'isNot' | 'gt' | 'gte' | 'lt' | 'lte';
|
|
3430
|
+
value: unknown;
|
|
3431
|
+
} | {
|
|
3432
|
+
op: 'in' | 'notIn';
|
|
3433
|
+
values: Array<unknown>;
|
|
3434
|
+
} | {
|
|
3435
|
+
op: 'startsWith';
|
|
3436
|
+
value: string;
|
|
3437
|
+
} | {
|
|
3438
|
+
op: 'has';
|
|
3439
|
+
filter: FilterNode;
|
|
3440
|
+
} | {
|
|
3441
|
+
op: 'includes';
|
|
3442
|
+
item: ConditionNode;
|
|
3443
|
+
};
|
|
3444
|
+
export function parseFilter(filter: unknown): FilterNode;
|
|
3445
|
+
export function parseCondition(condition: unknown): ConditionNode;
|
|
3446
|
+
type FilterCheck<Input> = (input: Input) => boolean;
|
|
3447
|
+
type FieldAccessor<Input> = (input: Input, name: string) => unknown;
|
|
3448
|
+
export function filterChecker<Input = unknown>(filter: Filter, getField?: FieldAccessor<Input>): FilterCheck<Input>;
|
|
3632
3449
|
export {};
|
|
3633
3450
|
|
|
3634
3451
|
}
|
|
@@ -3637,6 +3454,7 @@ declare module 'alinea/core/Graph' {
|
|
|
3637
3454
|
|
|
3638
3455
|
import type { Root, Workspace } from 'alinea/types';
|
|
3639
3456
|
import type { Config } from 'alinea/core/Config';
|
|
3457
|
+
import type { EntryStatus } from 'alinea/core/Entry';
|
|
3640
3458
|
import type { EntryFields } from 'alinea/core/EntryFields';
|
|
3641
3459
|
import type { Expr } from 'alinea/core/Expr';
|
|
3642
3460
|
import type { Condition, Filter } from 'alinea/core/Filter';
|
|
@@ -3738,8 +3556,16 @@ declare module 'alinea/core/Graph' {
|
|
|
3738
3556
|
id?: Condition<string>;
|
|
3739
3557
|
/** Filter by parentId */
|
|
3740
3558
|
parentId?: Condition<string | null>;
|
|
3559
|
+
/** Filter by the physical authored status before inheritance. */
|
|
3560
|
+
versionStatus?: Condition<EntryStatus>;
|
|
3561
|
+
/** Filter by whether this is the preferred version for its locale. */
|
|
3562
|
+
main?: Condition<boolean>;
|
|
3741
3563
|
/** Filter by path */
|
|
3742
3564
|
path?: Condition<string>;
|
|
3565
|
+
/** Filter by the full source file path. */
|
|
3566
|
+
filePath?: Condition<string>;
|
|
3567
|
+
/** Filter by the configured seed identity. */
|
|
3568
|
+
seeded?: Condition<string | null>;
|
|
3743
3569
|
/** Filter by url */
|
|
3744
3570
|
url?: Condition<string>;
|
|
3745
3571
|
/** Filter by a metadata URL alias */
|
|
@@ -3969,6 +3795,7 @@ declare module 'alinea/core/ListRow' {
|
|
|
3969
3795
|
const id = "_id";
|
|
3970
3796
|
const index = "_index";
|
|
3971
3797
|
const type = "_type";
|
|
3798
|
+
const label = "_label";
|
|
3972
3799
|
}
|
|
3973
3800
|
|
|
3974
3801
|
}
|
|
@@ -4329,6 +4156,7 @@ declare module 'alinea/core/Reference' {
|
|
|
4329
4156
|
export interface Reference {
|
|
4330
4157
|
_id: string;
|
|
4331
4158
|
_type: string;
|
|
4159
|
+
_label?: string;
|
|
4332
4160
|
}
|
|
4333
4161
|
export namespace Reference {
|
|
4334
4162
|
const id = "_id";
|
|
@@ -4592,6 +4420,8 @@ declare module 'alinea/core/Scope' {
|
|
|
4592
4420
|
keyOf(entity: Entity): string;
|
|
4593
4421
|
locationOf(entity: Entity): string[] | undefined;
|
|
4594
4422
|
nameOf(entity: Entity): string | undefined;
|
|
4423
|
+
/** Configured spellings of a locale, matched case-insensitively. */
|
|
4424
|
+
locales(locale: string): Array<string>;
|
|
4595
4425
|
stringify(input: any): string;
|
|
4596
4426
|
parse<Result>(input: string): Result;
|
|
4597
4427
|
}
|
|
@@ -4719,11 +4549,23 @@ declare module 'alinea/core/source/FSSource' {
|
|
|
4719
4549
|
import type { ChangesBatch } from 'alinea/core/source/Change';
|
|
4720
4550
|
import type { GetBlobsOptions, Source } from 'alinea/core/source/Source';
|
|
4721
4551
|
import { ReadonlyTree, WriteableTree } from 'alinea/core/source/Tree';
|
|
4552
|
+
/** The filesystem metadata used to detect that a file did not change. */
|
|
4553
|
+
export interface FileStat {
|
|
4554
|
+
mtimeMs: number;
|
|
4555
|
+
size: number;
|
|
4556
|
+
}
|
|
4722
4557
|
export class FSSource implements Source {
|
|
4723
4558
|
#private;
|
|
4724
4559
|
constructor(cwd: string);
|
|
4560
|
+
/**
|
|
4561
|
+
* Restore a previously persisted tree and the file stats it was built from,
|
|
4562
|
+
* so unchanged files are not read again.
|
|
4563
|
+
*/
|
|
4564
|
+
hydrate(tree: ReadonlyTree, stats: ReadonlyMap<string, FileStat>): void;
|
|
4565
|
+
/** The file stats of every file in the current tree. */
|
|
4566
|
+
fileStats(): ReadonlyMap<string, FileStat>;
|
|
4725
4567
|
getTree(): Promise<ReadonlyTree>;
|
|
4726
|
-
getFile(current: ReadonlyTree, builder: WriteableTree,
|
|
4568
|
+
getFile(current: ReadonlyTree, builder: WriteableTree, filePath: string): Promise<readonly [string, Uint8Array<ArrayBufferLike>] | undefined>;
|
|
4727
4569
|
getTreeIfDifferent(sha: string): Promise<ReadonlyTree | undefined>;
|
|
4728
4570
|
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncGenerator<[sha: string, blob: Uint8Array]>;
|
|
4729
4571
|
readBlob(sha: string, file: string, signal?: AbortSignal): Promise<[sha: string, blob: Uint8Array]>;
|
|
@@ -4732,7 +4574,7 @@ declare module 'alinea/core/source/FSSource' {
|
|
|
4732
4574
|
export class CachedFSSource extends FSSource {
|
|
4733
4575
|
#private;
|
|
4734
4576
|
constructor(cwd: string);
|
|
4735
|
-
refresh
|
|
4577
|
+
refresh(): Promise<ReadonlyTree>;
|
|
4736
4578
|
getTree(): Promise<ReadonlyTree>;
|
|
4737
4579
|
applyChanges(batch: ChangesBatch): Promise<void>;
|
|
4738
4580
|
getFile(current: ReadonlyTree, builder: WriteableTree, file: string): Promise<readonly [string, Uint8Array<ArrayBufferLike>] | undefined>;
|
|
@@ -4790,6 +4632,10 @@ declare module 'alinea/core/source/GitUtils' {
|
|
|
4790
4632
|
* Serializes a TreeData object into a Git tree object as a Uint8Array.
|
|
4791
4633
|
*/
|
|
4792
4634
|
export function serializeTreeEntries(entries: Array<Entry>): Uint8Array;
|
|
4635
|
+
/**
|
|
4636
|
+
* Compares two TreeEntry objects for sorting.
|
|
4637
|
+
*/
|
|
4638
|
+
export function compareTreeEntries(a: Entry, b: Entry): number;
|
|
4793
4639
|
/**
|
|
4794
4640
|
* Parses a Git tree object from a Uint8Array into a TreeEntry object.
|
|
4795
4641
|
*/
|
|
@@ -4812,7 +4658,7 @@ declare module 'alinea/core/source/GitUtils' {
|
|
|
4812
4658
|
declare module 'alinea/core/source/IndexedDBSource' {
|
|
4813
4659
|
|
|
4814
4660
|
import type { ChangesBatch } from 'alinea/core/source/Change';
|
|
4815
|
-
import type { GetBlobsOptions, Source } from 'alinea/core/source/Source';
|
|
4661
|
+
import type { GetBlobsOptions, RemoteSource, Source } from 'alinea/core/source/Source';
|
|
4816
4662
|
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
4817
4663
|
export class IndexedDBSource implements Source {
|
|
4818
4664
|
#private;
|
|
@@ -4821,6 +4667,7 @@ declare module 'alinea/core/source/IndexedDBSource' {
|
|
|
4821
4667
|
getTreeIfDifferent(sha: string): Promise<ReadonlyTree | undefined>;
|
|
4822
4668
|
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncGenerator<[sha: string, blob: Uint8Array]>;
|
|
4823
4669
|
applyChanges(batch: ChangesBatch): Promise<void>;
|
|
4670
|
+
applyChangesFrom(remote: RemoteSource, batch: ChangesBatch, tree: ReadonlyTree): Promise<void>;
|
|
4824
4671
|
}
|
|
4825
4672
|
|
|
4826
4673
|
}
|
|
@@ -4845,8 +4692,8 @@ declare module 'alinea/core/source/MemorySource' {
|
|
|
4845
4692
|
declare module 'alinea/core/source/OverlaySource' {
|
|
4846
4693
|
|
|
4847
4694
|
import type { ChangesBatch } from 'alinea/core/source/Change';
|
|
4848
|
-
import type { GetBlobsOptions, Source } from 'alinea/core/source/Source';
|
|
4849
|
-
import type
|
|
4695
|
+
import type { GetBlobsOptions, RemoteSource, Source } from 'alinea/core/source/Source';
|
|
4696
|
+
import { type ReadonlyTree } from 'alinea/core/source/Tree';
|
|
4850
4697
|
export class OverlaySource implements Source {
|
|
4851
4698
|
#private;
|
|
4852
4699
|
constructor(source: Source, tree: ReadonlyTree);
|
|
@@ -4855,6 +4702,9 @@ declare module 'alinea/core/source/OverlaySource' {
|
|
|
4855
4702
|
getTreeIfDifferent(sha: string): Promise<ReadonlyTree | undefined>;
|
|
4856
4703
|
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncGenerator<[sha: string, blob: Uint8Array]>;
|
|
4857
4704
|
applyChanges(batch: ChangesBatch): Promise<void>;
|
|
4705
|
+
applyChangesFrom(remote: RemoteSource, batch: ChangesBatch, tree: ReadonlyTree): Promise<void>;
|
|
4706
|
+
/** Apply a batch while reusing an already received or compiled target tree. */
|
|
4707
|
+
applyChangesTo(batch: ChangesBatch, tree?: ReadonlyTree): Promise<void>;
|
|
4858
4708
|
}
|
|
4859
4709
|
|
|
4860
4710
|
}
|
|
@@ -4884,7 +4734,10 @@ declare module 'alinea/core/source/Source' {
|
|
|
4884
4734
|
export interface Source extends RemoteSource {
|
|
4885
4735
|
getTree(): Promise<ReadonlyTree>;
|
|
4886
4736
|
applyChanges(batch: ChangesBatch): Promise<void>;
|
|
4737
|
+
/** Consume remote blobs incrementally instead of materializing one bundle. */
|
|
4738
|
+
applyChangesFrom?(remote: RemoteSource, batch: ChangesBatch, tree: ReadonlyTree): Promise<void>;
|
|
4887
4739
|
}
|
|
4740
|
+
export function applyChangesFrom(source: Source, remote: RemoteSource, batch: ChangesBatch, tree: ReadonlyTree): Promise<void>;
|
|
4888
4741
|
export function bundleContents(source: RemoteSource, batch: ChangesBatch): Promise<ChangesBatch>;
|
|
4889
4742
|
export function diff(source: Source, remote: RemoteSource): Promise<ChangesBatch>;
|
|
4890
4743
|
export function syncWith(source: Source, remote: RemoteSource): Promise<ChangesBatch>;
|
|
@@ -4951,7 +4804,6 @@ declare module 'alinea/core/source/Tree' {
|
|
|
4951
4804
|
readonly sha: string;
|
|
4952
4805
|
readonly mode: string;
|
|
4953
4806
|
constructor({ sha, mode }: BaseEntry);
|
|
4954
|
-
clone(): Leaf;
|
|
4955
4807
|
toJSON(): BaseEntry;
|
|
4956
4808
|
}
|
|
4957
4809
|
class TreeBase<Node extends TreeBase<Node>> {
|
|
@@ -4975,10 +4827,14 @@ declare module 'alinea/core/source/Tree' {
|
|
|
4975
4827
|
readonly sha: string;
|
|
4976
4828
|
static readonly EMPTY: ReadonlyTree;
|
|
4977
4829
|
constructor({ sha, entries }: Tree);
|
|
4830
|
+
/** A tree over built nodes, which it shares instead of copying. */
|
|
4831
|
+
static fromNodes(nodes: Map<string, ReadonlyTree | Leaf>, sha?: string): Promise<ReadonlyTree>;
|
|
4978
4832
|
get isEmpty(): boolean;
|
|
4979
4833
|
get entries(): Array<Entry>;
|
|
4980
|
-
|
|
4834
|
+
/** A path holding the blob, if this tree has it. */
|
|
4835
|
+
pathOf(sha: string): string | undefined;
|
|
4981
4836
|
hasSha(sha: string): boolean;
|
|
4837
|
+
/** A writable tree sharing these nodes until they change. */
|
|
4982
4838
|
clone(): WriteableTree;
|
|
4983
4839
|
toJSON(): {
|
|
4984
4840
|
sha: string;
|
|
@@ -4991,18 +4847,18 @@ declare module 'alinea/core/source/Tree' {
|
|
|
4991
4847
|
};
|
|
4992
4848
|
withChanges(batch: ChangesBatch): Promise<ReadonlyTree>;
|
|
4993
4849
|
static fromFlat(tree: FlatTree): ReadonlyTree;
|
|
4994
|
-
diff(that:
|
|
4850
|
+
diff(that: ReadonlyTree | WriteableTree): ChangesBatch;
|
|
4995
4851
|
}
|
|
4996
|
-
|
|
4852
|
+
/** A mutable tree, which copies shared readonly subtrees once they change. */
|
|
4853
|
+
export class WriteableTree extends TreeBase<WriteableTree | ReadonlyTree> {
|
|
4997
4854
|
#private;
|
|
4998
4855
|
constructor({ sha, entries }?: Tree);
|
|
4999
|
-
add(path: string, input:
|
|
5000
|
-
clone(): WriteableTree | Leaf;
|
|
5001
|
-
} | string): void;
|
|
4856
|
+
add(path: string, input: WriteableTree | ReadonlyTree | Leaf | string): void;
|
|
5002
4857
|
remove(path: string): boolean;
|
|
5003
4858
|
rename(from: string, to: string): void;
|
|
5004
4859
|
applyChanges(batch: ChangesBatch): void;
|
|
5005
4860
|
getSha(): Promise<string>;
|
|
4861
|
+
/** Compile, reusing the nodes of a previous tree wherever they are equal. */
|
|
5006
4862
|
compile(previous?: ReadonlyTree): Promise<ReadonlyTree>;
|
|
5007
4863
|
clone(): WriteableTree;
|
|
5008
4864
|
}
|
|
@@ -5087,6 +4943,7 @@ declare module 'alinea/core/TextDoc' {
|
|
|
5087
4943
|
export interface ElementNode {
|
|
5088
4944
|
_type: string;
|
|
5089
4945
|
content?: TextDoc;
|
|
4946
|
+
marks?: Array<Mark>;
|
|
5090
4947
|
[key: string]: any;
|
|
5091
4948
|
}
|
|
5092
4949
|
export namespace ElementNode {
|
|
@@ -5158,7 +5015,7 @@ declare module 'alinea/core/Type' {
|
|
|
5158
5015
|
import type { Config } from 'alinea/core/Config';
|
|
5159
5016
|
import type { EntryStatus } from 'alinea/core/Entry';
|
|
5160
5017
|
import type { Expr } from 'alinea/core/Expr';
|
|
5161
|
-
import { Field, type EntryAnchorTarget, type FieldAnchorContext, type FieldBeforeSaveContext } from 'alinea/core/Field';
|
|
5018
|
+
import { Field, type EntryAnchorTarget, type FieldAnchorContext, type FieldLocalizeContext, type FieldBeforeSaveContext } from 'alinea/core/Field';
|
|
5162
5019
|
import { type HasType } from 'alinea/core/Internal';
|
|
5163
5020
|
import type { Label } from 'alinea/core/Label';
|
|
5164
5021
|
import type { OrderBy } from 'alinea/core/OrderBy';
|
|
@@ -5204,6 +5061,7 @@ declare module 'alinea/core/Type' {
|
|
|
5204
5061
|
function initialValue(type: Type): Record<string, unknown>;
|
|
5205
5062
|
function withInitialValue(type: Type, value: Record<string, unknown>): Record<string, unknown>;
|
|
5206
5063
|
function normalizeAnchors(type: Type, value: Record<string, unknown>, context?: FieldAnchorContext): Record<string, unknown>;
|
|
5064
|
+
function localizeLinks(type: Type, value: Record<string, unknown>, context: FieldLocalizeContext): Record<string, unknown>;
|
|
5207
5065
|
function beforeSave(type: Type, value: Record<string, unknown>, context: Omit<FieldBeforeSaveContext<unknown>, 'value'>): Record<string, unknown>;
|
|
5208
5066
|
function applyLinks(type: Type, value: Record<string, unknown>, loader: import('./db/LinkResolver.js').LinkResolver): Promise<void>;
|
|
5209
5067
|
function preview(type: Type): Preview | undefined;
|
|
@@ -5305,6 +5163,12 @@ declare module 'alinea/core/util/ArrayBuffers' {
|
|
|
5305
5163
|
|
|
5306
5164
|
}
|
|
5307
5165
|
|
|
5166
|
+
declare module 'alinea/core/util/Arrays' {
|
|
5167
|
+
|
|
5168
|
+
export function chunks<T>(items: ReadonlyArray<T>, size: number): Generator<Array<T>>;
|
|
5169
|
+
|
|
5170
|
+
}
|
|
5171
|
+
|
|
5308
5172
|
declare module 'alinea/core/util/Assert' {
|
|
5309
5173
|
|
|
5310
5174
|
export function assert(value: unknown, message?: string): asserts value;
|
|
@@ -5323,6 +5187,13 @@ declare module 'alinea/core/util/Async' {
|
|
|
5323
5187
|
/** Map concurrently while yielding results as they complete. */
|
|
5324
5188
|
export function mapConcurrent<T, TResult>(iterable: Iterable<T>, mapper: (item: T, signal?: AbortSignal) => Promise<TResult>, options: MapConcurrentOptions): AsyncGenerator<TResult>;
|
|
5325
5189
|
export function genEffect<T, TReturn>(gen: AsyncIterable<T, TReturn>, effect: (result: T) => void): AsyncIterable<T>;
|
|
5190
|
+
/** Run tasks one after another; a failed task does not block the next one. */
|
|
5191
|
+
export class TaskQueue {
|
|
5192
|
+
#private;
|
|
5193
|
+
run<T>(task: () => Promise<T>): Promise<T>;
|
|
5194
|
+
/** Resolve once every task queued so far has settled. */
|
|
5195
|
+
drain(): Promise<void>;
|
|
5196
|
+
}
|
|
5326
5197
|
|
|
5327
5198
|
}
|
|
5328
5199
|
|
|
@@ -5482,10 +5353,29 @@ declare module 'alinea/core/util/Encoding' {
|
|
|
5482
5353
|
|
|
5483
5354
|
declare module 'alinea/core/util/EntryFilenames' {
|
|
5484
5355
|
|
|
5485
|
-
import
|
|
5356
|
+
import { Config } from 'alinea/core/Config';
|
|
5486
5357
|
import { type Entry, type EntryStatus } from 'alinea/core/Entry';
|
|
5487
5358
|
import type { EntryUrlInput, Type } from 'alinea/core/Type';
|
|
5488
5359
|
export function entryInfo(fileName: string): [name: string, status: EntryStatus];
|
|
5360
|
+
/** The workspace/root/locale layout encoded in a source file path. */
|
|
5361
|
+
export interface EntryFileLocation {
|
|
5362
|
+
workspace: string;
|
|
5363
|
+
root: string;
|
|
5364
|
+
locale: string | null;
|
|
5365
|
+
path: string;
|
|
5366
|
+
versionStatus: EntryStatus;
|
|
5367
|
+
parentDir: string;
|
|
5368
|
+
childrenDir: string;
|
|
5369
|
+
/** Segments taken up by the workspace, root and locale. */
|
|
5370
|
+
levelOffset: number;
|
|
5371
|
+
level: number;
|
|
5372
|
+
parentPaths: Array<string>;
|
|
5373
|
+
}
|
|
5374
|
+
/**
|
|
5375
|
+
* Read back the layout `Config.filePath` and `entryChildrenDir` write:
|
|
5376
|
+
* `[workspace/]root/[locale/]...parents/path[.status].json`.
|
|
5377
|
+
*/
|
|
5378
|
+
export function parseEntryFilePath(config: Config, filePath: string): EntryFileLocation;
|
|
5489
5379
|
export function entryChildrenDir(config: Config, entry: {
|
|
5490
5380
|
workspace: string;
|
|
5491
5381
|
root: string;
|
|
@@ -5493,6 +5383,8 @@ declare module 'alinea/core/util/EntryFilenames' {
|
|
|
5493
5383
|
path: string;
|
|
5494
5384
|
status: EntryStatus;
|
|
5495
5385
|
}, parentPaths: Array<string>): string;
|
|
5386
|
+
/** The `<childrenDir>[.status].json` file holding a single entry version. */
|
|
5387
|
+
export function entryVersionFile(childrenDir: string, status: EntryStatus): string;
|
|
5496
5388
|
export function entryFilepath(config: Config, entry: {
|
|
5497
5389
|
workspace: string;
|
|
5498
5390
|
root: string;
|
|
@@ -5561,6 +5453,15 @@ declare module 'alinea/core/util/Identifiers' {
|
|
|
5561
5453
|
|
|
5562
5454
|
}
|
|
5563
5455
|
|
|
5456
|
+
declare module 'alinea/core/util/IndexedDB' {
|
|
5457
|
+
|
|
5458
|
+
/** Resolve once an IndexedDB transaction has committed. */
|
|
5459
|
+
export function transactionComplete(tx: IDBTransaction): Promise<void>;
|
|
5460
|
+
/** Resolve with the result of an IndexedDB request. */
|
|
5461
|
+
export function requestResult<T>(request: IDBRequest<T>): Promise<T>;
|
|
5462
|
+
|
|
5463
|
+
}
|
|
5464
|
+
|
|
5564
5465
|
declare module 'alinea/core/util/JWT' {
|
|
5565
5466
|
|
|
5566
5467
|
const algorithms: {
|
|
@@ -6999,10 +6900,6 @@ declare module 'alinea/dashboard/atoms/config' {
|
|
|
6999
6900
|
export const workspaceAtom: (workspaceKey: string) => import("jotai").Atom<import("alinea/core/Workspace").WorkspaceInternal>;
|
|
7000
6901
|
export const viewAtoms: (key: string) => import("jotai").Atom<ComponentType | undefined>;
|
|
7001
6902
|
export const typeAtoms: (typeName: string) => import("jotai").Atom<{
|
|
7002
|
-
type: import("alinea/types").Type;
|
|
7003
|
-
customView: ((props: {
|
|
7004
|
-
type: import("alinea/types").Type;
|
|
7005
|
-
}) => import("react").ReactNode) | ComponentType | undefined;
|
|
7006
6903
|
fields: import("alinea/core/Type").FieldsDefinition;
|
|
7007
6904
|
contains?: Array<string | import("alinea/types").Type>;
|
|
7008
6905
|
orderChildrenBy?: import("alinea/core/OrderBy").OrderBy | Array<import("alinea/core/OrderBy").OrderBy>;
|
|
@@ -7020,6 +6917,10 @@ declare module 'alinea/dashboard/atoms/config' {
|
|
|
7020
6917
|
label: string;
|
|
7021
6918
|
allFields: Record<string, import("alinea/core").Field>;
|
|
7022
6919
|
sections: Array<import("alinea/core/Section").Section>;
|
|
6920
|
+
type: import("alinea/types").Type;
|
|
6921
|
+
customView: ((props: {
|
|
6922
|
+
type: import("alinea/types").Type;
|
|
6923
|
+
}) => import("react").ReactNode) | ComponentType | undefined;
|
|
7023
6924
|
}>;
|
|
7024
6925
|
|
|
7025
6926
|
}
|
|
@@ -7182,7 +7083,7 @@ declare module 'alinea/dashboard/atoms/editor' {
|
|
|
7182
7083
|
|
|
7183
7084
|
declare module 'alinea/dashboard/atoms/entry' {
|
|
7184
7085
|
|
|
7185
|
-
import type { EntryReference
|
|
7086
|
+
import type { EntryReference } from 'alinea/core/db/EntryReference';
|
|
7186
7087
|
import { Entry, EntryStatus } from 'alinea/core/Entry';
|
|
7187
7088
|
import type { Order } from 'alinea/core/Graph';
|
|
7188
7089
|
import { type EntryDefaultView } from 'alinea/core/Type';
|
|
@@ -7208,7 +7109,6 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7208
7109
|
export interface EntryReferences {
|
|
7209
7110
|
references: Array<EntryReferenceWithSource>;
|
|
7210
7111
|
total: number;
|
|
7211
|
-
scan: EntryReferenceScan;
|
|
7212
7112
|
}
|
|
7213
7113
|
export interface EntryReferenceWithSource {
|
|
7214
7114
|
reference: EntryReference;
|
|
@@ -7253,7 +7153,7 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7253
7153
|
preferredEntry: Atom<Entry<Record<string, unknown>>>;
|
|
7254
7154
|
selectedEntry: Atom<Promise<Entry<Record<string, unknown>>>>;
|
|
7255
7155
|
historyReady: Atom<Promise<import("alinea/core/Connection").Revision[]>>;
|
|
7256
|
-
|
|
7156
|
+
historyState: Atom<readonly [false, import("alinea/core/Connection").Revision[]] | readonly [true, import("alinea/core/Connection").Revision[] | undefined]>;
|
|
7257
7157
|
selectedNode: Atom<Promise<ReactiveNode<object>>>;
|
|
7258
7158
|
richTextImages: Atom<Promise<Map<string, ResolvedEditorImage>>>;
|
|
7259
7159
|
anchors: Atom<Promise<import("alinea/core/Field").EntryAnchorTarget[]>>;
|
|
@@ -7261,10 +7161,8 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7261
7161
|
init: null;
|
|
7262
7162
|
};
|
|
7263
7163
|
previewEntryReady: Atom<Promise<{
|
|
7264
|
-
title: string;
|
|
7265
|
-
path: string;
|
|
7266
|
-
data: Record<string, unknown>;
|
|
7267
7164
|
id: string;
|
|
7165
|
+
versionStatus?: EntryStatus;
|
|
7268
7166
|
status: EntryStatus;
|
|
7269
7167
|
type: string;
|
|
7270
7168
|
seeded: string | null;
|
|
@@ -7284,12 +7182,13 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7284
7182
|
fileHash: string;
|
|
7285
7183
|
url: string;
|
|
7286
7184
|
searchableText: string;
|
|
7287
|
-
}>>;
|
|
7288
|
-
previewEntry: Atom<{
|
|
7289
7185
|
title: string;
|
|
7290
7186
|
path: string;
|
|
7291
7187
|
data: Record<string, unknown>;
|
|
7188
|
+
}>>;
|
|
7189
|
+
previewEntry: Atom<{
|
|
7292
7190
|
id: string;
|
|
7191
|
+
versionStatus?: EntryStatus;
|
|
7293
7192
|
status: EntryStatus;
|
|
7294
7193
|
type: string;
|
|
7295
7194
|
seeded: string | null;
|
|
@@ -7309,6 +7208,9 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7309
7208
|
fileHash: string;
|
|
7310
7209
|
url: string;
|
|
7311
7210
|
searchableText: string;
|
|
7211
|
+
title: string;
|
|
7212
|
+
path: string;
|
|
7213
|
+
data: Record<string, unknown>;
|
|
7312
7214
|
} | undefined>;
|
|
7313
7215
|
previewUrlReady: Atom<Promise<string | undefined>>;
|
|
7314
7216
|
previewUrlState: Atom<readonly [false, string | undefined] | readonly [true, string | undefined]>;
|
|
@@ -7352,9 +7254,7 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7352
7254
|
readonly id: string;
|
|
7353
7255
|
readonly data: Atom<EntryData>;
|
|
7354
7256
|
constructor(id: string, data: Atom<EntryData>);
|
|
7355
|
-
previousVersionsOpen: import("jotai").
|
|
7356
|
-
init: boolean;
|
|
7357
|
-
};
|
|
7257
|
+
previousVersionsOpen: import("jotai").WritableAtom<boolean, [open: boolean], void>;
|
|
7358
7258
|
incomingReferencesReady: Atom<Promise<{
|
|
7359
7259
|
references: {
|
|
7360
7260
|
reference: EntryReference;
|
|
@@ -7371,7 +7271,6 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7371
7271
|
};
|
|
7372
7272
|
}[];
|
|
7373
7273
|
total: number;
|
|
7374
|
-
scan: EntryReferenceScan;
|
|
7375
7274
|
}>>;
|
|
7376
7275
|
incomingReferences: Atom<{
|
|
7377
7276
|
references: {
|
|
@@ -7389,7 +7288,6 @@ declare module 'alinea/dashboard/atoms/entry' {
|
|
|
7389
7288
|
};
|
|
7390
7289
|
}[];
|
|
7391
7290
|
total: number;
|
|
7392
|
-
scan: EntryReferenceScan;
|
|
7393
7291
|
} | undefined>;
|
|
7394
7292
|
type: Atom<string>;
|
|
7395
7293
|
parentId: Atom<string | null>;
|
|
@@ -7470,6 +7368,8 @@ declare module 'alinea/dashboard/atoms/explorer' {
|
|
|
7470
7368
|
import type { DragItem, DragTypes, DropOperation, DropTarget } from '@react-types/shared';
|
|
7471
7369
|
import type { DroppableCollectionOnItemDropEvent, Key } from 'react-aria-components';
|
|
7472
7370
|
export const dashboardEntryOverviewColumnCount = 5;
|
|
7371
|
+
/** The best ranked matches a search loads into the explorer. */
|
|
7372
|
+
export const searchResultLimit = 100;
|
|
7473
7373
|
export type ExplorerView = 'card' | 'row';
|
|
7474
7374
|
export type ExplorerSortBy = 'title' | 'path' | 'size' | 'id' | 'index';
|
|
7475
7375
|
export type ExplorerSortDirections = 'asc' | 'desc';
|
|
@@ -7926,6 +7826,7 @@ declare module 'alinea/dashboard/atoms/root' {
|
|
|
7926
7826
|
children: (id: string) => Atom<Promise<TreeEntryAtoms[]>>;
|
|
7927
7827
|
item: (id: string) => Atom<RootTreeItem>;
|
|
7928
7828
|
selectedItem: Atom<RootTreeItem | undefined>;
|
|
7829
|
+
canCreate: Atom<boolean>;
|
|
7929
7830
|
ready: Atom<Promise<{
|
|
7930
7831
|
expandedKeys: Set<string>;
|
|
7931
7832
|
items: RootTreeNode[];
|
|
@@ -8106,14 +8007,14 @@ declare module 'alinea/dashboard/boot/DashboardWorker' {
|
|
|
8106
8007
|
import type { Config } from 'alinea/core/Config';
|
|
8107
8008
|
import type { LocalConnection } from 'alinea/core/Connection';
|
|
8108
8009
|
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
8109
|
-
import { LocalDB } from 'alinea/core/db/LocalDB';
|
|
8110
8010
|
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
8111
8011
|
import type { Source } from 'alinea/core/source/Source';
|
|
8012
|
+
import { EntryStore } from 'alinea/database/EntryStore';
|
|
8112
8013
|
import { type Activity } from 'alinea/dashboard/boot/ActivityEvent';
|
|
8113
8014
|
export class DashboardWorker extends EventTarget {
|
|
8114
8015
|
#private;
|
|
8115
|
-
constructor(source
|
|
8116
|
-
get db():
|
|
8016
|
+
constructor(source?: Source);
|
|
8017
|
+
get db(): EntryStore | Promise<EntryStore>;
|
|
8117
8018
|
sync(): Promise<string>;
|
|
8118
8019
|
sha(): Promise<string>;
|
|
8119
8020
|
queue(id: string, mutations: Array<Mutation>): Promise<string>;
|
|
@@ -8596,6 +8497,8 @@ declare module 'alinea/dashboard/icons' {
|
|
|
8596
8497
|
export function IcOutlineTableRows(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8597
8498
|
export function IcOutlineViewList(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8598
8499
|
export function IcRoundDescription(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8500
|
+
export function IcRoundBolt(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8501
|
+
export function IcRoundInfo(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8599
8502
|
export function IcTwotoneDescription(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8600
8503
|
export function IcTwotoneFolder(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
8601
8504
|
export function IcRoundInsertDriveFile(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
|
|
@@ -8800,6 +8703,7 @@ declare module 'alinea/dashboard/ViewKeys' {
|
|
|
8800
8703
|
MetadataTimestampInput: string;
|
|
8801
8704
|
MetadataUserInput: string;
|
|
8802
8705
|
MetadataInput: string;
|
|
8706
|
+
MetadataDetailsView: string;
|
|
8803
8707
|
NumberInput: string;
|
|
8804
8708
|
ObjectInput: string;
|
|
8805
8709
|
PathInput: string;
|
|
@@ -8814,6 +8718,1055 @@ declare module 'alinea/dashboard/ViewKeys' {
|
|
|
8814
8718
|
|
|
8815
8719
|
}
|
|
8816
8720
|
|
|
8721
|
+
declare module 'alinea/database/BrowserEntryStore' {
|
|
8722
|
+
|
|
8723
|
+
import type { Config } from 'alinea/core/Config';
|
|
8724
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
8725
|
+
import type { CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
8726
|
+
import type { SyncOptions } from 'alinea/core/db/LocalStore';
|
|
8727
|
+
import type { RemoteSource } from 'alinea/core/source/Source';
|
|
8728
|
+
import { EntryStore } from 'alinea/database/EntryStore';
|
|
8729
|
+
export interface BrowserEntryStoreOptions {
|
|
8730
|
+
indexedDB: IDBFactory;
|
|
8731
|
+
name: string;
|
|
8732
|
+
revision: string;
|
|
8733
|
+
}
|
|
8734
|
+
/** WASM entry store persisted as one SQLite file in IndexedDB. */
|
|
8735
|
+
export class BrowserEntryStore extends EntryStore {
|
|
8736
|
+
#private;
|
|
8737
|
+
static open(config: Config, options: BrowserEntryStoreOptions): Promise<BrowserEntryStore>;
|
|
8738
|
+
private constructor();
|
|
8739
|
+
sync(): Promise<string>;
|
|
8740
|
+
syncWith(remote: RemoteSource, options?: SyncOptions): Promise<string>;
|
|
8741
|
+
mutate(mutations: Array<Mutation>): Promise<{
|
|
8742
|
+
sha: string;
|
|
8743
|
+
}>;
|
|
8744
|
+
write(request: CommitRequest): Promise<{
|
|
8745
|
+
sha: string;
|
|
8746
|
+
}>;
|
|
8747
|
+
close(): Promise<void>;
|
|
8748
|
+
/** Close a superseded store without persisting stale bytes over its
|
|
8749
|
+
* replacement's cache. Supersede always implies a revision change, so the
|
|
8750
|
+
* persisted revision would be discarded on the next open anyway. */
|
|
8751
|
+
abandon(): Promise<void>;
|
|
8752
|
+
}
|
|
8753
|
+
|
|
8754
|
+
}
|
|
8755
|
+
|
|
8756
|
+
declare module 'alinea/database/DatabaseSource' {
|
|
8757
|
+
|
|
8758
|
+
import type { ChangesBatch } from 'alinea/core/source/Change';
|
|
8759
|
+
import type { GetBlobsOptions, Source } from 'alinea/core/source/Source';
|
|
8760
|
+
import type { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
8761
|
+
import type { EntryLayer } from 'alinea/database/EntryLayer';
|
|
8762
|
+
/** Read-only Source view backed by exact payload text in an entry database. */
|
|
8763
|
+
export class DatabaseSource implements Source {
|
|
8764
|
+
#private;
|
|
8765
|
+
constructor(database: EntryLayer);
|
|
8766
|
+
getTree(): Promise<ReadonlyTree>;
|
|
8767
|
+
getTreeIfDifferent(sha: string): Promise<ReadonlyTree | undefined>;
|
|
8768
|
+
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncGenerator<[sha: string, blob: Uint8Array<ArrayBufferLike>], any, any>;
|
|
8769
|
+
applyChanges(_batch: ChangesBatch): Promise<void>;
|
|
8770
|
+
}
|
|
8771
|
+
|
|
8772
|
+
}
|
|
8773
|
+
|
|
8774
|
+
declare module 'alinea/database/DatabaseTables' {
|
|
8775
|
+
|
|
8776
|
+
import type { Tree } from 'alinea/core/source/Tree';
|
|
8777
|
+
export const DatabaseStateColumns: {
|
|
8778
|
+
id: import("rado").Column<number, [false, false]>;
|
|
8779
|
+
revision: import("rado").Column<string, [false, boolean]>;
|
|
8780
|
+
/** Merkle tree matching the indexed source revision. */
|
|
8781
|
+
tree: import("rado").JsonColumn<Tree, import("rado").Nullability>;
|
|
8782
|
+
};
|
|
8783
|
+
export const DatabaseStateTable: import("rado").Table<{
|
|
8784
|
+
id: import("rado").Column<number, [false, false]>;
|
|
8785
|
+
revision: import("rado").Column<string, [false, boolean]>;
|
|
8786
|
+
/** Merkle tree matching the indexed source revision. */
|
|
8787
|
+
tree: import("rado").JsonColumn<Tree, import("rado").Nullability>;
|
|
8788
|
+
}, "alinea_database_state">;
|
|
8789
|
+
export const DatabaseMetadataColumns: {
|
|
8790
|
+
id: import("rado").Column<number, [false, false]>;
|
|
8791
|
+
/** The database version whose layout the tables have. */
|
|
8792
|
+
version: import("rado").Column<number, [false, boolean]>;
|
|
8793
|
+
configFingerprint: import("rado").Column<string, [false, boolean]>;
|
|
8794
|
+
};
|
|
8795
|
+
export const DatabaseMetadataTable: import("rado").Table<{
|
|
8796
|
+
id: import("rado").Column<number, [false, false]>;
|
|
8797
|
+
/** The database version whose layout the tables have. */
|
|
8798
|
+
version: import("rado").Column<number, [false, boolean]>;
|
|
8799
|
+
configFingerprint: import("rado").Column<string, [false, boolean]>;
|
|
8800
|
+
}, "alinea_database_metadata">;
|
|
8801
|
+
/** Filesystem metadata of the source files indexed by this database. */
|
|
8802
|
+
export const SourceFileColumns: {
|
|
8803
|
+
path: import("rado").Column<string, [false, false]>;
|
|
8804
|
+
/** Last modification time in milliseconds. */
|
|
8805
|
+
mtime: import("rado").Column<number, [false, boolean]>;
|
|
8806
|
+
size: import("rado").Column<number, [false, boolean]>;
|
|
8807
|
+
};
|
|
8808
|
+
export const SourceFileTable: import("rado").Table<{
|
|
8809
|
+
path: import("rado").Column<string, [false, false]>;
|
|
8810
|
+
/** Last modification time in milliseconds. */
|
|
8811
|
+
mtime: import("rado").Column<number, [false, boolean]>;
|
|
8812
|
+
size: import("rado").Column<number, [false, boolean]>;
|
|
8813
|
+
}, "alinea_source_file">;
|
|
8814
|
+
|
|
8815
|
+
}
|
|
8816
|
+
|
|
8817
|
+
declare module 'alinea/database/driver/RuntimeDatabase' {
|
|
8818
|
+
|
|
8819
|
+
import type { Database, DatabaseOptions } from 'rado';
|
|
8820
|
+
export interface RuntimeDatabaseOptions extends DatabaseOptions {
|
|
8821
|
+
path?: string;
|
|
8822
|
+
data?: Uint8Array;
|
|
8823
|
+
readonly?: boolean;
|
|
8824
|
+
}
|
|
8825
|
+
/** Select a native Node/Bun driver for files and WASM for byte buffers. */
|
|
8826
|
+
export function runtimeDatabase(options?: RuntimeDatabaseOptions): Promise<Database>;
|
|
8827
|
+
|
|
8828
|
+
}
|
|
8829
|
+
|
|
8830
|
+
declare module 'alinea/database/driver/WasmDatabase' {
|
|
8831
|
+
|
|
8832
|
+
import { connect } from 'rado/driver/sql.js';
|
|
8833
|
+
export interface WasmDatabaseHandle {
|
|
8834
|
+
database: ReturnType<typeof connect>;
|
|
8835
|
+
export(): Uint8Array;
|
|
8836
|
+
}
|
|
8837
|
+
/** Open an in-memory WASM connection, optionally from a complete SQLite file. */
|
|
8838
|
+
export function openWasmDatabase(data?: Uint8Array): Promise<WasmDatabaseHandle>;
|
|
8839
|
+
export function wasmDatabase(data?: Uint8Array): Promise<import("rado").SyncDatabase<"sqlite">>;
|
|
8840
|
+
|
|
8841
|
+
}
|
|
8842
|
+
|
|
8843
|
+
declare module 'alinea/database/entry/EntryData' {
|
|
8844
|
+
|
|
8845
|
+
import { type Database, type Sql } from 'rado';
|
|
8846
|
+
import { type EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
8847
|
+
/**
|
|
8848
|
+
* Whether this SQLite stores entry data as JSONB, which reads paths of large
|
|
8849
|
+
* documents without parsing them. Older versions store JSON text.
|
|
8850
|
+
*/
|
|
8851
|
+
export function supportsJsonb(db: Database): Promise<boolean>;
|
|
8852
|
+
/** Whether the entry index holds rows stored as JSONB. */
|
|
8853
|
+
export function hasJsonbRows(db: Database): Promise<boolean>;
|
|
8854
|
+
/** Fail clearly when this SQLite cannot read the JSONB rows of a database. */
|
|
8855
|
+
export function assertReadableData(db: Database): Promise<void>;
|
|
8856
|
+
/** The data as JSON text, whether stored as text or JSONB. */
|
|
8857
|
+
export function entryDataText(entry: Pick<EntryIndexTarget, 'data'>): Sql<string>;
|
|
8858
|
+
|
|
8859
|
+
}
|
|
8860
|
+
|
|
8861
|
+
declare module 'alinea/database/entry/EntryTable' {
|
|
8862
|
+
|
|
8863
|
+
import type { Entry, EntryStatus } from 'alinea/core/Entry';
|
|
8864
|
+
import { type Table } from 'rado';
|
|
8865
|
+
/** One complete authored entry version. Only arrays and authored data are JSON. */
|
|
8866
|
+
export const EntryIndexColumns: {
|
|
8867
|
+
/**
|
|
8868
|
+
* Also the rowid of the version's full-text search row. Declared, so VACUUM
|
|
8869
|
+
* and copies into overlay tables keep it.
|
|
8870
|
+
*/
|
|
8871
|
+
rowid: import("rado").Column<number, [false, false]>;
|
|
8872
|
+
versionId: import("rado").Column<string, [false, boolean]>;
|
|
8873
|
+
id: import("rado").Column<string, [false, boolean]>;
|
|
8874
|
+
locale: import("rado").Column<string, import("rado").Nullability>;
|
|
8875
|
+
versionStatus: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8876
|
+
status: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8877
|
+
type: import("rado").Column<string, [false, boolean]>;
|
|
8878
|
+
title: import("rado").Column<string, [false, boolean]>;
|
|
8879
|
+
workspace: import("rado").Column<string, [false, boolean]>;
|
|
8880
|
+
root: import("rado").Column<string, [false, boolean]>;
|
|
8881
|
+
sourceRoot: import("rado").Column<string, import("rado").Nullability>;
|
|
8882
|
+
parentId: import("rado").Column<string, import("rado").Nullability>;
|
|
8883
|
+
parents: import("rado").Column<string[], [false, boolean]>;
|
|
8884
|
+
level: import("rado").Column<number, [false, boolean]>;
|
|
8885
|
+
index: import("rado").Column<string, [false, boolean]>;
|
|
8886
|
+
path: import("rado").Column<string, [false, boolean]>;
|
|
8887
|
+
/** Full source path of this authored version. */
|
|
8888
|
+
filePath: import("rado").Column<string, [false, boolean]>;
|
|
8889
|
+
fileHash: import("rado").Column<string, [false, boolean]>;
|
|
8890
|
+
parentDir: import("rado").Column<string, [false, boolean]>;
|
|
8891
|
+
childrenDir: import("rado").Column<string, [false, boolean]>;
|
|
8892
|
+
url: import("rado").Column<string, [false, boolean]>;
|
|
8893
|
+
active: import("rado").Column<boolean, [false, boolean]>;
|
|
8894
|
+
main: import("rado").Column<boolean, [false, boolean]>;
|
|
8895
|
+
visible: import("rado").Column<boolean, [false, boolean]>;
|
|
8896
|
+
seeded: import("rado").Column<string, import("rado").Nullability>;
|
|
8897
|
+
rowHash: import("rado").Column<string, [false, boolean]>;
|
|
8898
|
+
/** Hash of this entry's child directory in the synced source tree. */
|
|
8899
|
+
childrenSha: import("rado").Column<string, import("rado").Nullability>;
|
|
8900
|
+
/** Exact source blob for seeded rows whose expanded data differs. */
|
|
8901
|
+
payload: import("rado").Column<string, import("rado").Nullability>;
|
|
8902
|
+
/**
|
|
8903
|
+
* Exact source JSON, or expanded JSON for seeded rows. Stored as JSONB where
|
|
8904
|
+
* SQLite supports it; read it as text with `entryDataText`.
|
|
8905
|
+
*/
|
|
8906
|
+
data: import("rado").Column<string, [false, boolean]>;
|
|
8907
|
+
};
|
|
8908
|
+
export function entryIndexTable(name: string, temporary?: boolean): Table<{
|
|
8909
|
+
/**
|
|
8910
|
+
* Also the rowid of the version's full-text search row. Declared, so VACUUM
|
|
8911
|
+
* and copies into overlay tables keep it.
|
|
8912
|
+
*/
|
|
8913
|
+
rowid: import("rado").Column<number, [false, false]>;
|
|
8914
|
+
versionId: import("rado").Column<string, [false, boolean]>;
|
|
8915
|
+
id: import("rado").Column<string, [false, boolean]>;
|
|
8916
|
+
locale: import("rado").Column<string, import("rado").Nullability>;
|
|
8917
|
+
versionStatus: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8918
|
+
status: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8919
|
+
type: import("rado").Column<string, [false, boolean]>;
|
|
8920
|
+
title: import("rado").Column<string, [false, boolean]>;
|
|
8921
|
+
workspace: import("rado").Column<string, [false, boolean]>;
|
|
8922
|
+
root: import("rado").Column<string, [false, boolean]>;
|
|
8923
|
+
sourceRoot: import("rado").Column<string, import("rado").Nullability>;
|
|
8924
|
+
parentId: import("rado").Column<string, import("rado").Nullability>;
|
|
8925
|
+
parents: import("rado").Column<string[], [false, boolean]>;
|
|
8926
|
+
level: import("rado").Column<number, [false, boolean]>;
|
|
8927
|
+
index: import("rado").Column<string, [false, boolean]>;
|
|
8928
|
+
path: import("rado").Column<string, [false, boolean]>;
|
|
8929
|
+
/** Full source path of this authored version. */
|
|
8930
|
+
filePath: import("rado").Column<string, [false, boolean]>;
|
|
8931
|
+
fileHash: import("rado").Column<string, [false, boolean]>;
|
|
8932
|
+
parentDir: import("rado").Column<string, [false, boolean]>;
|
|
8933
|
+
childrenDir: import("rado").Column<string, [false, boolean]>;
|
|
8934
|
+
url: import("rado").Column<string, [false, boolean]>;
|
|
8935
|
+
active: import("rado").Column<boolean, [false, boolean]>;
|
|
8936
|
+
main: import("rado").Column<boolean, [false, boolean]>;
|
|
8937
|
+
visible: import("rado").Column<boolean, [false, boolean]>;
|
|
8938
|
+
seeded: import("rado").Column<string, import("rado").Nullability>;
|
|
8939
|
+
rowHash: import("rado").Column<string, [false, boolean]>;
|
|
8940
|
+
/** Hash of this entry's child directory in the synced source tree. */
|
|
8941
|
+
childrenSha: import("rado").Column<string, import("rado").Nullability>;
|
|
8942
|
+
/** Exact source blob for seeded rows whose expanded data differs. */
|
|
8943
|
+
payload: import("rado").Column<string, import("rado").Nullability>;
|
|
8944
|
+
/**
|
|
8945
|
+
* Exact source JSON, or expanded JSON for seeded rows. Stored as JSONB where
|
|
8946
|
+
* SQLite supports it; read it as text with `entryDataText`.
|
|
8947
|
+
*/
|
|
8948
|
+
data: import("rado").Column<string, [false, boolean]>;
|
|
8949
|
+
}, string>;
|
|
8950
|
+
export type EntryIndexTarget = Table<typeof EntryIndexColumns>;
|
|
8951
|
+
export const EntryIndexTable: Table<{
|
|
8952
|
+
/**
|
|
8953
|
+
* Also the rowid of the version's full-text search row. Declared, so VACUUM
|
|
8954
|
+
* and copies into overlay tables keep it.
|
|
8955
|
+
*/
|
|
8956
|
+
rowid: import("rado").Column<number, [false, false]>;
|
|
8957
|
+
versionId: import("rado").Column<string, [false, boolean]>;
|
|
8958
|
+
id: import("rado").Column<string, [false, boolean]>;
|
|
8959
|
+
locale: import("rado").Column<string, import("rado").Nullability>;
|
|
8960
|
+
versionStatus: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8961
|
+
status: import("rado").Column<EntryStatus, [false, boolean]>;
|
|
8962
|
+
type: import("rado").Column<string, [false, boolean]>;
|
|
8963
|
+
title: import("rado").Column<string, [false, boolean]>;
|
|
8964
|
+
workspace: import("rado").Column<string, [false, boolean]>;
|
|
8965
|
+
root: import("rado").Column<string, [false, boolean]>;
|
|
8966
|
+
sourceRoot: import("rado").Column<string, import("rado").Nullability>;
|
|
8967
|
+
parentId: import("rado").Column<string, import("rado").Nullability>;
|
|
8968
|
+
parents: import("rado").Column<string[], [false, boolean]>;
|
|
8969
|
+
level: import("rado").Column<number, [false, boolean]>;
|
|
8970
|
+
index: import("rado").Column<string, [false, boolean]>;
|
|
8971
|
+
path: import("rado").Column<string, [false, boolean]>;
|
|
8972
|
+
/** Full source path of this authored version. */
|
|
8973
|
+
filePath: import("rado").Column<string, [false, boolean]>;
|
|
8974
|
+
fileHash: import("rado").Column<string, [false, boolean]>;
|
|
8975
|
+
parentDir: import("rado").Column<string, [false, boolean]>;
|
|
8976
|
+
childrenDir: import("rado").Column<string, [false, boolean]>;
|
|
8977
|
+
url: import("rado").Column<string, [false, boolean]>;
|
|
8978
|
+
active: import("rado").Column<boolean, [false, boolean]>;
|
|
8979
|
+
main: import("rado").Column<boolean, [false, boolean]>;
|
|
8980
|
+
visible: import("rado").Column<boolean, [false, boolean]>;
|
|
8981
|
+
seeded: import("rado").Column<string, import("rado").Nullability>;
|
|
8982
|
+
rowHash: import("rado").Column<string, [false, boolean]>;
|
|
8983
|
+
/** Hash of this entry's child directory in the synced source tree. */
|
|
8984
|
+
childrenSha: import("rado").Column<string, import("rado").Nullability>;
|
|
8985
|
+
/** Exact source blob for seeded rows whose expanded data differs. */
|
|
8986
|
+
payload: import("rado").Column<string, import("rado").Nullability>;
|
|
8987
|
+
/**
|
|
8988
|
+
* Exact source JSON, or expanded JSON for seeded rows. Stored as JSONB where
|
|
8989
|
+
* SQLite supports it; read it as text with `entryDataText`.
|
|
8990
|
+
*/
|
|
8991
|
+
data: import("rado").Column<string, [false, boolean]>;
|
|
8992
|
+
}, string>;
|
|
8993
|
+
/** An Entry plus the physical-version and local-index fields. */
|
|
8994
|
+
export interface IndexedEntry extends Entry {
|
|
8995
|
+
versionStatus: EntryStatus;
|
|
8996
|
+
/** Exact source text matching fileHash. */
|
|
8997
|
+
payload?: string;
|
|
8998
|
+
/** False for authored versions suppressed by inherited status in normal queries. */
|
|
8999
|
+
visible?: boolean;
|
|
9000
|
+
/** First source-directory segment below the content root (not the URL slug). */
|
|
9001
|
+
sourceRoot?: string | null;
|
|
9002
|
+
/** Hash of this entry's child directory in the synced source tree. */
|
|
9003
|
+
childrenSha?: string | null;
|
|
9004
|
+
}
|
|
9005
|
+
export function entryIndexRow(entry: IndexedEntry): {
|
|
9006
|
+
versionId: string;
|
|
9007
|
+
id: string;
|
|
9008
|
+
locale: string | null;
|
|
9009
|
+
versionStatus: EntryStatus;
|
|
9010
|
+
status: EntryStatus;
|
|
9011
|
+
type: string;
|
|
9012
|
+
title: string;
|
|
9013
|
+
workspace: string;
|
|
9014
|
+
root: string;
|
|
9015
|
+
sourceRoot: string | null;
|
|
9016
|
+
parentId: string | null;
|
|
9017
|
+
parents: string[];
|
|
9018
|
+
level: number;
|
|
9019
|
+
index: string;
|
|
9020
|
+
path: string;
|
|
9021
|
+
filePath: string;
|
|
9022
|
+
fileHash: string;
|
|
9023
|
+
parentDir: string;
|
|
9024
|
+
childrenDir: string;
|
|
9025
|
+
url: string;
|
|
9026
|
+
active: boolean;
|
|
9027
|
+
main: boolean;
|
|
9028
|
+
visible: boolean;
|
|
9029
|
+
seeded: string | null;
|
|
9030
|
+
rowHash: string;
|
|
9031
|
+
childrenSha: string | null;
|
|
9032
|
+
payload: string | null;
|
|
9033
|
+
data: string;
|
|
9034
|
+
};
|
|
9035
|
+
export function storedEntryData(value: unknown, path: string): Record<string, unknown>;
|
|
9036
|
+
|
|
9037
|
+
}
|
|
9038
|
+
|
|
9039
|
+
declare module 'alinea/database/entry/EntryView' {
|
|
9040
|
+
|
|
9041
|
+
import { type Database } from 'rado';
|
|
9042
|
+
import type { EntrySyncTarget } from 'alinea/database/sync/EntrySyncer';
|
|
9043
|
+
/** The tables reads of a target go to: an unwritten view reads its parent's. */
|
|
9044
|
+
export function entryReadTarget(target: EntrySyncTarget): EntrySyncTarget;
|
|
9045
|
+
/**
|
|
9046
|
+
* Named, copy-on-write entry and search tables over another target. A view
|
|
9047
|
+
* reads its parent until the first write copies the parent's rows into
|
|
9048
|
+
* temporary tables of its own, which from then on no longer follow the parent.
|
|
9049
|
+
*/
|
|
9050
|
+
export class EntryView {
|
|
9051
|
+
#private;
|
|
9052
|
+
readonly target: EntrySyncTarget;
|
|
9053
|
+
private constructor();
|
|
9054
|
+
static create(db: Database, name: string, parent: EntrySyncTarget, revision: string): Promise<EntryView>;
|
|
9055
|
+
get readTarget(): EntrySyncTarget;
|
|
9056
|
+
/**
|
|
9057
|
+
* Copy the parent's rows into this view's tables. Await this before every
|
|
9058
|
+
* write through the view: until then reads go to the parent.
|
|
9059
|
+
*/
|
|
9060
|
+
diverge(): Promise<void>;
|
|
9061
|
+
close(): Promise<void>;
|
|
9062
|
+
}
|
|
9063
|
+
|
|
9064
|
+
}
|
|
9065
|
+
|
|
9066
|
+
declare module 'alinea/database/EntryDatabase' {
|
|
9067
|
+
|
|
9068
|
+
import type { Config } from 'alinea/core/Config';
|
|
9069
|
+
import type { FileStat } from 'alinea/core/source/FSSource';
|
|
9070
|
+
import { type Database } from 'rado';
|
|
9071
|
+
import { EntryLayer, type EntryDatabaseOptions, type EntrySyncResult } from 'alinea/database/EntryLayer';
|
|
9072
|
+
/** A queryable entry database owning its SQLite connection. */
|
|
9073
|
+
export class EntryDatabase extends EntryLayer {
|
|
9074
|
+
#private;
|
|
9075
|
+
constructor(config: Config, db: Database, options?: EntryDatabaseOptions);
|
|
9076
|
+
static createSchema(db: Database, revision: string, configFingerprint?: string): Promise<void>;
|
|
9077
|
+
/**
|
|
9078
|
+
* Derive every entry again with another config, recording the fingerprint
|
|
9079
|
+
* so a later open recognizes the database as written by that config.
|
|
9080
|
+
*/
|
|
9081
|
+
reindex(config: Config, configFingerprint?: string): Promise<EntrySyncResult>;
|
|
9082
|
+
/** File stats recorded by the last filesystem sync of this database. */
|
|
9083
|
+
getSourceFileStats(): Promise<Map<string, FileStat>>;
|
|
9084
|
+
/** Replace the recorded file stats after syncing from a filesystem source. */
|
|
9085
|
+
setSourceFileStats(stats: ReadonlyMap<string, FileStat>): Promise<void>;
|
|
9086
|
+
compact(): Promise<void>;
|
|
9087
|
+
protected releaseLayer(): Promise<void>;
|
|
9088
|
+
}
|
|
9089
|
+
|
|
9090
|
+
}
|
|
9091
|
+
|
|
9092
|
+
declare module 'alinea/database/EntryLayer' {
|
|
9093
|
+
|
|
9094
|
+
import type { Config } from 'alinea/core/Config';
|
|
9095
|
+
import type { CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
9096
|
+
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
9097
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
9098
|
+
import type { SyncOptions } from 'alinea/core/db/LocalStore';
|
|
9099
|
+
import { Graph, type AnyQueryResult, type GraphQuery } from 'alinea/core/Graph';
|
|
9100
|
+
import { Policy } from 'alinea/core/Role';
|
|
9101
|
+
import { OverlaySource } from 'alinea/core/source/OverlaySource';
|
|
9102
|
+
import { type GetBlobsOptions, type RemoteSource, type Source } from 'alinea/core/source/Source';
|
|
9103
|
+
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
9104
|
+
import { TaskQueue } from 'alinea/core/util/Async';
|
|
9105
|
+
import { type Database } from 'rado';
|
|
9106
|
+
import { EntryView } from 'alinea/database/entry/EntryView';
|
|
9107
|
+
import { EntrySyncer, type EntrySyncTarget } from 'alinea/database/sync/EntrySyncer';
|
|
9108
|
+
export interface EntryLayerState {
|
|
9109
|
+
/** Read connection, or the write transaction of a working layer. */
|
|
9110
|
+
db: Database;
|
|
9111
|
+
/** Serializes every task on the connection, shared by its overlays. */
|
|
9112
|
+
queue: TaskQueue;
|
|
9113
|
+
syncer: EntrySyncer;
|
|
9114
|
+
target: EntrySyncTarget;
|
|
9115
|
+
/** The copy-on-write table behind an overlay's target. */
|
|
9116
|
+
view?: EntryView;
|
|
9117
|
+
/** The layer an overlay was created from. */
|
|
9118
|
+
parent?: EntryLayer;
|
|
9119
|
+
tree?: ReadonlyTree;
|
|
9120
|
+
initialTree?: ReadonlyTree;
|
|
9121
|
+
/** The connection is already inside a transaction: never open nested ones. */
|
|
9122
|
+
transactional?: boolean;
|
|
9123
|
+
}
|
|
9124
|
+
export interface EntryDatabaseOptions {
|
|
9125
|
+
includedAtBuild?(filePath: string): boolean | Promise<boolean>;
|
|
9126
|
+
}
|
|
9127
|
+
export interface EntryApplyOptions {
|
|
9128
|
+
source: Source;
|
|
9129
|
+
policy?: Policy;
|
|
9130
|
+
}
|
|
9131
|
+
export type EntryChangeListener = (change: EntrySyncResult) => void;
|
|
9132
|
+
export interface EntrySyncResult {
|
|
9133
|
+
revision: string;
|
|
9134
|
+
/** Includes source changes, deletions, and entries changed by inheritance. */
|
|
9135
|
+
changedEntryIds: ReadonlyArray<string>;
|
|
9136
|
+
}
|
|
9137
|
+
export interface EntryApplyResult extends EntrySyncResult {
|
|
9138
|
+
request: CommitRequest;
|
|
9139
|
+
}
|
|
9140
|
+
export interface EntryDatabaseOverlay extends AsyncDisposable {
|
|
9141
|
+
database: EntryLayer;
|
|
9142
|
+
source: OverlaySource;
|
|
9143
|
+
close(): Promise<void>;
|
|
9144
|
+
}
|
|
9145
|
+
/** One queryable layer of the entry index: a database or a view over one. */
|
|
9146
|
+
export class EntryLayer extends Graph implements AsyncDisposable {
|
|
9147
|
+
#private;
|
|
9148
|
+
constructor(config: Config, options: EntryDatabaseOptions, state: EntryLayerState);
|
|
9149
|
+
get config(): Config;
|
|
9150
|
+
includedAtBuild(filePath: string): boolean | Promise<boolean>;
|
|
9151
|
+
/** Whether this layer was closed, and answers only from a replacement. */
|
|
9152
|
+
get closed(): boolean;
|
|
9153
|
+
/**
|
|
9154
|
+
* Synchronize a source through this layer's single prepared syncer, without
|
|
9155
|
+
* keeping an in-memory copy of its entries.
|
|
9156
|
+
*/
|
|
9157
|
+
syncWith(source: RemoteSource, options?: SyncOptions): Promise<EntrySyncResult>;
|
|
9158
|
+
/**
|
|
9159
|
+
* Adopt another config and derive every entry again from the payloads this
|
|
9160
|
+
* layer stores. The rows of the previous config are replaced within one
|
|
9161
|
+
* transaction, so reads keep answering from them until the replacement is
|
|
9162
|
+
* committed. Only a layer without overlays can be reindexed.
|
|
9163
|
+
*/
|
|
9164
|
+
protected reindexEntries(config: Config, reset?: (tx: Database) => Promise<void>): Promise<EntrySyncResult>;
|
|
9165
|
+
/** Atomically plan and apply mutations through a private working layer. */
|
|
9166
|
+
apply(mutations: ReadonlyArray<Mutation>, options: EntryApplyOptions): Promise<EntryApplyResult>;
|
|
9167
|
+
/** Plan mutations like apply, then roll them back. */
|
|
9168
|
+
plan(mutations: ReadonlyArray<Mutation>, options: EntryApplyOptions): Promise<CommitRequest>;
|
|
9169
|
+
close(): Promise<void>;
|
|
9170
|
+
/** Release what this layer owns, serialized with the read connection. */
|
|
9171
|
+
protected releaseLayer(): Promise<void>;
|
|
9172
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
9173
|
+
getRevision(): Promise<string>;
|
|
9174
|
+
getTree(): Promise<ReadonlyTree>;
|
|
9175
|
+
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncGenerator<[sha: string, blob: Uint8Array]>;
|
|
9176
|
+
/** Run a task serialized with every other read on this connection. */
|
|
9177
|
+
protected withReadConnection<T>(run: () => Promise<T>): Promise<T>;
|
|
9178
|
+
/** Create and synchronize a copy-on-write layer over this one. */
|
|
9179
|
+
overlay(source: RemoteSource): Promise<EntryLayer>;
|
|
9180
|
+
/** Create an initially empty writable source and database layer. */
|
|
9181
|
+
createOverlay(): Promise<EntryDatabaseOverlay>;
|
|
9182
|
+
resolve<const Query extends GraphQuery>(query: Query): Promise<AnyQueryResult<Query>>;
|
|
9183
|
+
/** Scan references in bounded pages without retaining an entry index. */
|
|
9184
|
+
referencesTo(query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
9185
|
+
onChange(listener: EntryChangeListener): () => void;
|
|
9186
|
+
}
|
|
9187
|
+
|
|
9188
|
+
}
|
|
9189
|
+
|
|
9190
|
+
declare module 'alinea/database/EntryStore' {
|
|
9191
|
+
|
|
9192
|
+
import type { Config } from 'alinea/core/Config';
|
|
9193
|
+
import type { GetBlobsOptions, RemoteSource, Source } from 'alinea/core/source/Source';
|
|
9194
|
+
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
9195
|
+
import type { AnyQueryResult, GraphQuery } from 'alinea/core/Graph';
|
|
9196
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
9197
|
+
import type { Policy } from 'alinea/core/Role';
|
|
9198
|
+
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
9199
|
+
import { type CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
9200
|
+
import type { LocalStore, SyncOptions } from 'alinea/core/db/LocalStore';
|
|
9201
|
+
import { WriteableGraph } from 'alinea/core/db/WriteableGraph';
|
|
9202
|
+
import type { UploadMetadata, UploadResponse } from 'alinea/core/Connection';
|
|
9203
|
+
import type { EntryChangeListener, EntryLayer } from 'alinea/database/EntryLayer';
|
|
9204
|
+
export interface EntryStoreOptions {
|
|
9205
|
+
ownsDatabase?: boolean;
|
|
9206
|
+
sourceFollowsDatabase?: boolean;
|
|
9207
|
+
close?: () => Promise<void>;
|
|
9208
|
+
}
|
|
9209
|
+
/** Source and commit lifecycle around the transport-neutral SQLite database. */
|
|
9210
|
+
export class EntryStore extends WriteableGraph implements LocalStore, AsyncDisposable {
|
|
9211
|
+
#private;
|
|
9212
|
+
/** Replaced only by a reindex, which derives every entry again. */
|
|
9213
|
+
config: Config;
|
|
9214
|
+
readonly database: EntryLayer;
|
|
9215
|
+
readonly source: Source;
|
|
9216
|
+
constructor(config: Config, database: EntryLayer, source: Source, options?: EntryStoreOptions);
|
|
9217
|
+
static memory(config: Config, source: Source): Promise<EntryStore>;
|
|
9218
|
+
get sha(): Promise<string>;
|
|
9219
|
+
includedAtBuild(filePath: string): boolean | Promise<boolean>;
|
|
9220
|
+
/**
|
|
9221
|
+
* Preview queries share a single overlay, which each query first brings to
|
|
9222
|
+
* its own payload over the current store revision. The overlay diffs from
|
|
9223
|
+
* the tree it shows, so a switch restores the previously previewed entry and
|
|
9224
|
+
* follows store syncs without copying the entries again.
|
|
9225
|
+
*/
|
|
9226
|
+
resolve<Query extends GraphQuery>(query: Query): Promise<AnyQueryResult<Query>>;
|
|
9227
|
+
/** Close the preview overlay, which keeps this store's database open. */
|
|
9228
|
+
protected closePreviews(): Promise<void>;
|
|
9229
|
+
referencesTo(query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
9230
|
+
onChange(listener: EntryChangeListener): () => void;
|
|
9231
|
+
sync(): Promise<string>;
|
|
9232
|
+
/** Keep the writable source and its query database at one remote revision. */
|
|
9233
|
+
syncWith(remote: RemoteSource, options?: SyncOptions): Promise<string>;
|
|
9234
|
+
/** Create a persistent copy-on-write session over this store. */
|
|
9235
|
+
overlay(remote: RemoteSource): Promise<EntryStore>;
|
|
9236
|
+
/** Plan a commit without changing this store. */
|
|
9237
|
+
request(mutations: ReadonlyArray<Mutation>, policy?: Policy): Promise<CommitRequest>;
|
|
9238
|
+
mutate(mutations: Array<Mutation>): Promise<{
|
|
9239
|
+
sha: string;
|
|
9240
|
+
}>;
|
|
9241
|
+
write(request: CommitRequest): Promise<{
|
|
9242
|
+
sha: string;
|
|
9243
|
+
}>;
|
|
9244
|
+
getTreeIfDifferent(sha: string): Promise<ReadonlyTree | undefined>;
|
|
9245
|
+
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncIterable<[sha: string, blob: Uint8Array<ArrayBufferLike>]>;
|
|
9246
|
+
prepareUpload(_file: string, _metadata?: UploadMetadata): Promise<UploadResponse>;
|
|
9247
|
+
/** Whether the underlying database was closed. */
|
|
9248
|
+
get closed(): boolean;
|
|
9249
|
+
close(): Promise<void>;
|
|
9250
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
9251
|
+
}
|
|
9252
|
+
|
|
9253
|
+
}
|
|
9254
|
+
|
|
9255
|
+
declare module 'alinea/database/EntryTransaction' {
|
|
9256
|
+
|
|
9257
|
+
import { type Policy } from 'alinea/core/Role';
|
|
9258
|
+
import { OverlaySource } from 'alinea/core/source/OverlaySource';
|
|
9259
|
+
import { SourceTransaction } from 'alinea/core/source/Source';
|
|
9260
|
+
import type { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
9261
|
+
import { type CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
9262
|
+
import type { ArchiveMutation, CreateMutation, MoveMutation, Mutation, PublishMutation, RemoveFileMutation, RemoveMutation, UnpublishMutation, UpdateMutation, UploadFileMutation } from 'alinea/core/db/Mutation';
|
|
9263
|
+
import type { EntryLayer } from 'alinea/database/EntryLayer';
|
|
9264
|
+
type Op<T> = Omit<T, 'op'>;
|
|
9265
|
+
/**
|
|
9266
|
+
* Plans mutations inside the receiver's write transaction. Each mutation is
|
|
9267
|
+
* flushed so subsequent mutations query its result without retaining an
|
|
9268
|
+
* in-memory entry index. SQLite rolls the full batch back on failure.
|
|
9269
|
+
*/
|
|
9270
|
+
export class EntryTransaction implements AsyncDisposable {
|
|
9271
|
+
#private;
|
|
9272
|
+
/** @internal Constructed by EntryLayer.apply. */
|
|
9273
|
+
constructor(workingDatabase: EntryLayer, workingSource: OverlaySource, sourceTransaction: SourceTransaction, from: ReadonlyTree, policy: Policy);
|
|
9274
|
+
get changedEntryIds(): Array<string>;
|
|
9275
|
+
apply(mutations: ReadonlyArray<Mutation>): Promise<void>;
|
|
9276
|
+
create({ locale, type, data, root, workspace, fromSeed, parentId, id, insertOrder, status, overwrite }: Op<CreateMutation>): Promise<void>;
|
|
9277
|
+
update({ id, locale, status, set }: Op<UpdateMutation>): Promise<void>;
|
|
9278
|
+
publish({ id, locale, status }: Op<PublishMutation>): Promise<void>;
|
|
9279
|
+
unpublish({ id, locale }: Op<UnpublishMutation>): Promise<void>;
|
|
9280
|
+
archive({ id, locale }: Op<ArchiveMutation>): Promise<void>;
|
|
9281
|
+
move({ id, target, dropPosition, targetType }: Op<MoveMutation>): Promise<void>;
|
|
9282
|
+
remove({ id, locale, status }: Op<RemoveMutation>): Promise<void>;
|
|
9283
|
+
removeFile(mutation: Op<RemoveFileMutation>): void;
|
|
9284
|
+
uploadFile(mutation: Op<UploadFileMutation>): void;
|
|
9285
|
+
toRequest(): Promise<CommitRequest>;
|
|
9286
|
+
close(): Promise<void>;
|
|
9287
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
9288
|
+
}
|
|
9289
|
+
export {};
|
|
9290
|
+
|
|
9291
|
+
}
|
|
9292
|
+
|
|
9293
|
+
declare module 'alinea/database/EntryUrlAliases' {
|
|
9294
|
+
|
|
9295
|
+
import { Type } from 'alinea/core/Type';
|
|
9296
|
+
export function dataWithUrlAlias(type: Type, data: Record<string, unknown>, previousUrl: string, currentUrl: string): Record<string, unknown>;
|
|
9297
|
+
|
|
9298
|
+
}
|
|
9299
|
+
|
|
9300
|
+
declare module 'alinea/database/LocalDB' {
|
|
9301
|
+
|
|
9302
|
+
import type { AnyQueryResult, GraphQuery } from 'alinea/core/Graph';
|
|
9303
|
+
import type { GetBlobsOptions, RemoteSource, Source } from 'alinea/core/source/Source';
|
|
9304
|
+
import type { Config } from 'alinea/core/Config';
|
|
9305
|
+
import type { UploadMetadata, UploadResponse } from 'alinea/core/Connection';
|
|
9306
|
+
import type { CommitRequest } from 'alinea/core/db/CommitRequest';
|
|
9307
|
+
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
9308
|
+
import type { LocalStore, SyncOptions } from 'alinea/core/db/LocalStore';
|
|
9309
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
9310
|
+
import { WriteableGraph } from 'alinea/core/db/WriteableGraph';
|
|
9311
|
+
import type { Policy } from 'alinea/core/Role';
|
|
9312
|
+
/**
|
|
9313
|
+
* Sync-constructor convenience over `EntryStore.memory()`.
|
|
9314
|
+
* This facade is backed by the SQLite engine.
|
|
9315
|
+
*/
|
|
9316
|
+
export class LocalDB extends WriteableGraph implements LocalStore, AsyncDisposable {
|
|
9317
|
+
#private;
|
|
9318
|
+
readonly config: Config;
|
|
9319
|
+
readonly source: Source;
|
|
9320
|
+
readonly events: EventTarget;
|
|
9321
|
+
constructor(config: Config, source?: Source);
|
|
9322
|
+
get sha(): Promise<string>;
|
|
9323
|
+
includedAtBuild(filePath: string): Promise<boolean>;
|
|
9324
|
+
resolve<Query extends GraphQuery>(query: Query): Promise<AnyQueryResult<Query>>;
|
|
9325
|
+
referencesTo(query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
9326
|
+
getTreeIfDifferent(sha: string): Promise<import("alinea/core/source/Tree").ReadonlyTree | undefined>;
|
|
9327
|
+
getBlobs(shas: ReadonlyArray<string>, options?: GetBlobsOptions): AsyncIterable<[sha: string, blob: Uint8Array<ArrayBufferLike>]>;
|
|
9328
|
+
sync(): Promise<string>;
|
|
9329
|
+
syncWith(remote: RemoteSource, options?: SyncOptions): Promise<string>;
|
|
9330
|
+
request(mutations: ReadonlyArray<Mutation>, policy?: Policy): Promise<CommitRequest>;
|
|
9331
|
+
mutate(mutations: Array<Mutation>): Promise<{
|
|
9332
|
+
sha: string;
|
|
9333
|
+
}>;
|
|
9334
|
+
write(request: CommitRequest): Promise<{
|
|
9335
|
+
sha: string;
|
|
9336
|
+
}>;
|
|
9337
|
+
prepareUpload(_file: string, _metadata?: UploadMetadata): Promise<UploadResponse>;
|
|
9338
|
+
close(): Promise<void>;
|
|
9339
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
9340
|
+
}
|
|
9341
|
+
|
|
9342
|
+
}
|
|
9343
|
+
|
|
9344
|
+
declare module 'alinea/database/query/Condition' {
|
|
9345
|
+
|
|
9346
|
+
import { type HasSql, type Sql } from 'rado';
|
|
9347
|
+
type FieldSql = (name: string) => HasSql;
|
|
9348
|
+
export function jsonField(target: HasSql, segments: Array<string>): HasSql<unknown>;
|
|
9349
|
+
/** Compile a condition; `depth` names the array items it iterates. */
|
|
9350
|
+
export function compileCondition(field: HasSql, condition: unknown, depth?: number): Sql<boolean>;
|
|
9351
|
+
export function compileFilter(filter: unknown, field: FieldSql): Sql<boolean>;
|
|
9352
|
+
export function arrayIncludes(field: HasSql, predicate: (item: HasSql) => Sql<boolean>, depth?: number): Sql<boolean>;
|
|
9353
|
+
export {};
|
|
9354
|
+
|
|
9355
|
+
}
|
|
9356
|
+
|
|
9357
|
+
declare module 'alinea/database/query/EntryQuery' {
|
|
9358
|
+
|
|
9359
|
+
import type { Config } from 'alinea/core/Config';
|
|
9360
|
+
import type { Field } from 'alinea/core/Field';
|
|
9361
|
+
import type { GraphQuery, Status } from 'alinea/core/Graph';
|
|
9362
|
+
import { type Scope } from 'alinea/core/Scope';
|
|
9363
|
+
import { type HasSql, type SelectionInput, type Sql } from 'rado';
|
|
9364
|
+
import { type EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9365
|
+
import { searchQuery, type EntrySearchTarget } from 'alinea/database/query/Search';
|
|
9366
|
+
interface RelationProjection {
|
|
9367
|
+
path: Array<string>;
|
|
9368
|
+
plan: ProjectionPlan;
|
|
9369
|
+
}
|
|
9370
|
+
interface FieldProjection {
|
|
9371
|
+
path: Array<string>;
|
|
9372
|
+
field: Field;
|
|
9373
|
+
}
|
|
9374
|
+
export interface ProjectionPlan {
|
|
9375
|
+
count: boolean;
|
|
9376
|
+
single: boolean;
|
|
9377
|
+
/** Rows carry the selection as `value`, next to the columns they need. */
|
|
9378
|
+
wrapped: boolean;
|
|
9379
|
+
relations: Array<RelationProjection>;
|
|
9380
|
+
fields: Array<FieldProjection>;
|
|
9381
|
+
}
|
|
9382
|
+
/** Rows visible under a query status; the default addresses published rows. */
|
|
9383
|
+
export function statusCondition(entry: EntryIndexTarget, status?: Status): Sql<boolean>;
|
|
9384
|
+
/**
|
|
9385
|
+
* Rows in one locale; null is unlocalized. Stored locales use the configured
|
|
9386
|
+
* spelling, so a requested locale matches any case of it.
|
|
9387
|
+
*/
|
|
9388
|
+
export function localeCondition(scope: Scope, entry: EntryIndexTarget, locale: string | null | HasSql<string | null>): Sql<boolean>;
|
|
9389
|
+
interface EntryQueryOptions {
|
|
9390
|
+
source?: EntryIndexTarget;
|
|
9391
|
+
search?: ReturnType<typeof searchQuery>;
|
|
9392
|
+
entry?: EntryIndexTarget;
|
|
9393
|
+
depth?: number;
|
|
9394
|
+
baseEntry?: EntryIndexTarget;
|
|
9395
|
+
searchTable?: EntrySearchTarget;
|
|
9396
|
+
}
|
|
9397
|
+
export function compileEntryQuery(config: Config, query: GraphQuery, options?: EntryQueryOptions): {
|
|
9398
|
+
rows: import("rado").Select<SelectionInput, import("rado/core/MetaData").QueryMeta>;
|
|
9399
|
+
plan: ProjectionPlan;
|
|
9400
|
+
};
|
|
9401
|
+
export {};
|
|
9402
|
+
|
|
9403
|
+
}
|
|
9404
|
+
|
|
9405
|
+
declare module 'alinea/database/query/EntryReferences' {
|
|
9406
|
+
|
|
9407
|
+
import type { Config } from 'alinea/core/Config';
|
|
9408
|
+
import type { EntryReferenceQuery, EntryReferenceResult } from 'alinea/core/db/EntryReference';
|
|
9409
|
+
import { type Database } from 'rado';
|
|
9410
|
+
import { type EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9411
|
+
/** Scan references in bounded pages on the caller's active transaction. */
|
|
9412
|
+
export function queryEntryReferences(config: Config, db: Database, entry: EntryIndexTarget, query: EntryReferenceQuery): Promise<EntryReferenceResult>;
|
|
9413
|
+
|
|
9414
|
+
}
|
|
9415
|
+
|
|
9416
|
+
declare module 'alinea/database/query/Relation' {
|
|
9417
|
+
|
|
9418
|
+
import type { EdgeQuery } from 'alinea/core/Graph';
|
|
9419
|
+
import { type Sql } from 'rado';
|
|
9420
|
+
import type { EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9421
|
+
/** Expand the stored references as SQL rows, retaining list order and duplicates. */
|
|
9422
|
+
export function linkRelation(source: EntryIndexTarget, field: string, multiple: boolean): {
|
|
9423
|
+
target: Sql<unknown>;
|
|
9424
|
+
id: Sql<string>;
|
|
9425
|
+
ordinal: Sql<number>;
|
|
9426
|
+
};
|
|
9427
|
+
/** Restrict related identities in SQL before the query's own filters/paging. */
|
|
9428
|
+
export function relationCondition(entry: EntryIndexTarget, query: EdgeQuery, source: EntryIndexTarget): Sql<boolean>;
|
|
9429
|
+
|
|
9430
|
+
}
|
|
9431
|
+
|
|
9432
|
+
declare module 'alinea/database/query/ResolveQuery' {
|
|
9433
|
+
|
|
9434
|
+
import type { Config } from 'alinea/core/Config';
|
|
9435
|
+
import type { GraphQuery } from 'alinea/core/Graph';
|
|
9436
|
+
import { type Database } from 'rado';
|
|
9437
|
+
import type { EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9438
|
+
import type { EntrySearchTarget, SearchQuery } from 'alinea/database/query/Search';
|
|
9439
|
+
/** Query dependencies bound to one connection and its current transaction. */
|
|
9440
|
+
export interface EntryQueryContext {
|
|
9441
|
+
config: Config;
|
|
9442
|
+
database: Database;
|
|
9443
|
+
entries: EntryIndexTarget;
|
|
9444
|
+
searchTable: EntrySearchTarget;
|
|
9445
|
+
search(input: GraphQuery['search']): Promise<SearchQuery | undefined>;
|
|
9446
|
+
includedAtBuild(filePath: string): boolean | Promise<boolean>;
|
|
9447
|
+
}
|
|
9448
|
+
export function resolveEntryQuery(query: GraphQuery, context: EntryQueryContext): Promise<unknown>;
|
|
9449
|
+
|
|
9450
|
+
}
|
|
9451
|
+
|
|
9452
|
+
declare module 'alinea/database/query/Search' {
|
|
9453
|
+
|
|
9454
|
+
import { type Database, type HasSql, type Sql, type Table } from 'rado';
|
|
9455
|
+
import type { EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9456
|
+
/**
|
|
9457
|
+
* The FTS5 index of an entry table. Sync writes a row for every entry version
|
|
9458
|
+
* under the rowid of its entry row; the body is the version's searchable text.
|
|
9459
|
+
*/
|
|
9460
|
+
const EntrySearchColumns: {
|
|
9461
|
+
rowid: import("rado").Column<number, [false, false]>;
|
|
9462
|
+
title: import("rado").Column<string, [false, boolean]>;
|
|
9463
|
+
body: import("rado").Column<string, [false, boolean]>;
|
|
9464
|
+
};
|
|
9465
|
+
export type EntrySearchTarget = Table<typeof EntrySearchColumns>;
|
|
9466
|
+
export function entrySearchTable(name: string, temporary?: boolean): EntrySearchTarget;
|
|
9467
|
+
export const EntrySearchTable: EntrySearchTarget;
|
|
9468
|
+
export interface SearchQuery {
|
|
9469
|
+
target: Sql;
|
|
9470
|
+
identity: Sql<boolean>;
|
|
9471
|
+
condition: Sql<boolean>;
|
|
9472
|
+
rank: Sql<number>;
|
|
9473
|
+
snippet(start: HasSql, end: HasSql, cutOff: HasSql, limit: HasSql): Sql<string>;
|
|
9474
|
+
}
|
|
9475
|
+
export function createSearch(db: Database, search: EntrySearchTarget): Promise<void>;
|
|
9476
|
+
/** The searchable text of an entry row, read from its search row. */
|
|
9477
|
+
export function searchableText(entry: EntryIndexTarget, search: EntrySearchTarget): Sql<string>;
|
|
9478
|
+
export function searchTokens(input: string | Array<string> | undefined): RegExpMatchArray | [] | undefined;
|
|
9479
|
+
export interface SearchQueryOptions {
|
|
9480
|
+
/** Indexed spellings a token may also match, besides its prefix. */
|
|
9481
|
+
alternatives?(token: string): ReadonlyArray<string>;
|
|
9482
|
+
}
|
|
9483
|
+
export function searchQuery(input: string | Array<string> | undefined, entry: EntryIndexTarget, target: EntrySearchTarget, options?: SearchQueryOptions): SearchQuery | undefined;
|
|
9484
|
+
/** The edits a token may be away from an indexed term: none below five
|
|
9485
|
+
* characters, one up to fourteen, then one more per ten. */
|
|
9486
|
+
export function fuzzyDistance(token: string): number;
|
|
9487
|
+
export function dropVocabulary(db: Database, search: EntrySearchTarget): Promise<void>;
|
|
9488
|
+
/**
|
|
9489
|
+
* The terms of one FTS5 table, loaded once per database revision. Query tokens
|
|
9490
|
+
* expand to indexed terms within a small edit distance, so a typo still
|
|
9491
|
+
* finds the entry.
|
|
9492
|
+
*/
|
|
9493
|
+
export class SearchVocabulary {
|
|
9494
|
+
#private;
|
|
9495
|
+
load(db: Database, search: EntrySearchTarget, revision: string): Promise<void>;
|
|
9496
|
+
/** Indexed terms close to a token, most frequent first; prefixes of the
|
|
9497
|
+
* token are left to the prefix match. */
|
|
9498
|
+
alternatives(token: string): Array<string>;
|
|
9499
|
+
}
|
|
9500
|
+
export {};
|
|
9501
|
+
|
|
9502
|
+
}
|
|
9503
|
+
|
|
9504
|
+
declare module 'alinea/database/sync/Derive' {
|
|
9505
|
+
|
|
9506
|
+
import type { Config } from 'alinea/core/Config';
|
|
9507
|
+
import { type SyncChanges } from 'alinea/database/sync/Ingest';
|
|
9508
|
+
import type { SyncQueries } from 'alinea/database/sync/SyncQueries';
|
|
9509
|
+
/**
|
|
9510
|
+
* Derive parents, statuses and urls for what a merge changed, and for what
|
|
9511
|
+
* inherits from it. Resolves to the sorted ids of every entry that changed.
|
|
9512
|
+
*/
|
|
9513
|
+
export function deriveEntries(config: Config, queries: SyncQueries, changes: SyncChanges, validate: boolean): Promise<Array<string>>;
|
|
9514
|
+
|
|
9515
|
+
}
|
|
9516
|
+
|
|
9517
|
+
declare module 'alinea/database/sync/EntryParser' {
|
|
9518
|
+
|
|
9519
|
+
import type { Config } from 'alinea/core/Config';
|
|
9520
|
+
import type { IndexedEntry } from 'alinea/database/entry/EntryTable';
|
|
9521
|
+
/** Parse one source blob into the entry fields that do not depend on its tree. */
|
|
9522
|
+
export function parseSourceEntry(config: Config, filePath: string, fileHash: string, blob: Uint8Array): IndexedEntry;
|
|
9523
|
+
|
|
9524
|
+
}
|
|
9525
|
+
|
|
9526
|
+
declare module 'alinea/database/sync/EntrySyncer' {
|
|
9527
|
+
|
|
9528
|
+
import type { Config } from 'alinea/core/Config';
|
|
9529
|
+
import type { RemoteSource } from 'alinea/core/source/Source';
|
|
9530
|
+
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
9531
|
+
import type { Database, Table } from 'rado';
|
|
9532
|
+
import { type DatabaseStateColumns } from 'alinea/database/DatabaseTables';
|
|
9533
|
+
import { type EntryIndexTarget } from 'alinea/database/entry/EntryTable';
|
|
9534
|
+
import { type EntrySearchTarget } from 'alinea/database/query/Search';
|
|
9535
|
+
export interface EntrySyncTarget {
|
|
9536
|
+
entries: EntryIndexTarget;
|
|
9537
|
+
state: Table<typeof DatabaseStateColumns>;
|
|
9538
|
+
/** The full-text index of the entries, written along with them. */
|
|
9539
|
+
search: EntrySearchTarget;
|
|
9540
|
+
/**
|
|
9541
|
+
* Whether the state records the synced source tree, so the database can be
|
|
9542
|
+
* reopened and synced from it. A temporary overlay keeps its tree in memory.
|
|
9543
|
+
*/
|
|
9544
|
+
recordsTree?: boolean;
|
|
9545
|
+
}
|
|
9546
|
+
export const EntrySyncRoot: EntrySyncTarget;
|
|
9547
|
+
export interface EntrySyncOptions {
|
|
9548
|
+
previousTree?: ReadonlyTree;
|
|
9549
|
+
withinTransaction?: boolean;
|
|
9550
|
+
/** Skip entry validation for a source whose entries were already validated. */
|
|
9551
|
+
validate?: boolean;
|
|
9552
|
+
}
|
|
9553
|
+
/** Prepared, serialized source synchronization for one database connection. */
|
|
9554
|
+
export class EntrySyncer {
|
|
9555
|
+
#private;
|
|
9556
|
+
constructor(config: Config, db: Database);
|
|
9557
|
+
/** Derive later syncs with another config; prepared statements are shared. */
|
|
9558
|
+
reconfigure(config: Config): Promise<void>;
|
|
9559
|
+
/** Stream a source/tree diff directly into the canonical SQLite table. */
|
|
9560
|
+
sync(target: EntrySyncTarget, source: RemoteSource, tree: ReadonlyTree, fromRevision: string, options?: EntrySyncOptions): Promise<Array<string>>;
|
|
9561
|
+
/** Release prepared statements belonging to a closed named target. */
|
|
9562
|
+
release(target: EntrySyncTarget): Promise<void>;
|
|
9563
|
+
close(): Promise<void>;
|
|
9564
|
+
}
|
|
9565
|
+
|
|
9566
|
+
}
|
|
9567
|
+
|
|
9568
|
+
declare module 'alinea/database/sync/Ingest' {
|
|
9569
|
+
|
|
9570
|
+
import type { Config } from 'alinea/core/Config';
|
|
9571
|
+
import type { RemoteSource } from 'alinea/core/source/Source';
|
|
9572
|
+
import { ReadonlyTree } from 'alinea/core/source/Tree';
|
|
9573
|
+
import { type SyncQueries } from 'alinea/database/sync/SyncQueries';
|
|
9574
|
+
/** What merging a source tree into the entry table changed. */
|
|
9575
|
+
export interface SyncChanges {
|
|
9576
|
+
/** Entries with a version that was added, replaced or removed. */
|
|
9577
|
+
touched: Set<string>;
|
|
9578
|
+
/** Versions written from their source file, with the url parsed from it. */
|
|
9579
|
+
inserted: Set<string>;
|
|
9580
|
+
/** Entries with a touched version that has children: those inherit from it. */
|
|
9581
|
+
parents: Set<string>;
|
|
9582
|
+
/** Child directories of removed or replaced versions that had children. */
|
|
9583
|
+
childDirs: Set<string>;
|
|
9584
|
+
/** Entries whose child directory changed in the source tree. */
|
|
9585
|
+
containers: Set<string>;
|
|
9586
|
+
}
|
|
9587
|
+
/** Whether a directory hash stands for a directory with files. */
|
|
9588
|
+
export function hasChildren(childrenSha: string | null): boolean;
|
|
9589
|
+
/** Write the files that differ between two source trees to the entry table. */
|
|
9590
|
+
export function mergeTrees(config: Config, source: RemoteSource, previousTree: ReadonlyTree, tree: ReadonlyTree, queries: SyncQueries): Promise<SyncChanges>;
|
|
9591
|
+
|
|
9592
|
+
}
|
|
9593
|
+
|
|
9594
|
+
declare module 'alinea/database/sync/SyncQueries' {
|
|
9595
|
+
|
|
9596
|
+
import type { EntryStatus } from 'alinea/core/Entry';
|
|
9597
|
+
import type { Tree } from 'alinea/core/source/Tree';
|
|
9598
|
+
import { type Database } from 'rado';
|
|
9599
|
+
import { type entryIndexRow } from 'alinea/database/entry/EntryTable';
|
|
9600
|
+
import type { EntrySyncTarget } from 'alinea/database/sync/EntrySyncer';
|
|
9601
|
+
export const sqliteBatchSize = 5000;
|
|
9602
|
+
/**
|
|
9603
|
+
* Named parameters bypass column encoders, so bind SQLite values explicitly for
|
|
9604
|
+
* the placeholders of {@link insertEntryQuery}.
|
|
9605
|
+
*/
|
|
9606
|
+
export function insertEntryValues(row: ReturnType<typeof entryIndexRow>): {
|
|
9607
|
+
versionId: string;
|
|
9608
|
+
id: string;
|
|
9609
|
+
locale: string | null;
|
|
9610
|
+
versionStatus: EntryStatus;
|
|
9611
|
+
status: EntryStatus;
|
|
9612
|
+
type: string;
|
|
9613
|
+
title: string;
|
|
9614
|
+
workspace: string;
|
|
9615
|
+
root: string;
|
|
9616
|
+
sourceRoot: string | null;
|
|
9617
|
+
parentId: string | null;
|
|
9618
|
+
level: number;
|
|
9619
|
+
index: string;
|
|
9620
|
+
path: string;
|
|
9621
|
+
filePath: string;
|
|
9622
|
+
fileHash: string;
|
|
9623
|
+
parentDir: string;
|
|
9624
|
+
childrenDir: string;
|
|
9625
|
+
url: string;
|
|
9626
|
+
seeded: string | null;
|
|
9627
|
+
rowHash: string;
|
|
9628
|
+
childrenSha: string | null;
|
|
9629
|
+
payload: string | null;
|
|
9630
|
+
data: string;
|
|
9631
|
+
parents: string;
|
|
9632
|
+
active: number;
|
|
9633
|
+
main: number;
|
|
9634
|
+
visible: number;
|
|
9635
|
+
};
|
|
9636
|
+
export function prepareSyncQueries(db: Database, target: EntrySyncTarget,
|
|
9637
|
+
/** Store entry data as JSONB, on a SQLite that reads it. */
|
|
9638
|
+
jsonb: boolean): {
|
|
9639
|
+
revision: import("rado").PreparedQuery<{
|
|
9640
|
+
revision: string;
|
|
9641
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9642
|
+
tree: import("rado").PreparedQuery<{
|
|
9643
|
+
tree: Tree;
|
|
9644
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9645
|
+
setRevision: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9646
|
+
entryCount: import("rado").PreparedQuery<{
|
|
9647
|
+
value: number;
|
|
9648
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9649
|
+
insertEntry: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9650
|
+
/** Index the entry row inserted last, under its rowid. */
|
|
9651
|
+
insertSearch: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9652
|
+
/** Versions stored at these file paths or under these version ids. */
|
|
9653
|
+
storedFiles: import("rado").PreparedQuery<{
|
|
9654
|
+
id: string;
|
|
9655
|
+
filePath: string;
|
|
9656
|
+
childrenDir: string;
|
|
9657
|
+
childrenSha: string | null;
|
|
9658
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9659
|
+
/** Delete the versions stored at these file paths or version ids. */
|
|
9660
|
+
deleteFiles: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9661
|
+
/** Delete the search rows of those versions, before the versions. */
|
|
9662
|
+
deleteSearch: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9663
|
+
directories: import("rado").PreparedQuery<{
|
|
9664
|
+
id: string;
|
|
9665
|
+
childrenDir: string;
|
|
9666
|
+
childrenSha: string | null;
|
|
9667
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9668
|
+
updateChildrenSha: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9669
|
+
/** Every version of these entries. */
|
|
9670
|
+
versionsOf: import("rado").PreparedQuery<{
|
|
9671
|
+
versionId: string;
|
|
9672
|
+
id: string;
|
|
9673
|
+
locale: string | null;
|
|
9674
|
+
versionStatus: EntryStatus;
|
|
9675
|
+
type: string;
|
|
9676
|
+
index: string;
|
|
9677
|
+
workspace: string;
|
|
9678
|
+
root: string;
|
|
9679
|
+
path: string;
|
|
9680
|
+
filePath: string;
|
|
9681
|
+
level: number;
|
|
9682
|
+
parentDir: string;
|
|
9683
|
+
childrenDir: string;
|
|
9684
|
+
childrenSha: string | null;
|
|
9685
|
+
parentId: string | null;
|
|
9686
|
+
parents: string[];
|
|
9687
|
+
status: EntryStatus;
|
|
9688
|
+
active: boolean;
|
|
9689
|
+
main: boolean;
|
|
9690
|
+
visible: boolean;
|
|
9691
|
+
url: string;
|
|
9692
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9693
|
+
/** Every version stored below one directory. */
|
|
9694
|
+
versionsBelow: import("rado").PreparedQuery<{
|
|
9695
|
+
versionId: string;
|
|
9696
|
+
id: string;
|
|
9697
|
+
locale: string | null;
|
|
9698
|
+
versionStatus: EntryStatus;
|
|
9699
|
+
type: string;
|
|
9700
|
+
index: string;
|
|
9701
|
+
workspace: string;
|
|
9702
|
+
root: string;
|
|
9703
|
+
path: string;
|
|
9704
|
+
filePath: string;
|
|
9705
|
+
level: number;
|
|
9706
|
+
parentDir: string;
|
|
9707
|
+
childrenDir: string;
|
|
9708
|
+
childrenSha: string | null;
|
|
9709
|
+
parentId: string | null;
|
|
9710
|
+
parents: string[];
|
|
9711
|
+
status: EntryStatus;
|
|
9712
|
+
active: boolean;
|
|
9713
|
+
main: boolean;
|
|
9714
|
+
visible: boolean;
|
|
9715
|
+
url: string;
|
|
9716
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9717
|
+
/** The entry owning each directory: children stored there have it as parent. */
|
|
9718
|
+
owners: import("rado").PreparedQuery<{
|
|
9719
|
+
childrenDir: string;
|
|
9720
|
+
id: string;
|
|
9721
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9722
|
+
statusesOf: import("rado").PreparedQuery<{
|
|
9723
|
+
id: string;
|
|
9724
|
+
locale: string | null;
|
|
9725
|
+
status: EntryStatus;
|
|
9726
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9727
|
+
dataOf: import("rado").PreparedQuery<{
|
|
9728
|
+
versionId: string;
|
|
9729
|
+
data: string;
|
|
9730
|
+
}[], Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9731
|
+
updateVersion: import("rado").PreparedQuery<import("rado/core/MetaData").MutationResultBase, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9732
|
+
/** An entry whose versions disagree on what all of them must share. */
|
|
9733
|
+
mismatchedEntry: import("rado").PreparedQuery<{
|
|
9734
|
+
id: string;
|
|
9735
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9736
|
+
/** A language whose versions disagree on their location. */
|
|
9737
|
+
mismatchedLanguage: import("rado").PreparedQuery<{
|
|
9738
|
+
id: string;
|
|
9739
|
+
locale: string | null;
|
|
9740
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9741
|
+
/** A language without exactly one active and one main version. */
|
|
9742
|
+
invalidStatus: import("rado").PreparedQuery<{
|
|
9743
|
+
id: string;
|
|
9744
|
+
locale: string | null;
|
|
9745
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9746
|
+
/** A version listed among its own parents. */
|
|
9747
|
+
cyclicVersion: import("rado").PreparedQuery<{
|
|
9748
|
+
filePath: string;
|
|
9749
|
+
}, Record<string, unknown>, import("rado/core/MetaData").QueryMeta>;
|
|
9750
|
+
free(): void;
|
|
9751
|
+
};
|
|
9752
|
+
export type SyncQueries = ReturnType<typeof prepareSyncQueries>;
|
|
9753
|
+
|
|
9754
|
+
}
|
|
9755
|
+
|
|
9756
|
+
declare module 'alinea/database/Version' {
|
|
9757
|
+
|
|
9758
|
+
/**
|
|
9759
|
+
* Bump when the SQLite schema or the data derived into generated databases
|
|
9760
|
+
* changes incompatibly. Generated database files and browser caches are keyed
|
|
9761
|
+
* by this version rather than the package version, so releases that keep the
|
|
9762
|
+
* schema reuse the databases that are already there.
|
|
9763
|
+
*/
|
|
9764
|
+
export const databaseVersion = 5;
|
|
9765
|
+
export const generatedDatabaseFile = "database-v5.sqlite";
|
|
9766
|
+
export function versionedCacheName(name: string): string;
|
|
9767
|
+
|
|
9768
|
+
}
|
|
9769
|
+
|
|
8817
9770
|
declare module 'alinea/edit' {
|
|
8818
9771
|
|
|
8819
9772
|
import type { Reference } from 'alinea/core/Reference';
|
|
@@ -9459,6 +10412,11 @@ declare module 'alinea/field/list/ListField' {
|
|
|
9459
10412
|
inline?: boolean;
|
|
9460
10413
|
/** Hide this list field */
|
|
9461
10414
|
hidden?: boolean;
|
|
10415
|
+
/** Mark the field as invalid while it has fewer items */
|
|
10416
|
+
min?: number;
|
|
10417
|
+
/** Hide the create actions once the list has this many items and mark
|
|
10418
|
+
* the field as invalid while it has more */
|
|
10419
|
+
max?: number;
|
|
9462
10420
|
/** The initial value of the field */
|
|
9463
10421
|
initialValue?: Array<InferStoredValue<Definitions>>;
|
|
9464
10422
|
/** Validate the given value */
|
|
@@ -9479,6 +10437,7 @@ declare module 'alinea/field/list/ListField.stories' {
|
|
|
9479
10437
|
|
|
9480
10438
|
import '#/theme.css';
|
|
9481
10439
|
export function Example(): import("react").JSX.Element | null;
|
|
10440
|
+
export function MinMax(): import("react").JSX.Element;
|
|
9482
10441
|
const _default: {
|
|
9483
10442
|
title: string;
|
|
9484
10443
|
};
|
|
@@ -9602,6 +10561,7 @@ declare module 'alinea/field/metadata/MetadataField' {
|
|
|
9602
10561
|
import type { FieldOptions } from 'alinea/core/Field';
|
|
9603
10562
|
import { RecordField } from 'alinea/core/field/RecordField';
|
|
9604
10563
|
import { ScalarField } from 'alinea/core/field/ScalarField';
|
|
10564
|
+
import { type Section, type SectionData } from 'alinea/core/Section';
|
|
9605
10565
|
import { Type } from 'alinea/core/Type';
|
|
9606
10566
|
import { type ImageField, type ImageLink } from 'alinea/field/link';
|
|
9607
10567
|
import { type ObjectField } from 'alinea/field/object';
|
|
@@ -9614,19 +10574,23 @@ declare module 'alinea/field/metadata/MetadataField' {
|
|
|
9614
10574
|
export interface MetadataUserOptions extends FieldOptions<MetadataAuditUser> {
|
|
9615
10575
|
width?: number;
|
|
9616
10576
|
}
|
|
9617
|
-
export interface
|
|
10577
|
+
export interface MetadataSeoFields {
|
|
9618
10578
|
title: TextField;
|
|
9619
10579
|
description: TextField;
|
|
9620
|
-
aliases: AliasesField;
|
|
9621
10580
|
openGraph: ObjectField<{
|
|
9622
10581
|
image: ImageField;
|
|
9623
10582
|
title: TextField;
|
|
9624
10583
|
description: TextField;
|
|
9625
10584
|
}>;
|
|
10585
|
+
}
|
|
10586
|
+
export interface MetadataDetailsFields {
|
|
9626
10587
|
createdAt: MetadataTimestampField;
|
|
9627
10588
|
createdBy: MetadataUserField;
|
|
9628
10589
|
updatedAt: MetadataTimestampField;
|
|
9629
10590
|
updatedBy: MetadataUserField;
|
|
10591
|
+
aliases: AliasesField;
|
|
10592
|
+
}
|
|
10593
|
+
export interface MetadataFields extends MetadataSeoFields, MetadataDetailsFields {
|
|
9630
10594
|
}
|
|
9631
10595
|
export interface MetadataAuditUser {
|
|
9632
10596
|
name: string;
|
|
@@ -9648,6 +10612,15 @@ declare module 'alinea/field/metadata/MetadataField' {
|
|
|
9648
10612
|
}
|
|
9649
10613
|
export interface MetadataOptions extends FieldOptions<Metadata> {
|
|
9650
10614
|
fields: Type<MetadataFields>;
|
|
10615
|
+
seo: Type<MetadataSeoFields>;
|
|
10616
|
+
details: Type<MetadataDetailsFields>;
|
|
10617
|
+
/** The details are rendered by a separate `metadataDetails` section */
|
|
10618
|
+
detailsSection?: boolean;
|
|
10619
|
+
}
|
|
10620
|
+
export interface MetadataConfig {
|
|
10621
|
+
/** Leave the details out of the field view, render them with
|
|
10622
|
+
* `metadataDetails(field)` instead */
|
|
10623
|
+
detailsSection?: boolean;
|
|
9651
10624
|
}
|
|
9652
10625
|
export class MetadataField extends RecordField<Metadata, MetadataOptions> {
|
|
9653
10626
|
}
|
|
@@ -9657,12 +10630,24 @@ declare module 'alinea/field/metadata/MetadataField' {
|
|
|
9657
10630
|
}
|
|
9658
10631
|
export class MetadataUserField extends ScalarField<MetadataAuditUser, MetadataUserOptions> {
|
|
9659
10632
|
}
|
|
9660
|
-
export function metadata(label?: string): MetadataField;
|
|
10633
|
+
export function metadata(label?: string, { detailsSection }?: MetadataConfig): MetadataField;
|
|
10634
|
+
export class MetadataDetailsSection implements SectionData {
|
|
10635
|
+
field: MetadataField;
|
|
10636
|
+
view: string;
|
|
10637
|
+
definition: {};
|
|
10638
|
+
fields: {};
|
|
10639
|
+
sections: never[];
|
|
10640
|
+
constructor(field: MetadataField);
|
|
10641
|
+
}
|
|
10642
|
+
/** Renders the created/updated details and aliases of a metadata field
|
|
10643
|
+
* created with `detailsSection: true` */
|
|
10644
|
+
export function metadataDetails(field: MetadataField): Section;
|
|
9661
10645
|
|
|
9662
10646
|
}
|
|
9663
10647
|
|
|
9664
10648
|
declare module 'alinea/field/metadata/MetadataField.view' {
|
|
9665
10649
|
|
|
10650
|
+
import { Section } from 'alinea/core/Section';
|
|
9666
10651
|
import { MetadataField, MetadataTimestampField, MetadataUserField } from 'alinea/field/metadata';
|
|
9667
10652
|
export interface MetadataFieldViewProps {
|
|
9668
10653
|
field: MetadataField;
|
|
@@ -9676,6 +10661,10 @@ declare module 'alinea/field/metadata/MetadataField.view' {
|
|
|
9676
10661
|
}
|
|
9677
10662
|
export function MetadataUserFieldView({ field }: MetadataUserFieldViewProps): import("react").JSX.Element;
|
|
9678
10663
|
export function MetadataFieldView({ field }: MetadataFieldViewProps): import("react").JSX.Element;
|
|
10664
|
+
export interface MetadataDetailsViewProps {
|
|
10665
|
+
section: Section;
|
|
10666
|
+
}
|
|
10667
|
+
export function MetadataDetailsView({ section }: MetadataDetailsViewProps): import("react").JSX.Element;
|
|
9679
10668
|
|
|
9680
10669
|
}
|
|
9681
10670
|
|
|
@@ -9930,6 +10919,7 @@ declare module 'alinea/field/richtext/PickTextAnchor' {
|
|
|
9930
10919
|
declare module 'alinea/field/richtext/PickTextLink' {
|
|
9931
10920
|
|
|
9932
10921
|
import { Reference } from 'alinea/core/Reference';
|
|
10922
|
+
import type { EntryPickerConditions } from 'alinea/picker/entry/EntryPicker';
|
|
9933
10923
|
export interface PickerValue {
|
|
9934
10924
|
link?: Reference;
|
|
9935
10925
|
alt?: string;
|
|
@@ -9959,9 +10949,10 @@ declare module 'alinea/field/richtext/PickTextLink' {
|
|
|
9959
10949
|
}
|
|
9960
10950
|
export interface PickTextLinkProps {
|
|
9961
10951
|
picker: PickTextLinkState;
|
|
10952
|
+
linkOptions?: EntryPickerConditions;
|
|
9962
10953
|
}
|
|
9963
10954
|
export function usePickTextLink(): PickTextLinkState;
|
|
9964
|
-
export function PickTextLink({ picker }: PickTextLinkProps): import("react").JSX.Element | null;
|
|
10955
|
+
export function PickTextLink({ picker, linkOptions }: PickTextLinkProps): import("react").JSX.Element | null;
|
|
9965
10956
|
|
|
9966
10957
|
}
|
|
9967
10958
|
|
|
@@ -10104,7 +11095,7 @@ declare module 'alinea/field/richtext/RichTextExtensions' {
|
|
|
10104
11095
|
Highlight: import("@tiptap/core").Mark<import("@tiptap/extension-highlight").HighlightOptions, any>;
|
|
10105
11096
|
UndoRedo: Extension<import("@tiptap/extensions").UndoRedoOptions, any>;
|
|
10106
11097
|
};
|
|
10107
|
-
export function defaultExtensionConfig(getEntryAnchors?: () => Iterable<string>, enableImageResize?: boolean): {
|
|
11098
|
+
export function defaultExtensionConfig(getEntryAnchors?: () => Iterable<string>, enableImageResize?: boolean, enableTables?: boolean): {
|
|
10108
11099
|
Document: TipTapNode<any, any>;
|
|
10109
11100
|
Text: TipTapNode<any, any>;
|
|
10110
11101
|
Paragraph: TipTapNode<import("@tiptap/extension-paragraph").ParagraphOptions, any>;
|
|
@@ -10146,6 +11137,7 @@ declare module 'alinea/field/richtext/RichTextField' {
|
|
|
10146
11137
|
import { RichTextField } from 'alinea/core/field/RichTextField';
|
|
10147
11138
|
import type { Schema } from 'alinea/core/Schema';
|
|
10148
11139
|
import type { TextDoc } from 'alinea/core/TextDoc';
|
|
11140
|
+
import type { EntryPickerConditions } from 'alinea/picker/entry/EntryPicker';
|
|
10149
11141
|
import type { AnyExtension } from '@tiptap/core';
|
|
10150
11142
|
import type { ReactNode } from 'react';
|
|
10151
11143
|
import type { ToolbarConfig } from 'alinea/field/richtext/Toolbar';
|
|
@@ -10174,6 +11166,8 @@ declare module 'alinea/field/richtext/RichTextField' {
|
|
|
10174
11166
|
enableTables?: boolean;
|
|
10175
11167
|
/** Enable inserting and editing images */
|
|
10176
11168
|
enableImages?: boolean;
|
|
11169
|
+
/** Constrain the entries that can be picked when inserting a link */
|
|
11170
|
+
link?: EntryPickerConditions;
|
|
10177
11171
|
/** Configure the toolbar layout and items */
|
|
10178
11172
|
toolbar?: ToolbarConfig;
|
|
10179
11173
|
/** Configure tiptap extensions */
|
|
@@ -10745,16 +11739,17 @@ declare module 'alinea' {
|
|
|
10745
11739
|
|
|
10746
11740
|
declare module 'alinea/next' {
|
|
10747
11741
|
|
|
10748
|
-
export {
|
|
10749
|
-
export {
|
|
10750
|
-
export
|
|
11742
|
+
export type { SyncStatus } from 'alinea/adapter/next/cms';
|
|
11743
|
+
export type { NextHandlerOptions } from 'alinea/adapter/next/handler';
|
|
11744
|
+
export { createCMS, createHandler } from 'alinea/adapter/next/node';
|
|
10751
11745
|
export { withAlinea } from 'alinea/adapter/next/with-alinea';
|
|
11746
|
+
export type { AfterCommitContext, BeforeCommitContext } from 'alinea/backend/Handler';
|
|
10752
11747
|
|
|
10753
11748
|
}
|
|
10754
11749
|
|
|
10755
11750
|
declare module 'alinea/next.edge' {
|
|
10756
11751
|
|
|
10757
|
-
export { createCMS } from 'alinea/adapter/next/cms';
|
|
11752
|
+
export { createCMS, type SyncStatus } from 'alinea/adapter/next/cms';
|
|
10758
11753
|
export { createHandler, type NextHandlerOptions } from 'alinea/adapter/next/handler';
|
|
10759
11754
|
export type { AfterCommitContext, BeforeCommitContext } from 'alinea/backend/Handler';
|
|
10760
11755
|
|
|
@@ -10967,6 +11962,20 @@ declare module 'alinea/preview/RegisterPreview' {
|
|
|
10967
11962
|
declare module 'alinea/preview/widget' {
|
|
10968
11963
|
|
|
10969
11964
|
import type { DOMAttributes } from 'react';
|
|
11965
|
+
export interface PreviewStat {
|
|
11966
|
+
kind: 'query' | 'sync';
|
|
11967
|
+
summary: string;
|
|
11968
|
+
/** Whether the query was answered by the bundled database or the handler. */
|
|
11969
|
+
source?: 'database' | 'handler';
|
|
11970
|
+
durationMs: number;
|
|
11971
|
+
}
|
|
11972
|
+
/** The CMS work of one render, shown in the widget. */
|
|
11973
|
+
export interface PreviewStats {
|
|
11974
|
+
rows: Array<PreviewStat>;
|
|
11975
|
+
/** SQL statements run in this process for the render. */
|
|
11976
|
+
statements: number;
|
|
11977
|
+
sqlMs: number;
|
|
11978
|
+
}
|
|
10970
11979
|
export function registerPreviewWidget(): void;
|
|
10971
11980
|
global {
|
|
10972
11981
|
namespace JSX {
|
|
@@ -10975,6 +11984,8 @@ declare module 'alinea/preview/widget' {
|
|
|
10975
11984
|
adminUrl: string;
|
|
10976
11985
|
editUrl: string;
|
|
10977
11986
|
livePreview?: 'connected' | 'warning' | 'loading';
|
|
11987
|
+
/** JSON encoded PreviewStats */
|
|
11988
|
+
stats?: string;
|
|
10978
11989
|
};
|
|
10979
11990
|
}
|
|
10980
11991
|
}
|
|
@@ -11008,7 +12019,11 @@ declare module 'alinea/query' {
|
|
|
11008
12019
|
count?: true;
|
|
11009
12020
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11010
12021
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12022
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12023
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11011
12024
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12025
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12026
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11012
12027
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11013
12028
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11014
12029
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11043,7 +12058,11 @@ declare module 'alinea/query' {
|
|
|
11043
12058
|
count?: true;
|
|
11044
12059
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11045
12060
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12061
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12062
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11046
12063
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12064
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12065
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11047
12066
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11048
12067
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11049
12068
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11078,7 +12097,11 @@ declare module 'alinea/query' {
|
|
|
11078
12097
|
count?: true;
|
|
11079
12098
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11080
12099
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12100
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12101
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11081
12102
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12103
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12104
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11082
12105
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11083
12106
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11084
12107
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11113,7 +12136,11 @@ declare module 'alinea/query' {
|
|
|
11113
12136
|
count?: true;
|
|
11114
12137
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11115
12138
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12139
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12140
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11116
12141
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12142
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12143
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11117
12144
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11118
12145
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11119
12146
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11146,7 +12173,11 @@ declare module 'alinea/query' {
|
|
|
11146
12173
|
count?: true;
|
|
11147
12174
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11148
12175
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12176
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12177
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11149
12178
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12179
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12180
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11150
12181
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11151
12182
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11152
12183
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11178,7 +12209,11 @@ declare module 'alinea/query' {
|
|
|
11178
12209
|
count?: true;
|
|
11179
12210
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11180
12211
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12212
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12213
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11181
12214
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12215
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12216
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11182
12217
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11183
12218
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11184
12219
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|
|
@@ -11210,7 +12245,11 @@ declare module 'alinea/query' {
|
|
|
11210
12245
|
count?: true;
|
|
11211
12246
|
id?: import("alinea/core/Filter").Condition<string>;
|
|
11212
12247
|
parentId?: import("alinea/core/Filter").Condition<string | null>;
|
|
12248
|
+
versionStatus?: import("alinea/core/Filter").Condition<import("alinea/core/Entry").EntryStatus>;
|
|
12249
|
+
main?: import("alinea/core/Filter").Condition<boolean>;
|
|
11213
12250
|
path?: import("alinea/core/Filter").Condition<string>;
|
|
12251
|
+
filePath?: import("alinea/core/Filter").Condition<string>;
|
|
12252
|
+
seeded?: import("alinea/core/Filter").Condition<string | null>;
|
|
11214
12253
|
url?: import("alinea/core/Filter").Condition<string>;
|
|
11215
12254
|
alias?: import("alinea/core/Filter").Condition<string>;
|
|
11216
12255
|
createdAt?: import("alinea/core/Filter").Condition<number | null>;
|