alinea 2.0.0-preview.1 → 2.0.0-preview.2

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 (201) hide show
  1. package/dist/.init/content/pages/welcome.json +1 -1
  2. package/dist/LICENSES.md +61 -34
  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/with-alinea.js +18 -16
  13. package/dist/backend/Handler.d.ts +14 -13
  14. package/dist/backend/Handler.js +53 -22
  15. package/dist/backend/resolver/ParsePreview.d.ts +8 -4
  16. package/dist/backend/resolver/ParsePreview.js +40 -43
  17. package/dist/bundled.d.ts +255 -60
  18. package/dist/chunks/{chunk-LUBOGJCG.js → chunk-6V4TAD2N.js} +1 -1
  19. package/dist/chunks/{chunk-TL7ZW6BX.js → chunk-A3XXZBOQ.js} +2535 -2999
  20. package/dist/chunks/chunk-AC5ATYI3.js +1434 -0
  21. package/dist/chunks/{chunk-7ORQ7BYK.js → chunk-KMLLLZ6X.js} +202 -269
  22. package/dist/chunks/{chunk-IWN3T3FL.js → chunk-O7XWTMCB.js} +1 -1
  23. package/dist/chunks/{chunk-53DZYORR.js → chunk-PAYSVIYI.js} +76 -176
  24. package/dist/chunks/{chunk-YK3OSMDM.js → chunk-S4AU6SRS.js} +188 -158
  25. package/dist/chunks/{chunk-FRYHNUEK.js → chunk-UVOEM4AH.js} +6 -3
  26. package/dist/chunks/{chunk-I7X64JTZ.js → chunk-VXZM6V4P.js} +4 -4
  27. package/dist/cli/Generate.js +3 -13
  28. package/dist/cli/Serve.js +7 -3
  29. package/dist/cli/bin.js +8 -5
  30. package/dist/cli/generate/CopyStaticFiles.js +2 -3
  31. package/dist/cli/generate/DevDB.d.ts +1 -1
  32. package/dist/cli/generate/DevDB.js +3 -5
  33. package/dist/cli/serve/CreateLocalServer.d.ts +1 -1
  34. package/dist/cli/serve/CreateLocalServer.js +3 -2
  35. package/dist/cli/serve/DevServer.d.ts +3 -2
  36. package/dist/cli/serve/DevServer.js +60 -3
  37. package/dist/cli/serve/ServeContext.d.ts +1 -0
  38. package/dist/cli/serve/StartServer.d.ts +1 -0
  39. package/dist/cli/serve/StartServer.js +6 -1
  40. package/dist/cli/util/EnsureLibs.js +2 -2
  41. package/dist/cli/util/EnsureNode.js +2 -2
  42. package/dist/cloud/CloudRemote.js +1 -1
  43. package/dist/components/Breadcrumbs.js +8 -8
  44. package/dist/components/Button.js +6 -6
  45. package/dist/components/Calendar.js +9 -9
  46. package/dist/components/Checkbox.js +9 -9
  47. package/dist/components/CheckboxGroup.js +6 -6
  48. package/dist/components/ColorSwatch.js +6 -6
  49. package/dist/components/ColorSwatchPicker.js +6 -6
  50. package/dist/components/ComboBox.js +16 -16
  51. package/dist/components/DateField.js +9 -9
  52. package/dist/components/DatePicker.js +11 -11
  53. package/dist/components/DateRangePicker.js +14 -14
  54. package/dist/components/Dialog.js +6 -6
  55. package/dist/components/Disclosure.js +14 -14
  56. package/dist/components/DropZone.js +6 -6
  57. package/dist/components/Label.js +14 -14
  58. package/dist/components/Link.js +6 -6
  59. package/dist/components/List.js +32 -32
  60. package/dist/components/Menu.js +10 -10
  61. package/dist/components/Modal.js +8 -8
  62. package/dist/components/MultipleSelect.js +25 -25
  63. package/dist/components/NumberField.d.ts +2 -1
  64. package/dist/components/NumberField.js +25 -15
  65. package/dist/components/Popover.js +6 -6
  66. package/dist/components/ProgressCircle.js +9 -9
  67. package/dist/components/RadioGroup.js +8 -8
  68. package/dist/components/SearchField.js +15 -15
  69. package/dist/components/Select.js +14 -14
  70. package/dist/components/Surface.js +2 -2
  71. package/dist/components/Switch.js +8 -8
  72. package/dist/components/Table.js +14 -14
  73. package/dist/components/Tabs.js +7 -7
  74. package/dist/components/TagGroup.js +8 -8
  75. package/dist/components/TextField.js +10 -10
  76. package/dist/components/TimeField.js +8 -8
  77. package/dist/components/Toggle.js +8 -8
  78. package/dist/components/Toolbar.js +9 -9
  79. package/dist/components/Tooltip.js +7 -7
  80. package/dist/components/Tree.js +10 -10
  81. package/dist/core/Client.js +3 -2
  82. package/dist/core/Config.d.ts +4 -0
  83. package/dist/core/Config.js +6 -0
  84. package/dist/core/Connection.d.ts +2 -2
  85. package/dist/core/Connection.js +7 -0
  86. package/dist/core/Graph.d.ts +3 -4
  87. package/dist/core/ListRow.d.ts +2 -0
  88. package/dist/core/OrderBy.d.ts +7 -3
  89. package/dist/core/TextDoc.d.ts +11 -0
  90. package/dist/core/Trace.d.ts +8 -0
  91. package/dist/core/Trace.js +32 -0
  92. package/dist/core/db/CommitRequest.d.ts +0 -3
  93. package/dist/core/db/CommitRequest.js +0 -9
  94. package/dist/core/db/EntryDB.js +1 -1
  95. package/dist/core/db/EntryIndex.d.ts +10 -0
  96. package/dist/core/db/EntryIndex.js +117 -9
  97. package/dist/core/db/EntryResolver.js +104 -29
  98. package/dist/core/db/EntryTransaction.d.ts +1 -2
  99. package/dist/core/db/EntryTransaction.js +25 -13
  100. package/dist/core/db/LocalDB.d.ts +2 -3
  101. package/dist/core/db/LocalDB.js +24 -19
  102. package/dist/core/field/RichTextField.d.ts +30 -3
  103. package/dist/core/field/RichTextField.js +125 -41
  104. package/dist/core/media/MediaAltField.d.ts +1 -0
  105. package/dist/core/media/MediaAltField.js +9 -1
  106. package/dist/core/source/OverlaySource.d.ts +12 -0
  107. package/dist/core/source/OverlaySource.js +50 -0
  108. package/dist/core/source/Source.d.ts +1 -1
  109. package/dist/core/source/Source.js +3 -3
  110. package/dist/dashboard/App.css +158 -0
  111. package/dist/dashboard/App.js +3 -3
  112. package/dist/dashboard/app/AccessDenied.js +1 -1
  113. package/dist/dashboard/app/ActivityStatus.js +14 -14
  114. package/dist/dashboard/app/AppShell.js +2 -2
  115. package/dist/dashboard/app/AuthView.js +12 -12
  116. package/dist/dashboard/app/Badge.js +2 -2
  117. package/dist/dashboard/app/CompactField.js +13 -13
  118. package/dist/dashboard/app/DashboardErrorBoundary.js +6 -6
  119. package/dist/dashboard/app/DashboardLayout.js +22 -19
  120. package/dist/dashboard/app/EntryHeader.js +10 -10
  121. package/dist/dashboard/app/EntryReferences.js +9 -9
  122. package/dist/dashboard/app/EntrySidebar.d.ts +1 -1
  123. package/dist/dashboard/app/EntrySidebar.js +19 -18
  124. package/dist/dashboard/app/EntrySidebarPreview.d.ts +1 -1
  125. package/dist/dashboard/app/EntrySidebarPreview.js +20 -15
  126. package/dist/dashboard/app/EntryTranslationBanner.js +6 -6
  127. package/dist/dashboard/app/Explorer.js +46 -46
  128. package/dist/dashboard/app/ExplorerCards.js +42 -42
  129. package/dist/dashboard/app/ExplorerFileCard.js +16 -16
  130. package/dist/dashboard/app/ExplorerList.js +15 -15
  131. package/dist/dashboard/app/ExplorerModal.js +5 -5
  132. package/dist/dashboard/app/ExplorerTable.js +54 -54
  133. package/dist/dashboard/app/ExternalLinkPicker.js +15 -4
  134. package/dist/dashboard/app/LinkPicker.js +6 -6
  135. package/dist/dashboard/app/LocaleMenu.js +11 -11
  136. package/dist/dashboard/app/SidebarLayout.d.ts +8 -0
  137. package/dist/dashboard/app/SidebarLayout.js +1169 -0
  138. package/dist/dashboard/app/SidebarTree.js +44 -44
  139. package/dist/dashboard/app/WorkspaceMenu.js +17 -17
  140. package/dist/dashboard/app/WorkspaceRoots.js +26 -26
  141. package/dist/dashboard/app/editor/FileEditor.js +28 -29
  142. package/dist/dashboard/app/editor/FilePreview.js +2 -2
  143. package/dist/dashboard/app/editor/MediaAltField.view.d.ts +1 -1
  144. package/dist/dashboard/app/editor/MediaAltField.view.js +6 -9
  145. package/dist/dashboard/app/modals/CreateEntry.js +4 -4
  146. package/dist/dashboard/app/pages/EntryPage.js +49 -25
  147. package/dist/dashboard/app/pages/UsersPage.js +38 -38
  148. package/dist/dashboard/app/ui/DashboardModal.js +22 -22
  149. package/dist/dashboard/app/ui/Rail.js +2 -2
  150. package/dist/dashboard/app/ui/Sidebar.js +2 -2
  151. package/dist/dashboard/atoms/auth.js +2 -0
  152. package/dist/dashboard/atoms/dashboard.d.ts +9 -0
  153. package/dist/dashboard/atoms/dashboard.js +17 -0
  154. package/dist/dashboard/atoms/editor.d.ts +7 -1
  155. package/dist/dashboard/atoms/editor.js +4 -1
  156. package/dist/dashboard/atoms/entry.d.ts +3 -1
  157. package/dist/dashboard/atoms/entry.js +55 -15
  158. package/dist/dashboard/atoms/explorer.js +3 -8
  159. package/dist/dashboard/atoms/preview.d.ts +3 -0
  160. package/dist/dashboard/atoms/preview.js +18 -1
  161. package/dist/dashboard/hooks.d.ts +4 -2
  162. package/dist/dashboard/hooks.js +9 -5
  163. package/dist/dashboard/icons.d.ts +1 -0
  164. package/dist/dashboard/icons.js +10 -0
  165. package/dist/field/check/CheckField.view.js +2 -2
  166. package/dist/field/code/CodeField.view.js +13 -13
  167. package/dist/field/date/DateField.view.js +12 -2
  168. package/dist/field/link/Link.js +2 -2
  169. package/dist/field/link/LinkField.view.js +88 -77
  170. package/dist/field/list/ListField.view.js +22 -33
  171. package/dist/field/metadata/MetadataField.view.js +20 -20
  172. package/dist/field/number/NumberField.d.ts +2 -0
  173. package/dist/field/number/NumberField.view.js +4 -2
  174. package/dist/field/richtext/PickTextLink.d.ts +7 -0
  175. package/dist/field/richtext/PickTextLink.js +104 -2
  176. package/dist/field/richtext/ReferenceLink.d.ts +4 -1
  177. package/dist/field/richtext/ReferenceLink.js +18 -4
  178. package/dist/field/richtext/RichTextDocument.d.ts +7 -2
  179. package/dist/field/richtext/RichTextDocument.js +34 -5
  180. package/dist/field/richtext/RichTextExtensions.d.ts +3 -1
  181. package/dist/field/richtext/RichTextExtensions.js +2704 -7467
  182. package/dist/field/richtext/RichTextField.d.ts +4 -0
  183. package/dist/field/richtext/RichTextField.story.d.ts +4 -0
  184. package/dist/field/richtext/RichTextField.view.js +44 -21
  185. package/dist/field/richtext/RichTextInsertMenu.js +281 -495
  186. package/dist/field/richtext/RichTextToolbar.d.ts +5 -2
  187. package/dist/field/richtext/RichTextToolbar.js +38 -3
  188. package/dist/field/richtext/Toolbar.d.ts +19 -1
  189. package/dist/field/richtext/Toolbar.js +18 -13
  190. package/dist/field/richtext/extensions/Anchor.js +1 -1
  191. package/dist/field/richtext/extensions/Link.js +1 -1
  192. package/dist/field/richtext/extensions/Small.js +1 -1
  193. package/dist/field/select/SelectField.view.js +8 -6
  194. package/dist/index.css +219 -14
  195. package/dist/next.cjs +18 -16
  196. package/dist/next.d.ts +2 -1
  197. package/dist/next.edge.d.ts +2 -1
  198. package/dist/ui/RichText.d.ts +1 -0
  199. package/dist/ui/RichText.js +29 -2
  200. package/package.json +6 -3
  201. package/dist/chunks/{chunk-JFROOUG6.js → chunk-NIVGVRDS.js} +17 -17
@@ -1,5 +1,5 @@
1
1
  {
2
- "_id": "3ISJqzspZnQ0LXWCDRtPXYjlfWD",
2
+ "_id": "3J0HOUgEnDgT3KMVS2IyiiHVGPp",
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
+ # @internationalized/date@3.12.1 (Apache-2.0)
59
59
 
60
60
  Apache License
61
61
  Version 2.0, January 2004
@@ -262,7 +262,7 @@ SOFTWARE.
262
262
 
263
263
  ===
264
264
 
265
- # @internationalized/date@3.12.1 (Apache-2.0)
265
+ # react-stately@3.46.0 (Apache-2.0)
266
266
 
267
267
  Apache License
268
268
  Version 2.0, January 2004
@@ -674,6 +674,33 @@ SOFTWARE.
674
674
  limitations under the License.
675
675
 
676
676
 
677
+ ===
678
+
679
+ # @tiptap/core@3.30.5 (MIT)
680
+
681
+ MIT License
682
+
683
+ Copyright (c) 2025, Tiptap GmbH
684
+
685
+ Permission is hereby granted, free of charge, to any person obtaining a copy
686
+ of this software and associated documentation files (the "Software"), to deal
687
+ in the Software without restriction, including without limitation the rights
688
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
689
+ copies of the Software, and to permit persons to whom the Software is
690
+ furnished to do so, subject to the following conditions:
691
+
692
+ The above copyright notice and this permission notice shall be included in all
693
+ copies or substantial portions of the Software.
694
+
695
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
696
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
697
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
698
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
699
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
700
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
701
+ SOFTWARE.
702
+
703
+
677
704
  ===
678
705
 
679
706
  # jotai-location@0.6.2 (MIT)
@@ -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
 
@@ -962,33 +989,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
962
989
  SOFTWARE.
963
990
 
964
991
 
965
- ===
966
-
967
- # fp16@1.0.0 (MIT)
968
-
969
- MIT License
970
-
971
- Copyright (c) 2021 Joel Gustafson
972
-
973
- Permission is hereby granted, free of charge, to any person obtaining a copy
974
- of this software and associated documentation files (the "Software"), to deal
975
- in the Software without restriction, including without limitation the rights
976
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
977
- copies of the Software, and to permit persons to whom the Software is
978
- furnished to do so, subject to the following conditions:
979
-
980
- The above copyright notice and this permission notice shall be included in all
981
- copies or substantial portions of the Software.
982
-
983
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
984
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
985
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
986
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
987
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
988
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
989
- SOFTWARE.
990
-
991
-
992
992
  ===
993
993
 
994
994
  # htmlparser2@9.1.0 (MIT)
@@ -1058,7 +1058,34 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1058
1058
 
1059
1059
  ===
1060
1060
 
1061
- # domhandler@5.0.3 (BSD-2-Clause)
1061
+ # fp16@1.0.0 (MIT)
1062
+
1063
+ MIT License
1064
+
1065
+ Copyright (c) 2021 Joel Gustafson
1066
+
1067
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1068
+ of this software and associated documentation files (the "Software"), to deal
1069
+ in the Software without restriction, including without limitation the rights
1070
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1071
+ copies of the Software, and to permit persons to whom the Software is
1072
+ furnished to do so, subject to the following conditions:
1073
+
1074
+ The above copyright notice and this permission notice shall be included in all
1075
+ copies or substantial portions of the Software.
1076
+
1077
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1078
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1079
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1080
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1081
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1082
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1083
+ SOFTWARE.
1084
+
1085
+
1086
+ ===
1087
+
1088
+ # entities@4.5.0 (BSD-2-Clause)
1062
1089
 
1063
1090
  Copyright (c) Felix Böhm
1064
1091
  All rights reserved.
@@ -1075,7 +1102,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1075
1102
 
1076
1103
  ===
1077
1104
 
1078
- # entities@4.5.0 (BSD-2-Clause)
1105
+ # domhandler@5.0.3 (BSD-2-Clause)
1079
1106
 
1080
1107
  Copyright (c) Felix Böhm
1081
1108
  All rights reserved.
@@ -1109,7 +1136,7 @@ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
1109
1136
 
1110
1137
  ===
1111
1138
 
1112
- # @internationalized/string@3.2.8 (Apache-2.0)
1139
+ # @internationalized/number@3.6.6 (Apache-2.0)
1113
1140
 
1114
1141
  Apache License
1115
1142
  Version 2.0, January 2004
@@ -1316,7 +1343,7 @@ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
1316
1343
 
1317
1344
  ===
1318
1345
 
1319
- # @internationalized/number@3.6.6 (Apache-2.0)
1346
+ # @internationalized/string@3.2.8 (Apache-2.0)
1320
1347
 
1321
1348
  Apache License
1322
1349
  Version 2.0, January 2004
@@ -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
  };
@@ -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;