alinea 2.0.0-preview.1 → 2.0.0-preview.3
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 +34 -7
- package/dist/adapter/next/DevRemote.d.ts +3 -0
- package/dist/adapter/next/DevRemote.js +37 -0
- package/dist/adapter/next/ForwardCredentials.d.ts +1 -0
- package/dist/adapter/next/ForwardCredentials.js +17 -0
- package/dist/adapter/next/cms.js +86 -38
- package/dist/adapter/next/context.d.ts +1 -1
- package/dist/adapter/next/context.js +11 -3
- package/dist/adapter/next/handler.d.ts +2 -0
- package/dist/adapter/next/handler.js +23 -16
- package/dist/adapter/next/previews.js +3 -1
- package/dist/adapter/next/previews.spec.d.ts +1 -0
- package/dist/adapter/next/with-alinea.js +18 -16
- package/dist/backend/Handler.d.ts +14 -13
- package/dist/backend/Handler.js +53 -22
- package/dist/backend/resolver/ParsePreview.d.ts +8 -4
- package/dist/backend/resolver/ParsePreview.js +40 -43
- package/dist/bundled.d.ts +318 -77
- package/dist/chunks/{chunk-LUBOGJCG.js → chunk-6V4TAD2N.js} +1 -1
- package/dist/chunks/{chunk-TL7ZW6BX.js → chunk-A3XXZBOQ.js} +2535 -2999
- package/dist/chunks/chunk-AC5ATYI3.js +1434 -0
- package/dist/chunks/{chunk-FRYHNUEK.js → chunk-HFBZMKIN.js} +6 -3
- package/dist/chunks/{chunk-7ORQ7BYK.js → chunk-KMLLLZ6X.js} +202 -269
- package/dist/chunks/{chunk-IWN3T3FL.js → chunk-O7XWTMCB.js} +1 -1
- package/dist/chunks/{chunk-53DZYORR.js → chunk-PAYSVIYI.js} +76 -176
- package/dist/chunks/{chunk-YK3OSMDM.js → chunk-S4AU6SRS.js} +188 -158
- package/dist/chunks/{chunk-I7X64JTZ.js → chunk-VXZM6V4P.js} +4 -4
- package/dist/cli/Generate.js +3 -13
- package/dist/cli/Serve.js +7 -3
- package/dist/cli/bin.js +8 -5
- package/dist/cli/generate/CopyStaticFiles.js +2 -3
- package/dist/cli/generate/DevDB.d.ts +1 -1
- package/dist/cli/generate/DevDB.js +3 -5
- package/dist/cli/serve/CreateLocalServer.d.ts +1 -1
- package/dist/cli/serve/CreateLocalServer.js +3 -2
- package/dist/cli/serve/DevServer.d.ts +3 -2
- package/dist/cli/serve/DevServer.js +60 -3
- package/dist/cli/serve/ServeContext.d.ts +1 -0
- package/dist/cli/serve/StartServer.d.ts +1 -0
- package/dist/cli/serve/StartServer.js +6 -1
- package/dist/cli/util/EnsureLibs.js +2 -2
- package/dist/cli/util/EnsureNode.js +2 -2
- package/dist/cloud/CloudRemote.js +1 -1
- package/dist/components/Breadcrumbs.js +6 -6
- package/dist/components/Button.js +6 -6
- package/dist/components/Calendar.js +13 -13
- package/dist/components/Checkbox.js +8 -8
- package/dist/components/CheckboxGroup.js +6 -6
- package/dist/components/ColorSwatch.js +6 -6
- package/dist/components/ColorSwatchPicker.js +6 -6
- package/dist/components/ComboBox.js +17 -17
- package/dist/components/DateField.js +7 -7
- package/dist/components/DatePicker.js +9 -9
- package/dist/components/DateRangePicker.js +14 -14
- package/dist/components/Dialog.js +6 -6
- package/dist/components/Disclosure.js +13 -13
- package/dist/components/DropZone.js +6 -6
- package/dist/components/Label.js +14 -14
- package/dist/components/Link.js +6 -6
- package/dist/components/List.js +34 -34
- package/dist/components/Menu.js +9 -9
- package/dist/components/Modal.js +9 -9
- package/dist/components/MultipleSelect.js +28 -28
- package/dist/components/NumberField.d.ts +2 -1
- package/dist/components/NumberField.js +22 -12
- package/dist/components/Popover.js +6 -6
- package/dist/components/ProgressCircle.js +9 -9
- package/dist/components/RadioGroup.js +6 -6
- package/dist/components/SearchField.js +14 -14
- package/dist/components/Select.js +16 -16
- package/dist/components/Surface.js +2 -2
- package/dist/components/Switch.js +8 -8
- package/dist/components/Table.js +14 -14
- package/dist/components/Tabs.js +9 -9
- package/dist/components/TagGroup.js +6 -6
- package/dist/components/TextField.js +10 -10
- package/dist/components/TimeField.js +8 -8
- package/dist/components/Toggle.js +8 -8
- package/dist/components/Toolbar.js +8 -8
- package/dist/components/Tooltip.js +9 -9
- package/dist/components/Tree.d.ts +4 -2
- package/dist/components/Tree.js +27 -13
- package/dist/core/Client.js +3 -2
- package/dist/core/Config.d.ts +4 -0
- package/dist/core/Config.js +6 -0
- package/dist/core/Connection.d.ts +2 -2
- package/dist/core/Connection.js +7 -0
- package/dist/core/Graph.d.ts +4 -5
- package/dist/core/Infer.d.ts +8 -1
- package/dist/core/ListRow.d.ts +2 -0
- package/dist/core/OrderBy.d.ts +7 -3
- package/dist/core/TextDoc.d.ts +11 -0
- package/dist/core/Trace.d.ts +8 -0
- package/dist/core/Trace.js +32 -0
- package/dist/core/db/CommitRequest.d.ts +0 -3
- package/dist/core/db/CommitRequest.js +0 -9
- package/dist/core/db/EntryAliases.js +1 -4
- package/dist/core/db/EntryDB.js +1 -1
- package/dist/core/db/EntryIndex.d.ts +10 -0
- package/dist/core/db/EntryIndex.js +117 -9
- package/dist/core/db/EntryResolver.js +110 -35
- package/dist/core/db/EntryTransaction.d.ts +1 -2
- package/dist/core/db/EntryTransaction.js +26 -13
- package/dist/core/db/LocalDB.d.ts +2 -3
- package/dist/core/db/LocalDB.js +24 -19
- package/dist/core/db/Operation.d.ts +2 -2
- package/dist/core/db/Operation.js +11 -1
- package/dist/core/field/RichTextField.d.ts +30 -3
- package/dist/core/field/RichTextField.js +125 -41
- package/dist/core/media/MediaAltField.d.ts +1 -0
- package/dist/core/media/MediaAltField.js +9 -1
- package/dist/core/source/OverlaySource.d.ts +12 -0
- package/dist/core/source/OverlaySource.js +50 -0
- package/dist/core/source/Source.d.ts +1 -1
- package/dist/core/source/Source.js +3 -3
- package/dist/dashboard/App.css +158 -0
- package/dist/dashboard/App.js +10 -4
- package/dist/dashboard/app/AccessDenied.d.ts +16 -1
- package/dist/dashboard/app/AccessDenied.js +20 -11
- package/dist/dashboard/app/ActivityStatus.js +15 -15
- package/dist/dashboard/app/AuthView.js +11 -11
- package/dist/dashboard/app/Badge.js +2 -2
- package/dist/dashboard/app/CompactField.js +12 -12
- package/dist/dashboard/app/DashboardErrorBoundary.js +4 -4
- package/dist/dashboard/app/DashboardLayout.js +22 -19
- package/dist/dashboard/app/EntryHeader.js +10 -10
- package/dist/dashboard/app/EntryReferences.js +10 -10
- package/dist/dashboard/app/EntrySidebar.d.ts +1 -1
- package/dist/dashboard/app/EntrySidebar.js +16 -15
- package/dist/dashboard/app/EntrySidebarPreview.d.ts +1 -1
- package/dist/dashboard/app/EntrySidebarPreview.js +60 -29
- package/dist/dashboard/app/EntrySidebarPreview.story.d.ts +6 -1
- package/dist/dashboard/app/EntryTranslationBanner.js +7 -7
- package/dist/dashboard/app/Explorer.d.ts +2 -1
- package/dist/dashboard/app/Explorer.js +63 -51
- package/dist/dashboard/app/ExplorerCards.js +51 -55
- package/dist/dashboard/app/ExplorerFileCard.js +20 -20
- package/dist/dashboard/app/ExplorerList.js +14 -14
- package/dist/dashboard/app/ExplorerModal.js +1 -1
- package/dist/dashboard/app/ExplorerTable.js +59 -59
- package/dist/dashboard/app/ExternalLinkPicker.js +15 -4
- package/dist/dashboard/app/LinkPicker.js +40 -15
- package/dist/dashboard/app/LocaleMenu.js +8 -8
- package/dist/dashboard/app/SidebarLayout.d.ts +8 -0
- package/dist/dashboard/app/SidebarLayout.js +1169 -0
- package/dist/dashboard/app/SidebarTree.js +56 -64
- package/dist/dashboard/app/WorkspaceMenu.js +14 -14
- package/dist/dashboard/app/WorkspaceRoots.js +24 -24
- package/dist/dashboard/app/editor/FileEditor.js +29 -30
- package/dist/dashboard/app/editor/FilePreview.js +6 -6
- package/dist/dashboard/app/editor/MediaAltField.view.d.ts +1 -1
- package/dist/dashboard/app/editor/MediaAltField.view.js +6 -9
- package/dist/dashboard/app/modals/CreateEntry.js +5 -5
- package/dist/dashboard/app/pages/EntryPage.js +49 -25
- package/dist/dashboard/app/pages/UsersPage.js +35 -35
- package/dist/dashboard/app/ui/DashboardModal.js +23 -23
- package/dist/dashboard/app/ui/Rail.js +3 -3
- package/dist/dashboard/app/ui/Sidebar.js +2 -2
- package/dist/dashboard/atoms/auth.js +2 -0
- package/dist/dashboard/atoms/dashboard.d.ts +9 -0
- package/dist/dashboard/atoms/dashboard.js +17 -0
- package/dist/dashboard/atoms/editor.d.ts +7 -1
- package/dist/dashboard/atoms/editor.js +4 -1
- package/dist/dashboard/atoms/entry.d.ts +3 -1
- package/dist/dashboard/atoms/entry.js +55 -15
- package/dist/dashboard/atoms/explorer.js +3 -8
- package/dist/dashboard/atoms/preview.d.ts +3 -0
- package/dist/dashboard/atoms/preview.js +18 -1
- package/dist/dashboard/hooks.d.ts +4 -2
- package/dist/dashboard/hooks.js +9 -5
- package/dist/dashboard/icons.d.ts +1 -0
- package/dist/dashboard/icons.js +10 -0
- package/dist/field/code/CodeField.view.js +13 -13
- package/dist/field/date/DateField.view.js +12 -2
- package/dist/field/link/EntryLink.d.ts +1 -1
- package/dist/field/link/EntryLink.js +1 -0
- package/dist/field/link/Link.js +3 -2
- package/dist/field/link/LinkField.d.ts +5 -0
- package/dist/field/link/LinkField.view.js +115 -87
- package/dist/field/list/ListField.view.js +22 -33
- package/dist/field/metadata/MetadataField.d.ts +2 -0
- package/dist/field/metadata/MetadataField.js +2 -1
- package/dist/field/metadata/MetadataField.view.js +18 -18
- package/dist/field/number/NumberField.d.ts +2 -0
- package/dist/field/number/NumberField.view.js +4 -2
- package/dist/field/richtext/PickTextLink.d.ts +7 -0
- package/dist/field/richtext/PickTextLink.js +104 -2
- package/dist/field/richtext/ReferenceLink.d.ts +4 -1
- package/dist/field/richtext/ReferenceLink.js +18 -4
- package/dist/field/richtext/RichTextBlock.js +2 -2
- package/dist/field/richtext/RichTextDocument.d.ts +7 -2
- package/dist/field/richtext/RichTextDocument.js +34 -5
- package/dist/field/richtext/RichTextExtensions.d.ts +3 -1
- package/dist/field/richtext/RichTextExtensions.js +2701 -7464
- package/dist/field/richtext/RichTextField.d.ts +4 -0
- package/dist/field/richtext/RichTextField.story.d.ts +4 -0
- package/dist/field/richtext/RichTextField.view.js +43 -20
- package/dist/field/richtext/RichTextInsertMenu.js +279 -493
- package/dist/field/richtext/RichTextToolbar.d.ts +5 -2
- package/dist/field/richtext/RichTextToolbar.js +38 -3
- package/dist/field/richtext/Toolbar.d.ts +19 -1
- package/dist/field/richtext/Toolbar.js +18 -13
- package/dist/field/richtext/extensions/Anchor.js +1 -1
- package/dist/field/richtext/extensions/Link.js +1 -1
- package/dist/field/richtext/extensions/Small.js +1 -1
- package/dist/field/select/SelectField.view.js +8 -6
- package/dist/index.css +240 -14
- package/dist/next.cjs +18 -16
- package/dist/next.d.ts +2 -1
- package/dist/next.edge.d.ts +2 -1
- package/dist/preview/PreviewMessage.d.ts +3 -0
- package/dist/preview/PreviewMessage.js +1 -0
- package/dist/preview/RegisterPreview.js +29 -9
- package/dist/preview/widget.js +6 -12
- package/dist/query.d.ts +7 -7
- package/dist/ui/RichText.d.ts +1 -0
- package/dist/ui/RichText.js +29 -2
- package/package.json +6 -3
- package/dist/chunks/{chunk-JFROOUG6.js → chunk-NIVGVRDS.js} +17 -17
package/dist/LICENSES.md
CHANGED
|
@@ -55,7 +55,7 @@ SOFTWARE.
|
|
|
55
55
|
|
|
56
56
|
===
|
|
57
57
|
|
|
58
|
-
# react-
|
|
58
|
+
# react-aria-components@1.17.0 (Apache-2.0)
|
|
59
59
|
|
|
60
60
|
Apache License
|
|
61
61
|
Version 2.0, January 2004
|
|
@@ -469,7 +469,34 @@ SOFTWARE.
|
|
|
469
469
|
|
|
470
470
|
===
|
|
471
471
|
|
|
472
|
-
#
|
|
472
|
+
# @tiptap/core@3.30.5 (MIT)
|
|
473
|
+
|
|
474
|
+
MIT License
|
|
475
|
+
|
|
476
|
+
Copyright (c) 2025, Tiptap GmbH
|
|
477
|
+
|
|
478
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
479
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
480
|
+
in the Software without restriction, including without limitation the rights
|
|
481
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
482
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
483
|
+
furnished to do so, subject to the following conditions:
|
|
484
|
+
|
|
485
|
+
The above copyright notice and this permission notice shall be included in all
|
|
486
|
+
copies or substantial portions of the Software.
|
|
487
|
+
|
|
488
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
489
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
490
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
491
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
492
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
493
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
494
|
+
SOFTWARE.
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
===
|
|
498
|
+
|
|
499
|
+
# react-stately@3.46.0 (Apache-2.0)
|
|
473
500
|
|
|
474
501
|
Apache License
|
|
475
502
|
Version 2.0, January 2004
|
|
@@ -937,7 +964,7 @@ SOFTWARE.
|
|
|
937
964
|
|
|
938
965
|
===
|
|
939
966
|
|
|
940
|
-
# @tiptap/
|
|
967
|
+
# @tiptap/extension-list@3.30.5 (MIT)
|
|
941
968
|
|
|
942
969
|
MIT License
|
|
943
970
|
|
|
@@ -964,11 +991,11 @@ SOFTWARE.
|
|
|
964
991
|
|
|
965
992
|
===
|
|
966
993
|
|
|
967
|
-
#
|
|
994
|
+
# use-sync-external-store@1.6.0 (MIT)
|
|
968
995
|
|
|
969
996
|
MIT License
|
|
970
997
|
|
|
971
|
-
Copyright (c)
|
|
998
|
+
Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
972
999
|
|
|
973
1000
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
974
1001
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1014,11 +1041,11 @@ IN THE SOFTWARE.
|
|
|
1014
1041
|
|
|
1015
1042
|
===
|
|
1016
1043
|
|
|
1017
|
-
#
|
|
1044
|
+
# fp16@1.0.0 (MIT)
|
|
1018
1045
|
|
|
1019
1046
|
MIT License
|
|
1020
1047
|
|
|
1021
|
-
Copyright (c)
|
|
1048
|
+
Copyright (c) 2021 Joel Gustafson
|
|
1022
1049
|
|
|
1023
1050
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
1024
1051
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import "../../chunks/chunk-CQ52GEHY.js";
|
|
2
|
+
|
|
3
|
+
// src/adapter/next/DevRemote.ts
|
|
4
|
+
import { composeBackend } from "alinea/backend/api/CreateBackend";
|
|
5
|
+
import { MissingCredentialsError } from "alinea/backend/Auth";
|
|
6
|
+
import { AuthResultType } from "alinea/cloud/AuthResult";
|
|
7
|
+
import { Client } from "alinea/core/Client";
|
|
8
|
+
function createDevRemote(context, config) {
|
|
9
|
+
const client = new Client({
|
|
10
|
+
config,
|
|
11
|
+
url: context.handlerUrl.href,
|
|
12
|
+
applyAuth: context.applyAuth
|
|
13
|
+
});
|
|
14
|
+
const auth = {
|
|
15
|
+
async authenticate() {
|
|
16
|
+
return Response.json({ type: AuthResultType.Authenticated });
|
|
17
|
+
},
|
|
18
|
+
async verify() {
|
|
19
|
+
const user = await client.user();
|
|
20
|
+
if (!user)
|
|
21
|
+
throw new MissingCredentialsError(
|
|
22
|
+
"Missing forwarded development authentication"
|
|
23
|
+
);
|
|
24
|
+
return { ...context, user, token: "dev" };
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const connection = {
|
|
28
|
+
getTreeIfDifferent: (sha) => client.getTreeIfDifferent(sha),
|
|
29
|
+
getBlobs: (shas, options) => client.getBlobs(shas, options),
|
|
30
|
+
write: (request) => client.write(request),
|
|
31
|
+
enrichUser: async (input) => input
|
|
32
|
+
};
|
|
33
|
+
return composeBackend(connection, auth);
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
createDevRemote
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function forwardDevelopmentCredentials(request: Request | undefined, apiKey: string, init?: RequestInit): RequestInit;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "../../chunks/chunk-CQ52GEHY.js";
|
|
2
|
+
|
|
3
|
+
// src/adapter/next/ForwardCredentials.ts
|
|
4
|
+
import { developmentKeyHeader } from "alinea/core/Connection";
|
|
5
|
+
import { Headers } from "@alinea/iso";
|
|
6
|
+
function forwardDevelopmentCredentials(request, apiKey, init) {
|
|
7
|
+
const headers = new Headers(init?.headers);
|
|
8
|
+
const cookie = request?.headers.get("cookie");
|
|
9
|
+
const authorization = request?.headers.get("authorization");
|
|
10
|
+
if (cookie) headers.set("cookie", cookie);
|
|
11
|
+
if (authorization) headers.set("authorization", authorization);
|
|
12
|
+
headers.set(developmentKeyHeader, apiKey);
|
|
13
|
+
return { ...init, headers };
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
forwardDevelopmentCredentials
|
|
17
|
+
};
|
package/dist/adapter/next/cms.js
CHANGED
|
@@ -4,14 +4,20 @@ import {
|
|
|
4
4
|
import "../../chunks/chunk-CQ52GEHY.js";
|
|
5
5
|
|
|
6
6
|
// src/adapter/next/cms.tsx
|
|
7
|
+
import {
|
|
8
|
+
applyPreview as applyPreviewUpdate,
|
|
9
|
+
decodePreviewRequest
|
|
10
|
+
} from "alinea/backend/resolver/ParsePreview";
|
|
7
11
|
import { createThrottledSync } from "alinea/backend/util/Syncable";
|
|
8
12
|
import { Client } from "alinea/core/Client";
|
|
9
13
|
import { CMS } from "alinea/core/CMS";
|
|
10
14
|
import { Config } from "alinea/core/Config";
|
|
11
15
|
import { LocalDB } from "alinea/core/db/LocalDB";
|
|
12
16
|
import { outcome } from "alinea/core/Outcome";
|
|
17
|
+
import { trace } from "alinea/core/Trace";
|
|
13
18
|
import { getPreviewPayloadFromCookies } from "alinea/preview/PreviewCookies";
|
|
14
19
|
import { Headers } from "@alinea/iso";
|
|
20
|
+
import { cache } from "react";
|
|
15
21
|
import { requestContext } from "./context.js";
|
|
16
22
|
import { jsx } from "react/jsx-runtime";
|
|
17
23
|
var NextCMS = class extends CMS {
|
|
@@ -22,46 +28,75 @@ var NextCMS = class extends CMS {
|
|
|
22
28
|
bundledDb = PLazy.from(async () => {
|
|
23
29
|
if (process.env.NEXT_RUNTIME === "edge")
|
|
24
30
|
throw new Error("Local DB is not supported in Edge runtime environments.");
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
let status = query.status;
|
|
33
|
-
const { handlerUrl, apiKey } = await requestContext(this.config);
|
|
34
|
-
const client = new Client({
|
|
35
|
-
config: this.config,
|
|
36
|
-
url: handlerUrl.href,
|
|
37
|
-
applyAuth: (init) => {
|
|
38
|
-
const headers = new Headers(init?.headers);
|
|
39
|
-
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
40
|
-
return { ...init, headers };
|
|
41
|
-
}
|
|
31
|
+
const span = trace(this.config, "alinea.next.cms.db");
|
|
32
|
+
return span(async () => {
|
|
33
|
+
const { generatedSource } = await import("alinea/backend/store/GeneratedSource");
|
|
34
|
+
const source = await generatedSource;
|
|
35
|
+
const db = new LocalDB(this.config, source);
|
|
36
|
+
await db.sync();
|
|
37
|
+
return db;
|
|
42
38
|
});
|
|
43
|
-
|
|
39
|
+
});
|
|
40
|
+
#applyPreview = cache(async () => {
|
|
41
|
+
const context = await requestContext(this.config);
|
|
42
|
+
const isEdge = process.env.NEXT_RUNTIME === "edge";
|
|
43
|
+
const { PHASE_PRODUCTION_BUILD } = await import("next/constants.js");
|
|
44
|
+
const isBuild = process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD;
|
|
45
|
+
const useLocalDb = !isEdge && (!context.isDev || isBuild);
|
|
44
46
|
const { cookies, draftMode } = await import("next/headers.js");
|
|
45
47
|
const [isDraft] = await outcome(async () => (await draftMode()).isEnabled);
|
|
46
|
-
if (isDraft)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
if (!isDraft)
|
|
49
|
+
return { context, hasPreview: false, isDraft, isBuild, useLocalDb };
|
|
50
|
+
const cookie = await cookies();
|
|
51
|
+
const payload = getPreviewPayloadFromCookies(cookie.getAll());
|
|
52
|
+
if (!payload)
|
|
53
|
+
return {
|
|
54
|
+
context,
|
|
55
|
+
hasPreview: false,
|
|
56
|
+
isDraft,
|
|
57
|
+
isBuild,
|
|
58
|
+
preview: void 0,
|
|
59
|
+
useLocalDb
|
|
60
|
+
};
|
|
61
|
+
let preview = { payload };
|
|
62
|
+
if (useLocalDb) {
|
|
63
|
+
const db = await this.bundledDb;
|
|
64
|
+
const decoded = await decodePreviewRequest(preview);
|
|
65
|
+
preview = await this.#prepareLocalPreview(db, decoded, context);
|
|
66
|
+
}
|
|
67
|
+
return { context, hasPreview: true, isDraft, isBuild, preview, useLocalDb };
|
|
68
|
+
});
|
|
69
|
+
async #prepareLocalPreview(db, decoded, context) {
|
|
70
|
+
if ("entry" in decoded) return decoded;
|
|
71
|
+
if (db.sha === decoded.contentHash) return applyPreviewUpdate(db, decoded);
|
|
72
|
+
const source = await db.source.getTree();
|
|
73
|
+
if (source.sha === decoded.contentHash) {
|
|
74
|
+
await db.sync();
|
|
75
|
+
return applyPreviewUpdate(db, decoded);
|
|
76
|
+
}
|
|
77
|
+
const applied = await applyPreviewUpdate(db, decoded);
|
|
78
|
+
if (applied) return applied;
|
|
79
|
+
await db.syncWith(createClient(this.config, context));
|
|
80
|
+
return applyPreviewUpdate(db, decoded);
|
|
81
|
+
}
|
|
82
|
+
async resolve(query) {
|
|
83
|
+
let status = query.status;
|
|
84
|
+
const { context, hasPreview, isDraft, isBuild, preview, useLocalDb } = await this.#applyPreview();
|
|
85
|
+
if (isDraft && !status) status = "preferDraft";
|
|
86
|
+
const request = { ...query, preview, status };
|
|
87
|
+
const client = createClient(this.config, context);
|
|
88
|
+
if (!useLocalDb) {
|
|
89
|
+
const span = trace(this.config, "alinea.cms.resolve.client");
|
|
90
|
+
return span(() => client.resolve(request));
|
|
51
91
|
}
|
|
52
|
-
const { PHASE_PRODUCTION_SERVER, PHASE_PRODUCTION_BUILD } = await import("next/constants.js");
|
|
53
|
-
const isEdge = process.env.NEXT_RUNTIME === "edge";
|
|
54
|
-
const isServer = process.env.NEXT_PHASE === PHASE_PRODUCTION_SERVER;
|
|
55
|
-
const isBuild = process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD;
|
|
56
|
-
const request = { preview, ...query, status };
|
|
57
|
-
const useLocalDb = !isEdge && (isServer || isBuild);
|
|
58
|
-
if (!useLocalDb) return client.resolve(request);
|
|
59
92
|
const db = await this.bundledDb;
|
|
60
|
-
|
|
93
|
+
const syncInterval = request.disableSync ? Number.POSITIVE_INFINITY : request.syncInterval ?? this.config.syncInterval;
|
|
94
|
+
if (hasPreview) return db.resolve(request);
|
|
95
|
+
if (!isBuild) await this.throttle(() => db.syncWith(client), syncInterval);
|
|
61
96
|
return db.resolve(request);
|
|
62
97
|
}
|
|
63
98
|
async #authenticatedClient() {
|
|
64
|
-
const
|
|
99
|
+
const context = await requestContext(this.config);
|
|
65
100
|
const authCookies = [];
|
|
66
101
|
try {
|
|
67
102
|
const { cookies } = await import("next/headers.js");
|
|
@@ -75,16 +110,16 @@ var NextCMS = class extends CMS {
|
|
|
75
110
|
}
|
|
76
111
|
return new Client({
|
|
77
112
|
config: this.config,
|
|
78
|
-
url: handlerUrl.href,
|
|
113
|
+
url: context.handlerUrl.href,
|
|
79
114
|
applyAuth: (init) => {
|
|
80
115
|
const headers = new Headers(init?.headers);
|
|
81
|
-
headers.set("Authorization", `Bearer ${apiKey}`);
|
|
82
116
|
if (authCookies.length) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
117
|
+
headers.set(
|
|
118
|
+
"Cookie",
|
|
119
|
+
authCookies.map(([name, value]) => `${name}=${value}`).join("; ")
|
|
120
|
+
);
|
|
86
121
|
}
|
|
87
|
-
return { ...init, headers };
|
|
122
|
+
return applyContextAuth(context, { ...init, headers });
|
|
88
123
|
}
|
|
89
124
|
});
|
|
90
125
|
}
|
|
@@ -126,6 +161,19 @@ var NextCMS = class extends CMS {
|
|
|
126
161
|
function createCMS(config) {
|
|
127
162
|
return new NextCMS(config);
|
|
128
163
|
}
|
|
164
|
+
function createClient(config, context) {
|
|
165
|
+
return new Client({
|
|
166
|
+
config,
|
|
167
|
+
url: context.handlerUrl.href,
|
|
168
|
+
applyAuth: (init) => applyContextAuth(context, init)
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function applyContextAuth(context, init) {
|
|
172
|
+
if (context.applyAuth) return context.applyAuth(init);
|
|
173
|
+
const headers = new Headers(init?.headers);
|
|
174
|
+
headers.set("Authorization", `Bearer ${context.apiKey}`);
|
|
175
|
+
return { ...init, headers };
|
|
176
|
+
}
|
|
129
177
|
export {
|
|
130
178
|
NextCMS,
|
|
131
179
|
createCMS
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Config } from 'alinea/core/Config';
|
|
2
2
|
import type { RequestContext } from 'alinea/core/Connection';
|
|
3
|
-
export declare function requestContext(config: Config): Promise<RequestContext>;
|
|
3
|
+
export declare function requestContext(config: Config, request?: Request): Promise<RequestContext>;
|
|
@@ -3,16 +3,24 @@ import "../../chunks/chunk-CQ52GEHY.js";
|
|
|
3
3
|
// src/adapter/next/context.ts
|
|
4
4
|
import { generatedRelease } from "alinea/backend/store/GeneratedRelease";
|
|
5
5
|
import { Config } from "alinea/core/Config";
|
|
6
|
-
|
|
6
|
+
import { forwardDevelopmentCredentials } from "./ForwardCredentials.js";
|
|
7
|
+
async function requestContext(config, request) {
|
|
7
8
|
const apiKey = process.env.ALINEA_API_KEY || (process.env.NODE_ENV === "development" ? "dev" : await generatedRelease);
|
|
8
9
|
const dev = process.env.ALINEA_DEV_SERVER;
|
|
9
|
-
if (dev)
|
|
10
|
+
if (dev) {
|
|
11
|
+
return {
|
|
12
|
+
isDev: true,
|
|
13
|
+
handlerUrl: new URL("/api", dev),
|
|
14
|
+
apiKey,
|
|
15
|
+
applyAuth: (init) => forwardDevelopmentCredentials(request, apiKey, init)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
10
18
|
const nodeEnv = process.env.NODE_ENV;
|
|
11
19
|
const baseUrl = Config.baseUrl(config, nodeEnv);
|
|
12
20
|
if (!baseUrl) throw new Error(`Missing baseUrl in config for ${nodeEnv}`);
|
|
13
21
|
return {
|
|
14
22
|
isDev: false,
|
|
15
|
-
handlerUrl: new URL(
|
|
23
|
+
handlerUrl: new URL(Config.handlerUrl(config), baseUrl),
|
|
16
24
|
apiKey
|
|
17
25
|
};
|
|
18
26
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type BackendFactory, type BackendOptions } from 'alinea/backend/api/CreateBackend';
|
|
2
2
|
import { type HandlerHooks } from 'alinea/backend/Handler';
|
|
3
|
+
import { Config } from 'alinea/core/Config';
|
|
3
4
|
import { NextCMS } from './cms.js';
|
|
4
5
|
type Handler = (request: Request) => Promise<Response>;
|
|
5
6
|
export interface NextHandlerOptions extends HandlerHooks {
|
|
@@ -7,4 +8,5 @@ export interface NextHandlerOptions extends HandlerHooks {
|
|
|
7
8
|
backend?: BackendFactory | BackendOptions;
|
|
8
9
|
}
|
|
9
10
|
export declare function createHandler(input: NextCMS | NextHandlerOptions): Handler;
|
|
11
|
+
export declare function handlerPathname(config: Config, requestUrl: URL): string;
|
|
10
12
|
export {};
|
|
@@ -13,22 +13,26 @@ import {
|
|
|
13
13
|
import { generatedSource } from "alinea/backend/store/GeneratedSource";
|
|
14
14
|
import { JWTPreviews } from "alinea/backend/util/JWTPreviews";
|
|
15
15
|
import { CloudRemote } from "alinea/cloud/CloudRemote";
|
|
16
|
+
import { Config } from "alinea/core/Config";
|
|
16
17
|
import { LocalDB } from "alinea/core/db/LocalDB";
|
|
18
|
+
import { trace } from "alinea/core/Trace";
|
|
17
19
|
import { NextCMS } from "./cms.js";
|
|
18
20
|
import { requestContext } from "./context.js";
|
|
19
|
-
|
|
21
|
+
import { createDevRemote } from "./DevRemote.js";
|
|
20
22
|
function createHandler(input) {
|
|
21
23
|
const options = input instanceof NextCMS ? { cms: input } : input;
|
|
22
|
-
if (handlers.has(options.cms)) return handlers.get(options.cms);
|
|
23
24
|
const config = options.cms.config;
|
|
24
25
|
const backend = typeof options.backend === "function" ? options.backend : options.backend ? backendFromOptions(options.backend) : (context) => new CloudRemote(context, config);
|
|
25
|
-
const remote = (context) => backend(context, config);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const remote = (context) => context.isDev ? createDevRemote(context, config) : backend(context, config);
|
|
27
|
+
const span = trace(config, "alinea.next.handler.db");
|
|
28
|
+
const db = PLazy.from(
|
|
29
|
+
() => span(async () => {
|
|
30
|
+
const source = await generatedSource;
|
|
31
|
+
const db2 = new LocalDB(config, source);
|
|
32
|
+
await db2.sync();
|
|
33
|
+
return db2;
|
|
34
|
+
})
|
|
35
|
+
);
|
|
32
36
|
const handleBackend = createCoreHandler({
|
|
33
37
|
...options,
|
|
34
38
|
remote,
|
|
@@ -37,9 +41,9 @@ function createHandler(input) {
|
|
|
37
41
|
const handle = async (request) => {
|
|
38
42
|
const url = new URL(request.url);
|
|
39
43
|
const { searchParams } = url;
|
|
40
|
-
const context = await requestContext(config);
|
|
41
|
-
const handlerPath = config
|
|
42
|
-
if (
|
|
44
|
+
const context = await requestContext(config, request);
|
|
45
|
+
const handlerPath = handlerPathname(config, url);
|
|
46
|
+
if (url.pathname !== handlerPath)
|
|
43
47
|
return new Response(`Expected handler to be served on ${handlerPath}`, {
|
|
44
48
|
status: 400
|
|
45
49
|
});
|
|
@@ -48,7 +52,8 @@ function createHandler(input) {
|
|
|
48
52
|
const previewToken = searchParams.get("preview");
|
|
49
53
|
if (previewToken) {
|
|
50
54
|
const { draftMode } = await import("next/headers");
|
|
51
|
-
await
|
|
55
|
+
const dm = await draftMode();
|
|
56
|
+
if (!dm.isEnabled) await previews.verify(previewToken);
|
|
52
57
|
const source = new URL(request.url);
|
|
53
58
|
if (source.hostname === "0.0.0.0") source.hostname = "localhost";
|
|
54
59
|
const returnTo = searchParams.get("returnTo") ?? "/";
|
|
@@ -57,7 +62,6 @@ function createHandler(input) {
|
|
|
57
62
|
const location = new URL(returnTo, source.origin);
|
|
58
63
|
if (location.origin !== source.origin)
|
|
59
64
|
throw new Error("Invalid preview return origin");
|
|
60
|
-
const dm = await draftMode();
|
|
61
65
|
dm.enable();
|
|
62
66
|
return new Response("Redirecting...", {
|
|
63
67
|
status: 302,
|
|
@@ -70,9 +74,12 @@ function createHandler(input) {
|
|
|
70
74
|
return new Response("Internal server error", { status: 500 });
|
|
71
75
|
}
|
|
72
76
|
};
|
|
73
|
-
handlers.set(options.cms, handle);
|
|
74
77
|
return handle;
|
|
75
78
|
}
|
|
79
|
+
function handlerPathname(config, requestUrl) {
|
|
80
|
+
return new URL(Config.handlerUrl(config), requestUrl).pathname;
|
|
81
|
+
}
|
|
76
82
|
export {
|
|
77
|
-
createHandler
|
|
83
|
+
createHandler,
|
|
84
|
+
handlerPathname
|
|
78
85
|
};
|
|
@@ -37,12 +37,14 @@ function NextPreviews({
|
|
|
37
37
|
if (widget) registerPreviewWidget();
|
|
38
38
|
}, [widget]);
|
|
39
39
|
if (!widget) return null;
|
|
40
|
+
const isFullPage = window.parent === window;
|
|
41
|
+
if (isFullPage && isPreviewing && !previewDisabled) return null;
|
|
40
42
|
return /* @__PURE__ */ jsx(
|
|
41
43
|
"alinea-preview",
|
|
42
44
|
{
|
|
43
45
|
adminUrl: String(adminUrl),
|
|
44
46
|
editUrl: String(editUrl),
|
|
45
|
-
livePreview: isLoading ? "loading" :
|
|
47
|
+
livePreview: isPreviewing ? isLoading ? "loading" : previewDisabled ? "warning" : "connected" : void 0
|
|
46
48
|
}
|
|
47
49
|
);
|
|
48
50
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -10,12 +10,13 @@ function createCMS() {
|
|
|
10
10
|
);
|
|
11
11
|
}
|
|
12
12
|
function withAlinea(config = {}) {
|
|
13
|
-
const
|
|
14
|
-
if (!
|
|
13
|
+
const settings = resolveSettings(config);
|
|
14
|
+
if (!settings) {
|
|
15
15
|
console.warn(
|
|
16
|
-
"Alinea dashboard settings
|
|
16
|
+
"Alinea dashboard settings were not provided; dashboard routing is disabled. Run Next.js through the Alinea CLI."
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
|
+
const adminPath = settings?.adminPath;
|
|
19
20
|
let nextVersion = 15;
|
|
20
21
|
try {
|
|
21
22
|
const require2 = createRequire(resolve("./index.js"));
|
|
@@ -39,6 +40,10 @@ function withAlinea(config = {}) {
|
|
|
39
40
|
};
|
|
40
41
|
const redirects = adminPath ? createRedirects(config, adminPath) : config.redirects;
|
|
41
42
|
const rewrites = adminPath ? createRewrites(config, adminPath) : config.rewrites;
|
|
43
|
+
const env = settings ? {
|
|
44
|
+
...config.env,
|
|
45
|
+
ALINEA_ADMIN_PATH: settings.adminPath
|
|
46
|
+
} : config.env;
|
|
42
47
|
if (nextVersion < 15)
|
|
43
48
|
return {
|
|
44
49
|
...config,
|
|
@@ -51,7 +56,8 @@ function withAlinea(config = {}) {
|
|
|
51
56
|
},
|
|
52
57
|
images,
|
|
53
58
|
redirects,
|
|
54
|
-
rewrites
|
|
59
|
+
rewrites,
|
|
60
|
+
env
|
|
55
61
|
};
|
|
56
62
|
return {
|
|
57
63
|
...config,
|
|
@@ -61,7 +67,8 @@ function withAlinea(config = {}) {
|
|
|
61
67
|
],
|
|
62
68
|
images,
|
|
63
69
|
redirects,
|
|
64
|
-
rewrites
|
|
70
|
+
rewrites,
|
|
71
|
+
env
|
|
65
72
|
};
|
|
66
73
|
}
|
|
67
74
|
function createRedirects(config, adminPath) {
|
|
@@ -124,17 +131,12 @@ function createRewrites(config, adminPath) {
|
|
|
124
131
|
};
|
|
125
132
|
};
|
|
126
133
|
}
|
|
127
|
-
function
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
);
|
|
134
|
-
if (typeof settings.adminPath === "string" && settings.adminPath)
|
|
135
|
-
return normalizeBasePath(settings.adminPath);
|
|
136
|
-
} catch {
|
|
137
|
-
}
|
|
134
|
+
function resolveSettings(config) {
|
|
135
|
+
const adminPath = config.env?.ALINEA_ADMIN_PATH ?? process.env.ALINEA_ADMIN_PATH;
|
|
136
|
+
if (!adminPath) return;
|
|
137
|
+
return {
|
|
138
|
+
adminPath: normalizeBasePath(adminPath)
|
|
139
|
+
};
|
|
138
140
|
}
|
|
139
141
|
function normalizeBasePath(value) {
|
|
140
142
|
return value.startsWith("/") ? value : `/${value}`;
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import type { Entry } from 'alinea/core';
|
|
2
1
|
import type { CMS } from 'alinea/core/CMS';
|
|
3
|
-
import type { RemoteConnection, RequestContext } from 'alinea/core/Connection';
|
|
4
|
-
import
|
|
2
|
+
import type { AuthedContext, RemoteConnection, RequestContext } from 'alinea/core/Connection';
|
|
3
|
+
import { LocalDB } from 'alinea/core/db/LocalDB';
|
|
4
|
+
import type { Mutation } from 'alinea/core/db/Mutation';
|
|
5
5
|
export interface Handler {
|
|
6
6
|
(request: Request, context: RequestContext): Promise<Response>;
|
|
7
7
|
}
|
|
8
|
-
export type HookResponse<T = void> = void | T | Promise<
|
|
8
|
+
export type HookResponse<T = void> = void | T | Promise<void | T>;
|
|
9
|
+
export interface BeforeCommitContext {
|
|
10
|
+
mutations: ReadonlyArray<Mutation>;
|
|
11
|
+
}
|
|
12
|
+
export interface AfterCommitContext extends BeforeCommitContext {
|
|
13
|
+
sha: string;
|
|
14
|
+
}
|
|
9
15
|
export interface HandlerHooks {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
beforeUpdate?(entry: Entry): HookResponse<Entry>;
|
|
13
|
-
afterUpdate?(entry: Entry): HookResponse;
|
|
14
|
-
beforeArchive?(entryId: string): HookResponse;
|
|
15
|
-
afterArchive?(entryId: string): HookResponse;
|
|
16
|
-
beforeRemove?(entryId: string): HookResponse;
|
|
17
|
-
afterRemove?(entryId: string): HookResponse;
|
|
16
|
+
beforeCommit?(context: BeforeCommitContext): HookResponse<ReadonlyArray<Mutation>>;
|
|
17
|
+
afterCommit?(context: AfterCommitContext): HookResponse;
|
|
18
18
|
}
|
|
19
19
|
export interface HandlerOptions extends HandlerHooks {
|
|
20
20
|
cms: CMS;
|
|
21
21
|
db: LocalDB | Promise<LocalDB>;
|
|
22
22
|
remote?: (context: RequestContext) => RemoteConnection;
|
|
23
|
+
forwardMutations?(request: Request, context: AuthedContext): Promise<Response | undefined>;
|
|
23
24
|
}
|
|
24
|
-
export declare function createHandler({ cms, remote, db, ...hooks }: HandlerOptions): Handler;
|
|
25
|
+
export declare function createHandler({ cms, remote, db, forwardMutations, ...hooks }: HandlerOptions): Handler;
|