alinea 2.0.0-preview.6 → 2.0.0-preview.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/dist/.init/content/pages/welcome.json +1 -1
  2. package/dist/LICENSES.md +109 -109
  3. package/dist/adapter/next/cms.d.ts +18 -4
  4. package/dist/adapter/next/cms.js +125 -36
  5. package/dist/adapter/next/handler.d.ts +5 -1
  6. package/dist/adapter/next/handler.js +14 -7
  7. package/dist/adapter/next/node.d.ts +5 -0
  8. package/dist/adapter/next/node.js +16 -0
  9. package/dist/adapter/next/previews.d.ts +4 -1
  10. package/dist/adapter/next/previews.js +13 -3
  11. package/dist/adapter/next/renderStats.d.ts +24 -0
  12. package/dist/adapter/next/renderStats.js +74 -0
  13. package/dist/adapter/next/syncCheck.d.ts +8 -2
  14. package/dist/adapter/next/syncCheck.js +3 -3
  15. package/dist/adapter/next/with-alinea.js +0 -18
  16. package/dist/backend/Handler.d.ts +2 -2
  17. package/dist/backend/Handler.js +33 -12
  18. package/dist/backend/api/CreateBackend.js +15 -3
  19. package/dist/backend/api/DatabaseApi.js +22 -135
  20. package/dist/backend/api/database.js +15 -3
  21. package/dist/backend/resolver/ParsePreview.d.ts +2 -2
  22. package/dist/backend/router/NodeHandler.js +2 -0
  23. package/dist/backend/store/GeneratedDatabase.d.ts +5 -0
  24. package/dist/backend/store/GeneratedDatabase.js +31 -0
  25. package/dist/backend/store/GeneratedDatabaseNode.d.ts +4 -0
  26. package/dist/backend/store/GeneratedDatabaseNode.js +35 -0
  27. package/dist/backend/util/ORM.js +4 -2
  28. package/dist/bundled.d.ts +1485 -446
  29. package/dist/chunks/bun-sqlite-ZZDB7YQQ.js +18 -0
  30. package/dist/chunks/chunk-2BJ2IFQM.js +1085 -0
  31. package/dist/chunks/chunk-2PIFHEYR.js +364 -0
  32. package/dist/chunks/{chunk-X47OVDF3.js → chunk-2U43BB6P.js} +356 -1000
  33. package/dist/chunks/chunk-76VMZTLN.js +55 -0
  34. package/dist/chunks/chunk-A42DP5T7.js +94 -0
  35. package/dist/chunks/chunk-ATF42T2B.js +35 -0
  36. package/dist/chunks/{chunk-NWQXN4SB.js → chunk-ETBQTP2S.js} +40 -29
  37. package/dist/chunks/chunk-IL7FJQAY.js +94 -0
  38. package/dist/chunks/chunk-K62JP6HR.js +22 -0
  39. package/dist/chunks/chunk-K7LHQXI4.js +103 -0
  40. package/dist/chunks/chunk-M7KDJEGH.js +495 -0
  41. package/dist/chunks/chunk-N47Y62CI.js +396 -0
  42. package/dist/chunks/chunk-NLZLRQ5U.js +100 -0
  43. package/dist/chunks/chunk-QBPYWU6C.js +24 -0
  44. package/dist/chunks/{chunk-7IOKMUKO.js → chunk-RWWYUNVX.js} +2 -1
  45. package/dist/chunks/chunk-TFMUSWGG.js +605 -0
  46. package/dist/chunks/{chunk-I4GC3E65.js → chunk-UPY2RUZF.js} +0 -1
  47. package/dist/chunks/chunk-XCZXR3C2.js +112 -0
  48. package/dist/chunks/chunk-XTWYBWP2.js +81 -0
  49. package/dist/chunks/node-sqlite-7CSGL27V.js +18 -0
  50. package/dist/cli/Generate.js +74 -64
  51. package/dist/cli/Serve.js +1 -1
  52. package/dist/cli/bin.js +2 -1
  53. package/dist/cli/generate/CopyStaticFiles.js +17 -14
  54. package/dist/cli/generate/DevDB.d.ts +22 -5
  55. package/dist/cli/generate/DevDB.js +136 -24
  56. package/dist/cli/serve/CreateLocalServer.js +22 -4
  57. package/dist/cli/serve/LiveReload.d.ts +1 -1
  58. package/dist/cli/serve/LiveReload.js +3 -0
  59. package/dist/cloud/CloudRemote.js +2 -1
  60. package/dist/components/Calendar.js +5 -5
  61. package/dist/components/Checkbox.js +2 -2
  62. package/dist/components/ComboBox.js +13 -13
  63. package/dist/components/DateField.js +3 -3
  64. package/dist/components/DatePicker.js +5 -5
  65. package/dist/components/DateRangePicker.js +6 -6
  66. package/dist/components/Disclosure.js +7 -7
  67. package/dist/components/Label.js +4 -4
  68. package/dist/components/List.js +51 -49
  69. package/dist/components/Menu.js +4 -4
  70. package/dist/components/Modal.js +2 -2
  71. package/dist/components/MultipleSelect.js +25 -25
  72. package/dist/components/NumberField.js +3 -3
  73. package/dist/components/ProgressCircle.js +2 -2
  74. package/dist/components/RadioGroup.js +2 -2
  75. package/dist/components/SearchField.js +8 -8
  76. package/dist/components/Select.js +8 -8
  77. package/dist/components/Surface.js +3 -3
  78. package/dist/components/Table.js +7 -7
  79. package/dist/components/Tabs.js +4 -4
  80. package/dist/components/TagGroup.js +3 -3
  81. package/dist/components/TextField.js +3 -3
  82. package/dist/components/TimeField.js +3 -3
  83. package/dist/components/Toggle.js +2 -2
  84. package/dist/components/Toolbar.js +2 -2
  85. package/dist/components/Tooltip.js +3 -3
  86. package/dist/components/Tree.d.ts +2 -1
  87. package/dist/components/Tree.js +9 -9
  88. package/dist/core/Document.js +15 -3
  89. package/dist/core/Entry.d.ts +3 -0
  90. package/dist/core/Entry.js +4 -0
  91. package/dist/core/EntrySeed.d.ts +19 -0
  92. package/dist/core/EntrySeed.js +136 -0
  93. package/dist/core/Field.d.ts +7 -0
  94. package/dist/core/Field.js +4 -0
  95. package/dist/core/Filter.d.ts +40 -2
  96. package/dist/core/Filter.js +145 -0
  97. package/dist/core/Graph.d.ts +9 -0
  98. package/dist/core/ListRow.d.ts +1 -0
  99. package/dist/core/ListRow.js +1 -0
  100. package/dist/core/Reference.d.ts +1 -0
  101. package/dist/core/Root.js +1 -1
  102. package/dist/core/Scope.d.ts +2 -0
  103. package/dist/core/Scope.js +16 -1
  104. package/dist/core/TextDoc.d.ts +1 -0
  105. package/dist/core/Type.d.ts +2 -1
  106. package/dist/core/Type.js +13 -1
  107. package/dist/core/db/EntryAliases.js +1 -11
  108. package/dist/core/db/EntryReference.d.ts +0 -6
  109. package/dist/core/db/IndexEvent.d.ts +2 -1
  110. package/dist/core/db/IndexEvent.js +11 -3
  111. package/dist/core/db/LinkResolver.d.ts +6 -6
  112. package/dist/core/db/LinkResolver.js +0 -52
  113. package/dist/core/db/LocalStore.d.ts +25 -0
  114. package/dist/core/field/ListField.js +19 -0
  115. package/dist/core/field/RecordField.js +8 -0
  116. package/dist/core/field/RichTextField.js +45 -3
  117. package/dist/core/field/UnionField.js +8 -0
  118. package/dist/core/source/FSSource.d.ts +14 -2
  119. package/dist/core/source/FSSource.js +58 -13
  120. package/dist/core/source/GitUtils.d.ts +4 -0
  121. package/dist/core/source/GitUtils.js +9 -10
  122. package/dist/core/source/GithubSource.js +22 -11
  123. package/dist/core/source/IndexedDBSource.d.ts +2 -1
  124. package/dist/core/source/IndexedDBSource.js +67 -53
  125. package/dist/core/source/MemorySource.js +5 -3
  126. package/dist/core/source/OverlaySource.d.ts +5 -2
  127. package/dist/core/source/OverlaySource.js +31 -3
  128. package/dist/core/source/Source.d.ts +3 -0
  129. package/dist/core/source/Source.js +15 -2
  130. package/dist/core/source/Tree.d.ts +10 -7
  131. package/dist/core/source/Tree.js +118 -70
  132. package/dist/core/source/Utils.js +6 -3
  133. package/dist/core/util/Arrays.d.ts +1 -0
  134. package/dist/core/util/Arrays.js +10 -0
  135. package/dist/core/util/Async.d.ts +7 -0
  136. package/dist/core/util/Async.js +15 -0
  137. package/dist/core/util/Checks.js +1 -1
  138. package/dist/core/util/EntryFilenames.d.ts +22 -1
  139. package/dist/core/util/EntryFilenames.js +56 -2
  140. package/dist/core/util/IndexedDB.d.ts +4 -0
  141. package/dist/core/util/IndexedDB.js +20 -0
  142. package/dist/core/util/Paths.js +5 -1
  143. package/dist/dashboard/App.js +5 -3
  144. package/dist/dashboard/ViewKeys.d.ts +1 -0
  145. package/dist/dashboard/ViewKeys.js +1 -0
  146. package/dist/dashboard/app/AccessDenied.js +3 -3
  147. package/dist/dashboard/app/ActivityStatus.js +17 -17
  148. package/dist/dashboard/app/AppShell.js +2 -2
  149. package/dist/dashboard/app/AuthView.js +11 -11
  150. package/dist/dashboard/app/CompactField.js +12 -12
  151. package/dist/dashboard/app/DashboardErrorBoundary.js +6 -6
  152. package/dist/dashboard/app/DashboardLayout.js +6 -5
  153. package/dist/dashboard/app/EntryHeader.js +8 -8
  154. package/dist/dashboard/app/EntryReferences.js +12 -17
  155. package/dist/dashboard/app/EntrySidebar.js +27 -13
  156. package/dist/dashboard/app/EntrySidebarPreview.js +12 -12
  157. package/dist/dashboard/app/EntryTranslationBanner.js +3 -3
  158. package/dist/dashboard/app/Explorer.js +41 -41
  159. package/dist/dashboard/app/ExplorerCards.js +33 -33
  160. package/dist/dashboard/app/ExplorerFileCard.js +18 -18
  161. package/dist/dashboard/app/ExplorerList.js +13 -13
  162. package/dist/dashboard/app/ExplorerModal.js +5 -5
  163. package/dist/dashboard/app/ExplorerTable.js +48 -48
  164. package/dist/dashboard/app/LinkPicker.js +3 -3
  165. package/dist/dashboard/app/LocaleMenu.js +7 -7
  166. package/dist/dashboard/app/SidebarTree.js +81 -45
  167. package/dist/dashboard/app/WorkspaceMenu.js +9 -9
  168. package/dist/dashboard/app/WorkspaceRoots.js +21 -21
  169. package/dist/dashboard/app/editor/FileEditor.js +26 -26
  170. package/dist/dashboard/app/editor/FilePreview.js +6 -6
  171. package/dist/dashboard/app/modals/CreateEntry.js +5 -5
  172. package/dist/dashboard/app/pages/EntryPage.js +15 -15
  173. package/dist/dashboard/app/pages/RootPage.js +3 -3
  174. package/dist/dashboard/app/pages/SplashPage.js +43 -43
  175. package/dist/dashboard/app/pages/UsersPage.js +34 -34
  176. package/dist/dashboard/app/ui/DashboardModal.js +17 -17
  177. package/dist/dashboard/app/ui/Rail.js +3 -3
  178. package/dist/dashboard/app/ui/Sidebar.js +2 -2
  179. package/dist/dashboard/atoms/config.d.ts +4 -4
  180. package/dist/dashboard/atoms/dashboard.js +2 -1
  181. package/dist/dashboard/atoms/editor.js +7 -0
  182. package/dist/dashboard/atoms/entry.d.ts +10 -13
  183. package/dist/dashboard/atoms/entry.js +42 -7
  184. package/dist/dashboard/atoms/explorer.d.ts +2 -0
  185. package/dist/dashboard/atoms/explorer.js +7 -2
  186. package/dist/dashboard/atoms/root.d.ts +1 -0
  187. package/dist/dashboard/atoms/root.js +61 -35
  188. package/dist/dashboard/boot/Boot.js +9 -8
  189. package/dist/dashboard/boot/DashboardWorker.d.ts +3 -3
  190. package/dist/dashboard/boot/DashboardWorker.js +78 -27
  191. package/dist/dashboard/boot/LoadWorker.js +2 -3
  192. package/dist/dashboard/icons.d.ts +2 -0
  193. package/dist/dashboard/icons.js +40 -0
  194. package/dist/dashboard/plugins/alineaFixturePlugin.js +14 -3
  195. package/dist/database/BrowserEntryStore.d.ts +30 -0
  196. package/dist/database/BrowserEntryStore.js +168 -0
  197. package/dist/database/DatabaseSource.d.ts +13 -0
  198. package/dist/database/DatabaseSource.js +25 -0
  199. package/dist/database/DatabaseTables.d.ts +38 -0
  200. package/dist/database/DatabaseTables.js +53 -0
  201. package/dist/database/EntryDatabase.d.ts +21 -0
  202. package/dist/database/EntryDatabase.js +138 -0
  203. package/dist/database/EntryLayer.d.ts +93 -0
  204. package/dist/database/EntryLayer.js +459 -0
  205. package/dist/database/EntryStore.d.ts +60 -0
  206. package/dist/database/EntryStore.js +269 -0
  207. package/dist/database/EntryTransaction.d.ts +33 -0
  208. package/dist/database/EntryTransaction.js +889 -0
  209. package/dist/database/EntryUrlAliases.d.ts +2 -0
  210. package/dist/database/EntryUrlAliases.js +69 -0
  211. package/dist/database/LocalDB.d.ts +39 -0
  212. package/dist/database/LocalDB.js +79 -0
  213. package/dist/database/Version.d.ts +9 -0
  214. package/dist/database/Version.js +13 -0
  215. package/dist/database/driver/RuntimeDatabase.d.ts +8 -0
  216. package/dist/database/driver/RuntimeDatabase.js +33 -0
  217. package/dist/database/driver/WasmDatabase.d.ts +8 -0
  218. package/dist/database/driver/WasmDatabase.js +33 -0
  219. package/dist/database/entry/EntryData.d.ts +13 -0
  220. package/dist/database/entry/EntryData.js +51 -0
  221. package/dist/database/entry/EntryTable.d.ts +173 -0
  222. package/dist/database/entry/EntryTable.js +137 -0
  223. package/dist/database/entry/EntryView.d.ts +22 -0
  224. package/dist/database/entry/EntryView.js +106 -0
  225. package/dist/database/query/Condition.d.ts +8 -0
  226. package/dist/database/query/Condition.js +117 -0
  227. package/dist/database/query/EntryQuery.d.ts +43 -0
  228. package/dist/database/query/EntryQuery.js +414 -0
  229. package/dist/database/query/EntryReferences.d.ts +6 -0
  230. package/dist/database/query/EntryReferences.js +68 -0
  231. package/dist/database/query/Relation.d.ts +11 -0
  232. package/dist/database/query/Relation.js +113 -0
  233. package/dist/database/query/ResolveQuery.d.ts +15 -0
  234. package/dist/database/query/ResolveQuery.js +154 -0
  235. package/dist/database/query/Search.d.ts +47 -0
  236. package/dist/database/query/Search.js +169 -0
  237. package/dist/database/sync/Derive.d.ts +8 -0
  238. package/dist/database/sync/Derive.js +270 -0
  239. package/dist/database/sync/EntryParser.d.ts +4 -0
  240. package/dist/database/sync/EntryParser.js +87 -0
  241. package/dist/database/sync/EntrySyncer.d.ts +37 -0
  242. package/dist/database/sync/EntrySyncer.js +117 -0
  243. package/dist/database/sync/Ingest.d.ts +21 -0
  244. package/dist/database/sync/Ingest.js +136 -0
  245. package/dist/database/sync/SyncQueries.d.ts +157 -0
  246. package/dist/database/sync/SyncQueries.js +192 -0
  247. package/dist/field/check/CheckField.view.js +2 -2
  248. package/dist/field/code/CodeField.view.js +7 -7
  249. package/dist/field/link/FileLink.js +1 -7
  250. package/dist/field/link/LinkField.js +23 -0
  251. package/dist/field/link/LinkField.view.js +44 -43
  252. package/dist/field/list/ListField.d.ts +5 -0
  253. package/dist/field/list/ListField.stories.d.ts +1 -0
  254. package/dist/field/list/ListField.view.js +190 -156
  255. package/dist/field/metadata/MetadataField.d.ts +28 -3
  256. package/dist/field/metadata/MetadataField.js +44 -7
  257. package/dist/field/metadata/MetadataField.view.d.ts +5 -0
  258. package/dist/field/metadata/MetadataField.view.js +37 -22
  259. package/dist/field/richtext/PickTextLink.d.ts +3 -1
  260. package/dist/field/richtext/PickTextLink.js +7 -6
  261. package/dist/field/richtext/RichTextDocument.js +12 -4
  262. package/dist/field/richtext/RichTextExtensions.d.ts +1 -1
  263. package/dist/field/richtext/RichTextExtensions.js +34 -30
  264. package/dist/field/richtext/RichTextField.d.ts +3 -0
  265. package/dist/field/richtext/RichTextField.view.js +20 -11
  266. package/dist/field/richtext/RichTextInsertMenu.js +3 -3
  267. package/dist/field/views.js +2 -0
  268. package/dist/index.css +17 -6
  269. package/dist/next.cjs +0 -18
  270. package/dist/next.d.ts +4 -3
  271. package/dist/next.edge.d.ts +1 -1
  272. package/dist/next.js +1 -2
  273. package/dist/picker/entry/EntryPicker.js +2 -1
  274. package/dist/picker/url/UrlPicker.js +1 -0
  275. package/dist/preview/widget.d.ts +16 -0
  276. package/dist/preview/widget.js +70 -1
  277. package/dist/query.d.ts +28 -0
  278. package/dist/ui/RichText.js +33 -18
  279. package/package.json +2 -1
  280. package/dist/backend/store/GeneratedSource.d.ts +0 -2
  281. package/dist/backend/store/GeneratedSource.js +0 -21
  282. package/dist/chunks/chunk-G6E35DMJ.js +0 -1997
  283. package/dist/core/db/EntryDB.d.ts +0 -19
  284. package/dist/core/db/EntryDB.js +0 -48
  285. package/dist/core/db/EntryIndex.d.ts +0 -143
  286. package/dist/core/db/EntryIndex.js +0 -2773
  287. package/dist/core/db/EntryReferenceIndex.d.ts +0 -21
  288. package/dist/core/db/EntryReferenceIndex.js +0 -131
  289. package/dist/core/db/EntryResolver.d.ts +0 -56
  290. package/dist/core/db/EntryResolver.js +0 -699
  291. package/dist/core/db/EntryTarget.d.ts +0 -5
  292. package/dist/core/db/EntryTransaction.d.ts +0 -31
  293. package/dist/core/db/EntryTransaction.js +0 -956
  294. package/dist/core/db/LocalDB.d.ts +0 -42
  295. package/dist/core/db/LocalDB.js +0 -127
  296. package/dist/core/db/TestDB.d.ts +0 -19
  297. package/dist/core/db/TestDB.js +0 -50
  298. /package/dist/core/db/{EntryTarget.js → LocalStore.js} +0 -0
@@ -0,0 +1,192 @@
1
+ import {
2
+ count,
3
+ max,
4
+ min
5
+ } from "../../chunks/chunk-QBPYWU6C.js";
6
+ import {
7
+ Builder
8
+ } from "../../chunks/chunk-2BJ2IFQM.js";
9
+ import {
10
+ and,
11
+ eq,
12
+ gt,
13
+ inArray,
14
+ lt,
15
+ ne,
16
+ or,
17
+ when
18
+ } from "../../chunks/chunk-XCZXR3C2.js";
19
+ import "../../chunks/chunk-2PIFHEYR.js";
20
+ import "../../chunks/chunk-K62JP6HR.js";
21
+ import "../../chunks/chunk-ATF42T2B.js";
22
+ import {
23
+ sql
24
+ } from "../../chunks/chunk-ETBQTP2S.js";
25
+ import "../../chunks/chunk-CQ52GEHY.js";
26
+
27
+ // src/database/sync/SyncQueries.ts
28
+ import { entryDataText } from "../entry/EntryData.js";
29
+ import {
30
+ EntryIndexColumns
31
+ } from "../entry/EntryTable.js";
32
+ var sqliteBatchSize = 5e3;
33
+ var builder = new Builder();
34
+ var ids = sql.placeholder("ids");
35
+ var versionIds = sql.placeholder("versionIds");
36
+ var filePaths = sql.placeholder("filePaths");
37
+ var dirs = sql.placeholder("dirs");
38
+ var dir = sql.placeholder("dir");
39
+ var from = sql.placeholder("from");
40
+ var to = sql.placeholder("to");
41
+ var revision = sql.placeholder("revision");
42
+ var treeSnapshot = sql.placeholder("tree");
43
+ function inJson(column, values) {
44
+ return sql`${column} in (select value from json_each(${values}))`;
45
+ }
46
+ function versionFields(entries) {
47
+ return {
48
+ versionId: entries.versionId,
49
+ id: entries.id,
50
+ locale: entries.locale,
51
+ versionStatus: entries.versionStatus,
52
+ type: entries.type,
53
+ index: entries.index,
54
+ workspace: entries.workspace,
55
+ root: entries.root,
56
+ path: entries.path,
57
+ filePath: entries.filePath,
58
+ level: entries.level,
59
+ parentDir: entries.parentDir,
60
+ childrenDir: entries.childrenDir,
61
+ childrenSha: entries.childrenSha,
62
+ parentId: entries.parentId,
63
+ parents: entries.parents,
64
+ status: entries.status,
65
+ active: entries.active,
66
+ main: entries.main,
67
+ visible: entries.visible,
68
+ url: entries.url
69
+ };
70
+ }
71
+ function insertEntryQuery(entries, jsonb) {
72
+ const { rowid: _, ...columns } = EntryIndexColumns;
73
+ const values = Object.fromEntries(
74
+ Object.keys(columns).map((name) => [name, sql.placeholder(name)])
75
+ );
76
+ if (jsonb) values.data = sql`jsonb(${values.data})`;
77
+ return builder.insert(entries).values(values);
78
+ }
79
+ function insertEntryValues(row) {
80
+ return {
81
+ ...row,
82
+ parents: JSON.stringify(row.parents),
83
+ active: Number(row.active),
84
+ main: Number(row.main),
85
+ visible: Number(row.visible)
86
+ };
87
+ }
88
+ function prepareSyncQueries(db, target, jsonb) {
89
+ const { entries, state, search } = target;
90
+ const storedVersion = or(
91
+ inJson(entries.filePath, filePaths),
92
+ inJson(entries.versionId, versionIds)
93
+ );
94
+ const activeCount = count(
95
+ when([eq(entries.active, true), sql.value(1)], null)
96
+ );
97
+ const mainCount = count(when([eq(entries.main, true), sql.value(1)], null));
98
+ const parentKey = sql`coalesce(${entries.parentId}, '')`;
99
+ const statements = {
100
+ revision: builder.select({ revision: state.revision }).from(state).where(eq(state.id, 1)).$first().prepare(void 0, db),
101
+ tree: builder.select({ tree: state.tree }).from(state).where(eq(state.id, 1)).$first().prepare(void 0, db),
102
+ setRevision: builder.update(state).set({ revision, tree: sql`${treeSnapshot}` }).where(eq(state.id, 1)).prepare(void 0, db),
103
+ entryCount: builder.select({ value: count() }).from(entries).where(sql.value(true)).$first().prepare(void 0, db),
104
+ insertEntry: insertEntryQuery(entries, jsonb).prepare(void 0, db),
105
+ /** Index the entry row inserted last, under its rowid. */
106
+ insertSearch: builder.insert(search).values({
107
+ rowid: sql`last_insert_rowid()`,
108
+ title: sql.placeholder("title"),
109
+ body: sql.placeholder("body")
110
+ }).prepare(void 0, db),
111
+ /** Versions stored at these file paths or under these version ids. */
112
+ storedFiles: builder.select({
113
+ id: entries.id,
114
+ filePath: entries.filePath,
115
+ childrenDir: entries.childrenDir,
116
+ childrenSha: entries.childrenSha
117
+ }).from(entries).where(storedVersion).prepare(void 0, db),
118
+ /** Delete the versions stored at these file paths or version ids. */
119
+ deleteFiles: builder.delete(entries).where(storedVersion).prepare(void 0, db),
120
+ /** Delete the search rows of those versions, before the versions. */
121
+ deleteSearch: builder.delete(search).where(
122
+ inArray(
123
+ search.rowid,
124
+ builder.select(entries.rowid).from(entries).where(storedVersion)
125
+ )
126
+ ).prepare(void 0, db),
127
+ directories: builder.select({
128
+ id: entries.id,
129
+ childrenDir: entries.childrenDir,
130
+ childrenSha: entries.childrenSha
131
+ }).from(entries).where(inJson(entries.childrenDir, dirs)).prepare(void 0, db),
132
+ updateChildrenSha: builder.update(entries).set({ childrenSha: sql.placeholder("sha") }).where(eq(entries.childrenDir, dir)).prepare(void 0, db),
133
+ /** Every version of these entries. */
134
+ versionsOf: builder.select(versionFields(entries)).from(entries).where(inJson(entries.id, ids)).prepare(void 0, db),
135
+ /** Every version stored below one directory. */
136
+ versionsBelow: builder.select(versionFields(entries)).from(entries).where(and(gt(entries.filePath, from), lt(entries.filePath, to))).prepare(void 0, db),
137
+ /** The entry owning each directory: children stored there have it as parent. */
138
+ owners: builder.select({ childrenDir: entries.childrenDir, id: entries.id }).from(entries).where(inJson(entries.childrenDir, dirs)).groupBy(entries.childrenDir).prepare(void 0, db),
139
+ statusesOf: builder.select({ id: entries.id, locale: entries.locale, status: entries.status }).from(entries).where(inJson(entries.id, ids)).prepare(void 0, db),
140
+ dataOf: builder.select({ versionId: entries.versionId, data: entryDataText(entries) }).from(entries).where(inJson(entries.versionId, versionIds)).prepare(void 0, db),
141
+ updateVersion: builder.update(entries).set({
142
+ parentId: sql.placeholder("parentId"),
143
+ parents: sql.placeholder("parents"),
144
+ status: sql.placeholder("status"),
145
+ active: sql.placeholder("active"),
146
+ main: sql.placeholder("main"),
147
+ visible: sql.placeholder("visible"),
148
+ url: sql.placeholder("url")
149
+ }).where(eq(entries.versionId, sql.placeholder("versionId"))).prepare(void 0, db),
150
+ /** An entry whose versions disagree on what all of them must share. */
151
+ mismatchedEntry: builder.select({ id: entries.id }).from(entries).where(inJson(entries.id, ids)).groupBy(entries.id).having(
152
+ or(
153
+ ne(min(entries.type), max(entries.type)),
154
+ ne(min(entries.index), max(entries.index)),
155
+ ne(min(entries.root), max(entries.root)),
156
+ ne(min(entries.workspace), max(entries.workspace)),
157
+ ne(min(parentKey), max(parentKey))
158
+ )
159
+ ).$first().prepare(void 0, db),
160
+ /** A language whose versions disagree on their location. */
161
+ mismatchedLanguage: builder.select({ id: entries.id, locale: entries.locale }).from(entries).where(inJson(entries.id, ids)).groupBy(entries.id, entries.locale).having(
162
+ or(
163
+ ne(min(entries.path), max(entries.path)),
164
+ ne(min(entries.parentDir), max(entries.parentDir)),
165
+ ne(min(entries.childrenDir), max(entries.childrenDir))
166
+ )
167
+ ).$first().prepare(void 0, db),
168
+ /** A language without exactly one active and one main version. */
169
+ invalidStatus: builder.select({ id: entries.id, locale: entries.locale }).from(entries).where(inJson(entries.id, ids)).groupBy(entries.id, entries.locale).having(or(ne(activeCount, 1), ne(mainCount, 1))).$first().prepare(void 0, db),
170
+ /** A version listed among its own parents. */
171
+ cyclicVersion: builder.select({ filePath: entries.filePath }).from(entries).where(
172
+ and(
173
+ inJson(entries.id, ids),
174
+ sql`exists (
175
+ select 1 from json_each(${entries.parents}) parent
176
+ where parent.value = ${entries.id}
177
+ )`
178
+ )
179
+ ).$first().prepare(void 0, db)
180
+ };
181
+ return {
182
+ ...statements,
183
+ free() {
184
+ for (const statement of Object.values(statements)) statement.free();
185
+ }
186
+ };
187
+ }
188
+ export {
189
+ insertEntryValues,
190
+ prepareSyncQueries,
191
+ sqliteBatchSize
192
+ };
@@ -9,9 +9,9 @@ import { useField, useFieldError, useFieldOptions } from "alinea/dashboard/hooks
9
9
 
10
10
  // src/field/check/CheckField.module.css
11
11
  var CheckField_default = {
12
- "checkline": "alinea-checkline",
13
12
  "checkline-required": "alinea-checkline-required",
14
- "checklineRequired": "alinea-checkline-required"
13
+ "checklineRequired": "alinea-checkline-required",
14
+ "checkline": "alinea-checkline"
15
15
  };
16
16
 
17
17
  // src/field/check/CheckField.view.tsx
@@ -64,23 +64,23 @@ import { Fragment, useId } from "react";
64
64
 
65
65
  // src/field/code/CodeField.module.css
66
66
  var CodeField_default = {
67
+ "CodeEditorInput-regex": "alinea-CodeEditorInput-regex",
68
+ "CodeEditorInputRegex": "alinea-CodeEditorInput-regex",
67
69
  "CodeEditorInput-punctuation": "alinea-CodeEditorInput-punctuation",
68
70
  "CodeEditorInputPunctuation": "alinea-CodeEditorInput-punctuation",
69
71
  "CodeEditorInput-editor": "alinea-CodeEditorInput-editor",
70
72
  "CodeEditorInputEditor": "alinea-CodeEditorInput-editor",
71
- "CodeEditorInput-identifier": "alinea-CodeEditorInput-identifier",
72
- "CodeEditorInputIdentifier": "alinea-CodeEditorInput-identifier",
73
- "CodeEditorInput-textarea": "alinea-CodeEditorInput-textarea",
74
- "CodeEditorInputTextarea": "alinea-CodeEditorInput-textarea",
73
+ "CodeEditorInput": "alinea-CodeEditorInput",
75
74
  "CodeEditorInput-comment": "alinea-CodeEditorInput-comment",
76
75
  "CodeEditorInputComment": "alinea-CodeEditorInput-comment",
77
- "CodeEditorInput": "alinea-CodeEditorInput",
76
+ "CodeEditorInput-textarea": "alinea-CodeEditorInput-textarea",
77
+ "CodeEditorInputTextarea": "alinea-CodeEditorInput-textarea",
78
78
  "CodeEditorInput-string": "alinea-CodeEditorInput-string",
79
79
  "CodeEditorInputString": "alinea-CodeEditorInput-string",
80
- "CodeEditorInput-regex": "alinea-CodeEditorInput-regex",
81
- "CodeEditorInputRegex": "alinea-CodeEditorInput-regex",
82
80
  "CodeEditorInput-keyword": "alinea-CodeEditorInput-keyword",
83
81
  "CodeEditorInputKeyword": "alinea-CodeEditorInput-keyword",
82
+ "CodeEditorInput-identifier": "alinea-CodeEditorInput-identifier",
83
+ "CodeEditorInputIdentifier": "alinea-CodeEditorInput-identifier",
84
84
  "CodeEditorInput-pre": "alinea-CodeEditorInput-pre",
85
85
  "CodeEditorInputPre": "alinea-CodeEditorInput-pre",
86
86
  "CodeEditorInput-number": "alinea-CodeEditorInput-number",
@@ -2,7 +2,6 @@ import "../../chunks/chunk-CQ52GEHY.js";
2
2
 
3
3
  // src/field/link/FileLink.ts
4
4
  import { Entry } from "alinea/core/Entry";
5
- import { imageExtensions } from "alinea/core/media/IsImage";
6
5
  import { MediaFile } from "alinea/core/media/MediaTypes";
7
6
  import {
8
7
  createLink,
@@ -17,12 +16,7 @@ var FileLink;
17
16
  FileLink2.extension = MediaFile.extension;
18
17
  FileLink2.size = MediaFile.size;
19
18
  })(FileLink || (FileLink = {}));
20
- var fileCondition = {
21
- _type: "MediaFile",
22
- extension: {
23
- notIn: [...imageExtensions, ...imageExtensions.map((e) => e.toUpperCase())]
24
- }
25
- };
19
+ var fileCondition = { _type: "MediaFile" };
26
20
  function filePicker(multiple, options) {
27
21
  return entryPicker({
28
22
  ...options,
@@ -11,6 +11,7 @@ import { ListRow } from "alinea/core/ListRow";
11
11
  import { entries, fromEntries } from "alinea/core/util/Objects";
12
12
  import { viewKeys } from "alinea/dashboard/ViewKeys";
13
13
  import { unresolvedEntryMarker } from "alinea/picker/entry/EntryPicker";
14
+ import { EntryReference } from "alinea/picker/entry/EntryReference";
14
15
  var LinkField = class extends UnionField {
15
16
  first(query) {
16
17
  return { edge: "entrySingle", first: true, field: this, ...query };
@@ -43,6 +44,9 @@ function createLink(label, options) {
43
44
  }
44
45
  ];
45
46
  },
47
+ localizeLinks(value, context) {
48
+ return localizeEntryLink(value, context);
49
+ },
46
50
  view: viewKeys.SingleLinkInput
47
51
  });
48
52
  }
@@ -98,6 +102,17 @@ function createLinks(label, options) {
98
102
  }
99
103
  return result;
100
104
  },
105
+ localizeLinks(rows, context) {
106
+ if (!Array.isArray(rows)) return rows;
107
+ let next = rows;
108
+ rows.forEach((row, index) => {
109
+ const localized = localizeEntryLink(row, context);
110
+ if (localized === row) return;
111
+ if (next === rows) next = [...rows];
112
+ next[index] = localized;
113
+ });
114
+ return next;
115
+ },
101
116
  view: viewKeys.MultipleLinksInput
102
117
  });
103
118
  }
@@ -106,6 +121,14 @@ function entryIdOf(value) {
106
121
  const entry = value._entry;
107
122
  return typeof entry === "string" ? entry : void 0;
108
123
  }
124
+ function localizeEntryLink(value, context) {
125
+ if (!value || value[Reference.type] !== "entry") return value;
126
+ const entryId = entryIdOf(value);
127
+ if (!entryId || !context.entryIds.has(entryId)) return value;
128
+ if (value[EntryReference.locale] === context.locale)
129
+ return value;
130
+ return { ...value, [EntryReference.locale]: context.locale };
131
+ }
109
132
  function entryLinkType(type) {
110
133
  return type === "entry" || type === "image" || type === "file" ? type : void 0;
111
134
  }
@@ -89,56 +89,56 @@ import { Fragment, useMemo, useRef, useState } from "react";
89
89
 
90
90
  // src/field/link/LinkField.module.css
91
91
  var LinkField_default = {
92
+ "LinkFieldView-previewImage": "alinea-LinkFieldView-previewImage",
93
+ "LinkFieldViewPreviewImage": "alinea-LinkFieldView-previewImage",
94
+ "LinkFieldView-icon": "alinea-LinkFieldView-icon",
95
+ "LinkFieldViewIcon": "alinea-LinkFieldView-icon",
96
+ "LinkFieldView-type": "alinea-LinkFieldView-type",
97
+ "LinkFieldViewType": "alinea-LinkFieldView-type",
98
+ "is-wide": "alinea-is-wide",
99
+ "isWide": "alinea-is-wide",
100
+ "LinkFieldView-dropIndicator": "alinea-LinkFieldView-dropIndicator",
101
+ "LinkFieldViewDropIndicator": "alinea-LinkFieldView-dropIndicator",
102
+ "is-loading": "alinea-is-loading",
103
+ "isLoading": "alinea-is-loading",
92
104
  "LinkFieldView-title": "alinea-LinkFieldView-title",
93
105
  "LinkFieldViewTitle": "alinea-LinkFieldView-title",
94
- "LinkFieldView-previewImagePlaceholder": "alinea-LinkFieldView-previewImagePlaceholder",
95
- "LinkFieldViewPreviewImagePlaceholder": "alinea-LinkFieldView-previewImagePlaceholder",
96
- "LinkFieldView-create": "alinea-LinkFieldView-create",
97
- "LinkFieldViewCreate": "alinea-LinkFieldView-create",
98
- "LinkFieldView-meta": "alinea-LinkFieldView-meta",
99
- "LinkFieldViewMeta": "alinea-LinkFieldView-meta",
100
- "LinkFieldView-createButton": "alinea-LinkFieldView-createButton",
101
- "LinkFieldViewCreateButton": "alinea-LinkFieldView-createButton",
106
+ "LinkFieldView-anchorOption": "alinea-LinkFieldView-anchorOption",
107
+ "LinkFieldViewAnchorOption": "alinea-LinkFieldView-anchorOption",
108
+ "is-missing": "alinea-is-missing",
109
+ "isMissing": "alinea-is-missing",
110
+ "LinkFieldView-skeleton-pulse": "alinea-LinkFieldView-skeleton-pulse",
111
+ "LinkFieldViewSkeletonPulse": "alinea-LinkFieldView-skeleton-pulse",
112
+ "LinkFieldView-imagePlaceholder": "alinea-LinkFieldView-imagePlaceholder",
113
+ "LinkFieldViewImagePlaceholder": "alinea-LinkFieldView-imagePlaceholder",
102
114
  "LinkFieldView-anchorOption-label": "alinea-LinkFieldView-anchorOption-label",
103
115
  "LinkFieldViewAnchorOptionLabel": "alinea-LinkFieldView-anchorOption-label",
104
- "LinkFieldView-rowDropTarget": "alinea-LinkFieldView-rowDropTarget",
105
- "LinkFieldViewRowDropTarget": "alinea-LinkFieldView-rowDropTarget",
106
- "LinkFieldView-labelText": "alinea-LinkFieldView-labelText",
107
- "LinkFieldViewLabelText": "alinea-LinkFieldView-labelText",
116
+ "LinkFieldView-anchorOption-location": "alinea-LinkFieldView-anchorOption-location",
117
+ "LinkFieldViewAnchorOptionLocation": "alinea-LinkFieldView-anchorOption-location",
118
+ "LinkFieldView-createButton": "alinea-LinkFieldView-createButton",
119
+ "LinkFieldViewCreateButton": "alinea-LinkFieldView-createButton",
108
120
  "LinkFieldView-image": "alinea-LinkFieldView-image",
109
121
  "LinkFieldViewImage": "alinea-LinkFieldView-image",
110
122
  "LinkFieldView-inputHeader": "alinea-LinkFieldView-inputHeader",
111
123
  "LinkFieldViewInputHeader": "alinea-LinkFieldView-inputHeader",
112
- "LinkFieldView-anchorOption-location": "alinea-LinkFieldView-anchorOption-location",
113
- "LinkFieldViewAnchorOptionLocation": "alinea-LinkFieldView-anchorOption-location",
124
+ "LinkFieldView-meta": "alinea-LinkFieldView-meta",
125
+ "LinkFieldViewMeta": "alinea-LinkFieldView-meta",
126
+ "LinkFieldView-labelText": "alinea-LinkFieldView-labelText",
127
+ "LinkFieldViewLabelText": "alinea-LinkFieldView-labelText",
114
128
  "LinkFieldView-label": "alinea-LinkFieldView-label",
115
129
  "LinkFieldViewLabel": "alinea-LinkFieldView-label",
116
- "LinkFieldView-previewImage": "alinea-LinkFieldView-previewImage",
117
- "LinkFieldViewPreviewImage": "alinea-LinkFieldView-previewImage",
118
- "LinkFieldView-type": "alinea-LinkFieldView-type",
119
- "LinkFieldViewType": "alinea-LinkFieldView-type",
120
- "LinkFieldView-imagePlaceholder": "alinea-LinkFieldView-imagePlaceholder",
121
- "LinkFieldViewImagePlaceholder": "alinea-LinkFieldView-imagePlaceholder",
122
- "LinkFieldView-skeleton-pulse": "alinea-LinkFieldView-skeleton-pulse",
123
- "LinkFieldViewSkeletonPulse": "alinea-LinkFieldView-skeleton-pulse",
124
- "LinkFieldView-metaLabel": "alinea-LinkFieldView-metaLabel",
125
- "LinkFieldViewMetaLabel": "alinea-LinkFieldView-metaLabel",
126
- "LinkFieldView-skeleton": "alinea-LinkFieldView-skeleton",
127
- "LinkFieldViewSkeleton": "alinea-LinkFieldView-skeleton",
128
- "LinkFieldView-icon": "alinea-LinkFieldView-icon",
129
- "LinkFieldViewIcon": "alinea-LinkFieldView-icon",
130
- "is-loading": "alinea-is-loading",
131
- "isLoading": "alinea-is-loading",
132
- "is-missing": "alinea-is-missing",
133
- "isMissing": "alinea-is-missing",
134
- "LinkFieldView-anchorOption": "alinea-LinkFieldView-anchorOption",
135
- "LinkFieldViewAnchorOption": "alinea-LinkFieldView-anchorOption",
136
- "is-wide": "alinea-is-wide",
137
- "isWide": "alinea-is-wide",
138
130
  "LinkFieldView-rowAction": "alinea-LinkFieldView-rowAction",
139
131
  "LinkFieldViewRowAction": "alinea-LinkFieldView-rowAction",
140
- "LinkFieldView-dropIndicator": "alinea-LinkFieldView-dropIndicator",
141
- "LinkFieldViewDropIndicator": "alinea-LinkFieldView-dropIndicator"
132
+ "LinkFieldView-skeleton": "alinea-LinkFieldView-skeleton",
133
+ "LinkFieldViewSkeleton": "alinea-LinkFieldView-skeleton",
134
+ "LinkFieldView-create": "alinea-LinkFieldView-create",
135
+ "LinkFieldViewCreate": "alinea-LinkFieldView-create",
136
+ "LinkFieldView-rowDropTarget": "alinea-LinkFieldView-rowDropTarget",
137
+ "LinkFieldViewRowDropTarget": "alinea-LinkFieldView-rowDropTarget",
138
+ "LinkFieldView-metaLabel": "alinea-LinkFieldView-metaLabel",
139
+ "LinkFieldViewMetaLabel": "alinea-LinkFieldView-metaLabel",
140
+ "LinkFieldView-previewImagePlaceholder": "alinea-LinkFieldView-previewImagePlaceholder",
141
+ "LinkFieldViewPreviewImagePlaceholder": "alinea-LinkFieldView-previewImagePlaceholder"
142
142
  };
143
143
 
144
144
  // src/field/link/LinkField.view.tsx
@@ -221,7 +221,9 @@ function EntryRow({
221
221
  );
222
222
  }
223
223
  function useLinkEntryState(entryId, locale) {
224
- return useAtomValueRaw(linkEntryAtoms(entryId, locale));
224
+ const scope = useOptionalEntryAtoms();
225
+ const linkLocale = locale ?? scope?.localeData.requestedLocale ?? void 0;
226
+ return useAtomValueRaw(linkEntryAtoms(entryId, linkLocale));
225
227
  }
226
228
  function MissingEntryRow({
227
229
  entryId,
@@ -407,7 +409,6 @@ function LinkPickerAction({
407
409
  const location = childLocation ?? resolved.location ?? fallbackLocation;
408
410
  const condition = resolved.condition;
409
411
  const handlesMultiple = Boolean(onPickMany && picker.handlesMultiple);
410
- const selectsMultiple = handlesMultiple && !allowDuplicates;
411
412
  const pickerProps = {
412
413
  condition,
413
414
  enableNavigation: options.enableNavigation,
@@ -428,9 +429,9 @@ function LinkPickerAction({
428
429
  limitLocations: options.limitLocations,
429
430
  nestedNavigation: !pickingChildren,
430
431
  pickChildren: pickingChildren,
431
- preselect: selectsMultiple,
432
- selectionMode: selectsMultiple ? "multiple" : "single",
433
- selectionBehavior: selectsMultiple ? "toggle" : "replace",
432
+ preselect: handlesMultiple && !allowDuplicates,
433
+ selectionMode: handlesMultiple ? "multiple" : "single",
434
+ selectionBehavior: handlesMultiple ? "toggle" : "replace",
434
435
  initialSelection: initialSelection(value, selection),
435
436
  onConfirm(entryIds, locale) {
436
437
  const existing = allowDuplicates ? [] : selection;
@@ -16,6 +16,11 @@ export interface ListOptions<Definitions extends Schema> extends FieldOptions<Ar
16
16
  inline?: boolean;
17
17
  /** Hide this list field */
18
18
  hidden?: boolean;
19
+ /** Mark the field as invalid while it has fewer items */
20
+ min?: number;
21
+ /** Hide the create actions once the list has this many items and mark
22
+ * the field as invalid while it has more */
23
+ max?: number;
19
24
  /** The initial value of the field */
20
25
  initialValue?: Array<InferStoredValue<Definitions>>;
21
26
  /** Validate the given value */
@@ -1,5 +1,6 @@
1
1
  import '#/theme.css';
2
2
  export declare function Example(): import("react").JSX.Element | null;
3
+ export declare function MinMax(): import("react").JSX.Element;
3
4
  declare const _default: {
4
5
  title: string;
5
6
  };