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.
Files changed (220) hide show
  1. package/dist/.init/content/pages/welcome.json +1 -1
  2. package/dist/LICENSES.md +34 -7
  3. package/dist/adapter/next/DevRemote.d.ts +3 -0
  4. package/dist/adapter/next/DevRemote.js +37 -0
  5. package/dist/adapter/next/ForwardCredentials.d.ts +1 -0
  6. package/dist/adapter/next/ForwardCredentials.js +17 -0
  7. package/dist/adapter/next/cms.js +86 -38
  8. package/dist/adapter/next/context.d.ts +1 -1
  9. package/dist/adapter/next/context.js +11 -3
  10. package/dist/adapter/next/handler.d.ts +2 -0
  11. package/dist/adapter/next/handler.js +23 -16
  12. package/dist/adapter/next/previews.js +3 -1
  13. package/dist/adapter/next/previews.spec.d.ts +1 -0
  14. package/dist/adapter/next/with-alinea.js +18 -16
  15. package/dist/backend/Handler.d.ts +14 -13
  16. package/dist/backend/Handler.js +53 -22
  17. package/dist/backend/resolver/ParsePreview.d.ts +8 -4
  18. package/dist/backend/resolver/ParsePreview.js +40 -43
  19. package/dist/bundled.d.ts +318 -77
  20. package/dist/chunks/{chunk-LUBOGJCG.js → chunk-6V4TAD2N.js} +1 -1
  21. package/dist/chunks/{chunk-TL7ZW6BX.js → chunk-A3XXZBOQ.js} +2535 -2999
  22. package/dist/chunks/chunk-AC5ATYI3.js +1434 -0
  23. package/dist/chunks/{chunk-FRYHNUEK.js → chunk-HFBZMKIN.js} +6 -3
  24. package/dist/chunks/{chunk-7ORQ7BYK.js → chunk-KMLLLZ6X.js} +202 -269
  25. package/dist/chunks/{chunk-IWN3T3FL.js → chunk-O7XWTMCB.js} +1 -1
  26. package/dist/chunks/{chunk-53DZYORR.js → chunk-PAYSVIYI.js} +76 -176
  27. package/dist/chunks/{chunk-YK3OSMDM.js → chunk-S4AU6SRS.js} +188 -158
  28. package/dist/chunks/{chunk-I7X64JTZ.js → chunk-VXZM6V4P.js} +4 -4
  29. package/dist/cli/Generate.js +3 -13
  30. package/dist/cli/Serve.js +7 -3
  31. package/dist/cli/bin.js +8 -5
  32. package/dist/cli/generate/CopyStaticFiles.js +2 -3
  33. package/dist/cli/generate/DevDB.d.ts +1 -1
  34. package/dist/cli/generate/DevDB.js +3 -5
  35. package/dist/cli/serve/CreateLocalServer.d.ts +1 -1
  36. package/dist/cli/serve/CreateLocalServer.js +3 -2
  37. package/dist/cli/serve/DevServer.d.ts +3 -2
  38. package/dist/cli/serve/DevServer.js +60 -3
  39. package/dist/cli/serve/ServeContext.d.ts +1 -0
  40. package/dist/cli/serve/StartServer.d.ts +1 -0
  41. package/dist/cli/serve/StartServer.js +6 -1
  42. package/dist/cli/util/EnsureLibs.js +2 -2
  43. package/dist/cli/util/EnsureNode.js +2 -2
  44. package/dist/cloud/CloudRemote.js +1 -1
  45. package/dist/components/Breadcrumbs.js +6 -6
  46. package/dist/components/Button.js +6 -6
  47. package/dist/components/Calendar.js +13 -13
  48. package/dist/components/Checkbox.js +8 -8
  49. package/dist/components/CheckboxGroup.js +6 -6
  50. package/dist/components/ColorSwatch.js +6 -6
  51. package/dist/components/ColorSwatchPicker.js +6 -6
  52. package/dist/components/ComboBox.js +17 -17
  53. package/dist/components/DateField.js +7 -7
  54. package/dist/components/DatePicker.js +9 -9
  55. package/dist/components/DateRangePicker.js +14 -14
  56. package/dist/components/Dialog.js +6 -6
  57. package/dist/components/Disclosure.js +13 -13
  58. package/dist/components/DropZone.js +6 -6
  59. package/dist/components/Label.js +14 -14
  60. package/dist/components/Link.js +6 -6
  61. package/dist/components/List.js +34 -34
  62. package/dist/components/Menu.js +9 -9
  63. package/dist/components/Modal.js +9 -9
  64. package/dist/components/MultipleSelect.js +28 -28
  65. package/dist/components/NumberField.d.ts +2 -1
  66. package/dist/components/NumberField.js +22 -12
  67. package/dist/components/Popover.js +6 -6
  68. package/dist/components/ProgressCircle.js +9 -9
  69. package/dist/components/RadioGroup.js +6 -6
  70. package/dist/components/SearchField.js +14 -14
  71. package/dist/components/Select.js +16 -16
  72. package/dist/components/Surface.js +2 -2
  73. package/dist/components/Switch.js +8 -8
  74. package/dist/components/Table.js +14 -14
  75. package/dist/components/Tabs.js +9 -9
  76. package/dist/components/TagGroup.js +6 -6
  77. package/dist/components/TextField.js +10 -10
  78. package/dist/components/TimeField.js +8 -8
  79. package/dist/components/Toggle.js +8 -8
  80. package/dist/components/Toolbar.js +8 -8
  81. package/dist/components/Tooltip.js +9 -9
  82. package/dist/components/Tree.d.ts +4 -2
  83. package/dist/components/Tree.js +27 -13
  84. package/dist/core/Client.js +3 -2
  85. package/dist/core/Config.d.ts +4 -0
  86. package/dist/core/Config.js +6 -0
  87. package/dist/core/Connection.d.ts +2 -2
  88. package/dist/core/Connection.js +7 -0
  89. package/dist/core/Graph.d.ts +4 -5
  90. package/dist/core/Infer.d.ts +8 -1
  91. package/dist/core/ListRow.d.ts +2 -0
  92. package/dist/core/OrderBy.d.ts +7 -3
  93. package/dist/core/TextDoc.d.ts +11 -0
  94. package/dist/core/Trace.d.ts +8 -0
  95. package/dist/core/Trace.js +32 -0
  96. package/dist/core/db/CommitRequest.d.ts +0 -3
  97. package/dist/core/db/CommitRequest.js +0 -9
  98. package/dist/core/db/EntryAliases.js +1 -4
  99. package/dist/core/db/EntryDB.js +1 -1
  100. package/dist/core/db/EntryIndex.d.ts +10 -0
  101. package/dist/core/db/EntryIndex.js +117 -9
  102. package/dist/core/db/EntryResolver.js +110 -35
  103. package/dist/core/db/EntryTransaction.d.ts +1 -2
  104. package/dist/core/db/EntryTransaction.js +26 -13
  105. package/dist/core/db/LocalDB.d.ts +2 -3
  106. package/dist/core/db/LocalDB.js +24 -19
  107. package/dist/core/db/Operation.d.ts +2 -2
  108. package/dist/core/db/Operation.js +11 -1
  109. package/dist/core/field/RichTextField.d.ts +30 -3
  110. package/dist/core/field/RichTextField.js +125 -41
  111. package/dist/core/media/MediaAltField.d.ts +1 -0
  112. package/dist/core/media/MediaAltField.js +9 -1
  113. package/dist/core/source/OverlaySource.d.ts +12 -0
  114. package/dist/core/source/OverlaySource.js +50 -0
  115. package/dist/core/source/Source.d.ts +1 -1
  116. package/dist/core/source/Source.js +3 -3
  117. package/dist/dashboard/App.css +158 -0
  118. package/dist/dashboard/App.js +10 -4
  119. package/dist/dashboard/app/AccessDenied.d.ts +16 -1
  120. package/dist/dashboard/app/AccessDenied.js +20 -11
  121. package/dist/dashboard/app/ActivityStatus.js +15 -15
  122. package/dist/dashboard/app/AuthView.js +11 -11
  123. package/dist/dashboard/app/Badge.js +2 -2
  124. package/dist/dashboard/app/CompactField.js +12 -12
  125. package/dist/dashboard/app/DashboardErrorBoundary.js +4 -4
  126. package/dist/dashboard/app/DashboardLayout.js +22 -19
  127. package/dist/dashboard/app/EntryHeader.js +10 -10
  128. package/dist/dashboard/app/EntryReferences.js +10 -10
  129. package/dist/dashboard/app/EntrySidebar.d.ts +1 -1
  130. package/dist/dashboard/app/EntrySidebar.js +16 -15
  131. package/dist/dashboard/app/EntrySidebarPreview.d.ts +1 -1
  132. package/dist/dashboard/app/EntrySidebarPreview.js +60 -29
  133. package/dist/dashboard/app/EntrySidebarPreview.story.d.ts +6 -1
  134. package/dist/dashboard/app/EntryTranslationBanner.js +7 -7
  135. package/dist/dashboard/app/Explorer.d.ts +2 -1
  136. package/dist/dashboard/app/Explorer.js +63 -51
  137. package/dist/dashboard/app/ExplorerCards.js +51 -55
  138. package/dist/dashboard/app/ExplorerFileCard.js +20 -20
  139. package/dist/dashboard/app/ExplorerList.js +14 -14
  140. package/dist/dashboard/app/ExplorerModal.js +1 -1
  141. package/dist/dashboard/app/ExplorerTable.js +59 -59
  142. package/dist/dashboard/app/ExternalLinkPicker.js +15 -4
  143. package/dist/dashboard/app/LinkPicker.js +40 -15
  144. package/dist/dashboard/app/LocaleMenu.js +8 -8
  145. package/dist/dashboard/app/SidebarLayout.d.ts +8 -0
  146. package/dist/dashboard/app/SidebarLayout.js +1169 -0
  147. package/dist/dashboard/app/SidebarTree.js +56 -64
  148. package/dist/dashboard/app/WorkspaceMenu.js +14 -14
  149. package/dist/dashboard/app/WorkspaceRoots.js +24 -24
  150. package/dist/dashboard/app/editor/FileEditor.js +29 -30
  151. package/dist/dashboard/app/editor/FilePreview.js +6 -6
  152. package/dist/dashboard/app/editor/MediaAltField.view.d.ts +1 -1
  153. package/dist/dashboard/app/editor/MediaAltField.view.js +6 -9
  154. package/dist/dashboard/app/modals/CreateEntry.js +5 -5
  155. package/dist/dashboard/app/pages/EntryPage.js +49 -25
  156. package/dist/dashboard/app/pages/UsersPage.js +35 -35
  157. package/dist/dashboard/app/ui/DashboardModal.js +23 -23
  158. package/dist/dashboard/app/ui/Rail.js +3 -3
  159. package/dist/dashboard/app/ui/Sidebar.js +2 -2
  160. package/dist/dashboard/atoms/auth.js +2 -0
  161. package/dist/dashboard/atoms/dashboard.d.ts +9 -0
  162. package/dist/dashboard/atoms/dashboard.js +17 -0
  163. package/dist/dashboard/atoms/editor.d.ts +7 -1
  164. package/dist/dashboard/atoms/editor.js +4 -1
  165. package/dist/dashboard/atoms/entry.d.ts +3 -1
  166. package/dist/dashboard/atoms/entry.js +55 -15
  167. package/dist/dashboard/atoms/explorer.js +3 -8
  168. package/dist/dashboard/atoms/preview.d.ts +3 -0
  169. package/dist/dashboard/atoms/preview.js +18 -1
  170. package/dist/dashboard/hooks.d.ts +4 -2
  171. package/dist/dashboard/hooks.js +9 -5
  172. package/dist/dashboard/icons.d.ts +1 -0
  173. package/dist/dashboard/icons.js +10 -0
  174. package/dist/field/code/CodeField.view.js +13 -13
  175. package/dist/field/date/DateField.view.js +12 -2
  176. package/dist/field/link/EntryLink.d.ts +1 -1
  177. package/dist/field/link/EntryLink.js +1 -0
  178. package/dist/field/link/Link.js +3 -2
  179. package/dist/field/link/LinkField.d.ts +5 -0
  180. package/dist/field/link/LinkField.view.js +115 -87
  181. package/dist/field/list/ListField.view.js +22 -33
  182. package/dist/field/metadata/MetadataField.d.ts +2 -0
  183. package/dist/field/metadata/MetadataField.js +2 -1
  184. package/dist/field/metadata/MetadataField.view.js +18 -18
  185. package/dist/field/number/NumberField.d.ts +2 -0
  186. package/dist/field/number/NumberField.view.js +4 -2
  187. package/dist/field/richtext/PickTextLink.d.ts +7 -0
  188. package/dist/field/richtext/PickTextLink.js +104 -2
  189. package/dist/field/richtext/ReferenceLink.d.ts +4 -1
  190. package/dist/field/richtext/ReferenceLink.js +18 -4
  191. package/dist/field/richtext/RichTextBlock.js +2 -2
  192. package/dist/field/richtext/RichTextDocument.d.ts +7 -2
  193. package/dist/field/richtext/RichTextDocument.js +34 -5
  194. package/dist/field/richtext/RichTextExtensions.d.ts +3 -1
  195. package/dist/field/richtext/RichTextExtensions.js +2701 -7464
  196. package/dist/field/richtext/RichTextField.d.ts +4 -0
  197. package/dist/field/richtext/RichTextField.story.d.ts +4 -0
  198. package/dist/field/richtext/RichTextField.view.js +43 -20
  199. package/dist/field/richtext/RichTextInsertMenu.js +279 -493
  200. package/dist/field/richtext/RichTextToolbar.d.ts +5 -2
  201. package/dist/field/richtext/RichTextToolbar.js +38 -3
  202. package/dist/field/richtext/Toolbar.d.ts +19 -1
  203. package/dist/field/richtext/Toolbar.js +18 -13
  204. package/dist/field/richtext/extensions/Anchor.js +1 -1
  205. package/dist/field/richtext/extensions/Link.js +1 -1
  206. package/dist/field/richtext/extensions/Small.js +1 -1
  207. package/dist/field/select/SelectField.view.js +8 -6
  208. package/dist/index.css +240 -14
  209. package/dist/next.cjs +18 -16
  210. package/dist/next.d.ts +2 -1
  211. package/dist/next.edge.d.ts +2 -1
  212. package/dist/preview/PreviewMessage.d.ts +3 -0
  213. package/dist/preview/PreviewMessage.js +1 -0
  214. package/dist/preview/RegisterPreview.js +29 -9
  215. package/dist/preview/widget.js +6 -12
  216. package/dist/query.d.ts +7 -7
  217. package/dist/ui/RichText.d.ts +1 -0
  218. package/dist/ui/RichText.js +29 -2
  219. package/package.json +6 -3
  220. package/dist/chunks/{chunk-JFROOUG6.js → chunk-NIVGVRDS.js} +17 -17
@@ -1,5 +1,5 @@
1
1
  {
2
- "_id": "3ISJqzspZnQ0LXWCDRtPXYjlfWD",
2
+ "_id": "3J5B7YiszA6gly0Vumu4zjLeUNP",
3
3
  "_type": "Page",
4
4
  "_index": "a0",
5
5
  "_seeded": "welcome.json",
package/dist/LICENSES.md CHANGED
@@ -55,7 +55,7 @@ SOFTWARE.
55
55
 
56
56
  ===
57
57
 
58
- # react-stately@3.46.0 (Apache-2.0)
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
- # react-aria-components@1.17.0 (Apache-2.0)
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/core@3.27.3 (MIT)
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
- # fp16@1.0.0 (MIT)
994
+ # use-sync-external-store@1.6.0 (MIT)
968
995
 
969
996
  MIT License
970
997
 
971
- Copyright (c) 2021 Joel Gustafson
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
- # use-sync-external-store@1.6.0 (MIT)
1044
+ # fp16@1.0.0 (MIT)
1018
1045
 
1019
1046
  MIT License
1020
1047
 
1021
- Copyright (c) Meta Platforms, Inc. and affiliates.
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,3 @@
1
+ import type { RemoteConnection, RequestContext } from 'alinea/core/Connection';
2
+ import type { Config } from 'alinea/core/Config';
3
+ export declare function createDevRemote(context: RequestContext, config: Config): RemoteConnection;
@@ -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
+ };
@@ -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 { generatedSource } = await import("alinea/backend/store/GeneratedSource");
26
- const source = await generatedSource;
27
- const db = new LocalDB(this.config, source);
28
- await db.sync();
29
- return db;
30
- });
31
- async resolve(query) {
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
- let preview;
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
- if (!status) status = "preferDraft";
48
- const cookie = await cookies();
49
- const payload = getPreviewPayloadFromCookies(cookie.getAll());
50
- if (payload) preview = { payload };
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
- await this.throttle(() => db.syncWith(client), request.syncInterval);
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 { handlerUrl, apiKey } = await requestContext(this.config);
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
- for (const [name, value] of authCookies) {
84
- headers.set("Cookie", `${name}=${value}`);
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
- async function requestContext(config) {
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) return { isDev: true, handlerUrl: new URL("/api", dev), apiKey };
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(config.handlerUrl ?? "/api/cms", baseUrl),
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
- var handlers = /* @__PURE__ */ new WeakMap();
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 db = PLazy.from(async () => {
27
- const source = await generatedSource;
28
- const db2 = new LocalDB(config, source);
29
- await db2.sync();
30
- return db2;
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.handlerUrl ?? "/api/cms";
42
- if (!url.pathname.startsWith(handlerPath))
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 previews.verify(previewToken);
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" : isPreviewing ? previewDisabled ? "warning" : "connected" : void 0
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 adminPath = resolveAdminPath();
14
- if (!adminPath) {
13
+ const settings = resolveSettings(config);
14
+ if (!settings) {
15
15
  console.warn(
16
- "Alinea dashboard settings could not be loaded; dashboard routing is disabled. Run Next.js through the Alinea CLI and deploy @alinea/generated."
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 resolveAdminPath() {
128
- try {
129
- const require2 = createRequire(resolve("./index.js"));
130
- const location = require2.resolve("@alinea/generated/settings.json");
131
- const settings = JSON.parse(
132
- readFileSync(location, "utf-8")
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 type { LocalDB } from 'alinea/core/db/LocalDB';
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<T> | Promise<void>;
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
- beforeCreate?(entry: Entry): HookResponse<Entry>;
11
- afterCreate?(entry: Entry): HookResponse;
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;