rimecms 0.33.0 → 1.0.0

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 (489) hide show
  1. package/dist/adapter-sqlite/auth.server.d.ts +2 -2
  2. package/dist/adapter-sqlite/columns.server.js +2 -2
  3. package/dist/adapter-sqlite/connect.server.d.ts +12 -0
  4. package/dist/adapter-sqlite/connect.server.js +31 -0
  5. package/dist/adapter-sqlite/generate-schema/index.server.js +11 -3
  6. package/dist/adapter-sqlite/generate-schema/root.server.d.ts +13 -4
  7. package/dist/adapter-sqlite/generate-schema/root.server.js +75 -131
  8. package/dist/adapter-sqlite/generate-schema/templates.server.d.ts +27 -6
  9. package/dist/adapter-sqlite/generate-schema/templates.server.js +52 -10
  10. package/dist/adapter-sqlite/index.server.d.ts +13 -5
  11. package/dist/adapter-sqlite/index.server.js +9 -6
  12. package/dist/adapter-sqlite/naming.server.d.ts +6 -8
  13. package/dist/adapter-sqlite/naming.server.js +22 -4
  14. package/dist/adapter-sqlite/paths.server.d.ts +10 -0
  15. package/dist/adapter-sqlite/paths.server.js +122 -0
  16. package/dist/adapter-sqlite/read.server.d.ts +10 -1
  17. package/dist/adapter-sqlite/read.server.js +22 -10
  18. package/dist/adapter-sqlite/select.server.d.ts +19 -0
  19. package/dist/adapter-sqlite/select.server.js +71 -63
  20. package/dist/adapter-sqlite/table.server.d.ts +2 -2
  21. package/dist/adapter-sqlite/transform.server.js +33 -3
  22. package/dist/adapter-sqlite/types.server.d.ts +10 -3
  23. package/dist/adapter-sqlite/where.server.d.ts +2 -3
  24. package/dist/adapter-sqlite/where.server.js +19 -1
  25. package/dist/core/adapter.d.ts +94 -0
  26. package/dist/core/auth/better-auth/config.server.d.ts +3 -3
  27. package/dist/core/auth/better-auth/instance.server.d.ts +6 -6
  28. package/dist/core/auth/handler/index.server.js +1 -1
  29. package/dist/core/auth/staff/derive.js +1 -1
  30. package/dist/core/auth/validate-config.js +3 -5
  31. package/dist/core/boot.server.d.ts +6 -6
  32. package/dist/core/config/types.d.ts +43 -5
  33. package/dist/core/config/validate.server.js +34 -51
  34. package/dist/core/dev/cli/commands/build.js +21 -6
  35. package/dist/core/dev/cli/commands/init.server.d.ts +2 -1
  36. package/dist/core/dev/cli/commands/init.server.js +32 -6
  37. package/dist/core/dev/cli/index.js +1 -0
  38. package/dist/core/dev/cli/templates/init.d.ts +6 -1
  39. package/dist/core/dev/cli/templates/init.js +30 -2
  40. package/dist/core/dev/cli/util/package-manager.server.d.ts +1 -0
  41. package/dist/core/dev/cli/util/package-manager.server.js +11 -8
  42. package/dist/core/dev/cli/util/package.server.d.ts +9 -0
  43. package/dist/core/dev/cli/util/package.server.js +43 -0
  44. package/dist/core/dev/codegen/types/contributions.server.d.ts +3 -2
  45. package/dist/core/dev/codegen/types/contributions.server.js +10 -3
  46. package/dist/core/dev/vite.server.js +4 -3
  47. package/dist/core/fields/blank.d.ts +21 -0
  48. package/dist/core/fields/blank.js +37 -0
  49. package/dist/core/fields/builders/field-builder.d.ts +53 -0
  50. package/dist/core/fields/builders/field-builder.js +14 -1
  51. package/dist/core/fields/builders/form-field-builder.d.ts +8 -0
  52. package/dist/core/fields/builders/form-field-builder.js +14 -1
  53. package/dist/core/fields/util.d.ts +9 -2
  54. package/dist/core/fields/util.js +123 -135
  55. package/dist/core/fields/walk.d.ts +44 -0
  56. package/dist/core/fields/walk.js +55 -0
  57. package/dist/core/handler.server.js +4 -0
  58. package/dist/core/i18n/context.d.ts +5 -0
  59. package/dist/core/i18n/context.js +6 -0
  60. package/dist/core/i18n/en/common.d.ts +71 -0
  61. package/dist/core/i18n/en/common.js +72 -1
  62. package/dist/core/i18n/en/fields.d.ts +68 -0
  63. package/dist/core/i18n/en/fields.js +69 -1
  64. package/dist/core/i18n/fr/common.d.ts +71 -0
  65. package/dist/core/i18n/fr/common.js +72 -1
  66. package/dist/core/i18n/fr/fields.d.ts +68 -0
  67. package/dist/core/i18n/fr/fields.js +69 -1
  68. package/dist/core/i18n/index.d.ts +29 -3
  69. package/dist/core/i18n/index.js +55 -29
  70. package/dist/core/locale/copy.server.js +3 -3
  71. package/dist/core/logger.server.js +15 -6
  72. package/dist/core/pipeline/build-document.server.d.ts +3 -0
  73. package/dist/core/pipeline/build-document.server.js +10 -7
  74. package/dist/core/pipeline/config-map/index.d.ts +9 -0
  75. package/dist/core/pipeline/config-map/index.js +16 -50
  76. package/dist/core/pipeline/hooks/process-document-fields.server.d.ts +3 -0
  77. package/dist/core/pipeline/hooks/process-document-fields.server.js +48 -12
  78. package/dist/core/pipeline/hooks/set-default-values.server.d.ts +1 -0
  79. package/dist/core/pipeline/hooks/set-default-values.server.js +1 -0
  80. package/dist/core/pipeline/persist/blocks/extract.server.js +1 -1
  81. package/dist/core/pipeline/persist/relations/extract.server.js +2 -0
  82. package/dist/core/pipeline/populate-relations.server.d.ts +27 -0
  83. package/dist/core/pipeline/populate-relations.server.js +42 -0
  84. package/dist/core/pipeline/run.server.d.ts +17 -6
  85. package/dist/core/pipeline/run.server.js +44 -30
  86. package/dist/core/plugins/cache/module.server.d.ts +1 -1
  87. package/dist/core/plugins/cache/module.server.js +5 -5
  88. package/dist/core/prototype/area/api.server.js +1 -2
  89. package/dist/core/prototype/area/definition.js +1 -10
  90. package/dist/core/prototype/area/definition.server.js +4 -5
  91. package/dist/core/prototype/area/hooks.server.js +3 -2
  92. package/dist/core/prototype/area/operations/find.js +2 -0
  93. package/dist/core/prototype/blank.d.ts +26 -0
  94. package/dist/core/prototype/blank.js +22 -0
  95. package/dist/core/prototype/collection/api.server.d.ts +29 -3
  96. package/dist/core/prototype/collection/api.server.js +47 -4
  97. package/dist/core/prototype/collection/definition.js +0 -3
  98. package/dist/core/prototype/collection/hooks/merge-with-blank.server.d.ts +5 -1
  99. package/dist/core/prototype/collection/hooks/merge-with-blank.server.js +8 -22
  100. package/dist/core/prototype/collection/hooks.server.js +11 -5
  101. package/dist/core/prototype/collection/nested/module.server.js +3 -1
  102. package/dist/core/prototype/collection/nested/tree.d.ts +12 -0
  103. package/dist/core/prototype/collection/nested/tree.js +42 -0
  104. package/dist/core/prototype/collection/operations/find-by-id.js +2 -0
  105. package/dist/core/prototype/collection/operations/find-by-ids.d.ts +19 -0
  106. package/dist/core/prototype/collection/operations/find-by-ids.js +54 -0
  107. package/dist/core/prototype/collection/operations/find.js +21 -27
  108. package/dist/core/prototype/collection/operations/update-slug-by-id.d.ts +20 -0
  109. package/dist/core/prototype/collection/operations/update-slug-by-id.js +53 -0
  110. package/dist/core/prototype/collection/rest/index.server.js +3 -1
  111. package/dist/core/prototype/collection/rest/update-slug-by-id.server.d.ts +2 -0
  112. package/dist/core/prototype/collection/rest/update-slug-by-id.server.js +20 -0
  113. package/dist/core/prototype/collection/thumbnail/find-thumbnail.d.ts +2 -1
  114. package/dist/core/prototype/collection/thumbnail/find-thumbnail.js +4 -27
  115. package/dist/core/prototype/collection/upload/directories/derive.js +3 -1
  116. package/dist/core/prototype/collection/upload/disk/delete.server.js +1 -2
  117. package/dist/core/prototype/define.js +2 -0
  118. package/dist/core/prototype/shared/metas/fields.js +2 -1
  119. package/dist/core/prototype/shared/title/find-title.d.ts +2 -1
  120. package/dist/core/prototype/shared/title/find-title.js +5 -28
  121. package/dist/core/prototype/shared/url/addresses.server.d.ts +26 -0
  122. package/dist/core/prototype/shared/url/addresses.server.js +119 -0
  123. package/dist/core/prototype/shared/url/doc-type.d.ts +6 -0
  124. package/dist/core/prototype/shared/url/doc-type.js +9 -0
  125. package/dist/core/prototype/shared/url/format.server.d.ts +27 -0
  126. package/dist/core/prototype/shared/url/format.server.js +38 -0
  127. package/dist/core/prototype/shared/url/hooks/create-paths.server.d.ts +2 -0
  128. package/dist/core/prototype/shared/url/hooks/create-paths.server.js +9 -0
  129. package/dist/core/prototype/shared/url/hooks/detach-paths.server.d.ts +5 -0
  130. package/dist/core/prototype/shared/url/hooks/detach-paths.server.js +18 -0
  131. package/dist/core/prototype/shared/url/hooks/index.server.d.ts +5 -1
  132. package/dist/core/prototype/shared/url/hooks/index.server.js +5 -1
  133. package/dist/core/prototype/shared/url/hooks/set-area-url.server.d.ts +2 -0
  134. package/dist/core/prototype/shared/url/hooks/set-area-url.server.js +8 -0
  135. package/dist/core/prototype/shared/url/hooks/set-live-url.server.d.ts +5 -0
  136. package/dist/core/prototype/shared/url/hooks/set-live-url.server.js +19 -0
  137. package/dist/core/prototype/shared/url/hooks/sync-paths.server.d.ts +7 -0
  138. package/dist/core/prototype/shared/url/hooks/sync-paths.server.js +37 -0
  139. package/dist/core/prototype/shared/url/refresh.server.d.ts +36 -0
  140. package/dist/core/prototype/shared/url/refresh.server.js +58 -0
  141. package/dist/core/prototype/shared/versions/configure.server.js +3 -0
  142. package/dist/core/routes/context.server.d.ts +2 -1
  143. package/dist/fields/blocks/component/AddBlockButton.svelte +48 -137
  144. package/dist/fields/blocks/component/Block.svelte +153 -117
  145. package/dist/fields/blocks/component/Block.svelte.d.ts +11 -5
  146. package/dist/fields/blocks/component/BlockActions.svelte +76 -26
  147. package/dist/fields/blocks/component/BlockActions.svelte.d.ts +3 -0
  148. package/dist/fields/blocks/component/Blocks.svelte +248 -91
  149. package/dist/fields/blocks/component/focus/BlocksFocus.svelte +680 -0
  150. package/dist/fields/blocks/component/focus/BlocksFocus.svelte.d.ts +7 -0
  151. package/dist/fields/blocks/component/focus/Layers.svelte +145 -0
  152. package/dist/fields/blocks/component/focus/Layers.svelte.d.ts +9 -0
  153. package/dist/fields/blocks/component/focus/LayersList.svelte +304 -0
  154. package/dist/fields/blocks/component/focus/LayersList.svelte.d.ts +10 -0
  155. package/dist/fields/blocks/component/focus/Palette.svelte +135 -0
  156. package/dist/fields/blocks/component/focus/Palette.svelte.d.ts +9 -0
  157. package/dist/fields/blocks/component/focus/RenderPlaceholder.svelte +77 -0
  158. package/dist/fields/blocks/component/focus/RenderPlaceholder.svelte.d.ts +10 -0
  159. package/dist/fields/blocks/component/focus/Renders.svelte +302 -0
  160. package/dist/fields/blocks/component/focus/Renders.svelte.d.ts +11 -0
  161. package/dist/fields/blocks/component/focus/Stage.svelte +190 -0
  162. package/dist/fields/blocks/component/focus/Stage.svelte.d.ts +8 -0
  163. package/dist/fields/blocks/component/focus/StagePlaceholder.svelte +69 -0
  164. package/dist/fields/blocks/component/focus/StagePlaceholder.svelte.d.ts +3 -0
  165. package/dist/fields/blocks/component/focus/focus.svelte.d.ts +140 -0
  166. package/dist/fields/blocks/component/focus/focus.svelte.js +424 -0
  167. package/dist/fields/blocks/component/picker/BlockPicker.svelte +88 -0
  168. package/dist/fields/blocks/component/picker/BlockPicker.svelte.d.ts +10 -0
  169. package/dist/fields/blocks/component/picker/BlockTile.svelte +121 -0
  170. package/dist/fields/blocks/component/picker/BlockTile.svelte.d.ts +12 -0
  171. package/dist/fields/blocks/index.d.ts +49 -7
  172. package/dist/fields/blocks/index.js +61 -12
  173. package/dist/fields/checkbox/component/Checkbox.svelte +11 -37
  174. package/dist/fields/checkbox/component/Checkbox.svelte.d.ts +1 -0
  175. package/dist/fields/combobox/component/ComboBox.svelte +37 -7
  176. package/dist/fields/combobox/component/combobox.css +26 -10
  177. package/dist/fields/date/component/Date.svelte +43 -12
  178. package/dist/fields/group/component/Group.svelte +110 -41
  179. package/dist/fields/group/index.d.ts +5 -1
  180. package/dist/fields/group/index.js +10 -2
  181. package/dist/fields/link/component/Link.svelte +184 -143
  182. package/dist/fields/link/component/RessourceInput.svelte +26 -24
  183. package/dist/fields/link/index.d.ts +1 -0
  184. package/dist/fields/link/module.server.js +2 -4
  185. package/dist/fields/number/component/Number.svelte +38 -20
  186. package/dist/fields/number/component/number.css +22 -20
  187. package/dist/fields/number/index.d.ts +1 -0
  188. package/dist/fields/radio/component/Radio.svelte +12 -0
  189. package/dist/fields/radio/index.js +1 -1
  190. package/dist/fields/relation/component/Relation.svelte +169 -40
  191. package/dist/fields/relation/component/RelationInline.svelte +258 -0
  192. package/dist/fields/relation/component/RelationInline.svelte.d.ts +26 -0
  193. package/dist/fields/relation/component/default/Default.svelte +210 -100
  194. package/dist/fields/relation/component/default/Default.svelte.d.ts +14 -1
  195. package/dist/fields/relation/component/types.d.ts +4 -0
  196. package/dist/fields/relation/component/upload/Browse.svelte +619 -88
  197. package/dist/fields/relation/component/upload/Browse.svelte.d.ts +10 -2
  198. package/dist/fields/relation/component/upload/Create.svelte +41 -0
  199. package/dist/fields/relation/component/upload/Create.svelte.d.ts +13 -0
  200. package/dist/fields/relation/component/upload/Upload.svelte +287 -101
  201. package/dist/fields/relation/component/upload/Upload.svelte.d.ts +6 -1
  202. package/dist/fields/relation/component/upload/upload.css +5 -81
  203. package/dist/fields/relation/module.server.js +7 -1
  204. package/dist/fields/relation/value.d.ts +25 -0
  205. package/dist/fields/relation/value.js +27 -0
  206. package/dist/fields/rich-text/component/RichText.svelte +12 -80
  207. package/dist/fields/rich-text/component/RichText.svelte.d.ts +1 -1
  208. package/dist/fields/rich-text/component/RichTextInline.svelte +28 -0
  209. package/dist/fields/rich-text/component/RichTextInline.svelte.d.ts +11 -0
  210. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.css +4 -3
  211. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte +3 -1
  212. package/dist/fields/rich-text/component/bubble-menu/icon-button/icon-button.css +2 -2
  213. package/dist/fields/rich-text/component/bubble-menu/node-selector/node-selector.css +7 -10
  214. package/dist/fields/rich-text/component/drag-handle/drag-handle.css +0 -2
  215. package/dist/fields/rich-text/component/styles/editor.css +111 -0
  216. package/dist/fields/rich-text/component/styles/field.css +71 -0
  217. package/dist/fields/rich-text/component/suggestion/suggestion.svelte +41 -56
  218. package/dist/fields/rich-text/core/build-editor-config.js +1 -1
  219. package/dist/fields/rich-text/core/extensions/drag-handle/drag-handle-plugin.js +29 -3
  220. package/dist/fields/rich-text/core/extensions/drag-handle/drag-handle.d.ts +1 -0
  221. package/dist/fields/rich-text/core/extensions/drag-handle/drag-handle.js +2 -1
  222. package/dist/fields/rich-text/core/features/fields/fields.css +2 -3
  223. package/dist/fields/rich-text/core/features/hr/hr.css +4 -4
  224. package/dist/fields/rich-text/core/features/link/component/link-selector.css +0 -4
  225. package/dist/fields/rich-text/core/features/link/component/link-selector.svelte +24 -8
  226. package/dist/fields/rich-text/core/features/resource/resource.svelte +20 -6
  227. package/dist/fields/rich-text/core/features/upload/upload.svelte +20 -8
  228. package/dist/fields/rich-text/core/rich-text-editor-core.svelte +103 -0
  229. package/dist/fields/rich-text/core/rich-text-editor-core.svelte.d.ts +15 -0
  230. package/dist/fields/select/component/Select.svelte +67 -28
  231. package/dist/fields/slug/component/Slug.svelte +26 -53
  232. package/dist/fields/slug/index.d.ts +1 -0
  233. package/dist/fields/slug/index.js +1 -1
  234. package/dist/fields/tabs/component/Tabs.svelte +28 -22
  235. package/dist/fields/tabs/index.d.ts +4 -1
  236. package/dist/fields/tabs/index.js +17 -5
  237. package/dist/fields/text/index.d.ts +1 -0
  238. package/dist/fields/textarea/component/TextArea.svelte +28 -13
  239. package/dist/fields/textarea/index.d.ts +1 -0
  240. package/dist/fields/time/component/Time.svelte +9 -2
  241. package/dist/fields/toggle/component/Toggle.svelte +8 -25
  242. package/dist/fields/toggle/component/Toggle.svelte.d.ts +1 -0
  243. package/dist/fields/toggle/index.d.ts +1 -0
  244. package/dist/fields/tree/component/AddItemButton.svelte +18 -5
  245. package/dist/fields/tree/component/Tree.svelte +48 -19
  246. package/dist/fields/tree/component/TreeBlock.svelte +318 -104
  247. package/dist/fields/tree/component/TreeBlockActions.svelte +71 -7
  248. package/dist/fields/tree/component/TreeBlockActions.svelte.d.ts +4 -0
  249. package/dist/fields/tree/component/props.d.ts +2 -1
  250. package/dist/fields/tree/index.d.ts +13 -1
  251. package/dist/fields/tree/index.js +35 -9
  252. package/dist/fields/types.d.ts +3 -1
  253. package/dist/index.d.ts +4 -3
  254. package/dist/index.js +3 -2
  255. package/dist/panel/components/Root.svelte +16 -44
  256. package/dist/panel/components/Root.svelte.d.ts +1 -1
  257. package/dist/panel/components/fields/Error.svelte +18 -3
  258. package/dist/panel/components/fields/FieldsPreview.svelte +30 -17
  259. package/dist/panel/components/fields/FieldsPreviewTrigger.svelte +25 -3
  260. package/dist/panel/components/fields/Hint.svelte +51 -8
  261. package/dist/panel/components/fields/Hint.svelte.d.ts +11 -0
  262. package/dist/panel/components/fields/Label.svelte +2 -0
  263. package/dist/panel/components/fields/LabelFor.svelte +7 -2
  264. package/dist/panel/components/fields/RenderFields.svelte +10 -3
  265. package/dist/panel/components/fields/fieldset.svelte.d.ts +4 -1
  266. package/dist/panel/components/fields/fieldset.svelte.js +9 -2
  267. package/dist/panel/components/fields/index.d.ts +1 -0
  268. package/dist/panel/components/fields/setting.css +82 -0
  269. package/dist/panel/components/sections/auth/AuthForm.svelte +25 -26
  270. package/dist/panel/components/sections/collection/Avatar.svelte +61 -0
  271. package/dist/panel/components/sections/collection/Avatar.svelte.d.ts +9 -0
  272. package/dist/panel/components/sections/collection/DocStatus.svelte +28 -0
  273. package/dist/panel/components/sections/collection/DocStatus.svelte.d.ts +7 -0
  274. package/dist/panel/components/sections/collection/Empty.svelte +3 -3
  275. package/dist/panel/components/sections/collection/StatusDot.svelte +7 -5
  276. package/dist/panel/components/sections/collection/When.svelte +33 -0
  277. package/dist/panel/components/sections/collection/When.svelte.d.ts +8 -0
  278. package/dist/panel/components/sections/collection/bulk-upload/BulkUploadDialog.svelte +65 -21
  279. package/dist/panel/components/sections/collection/bulk-upload/BulkUploadDialog.svelte.d.ts +3 -2
  280. package/dist/panel/components/sections/collection/bulk-upload/DropZone.svelte +45 -162
  281. package/dist/panel/components/sections/collection/bulk-upload/DropZone.svelte.d.ts +3 -2
  282. package/dist/panel/components/sections/collection/bulk-upload/FileDrop.svelte +151 -0
  283. package/dist/panel/components/sections/collection/bulk-upload/FileDrop.svelte.d.ts +17 -0
  284. package/dist/panel/components/sections/collection/bulk-upload/PageDrop.svelte +177 -0
  285. package/dist/panel/components/sections/collection/bulk-upload/PageDrop.svelte.d.ts +12 -0
  286. package/dist/panel/components/sections/collection/bulk-upload/UploadProgress.svelte +75 -0
  287. package/dist/panel/components/sections/collection/bulk-upload/UploadProgress.svelte.d.ts +8 -0
  288. package/dist/panel/components/sections/collection/folder/Folder.svelte +18 -3
  289. package/dist/panel/components/sections/collection/folder/FolderEdit.svelte +26 -18
  290. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +98 -58
  291. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte.d.ts +0 -1
  292. package/dist/panel/components/sections/collection/folder/Folders.svelte +60 -0
  293. package/dist/panel/components/sections/collection/folder/Folders.svelte.d.ts +7 -0
  294. package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte +31 -71
  295. package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte.d.ts +1 -0
  296. package/dist/panel/components/sections/collection/grid/create-directory-dialog/CreateDirectoryDialog.svelte +5 -3
  297. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte +250 -37
  298. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte.d.ts +2 -0
  299. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte +43 -18
  300. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte.d.ts +6 -4
  301. package/dist/panel/components/sections/collection/header/DisplayMode.svelte +69 -58
  302. package/dist/panel/components/sections/collection/header/DisplayMode.svelte.d.ts +0 -1
  303. package/dist/panel/components/sections/collection/header/FilterMenu.svelte +60 -0
  304. package/dist/panel/components/sections/collection/header/FilterMenu.svelte.d.ts +14 -0
  305. package/dist/panel/components/sections/collection/header/SearchInput.svelte +17 -26
  306. package/dist/panel/components/sections/collection/header/SelectUI.svelte +19 -34
  307. package/dist/panel/components/sections/collection/list/CollectionList.svelte +99 -68
  308. package/dist/panel/components/sections/collection/list/columns.d.ts +21 -0
  309. package/dist/panel/components/sections/collection/list/columns.js +23 -0
  310. package/dist/panel/components/sections/collection/list/header/Header.svelte +99 -51
  311. package/dist/panel/components/sections/collection/list/row/Row.svelte +165 -82
  312. package/dist/panel/components/sections/collection/list/row/Row.svelte.d.ts +4 -0
  313. package/dist/panel/components/sections/collection/tree/CollectionTree.svelte +92 -44
  314. package/dist/panel/components/sections/collection/tree/CollectionTree.svelte.d.ts +1 -0
  315. package/dist/panel/components/sections/collection/tree/CollectionTreeNode.svelte +139 -43
  316. package/dist/panel/components/sections/collection/tree/CollectionTreeNode.svelte.d.ts +2 -0
  317. package/dist/panel/components/sections/collection/upload-thumb-cell/UploadThumbCell.svelte +1 -1
  318. package/dist/panel/components/sections/commands/CommandButton.svelte +99 -0
  319. package/dist/panel/components/sections/commands/CommandButton.svelte.d.ts +10 -0
  320. package/dist/panel/components/sections/commands/CommandPalette.svelte +275 -0
  321. package/dist/panel/components/sections/commands/CommandPalette.svelte.d.ts +8 -0
  322. package/dist/panel/components/sections/commands/Commands.svelte +18 -0
  323. package/dist/panel/components/sections/commands/Commands.svelte.d.ts +9 -0
  324. package/dist/panel/components/sections/document/AuthAPIKeyDialog.svelte +23 -7
  325. package/dist/panel/components/sections/document/AuthFooter.svelte +31 -12
  326. package/dist/panel/components/sections/document/AutoSaveBanner.svelte +24 -7
  327. package/dist/panel/components/sections/document/ButtonSave.svelte +32 -21
  328. package/dist/panel/components/sections/document/ButtonSave.svelte.d.ts +5 -5
  329. package/dist/panel/components/sections/document/ButtonStatus.svelte +68 -20
  330. package/dist/panel/components/sections/document/ChangeSlugDialog.svelte +199 -0
  331. package/dist/panel/components/sections/document/ChangeSlugDialog.svelte.d.ts +10 -0
  332. package/dist/panel/components/sections/document/CurrentlyEdited.svelte +2 -2
  333. package/dist/panel/components/sections/document/Document.svelte +96 -65
  334. package/dist/panel/components/sections/document/DocumentChildren.svelte +175 -0
  335. package/dist/panel/components/sections/document/DocumentChildren.svelte.d.ts +8 -0
  336. package/dist/panel/components/sections/document/DocumentUrl.svelte +119 -0
  337. package/dist/panel/components/sections/document/DocumentUrl.svelte.d.ts +9 -0
  338. package/dist/panel/components/sections/document/Header.svelte +171 -94
  339. package/dist/panel/components/sections/document/Settings.svelte +255 -110
  340. package/dist/panel/components/sections/document/Settings.svelte.d.ts +0 -1
  341. package/dist/panel/components/sections/document/Versions.svelte +5 -3
  342. package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte +112 -53
  343. package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte.d.ts +2 -2
  344. package/dist/panel/components/sections/document/upload-header/drop-zone/DropZone.svelte +74 -41
  345. package/dist/panel/components/sections/document/upload-header/drop-zone/DropZone.svelte.d.ts +1 -1
  346. package/dist/panel/components/sections/live/LiveEdit.svelte +2 -2
  347. package/dist/panel/components/sections/live/LiveFloatingUI.svelte +30 -11
  348. package/dist/panel/components/sections/live/live-edit-panel.css +2 -2
  349. package/dist/panel/components/sections/page-layout/Page.svelte +13 -1
  350. package/dist/panel/components/ui/breadcrumb/BreadCrumb.svelte +55 -27
  351. package/dist/panel/components/ui/button/button.svelte +81 -54
  352. package/dist/panel/components/ui/button/index.d.ts +7 -3
  353. package/dist/panel/components/ui/button/index.js +2 -2
  354. package/dist/panel/components/ui/calendar/calendar.css +27 -27
  355. package/dist/panel/components/ui/calendar/calendar.svelte.d.ts +1 -1
  356. package/dist/panel/components/ui/card/card-description.svelte +1 -1
  357. package/dist/panel/components/ui/card/card.svelte +21 -4
  358. package/dist/panel/components/ui/card-document/card-document.svelte +24 -12
  359. package/dist/panel/components/ui/card-resource/card-resource.svelte +26 -8
  360. package/dist/panel/components/ui/checkbox/checkbox.css +8 -10
  361. package/dist/panel/components/ui/command/command-dialog.css +28 -4
  362. package/dist/panel/components/ui/command/command-dialog.svelte +4 -1
  363. package/dist/panel/components/ui/command/command-dialog.svelte.d.ts +2 -0
  364. package/dist/panel/components/ui/command/command-empty.css +1 -1
  365. package/dist/panel/components/ui/command/command-group.css +3 -3
  366. package/dist/panel/components/ui/command/command-input-select.svelte +3 -3
  367. package/dist/panel/components/ui/command/command-input.svelte +38 -14
  368. package/dist/panel/components/ui/command/command-input.svelte.d.ts +6 -1
  369. package/dist/panel/components/ui/command/command-item.css +2 -2
  370. package/dist/panel/components/ui/command/command-list.css +1 -1
  371. package/dist/panel/components/ui/command/command-separator.css +1 -1
  372. package/dist/panel/components/ui/context-menu/context-menu-item.css +2 -2
  373. package/dist/panel/components/ui/context-menu/context-menu.css +6 -7
  374. package/dist/panel/components/ui/dialog/dialog-content.css +8 -10
  375. package/dist/panel/components/ui/dialog/dialog-content.svelte +19 -0
  376. package/dist/panel/components/ui/dialog/dialog-description.css +1 -1
  377. package/dist/panel/components/ui/dialog/dialog-footer.svelte +5 -1
  378. package/dist/panel/components/ui/dialog/dialog-overlay.css +1 -1
  379. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +19 -5
  380. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-content.css +6 -4
  381. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-item.css +1 -1
  382. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-radio-item.css +1 -1
  383. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-separator.css +1 -1
  384. package/dist/panel/components/ui/input/input.svelte +57 -31
  385. package/dist/panel/components/ui/kbd/Kbd.svelte +90 -0
  386. package/dist/panel/components/ui/kbd/Kbd.svelte.d.ts +11 -0
  387. package/dist/panel/components/ui/kbd/index.d.ts +1 -0
  388. package/dist/panel/components/ui/kbd/index.js +1 -0
  389. package/dist/panel/components/ui/label/label.css +5 -3
  390. package/dist/panel/components/ui/language-switcher/LanguageSwitcher.svelte +27 -15
  391. package/dist/panel/components/ui/nav/Nav.svelte +180 -110
  392. package/dist/panel/components/ui/nav/Nav.svelte.d.ts +0 -2
  393. package/dist/panel/components/ui/nav/NavGroup.svelte +87 -73
  394. package/dist/panel/components/ui/nav/NavItemButton.svelte +69 -29
  395. package/dist/panel/components/ui/nav/UserButton.svelte +132 -71
  396. package/dist/panel/components/ui/page-header/PageHeader.svelte +140 -42
  397. package/dist/panel/components/ui/page-header/PageHeader.svelte.d.ts +8 -1
  398. package/dist/panel/components/ui/popover/popover-content.css +4 -3
  399. package/dist/panel/components/ui/radio-group/radio-group.css +4 -6
  400. package/dist/panel/components/ui/radio-row-group/radio-row-group.css +19 -7
  401. package/dist/panel/components/ui/scroll-area/scroll-area.css +2 -2
  402. package/dist/panel/components/ui/separator/separator.svelte +1 -1
  403. package/dist/panel/components/ui/sheet/index.d.ts +4 -4
  404. package/dist/panel/components/ui/sheet/index.js +5 -5
  405. package/dist/panel/components/ui/sheet/sheet.css +50 -11
  406. package/dist/panel/components/ui/sonner/sonner.css +11 -8
  407. package/dist/panel/components/ui/switch/switch.css +13 -18
  408. package/dist/panel/components/ui/tabs/tabs.css +44 -35
  409. package/dist/panel/components/ui/tag/tag.svelte +20 -6
  410. package/dist/panel/components/ui/tooltip/tooltip-content.svelte +14 -4
  411. package/dist/panel/components/ui/tree/tree-rows.css +146 -0
  412. package/dist/panel/context/blocks-ops.d.ts +78 -0
  413. package/dist/panel/context/blocks-ops.js +170 -0
  414. package/dist/panel/context/collection.svelte.d.ts +28 -0
  415. package/dist/panel/context/collection.svelte.js +120 -65
  416. package/dist/panel/context/commands.svelte.d.ts +80 -0
  417. package/dist/panel/context/commands.svelte.js +108 -0
  418. package/dist/panel/context/documentForm.svelte.d.ts +34 -2
  419. package/dist/panel/context/documentForm.svelte.js +105 -102
  420. package/dist/panel/context/live.svelte.js +2 -73
  421. package/dist/panel/context/nav.svelte.d.ts +23 -0
  422. package/dist/panel/context/nav.svelte.js +56 -0
  423. package/dist/panel/fonts/Geist-VariableFont_wght.ttf +0 -0
  424. package/dist/panel/fonts/GeistMono-VariableFont_wght.ttf +0 -0
  425. package/dist/panel/index.d.ts +7 -1
  426. package/dist/panel/index.js +10 -1
  427. package/dist/panel/pages/auth/forgot-password/ForgotPassword.svelte +16 -1
  428. package/dist/panel/pages/collection/CollectionPage.svelte +236 -61
  429. package/dist/panel/pages/collection/load.server.js +1 -1
  430. package/dist/panel/pages/dashboard/Dashboard.svelte +135 -90
  431. package/dist/panel/pages/dashboard/DashboardCard.svelte +109 -0
  432. package/dist/panel/pages/dashboard/DashboardCard.svelte.d.ts +14 -0
  433. package/dist/panel/pages/dashboard/DashboardCollection.svelte +180 -57
  434. package/dist/panel/pages/dashboard/DashboardCollection.svelte.d.ts +1 -0
  435. package/dist/panel/pages/dashboard/DashboardRow.svelte +93 -0
  436. package/dist/panel/pages/dashboard/DashboardRow.svelte.d.ts +16 -0
  437. package/dist/panel/pages/dashboard/load.server.js +49 -25
  438. package/dist/panel/pages/dashboard/time.d.ts +19 -0
  439. package/dist/panel/pages/dashboard/time.js +29 -0
  440. package/dist/panel/pages/dashboard/types.d.ts +9 -2
  441. package/dist/panel/pages/live/Live.svelte +53 -50
  442. package/dist/panel/style/font.css +21 -32
  443. package/dist/panel/style/index.css +191 -122
  444. package/dist/panel/style/mixins/index.css +14 -0
  445. package/dist/panel/style/palette.css +35 -26
  446. package/dist/panel/style/postcss/size-function.d.ts +4 -0
  447. package/dist/panel/style/postcss/size-function.js +24 -0
  448. package/dist/panel/style/radius.css +4 -5
  449. package/dist/panel/style/scheme.css +111 -0
  450. package/dist/panel/style/size.css +3 -0
  451. package/dist/panel/util/Sortable.js +9 -4
  452. package/dist/panel/util/keys.d.ts +24 -0
  453. package/dist/panel/util/keys.js +63 -0
  454. package/dist/panel/util/populate.d.ts +8 -0
  455. package/dist/panel/util/populate.js +49 -0
  456. package/dist/panel/util/time.d.ts +12 -0
  457. package/dist/panel/util/time.js +35 -0
  458. package/dist/panel/util/upload-file.d.ts +106 -0
  459. package/dist/panel/util/upload-file.js +165 -0
  460. package/dist/util/index.d.ts +7 -10
  461. package/dist/util/index.js +7 -8
  462. package/dist/util/object.d.ts +10 -0
  463. package/dist/util/object.js +22 -1
  464. package/dist/util/string.d.ts +17 -0
  465. package/dist/util/string.js +23 -0
  466. package/package.json +1 -3
  467. package/dist/core/pipeline/config-map/build-tree-map.d.ts +0 -4
  468. package/dist/core/pipeline/config-map/build-tree-map.js +0 -30
  469. package/dist/core/prototype/doc.d.ts +0 -31
  470. package/dist/core/prototype/doc.js +0 -118
  471. package/dist/core/prototype/shared/url/augment.d.ts +0 -13
  472. package/dist/core/prototype/shared/url/augment.js +0 -11
  473. package/dist/core/prototype/shared/url/hooks/populate-url.server.d.ts +0 -4
  474. package/dist/core/prototype/shared/url/hooks/populate-url.server.js +0 -120
  475. package/dist/fields/rich-text/component/styles/rich-text.css +0 -183
  476. package/dist/panel/components/sections/collection/header/Header.svelte +0 -17
  477. package/dist/panel/components/sections/collection/header/Header.svelte.d.ts +0 -3
  478. package/dist/panel/components/sections/collection/header/Separator.svelte +0 -8
  479. package/dist/panel/components/sections/collection/header/Separator.svelte.d.ts +0 -26
  480. package/dist/panel/components/sections/collection/tree/util.d.ts +0 -12
  481. package/dist/panel/components/sections/collection/tree/util.js +0 -22
  482. package/dist/panel/fonts/ChivoMono-Italic-VariableFont_wght.ttf +0 -0
  483. package/dist/panel/fonts/ChivoMono-VariableFont_wght.ttf +0 -0
  484. package/dist/panel/fonts/Inter-VariableFont_slnt,wght.ttf +0 -0
  485. package/dist/panel/fonts/Lora-Italic-VariableFont_wght.ttf +0 -0
  486. package/dist/panel/fonts/Lora-VariableFont_wght.ttf +0 -0
  487. package/dist/panel/style/shadow.css +0 -10
  488. package/dist/util/path.d.ts +0 -16
  489. package/dist/util/path.js +0 -19
@@ -97,12 +97,7 @@ export declare const persistRelational: (args: {
97
97
  config: AnyConfig;
98
98
  locale?: string | undefined;
99
99
  }) => Promise<void>;
100
- /**
101
- * The read tail shared by findById and an area's find: turn a raw adapter row into a document,
102
- * then run the beforeRead chain over it.
103
- */
104
- export declare const readDocument: <S extends DocType, T extends GenericDoc>(args: {
105
- raw: RawDoc;
100
+ type ReadArgs<S extends DocType> = {
106
101
  config: AnyConfig;
107
102
  event: RequestEvent;
108
103
  context: OperationContext<S>;
@@ -110,6 +105,22 @@ export declare const readDocument: <S extends DocType, T extends GenericDoc>(arg
110
105
  localeFallback?: boolean;
111
106
  depth?: number;
112
107
  select?: string[];
108
+ };
109
+ /**
110
+ * The read tail of a list: every raw adapter row turned into rows, what their relations point at
111
+ * read in one pass, then each document built and run through the beforeRead chain.
112
+ *
113
+ * One settled result per raw, in order: a document that fails is the caller's to skip or throw.
114
+ */
115
+ export declare const readDocuments: <S extends DocType, T extends GenericDoc>(args: ReadArgs<S> & {
116
+ raws: RawDoc[];
117
+ }) => Promise<PromiseSettledResult<{
118
+ doc: T;
119
+ context: OperationContext<S>;
120
+ }>[]>;
121
+ /** The read tail of a single document: `readDocuments` over one raw row, its failure thrown. */
122
+ export declare const readDocument: <S extends DocType, T extends GenericDoc>(args: ReadArgs<S> & {
123
+ raw: RawDoc;
113
124
  }) => Promise<{
114
125
  doc: T;
115
126
  context: OperationContext<S>;
@@ -1,6 +1,7 @@
1
1
  import { RimeError } from '../errors/index.js';
2
2
  import { versionsWritePlan } from '../prototype/shared/versions/write-plan.js';
3
3
  import { buildDocument } from './build-document.server.js';
4
+ import { populateRelations } from './populate-relations.server.js';
4
5
  import { saveBlocks } from './persist/blocks/index.server.js';
5
6
  import { saveRelations } from './persist/relations/index.server.js';
6
7
  import { saveTreeBlocks } from './persist/tree/index.server.js';
@@ -133,42 +134,55 @@ export const persistRelational = async (args) => {
133
134
  });
134
135
  };
135
136
  /**
136
- * The read tail shared by findById and an area's find: turn a raw adapter row into a document,
137
- * then run the beforeRead chain over it.
137
+ * The read tail of a list: every raw adapter row turned into rows, what their relations point at
138
+ * read in one pass, then each document built and run through the beforeRead chain.
139
+ *
140
+ * One settled result per raw, in order: a document that fails is the caller's to skip or throw.
138
141
  */
139
- export const readDocument = async (args) => {
140
- const { raw, config, event, locale, localeFallback, depth, select } = args;
142
+ export const readDocuments = async (args) => {
143
+ const { raws, config, event, locale, localeFallback, depth = 0, select } = args;
141
144
  const hasSelect = !!select && Array.isArray(select) && !!select.length;
142
- const rows = await event.locals.rime.adapter.transform.rows({
145
+ const rows = await Promise.allSettled(raws.map((raw) => event.locals.rime.adapter.transform.rows({
143
146
  doc: raw,
144
147
  slug: config.slug,
145
148
  locale,
146
149
  localeFallback
147
- });
148
- const document = await buildDocument(rows, {
149
- config,
150
- event,
151
- locale,
152
- depth,
153
- withBlank: !hasSelect,
154
- /**
155
- * The panel edits blocks and tree nodes in place, so it needs each child row's own
156
- * bookkeeping — `position`, `path`, `ownerId`, `locale` — kept on it.
157
- *
158
- * The adapter used to work this out for itself, by testing `event.params.panel`. Core naming
159
- * the panel here is the last of that coupling (core letting go of `src/lib/panel/`), and it
160
- * is one line rather than four `if`s in the database layer.
161
- */
162
- withRowMeta: event.params.panel !== undefined
163
- });
164
- return runDocHooks({
165
- hooks: config.$hooks?.beforeRead,
166
- doc: document,
167
- config,
168
- event,
169
- operation: 'read',
170
- context: args.context
171
- });
150
+ })));
151
+ const populated = depth > 0
152
+ ? await populateRelations(rows.flatMap((row) => (row.status === 'fulfilled' ? [row.value] : [])), { event, locale, depth })
153
+ : undefined;
154
+ return Promise.allSettled(rows.map(async (row) => {
155
+ if (row.status === 'rejected')
156
+ throw row.reason;
157
+ const document = await buildDocument(row.value, {
158
+ config,
159
+ event,
160
+ locale,
161
+ depth,
162
+ populated,
163
+ withBlank: !hasSelect,
164
+ /**
165
+ * The panel edits blocks and tree nodes in place, so it needs each child row's own
166
+ * bookkeeping — `position`, `path`, `ownerId`, `locale` — kept on it.
167
+ */
168
+ withRowMeta: event.params.panel !== undefined
169
+ });
170
+ return runDocHooks({
171
+ hooks: config.$hooks?.beforeRead,
172
+ doc: document,
173
+ config,
174
+ event,
175
+ operation: 'read',
176
+ context: args.context
177
+ });
178
+ }));
179
+ };
180
+ /** The read tail of a single document: `readDocuments` over one raw row, its failure thrown. */
181
+ export const readDocument = async (args) => {
182
+ const [result] = await readDocuments({ ...args, raws: [args.raw] });
183
+ if (result.status === 'rejected')
184
+ throw result.reason;
185
+ return result.value;
172
186
  };
173
187
  /**
174
188
  * The update pipeline, prototype-parameterized.
@@ -29,7 +29,7 @@ export declare const cache: (options?: CacheOptions) => {
29
29
  readonly configure: <const C extends import("../../config/types.js").Config | import("../../config/types.js").SanitizedConfigClient>(config: C) => C;
30
30
  readonly routes: {
31
31
  readonly '/api/clear-cache': {
32
- readonly POST: () => Response;
32
+ readonly POST: (event: RequestEvent) => Response;
33
33
  };
34
34
  };
35
35
  readonly actions: CacheActions;
@@ -1,4 +1,5 @@
1
- import { json } from '@sveltejs/kit';
1
+ import { isStaff } from '../../auth/access.js';
2
+ import { error, json } from '@sveltejs/kit';
2
3
  import { createHash } from 'node:crypto';
3
4
  import { definePlugin } from '../index.js';
4
5
  import { Cache } from './cache.server.js';
@@ -20,9 +21,7 @@ export const cache = definePlugin((options) => {
20
21
  async function getAction(key, get) {
21
22
  return await Cache.get(key, get);
22
23
  }
23
- /**
24
- * Empty the .cache folder
25
- */
24
+ /** Empties the cache. A config's hook calls it as an action; the route below guards it. */
26
25
  const clearCache = () => {
27
26
  Cache.clear();
28
27
  return json({ message: 'Cache cleared' });
@@ -59,8 +58,9 @@ export const cache = definePlugin((options) => {
59
58
  return config;
60
59
  },
61
60
  routes: {
61
+ // Staff only: the route is public, and an empty cache is a cost.
62
62
  '/api/clear-cache': {
63
- POST: clearCache
63
+ POST: (event) => (isStaff(event.locals.user) ? clearCache() : error(403))
64
64
  }
65
65
  },
66
66
  actions,
@@ -1,4 +1,3 @@
1
- import { createBlankDocument } from '../doc.js';
2
1
  import { versionsReadQuery } from '../shared/versions/read-query.js';
3
2
  import { find } from './operations/find.js';
4
3
  import { update } from './operations/update.js';
@@ -40,7 +39,7 @@ class AreaAPI {
40
39
  }
41
40
  /** The area's document with every default applied. */
42
41
  blank() {
43
- return createBlankDocument(this.config, this.event);
42
+ return this.config.blank(this.event);
44
43
  }
45
44
  /** The locale to act in: the one asked for, else the request's, else the config's default. */
46
45
  fallbackLocale(locale) {
@@ -1,9 +1,6 @@
1
1
  import { augmentMetas } from 'rimecms/core/prototype/shared/metas/module';
2
2
  import { augmentTitle } from '../shared/title/augment.js';
3
- import { augmentUrl } from '../shared/url/augment.js';
4
- import { hasUrl } from '../shared/url/enabled.js';
5
3
  import { augmentVersions } from '../shared/versions/augment.js';
6
- import { when } from '../when.js';
7
4
  import { definePrototype } from '../define.js';
8
5
  import { augmentAreaLabel } from './augment-label.js';
9
6
  /**
@@ -27,13 +24,7 @@ export const area = definePrototype({
27
24
  * in — it simply does not list them. That is what the two lists say that a shared
28
25
  * implementation with a flag could not.
29
26
  */
30
- augments: () => [
31
- augmentAreaLabel,
32
- augmentVersions,
33
- when(hasUrl, augmentUrl),
34
- augmentTitle,
35
- augmentMetas
36
- ]
27
+ augments: () => [augmentAreaLabel, augmentVersions, augmentTitle, augmentMetas]
37
28
  });
38
29
  /**
39
30
  * The public authoring API: `Area.create('settings', {…})`. See the collection's for why the
@@ -1,5 +1,4 @@
1
1
  import { definePrototype } from '../define.js';
2
- import { createBlankDocument } from '../doc.js';
3
2
  import { blankVersion } from '../shared/versions/blank.js';
4
3
  import { area as base } from './definition.js';
5
4
  import { areaHooks } from './hooks.server.js';
@@ -22,9 +21,9 @@ export const area = definePrototype({
22
21
  hooks: areaHooks,
23
22
  boot: async ({ config, adapter, defaultLocale }) => {
24
23
  /**
25
- * No request event: boot has no request. `createBlankDocument` takes one only to pass to a
26
- * field's `defaultValue({ event })`, which already declares it optional — so a default that
27
- * reads it gets `undefined` here rather than whichever request arrived first.
24
+ * No request event: boot has no request. `blank` takes one only to pass to a field's
25
+ * `defaultValue({ event })`, which already declares it optional — so a default that reads it
26
+ * gets `undefined` here rather than whichever request arrived first.
28
27
  *
29
28
  * The locale is the config's default for the same reason: the locale of an area's first row
30
29
  * is a property of the config, not of its first reader.
@@ -33,7 +32,7 @@ export const area = definePrototype({
33
32
  // Intent `'seed'`, not `'create'`: a feature that gives this prototype a versions table may need
34
33
  // the first row to differ from what an author's create starts with. See
35
34
  // FeatureDefinition.blank.
36
- blank: blankVersion(createBlankDocument(config), config),
35
+ blank: blankVersion(config.blank(), config),
37
36
  locale: defaultLocale
38
37
  });
39
38
  }
@@ -39,8 +39,9 @@ export const areaHooks = {
39
39
  setDocumentType,
40
40
  when(isVersioned, versions.exposeVersionId),
41
41
  title.setDocumentTitle,
42
- // After the title, for the reason the collection's list gives.
43
- when(hasUrl, url.populateURL),
42
+ // After the title: `$url` is the author's function, and may read it.
43
+ when(hasUrl, url.setAreaUrl),
44
+ when(hasUrl, url.setLiveUrl),
44
45
  metas.deletePanelLockMetas
45
46
  ],
46
47
  beforeUpdate: [
@@ -1,3 +1,4 @@
1
+ import { readableReferences } from '../../../fields/util.js';
1
2
  import { RimeError } from '../../../errors/index.js';
2
3
  import { readDocument, runBeforeOperation } from '../../../pipeline/run.server.js';
3
4
  export const find = async (args) => {
@@ -24,6 +25,7 @@ export const find = async (args) => {
24
25
  locale,
25
26
  localeFallback,
26
27
  select,
28
+ resolve: isSystemOperation ? undefined : readableReferences(config.fields, event.locals.user),
27
29
  // See the collection's findById.
28
30
  content: ctx.versionQuery({ latest, versionId })
29
31
  });
@@ -0,0 +1,26 @@
1
+ import type { FieldBuilder } from '../fields/builders/field-builder.js';
2
+ import type { GenericDoc } from './types.js';
3
+ import type { Field } from '../../fields/types.js';
4
+ import type { RequestEvent } from '@sveltejs/kit';
5
+ /** What `blank` reads off the config it is a method of. */
6
+ type BlankOwner = {
7
+ fields: FieldBuilder<Field>[];
8
+ slug: string;
9
+ type: string;
10
+ };
11
+ /**
12
+ * A document of this config's shape with every default applied, and no id.
13
+ *
14
+ * ```ts
15
+ * const page = config.getCollection('pages').blank();
16
+ * ```
17
+ *
18
+ * Written as a standalone function so every config carries the same one — `definePrototype.create`
19
+ * for an authored config, and the three derivations that build a config by hand. The event is a
20
+ * field default's; boot has none, and a default that reads it gets `undefined` there.
21
+ *
22
+ * Nothing feature-shaped lands here: a feature adds to a blank document through
23
+ * `FeatureDefinition.blank`, which the local API folds.
24
+ */
25
+ export declare function blank(this: BlankOwner, event?: RequestEvent): GenericDoc;
26
+ export {};
@@ -0,0 +1,22 @@
1
+ import { blankFields } from '../fields/blank.js';
2
+ /**
3
+ * A document of this config's shape with every default applied, and no id.
4
+ *
5
+ * ```ts
6
+ * const page = config.getCollection('pages').blank();
7
+ * ```
8
+ *
9
+ * Written as a standalone function so every config carries the same one — `definePrototype.create`
10
+ * for an authored config, and the three derivations that build a config by hand. The event is a
11
+ * field default's; boot has none, and a default that reads it gets `undefined` there.
12
+ *
13
+ * Nothing feature-shaped lands here: a feature adds to a blank document through
14
+ * `FeatureDefinition.blank`, which the local API folds.
15
+ */
16
+ export function blank(event) {
17
+ return {
18
+ ...blankFields(this.fields, { event }),
19
+ _type: this.slug,
20
+ _prototype: this.type
21
+ };
22
+ }
@@ -10,8 +10,10 @@ import { type DeleteByIdArgs } from './operations/delete-by-id.js';
10
10
  import { type DeleteArgs } from './operations/delete.js';
11
11
  import { type DuplicateArgs } from './operations/duplicate.js';
12
12
  import { type FindByIdArgs } from './operations/find-by-id.js';
13
+ import { type FindByIdsArgs } from './operations/find-by-ids.js';
13
14
  import { type FindArgs } from './operations/find.js';
14
15
  import { type UpdateByIdArgs } from './operations/update-by-id.js';
16
+ import { type UpdateSlugByIdArgs } from './operations/update-slug-by-id.js';
15
17
  /** What building a collection's API for one request needs. */
16
18
  export type CollectionApiArgs = {
17
19
  config: BuiltCollection;
@@ -49,8 +51,15 @@ declare class CollectionAPI<Doc extends RegisterCollection[CollectionSlug]> impl
49
51
  /**
50
52
  * A document of this collection's shape with every default applied, and no id.
51
53
  *
52
- * An auth collection hands back nothing private — the password, the better-auth link. Only a
53
- * collection signs in, which is why this step is here and not on the area's.
54
+ * An auth collection hands back nothing private. Only a collection signs in, which is why this
55
+ * step is here and not on the area's.
56
+ *
57
+ * **Likely dead, to be checked and dropped.** `withoutPrivateFields` strips `PRIVATE_FIELDS`, and
58
+ * of those only `apiKeyId` is ever a member of `config.fields` — `augment.ts` adds it, hidden, on
59
+ * an apiKey collection. `password` is appended per-operation by `augmentFieldsPassword`, which
60
+ * runs *after* the blank merge, and the rest are columns no field declares. So the one member
61
+ * this can remove is `apiKeyId`, which `removePrivateFields` takes off again on every read. If
62
+ * that holds, an auth collection's blank is a blank like any other and this line is ceremony.
54
63
  */
55
64
  blank(): Doc;
56
65
  /** The locale to act in: the one asked for, else the request's, else the config's default. */
@@ -119,6 +128,23 @@ declare class CollectionAPI<Doc extends RegisterCollection[CollectionSlug]> impl
119
128
  * });
120
129
  */
121
130
  findById(args: FindByIdArgs): Promise<Doc>;
131
+ /**
132
+ * Finds the documents with these ids, in one read. Each id is checked against the read access
133
+ * as findById would check it; a missing or refused one is left out. The order is the list's
134
+ * default sort, not the order of `ids`.
135
+ *
136
+ * @example
137
+ * const medias = await rime.collection('medias').findByIds({ ids: ['a1', 'b2'] });
138
+ */
139
+ findByIds(args: FindByIdsArgs): Promise<Doc[]>;
140
+ /**
141
+ * Changes a page's slug in one locale, on the published page. Its address changes, and the pages
142
+ * under it follow. A collection with `$url` only.
143
+ *
144
+ * @example
145
+ * await rime.collection('pages').updateSlugById({ id: '12345', slug: 'web-design', locale: 'en' });
146
+ */
147
+ updateSlugById(args: UpdateSlugByIdArgs): Promise<import("../../adapter.js").PathRow>;
122
148
  /**
123
149
  * Updates a document in the collection by ID.
124
150
  *
@@ -168,6 +194,6 @@ export declare const collectionApi: <Doc extends RegisterCollection[CollectionSl
168
194
  * itself and every `rime.collection(...)` in the repo would resolve to `never`. Each operation
169
195
  * exports its caller-facing arguments separately for the same reason.
170
196
  */
171
- export type CollectionApi<Doc extends RegisterCollection[CollectionSlug] = RegisterCollection[CollectionSlug]> = Pick<CollectionAPI<Doc>, 'config' | 'blank' | 'create' | 'duplicate' | 'find' | 'findById' | 'updateById' | 'deleteById' | 'delete' | 'system'>;
197
+ export type CollectionApi<Doc extends RegisterCollection[CollectionSlug] = RegisterCollection[CollectionSlug]> = Pick<CollectionAPI<Doc>, 'config' | 'blank' | 'create' | 'duplicate' | 'find' | 'findById' | 'findByIds' | 'updateById' | 'updateSlugById' | 'deleteById' | 'delete' | 'system'>;
172
198
  export type CollectionAccessor = <Slug extends keyof RegisterCollection>(slug: Slug) => CollectionApi<RegisterCollection[Slug]>;
173
199
  export {};
@@ -1,15 +1,16 @@
1
1
  import { RimeError } from '../../errors/index.js';
2
2
  import { withoutPrivateFields } from '../../auth/constant.server.js';
3
3
  import { isAuth } from '../../auth/enabled.js';
4
- import { createBlankDocument } from '../doc.js';
5
4
  import { versionsReadQuery } from '../shared/versions/read-query.js';
6
5
  import { create } from './operations/create.js';
7
6
  import { deleteById } from './operations/delete-by-id.js';
8
7
  import { deleteDocs } from './operations/delete.js';
9
8
  import { duplicate } from './operations/duplicate.js';
10
9
  import { findById } from './operations/find-by-id.js';
10
+ import { findByIds } from './operations/find-by-ids.js';
11
11
  import { find } from './operations/find.js';
12
12
  import { updateById } from './operations/update-by-id.js';
13
+ import { updateSlugById } from './operations/update-slug-by-id.js';
13
14
  /**
14
15
  * Everything `rime.collection('pages')` can do, in the collection's own folder, beside the
15
16
  * operations that implement it.
@@ -49,11 +50,18 @@ class CollectionAPI {
49
50
  /**
50
51
  * A document of this collection's shape with every default applied, and no id.
51
52
  *
52
- * An auth collection hands back nothing private — the password, the better-auth link. Only a
53
- * collection signs in, which is why this step is here and not on the area's.
53
+ * An auth collection hands back nothing private. Only a collection signs in, which is why this
54
+ * step is here and not on the area's.
55
+ *
56
+ * **Likely dead, to be checked and dropped.** `withoutPrivateFields` strips `PRIVATE_FIELDS`, and
57
+ * of those only `apiKeyId` is ever a member of `config.fields` — `augment.ts` adds it, hidden, on
58
+ * an apiKey collection. `password` is appended per-operation by `augmentFieldsPassword`, which
59
+ * runs *after* the blank merge, and the rest are columns no field declares. So the one member
60
+ * this can remove is `apiKeyId`, which `removePrivateFields` takes off again on every read. If
61
+ * that holds, an auth collection's blank is a blank like any other and this line is ceremony.
54
62
  */
55
63
  blank() {
56
- const doc = createBlankDocument(this.config, this.event);
64
+ const doc = this.config.blank(this.event);
57
65
  return (isAuth(this.config) ? withoutPrivateFields(doc) : doc);
58
66
  }
59
67
  /** The locale to act in: the one asked for, else the request's, else the config's default. */
@@ -173,6 +181,41 @@ class CollectionAPI {
173
181
  locale: this.fallbackLocale(locale)
174
182
  }));
175
183
  }
184
+ /**
185
+ * Finds the documents with these ids, in one read. Each id is checked against the read access
186
+ * as findById would check it; a missing or refused one is left out. The order is the list's
187
+ * default sort, not the order of `ids`.
188
+ *
189
+ * @example
190
+ * const medias = await rime.collection('medias').findByIds({ ids: ['a1', 'b2'] });
191
+ */
192
+ findByIds(args) {
193
+ const { ids, locale, depth = 0, localeFallback } = args;
194
+ if (!ids.length)
195
+ return Promise.resolve([]);
196
+ return findByIds({
197
+ ctx: this,
198
+ ids,
199
+ depth,
200
+ localeFallback,
201
+ locale: this.fallbackLocale(locale)
202
+ });
203
+ }
204
+ /**
205
+ * Changes a page's slug in one locale, on the published page. Its address changes, and the pages
206
+ * under it follow. A collection with `$url` only.
207
+ *
208
+ * @example
209
+ * await rime.collection('pages').updateSlugById({ id: '12345', slug: 'web-design', locale: 'en' });
210
+ */
211
+ updateSlugById(args) {
212
+ return updateSlugById({
213
+ ctx: this,
214
+ id: args.id,
215
+ slug: args.slug,
216
+ locale: this.fallbackLocale(args.locale)
217
+ });
218
+ }
176
219
  /**
177
220
  * Updates a document in the collection by ID.
178
221
  *
@@ -7,8 +7,6 @@ import { augmentThumbnail } from './thumbnail/augment.js';
7
7
  import { augmentTitle } from '../shared/title/augment.js';
8
8
  import { augmentUpload } from 'rimecms/core/prototype/collection/upload/module';
9
9
  import { isUpload } from './upload/enabled.js';
10
- import { augmentUrl } from '../shared/url/augment.js';
11
- import { hasUrl } from '../shared/url/enabled.js';
12
10
  import { augmentVersions } from '../shared/versions/augment.js';
13
11
  import { when } from '../when.js';
14
12
  import { definePrototype } from '../define.js';
@@ -50,7 +48,6 @@ export const collection = definePrototype({
50
48
  when(isUpload, augmentUpload),
51
49
  when(isNested, augmentNested),
52
50
  augmentVersions,
53
- when(hasUrl, augmentUrl),
54
51
  augmentTitle,
55
52
  augmentThumbnail,
56
53
  augmentMetas
@@ -1,5 +1,9 @@
1
1
  /**
2
- * Merges the incoming data onto a blank document, so a create starts from every field the config
2
+ * Fills the incoming data from a blank document, so a create starts from every field the config
3
3
  * declares rather than only the ones the caller sent.
4
+ *
5
+ * What the caller sent is kept as sent: an upload's `File` is not a plain object and is not
6
+ * walked, a key no field declares has no blank to fill from. The data's own nested objects are
7
+ * shared with the caller's payload from here on, not copied.
4
8
  */
5
9
  export declare const mergeWithBlankDocument: import("../../../pipeline/types").Hook<"raw", "create", "before">;
@@ -1,28 +1,14 @@
1
1
  import { Hooks } from '../../../pipeline/define-hook.js';
2
- import { createBlankDocument } from '../../doc.js';
3
- import { omit, pick } from '../../../../util/object.js';
4
- import deepmerge from 'deepmerge';
2
+ import { withDefaults } from '../../../../util/object.js';
5
3
  /**
6
- * Merges the incoming data onto a blank document, so a create starts from every field the config
4
+ * Fills the incoming data from a blank document, so a create starts from every field the config
7
5
  * declares rather than only the ones the caller sent.
6
+ *
7
+ * What the caller sent is kept as sent: an upload's `File` is not a plain object and is not
8
+ * walked, a key no field declares has no blank to fill from. The data's own nested objects are
9
+ * shared with the caller's payload from here on, not copied.
8
10
  */
9
11
  export const mergeWithBlankDocument = Hooks.beforeCreate(async function mergeWithBlankDocument(args) {
10
- const blank = createBlankDocument(args.config, args.event);
11
- const known = Object.keys(blank);
12
- const data = args.data;
13
- /**
14
- * The blank is built from the config's fields, so only the keys it has are keys there is
15
- * anything to merge *with*. Everything else is carried across rather than through.
16
- *
17
- * That is what keeps a `File` a `File`. `deepmerge` clones every plain object it walks, so an
18
- * upload payload passed through it would come out with none of a `File`'s methods — and `file`
19
- * is not a field on any config, so the blank has no key for it and nothing to merge it into.
20
- */
21
- return {
22
- ...args,
23
- data: {
24
- ...deepmerge(blank, pick(known, data), { arrayMerge: (_, incoming) => incoming }),
25
- ...omit(known, data)
26
- }
27
- };
12
+ const blank = args.config.blank(args.event);
13
+ return { ...args, data: withDefaults(args.data, blank) };
28
14
  });
@@ -62,9 +62,8 @@ export const collectionHooks = {
62
62
  when(isNested, nested.addChildrenProperty),
63
63
  when(isVersioned, versions.exposeVersionId),
64
64
  title.setDocumentTitle,
65
- // After the title: `config.$url(document)` is the author's own function, and a slug built
66
- // from the title is the ordinary case.
67
- when(hasUrl, url.populateURL),
65
+ // The live edit link, from the url the read joined.
66
+ when(hasUrl, url.setLiveUrl),
68
67
  // After the sizes: it takes the thumbnail `upload.populateSizes` derived when there is one.
69
68
  thumbnail.setDocumentThumbnail,
70
69
  metas.deletePanelLockMetas
@@ -89,7 +88,12 @@ export const collectionHooks = {
89
88
  when(isUpload, upload.castBase64ToFile),
90
89
  when(isUpload, upload.processFileUpload)
91
90
  ],
92
- afterCreate: [when(isAuth, auth.populateAPIKey), when(isAuth, auth.signInNewUser)],
91
+ afterCreate: [
92
+ when(isAuth, auth.populateAPIKey),
93
+ when(isAuth, auth.signInNewUser),
94
+ when(hasUrl, url.createPaths)
95
+ ],
96
+ afterUpdate: [when(hasUrl, url.syncPaths)],
93
97
  beforeUpdate: [
94
98
  versions.stripAutoSaveFlag,
95
99
  getOriginalDocument,
@@ -127,7 +131,9 @@ export const collectionHooks = {
127
131
  when(isAuth, auth.preventSupperAdminDeletion),
128
132
  // After the refusal above: a user who cannot be deleted keeps their auto-saves.
129
133
  when(isStaffCollection, versions.discardAutoSavesOf),
130
- when(isUpload, upload.cleanUpFiles)
134
+ when(isUpload, upload.cleanUpFiles),
135
+ // Its children go to the top with their addresses, before its own go by cascade.
136
+ when(hasUrl, url.detachPaths)
131
137
  ],
132
138
  afterDelete: [when(isAuth, auth.deleteBetterAuthUser)]
133
139
  };
@@ -15,7 +15,9 @@ export const augmentNested = (config) => ({
15
15
  text('_parent')
16
16
  .$references(config.slug, { onDelete: 'set null', selfReferencing: true })
17
17
  .hidden()
18
- .$root(),
18
+ .$root()
19
+ // A read lists a document's children by it
20
+ .$index(),
19
21
  number('_position').defaultValue(0).hidden().$root()
20
22
  ]
21
23
  });
@@ -0,0 +1,12 @@
1
+ import type { GenericDoc } from '../../types.js';
2
+ /**
3
+ * The flat rows of a nested collection as a tree, each document holding its own children.
4
+ *
5
+ * Roots are the documents with no `_parent`, ordered by `_position`; a document already placed is
6
+ * never placed twice, so a cycle in the rows stops rather than recurses.
7
+ *
8
+ * ```ts
9
+ * toNestedStructure(pages); // [{ id: '1', _children: [{ id: '2', _children: [] }] }]
10
+ * ```
11
+ */
12
+ export declare const toNestedStructure: (documents: GenericDoc[]) => GenericDoc[];
@@ -0,0 +1,42 @@
1
+ import { snapshot } from '../../../../util/state.js';
2
+ /**
3
+ * The flat rows of a nested collection as a tree, each document holding its own children.
4
+ *
5
+ * Roots are the documents with no `_parent`, ordered by `_position`; a document already placed is
6
+ * never placed twice, so a cycle in the rows stops rather than recurses.
7
+ *
8
+ * ```ts
9
+ * toNestedStructure(pages); // [{ id: '1', _children: [{ id: '2', _children: [] }] }]
10
+ * ```
11
+ */
12
+ export const toNestedStructure = (documents) => {
13
+ const incomingDocs = snapshot(documents);
14
+ const docById = new Map();
15
+ incomingDocs.forEach((doc) => docById.set(doc.id, doc));
16
+ const processed = new Set();
17
+ const processDocument = (doc) => {
18
+ if (!doc || processed.has(doc.id)) {
19
+ return doc;
20
+ }
21
+ processed.add(doc.id);
22
+ const result = { ...doc };
23
+ // Children first, depth-first.
24
+ if (Array.isArray(result._children)) {
25
+ result._children = result._children
26
+ .map((id) => {
27
+ const childDoc = docById.get(id);
28
+ return childDoc ? processDocument(childDoc) : null;
29
+ })
30
+ .filter(Boolean);
31
+ }
32
+ // The parent stays an id — only children are expanded.
33
+ if (result._parent && typeof result._parent === 'string') {
34
+ result._parent = docById.get(result._parent)?.id || null;
35
+ }
36
+ return result;
37
+ };
38
+ return incomingDocs
39
+ .filter((doc) => !doc._parent)
40
+ .map(processDocument)
41
+ .sort((a, b) => (a._position || 0) - (b._position || 0));
42
+ };
@@ -1,3 +1,4 @@
1
+ import { readableReferences } from '../../../fields/util.js';
1
2
  import { RimeError } from '../../../errors/index.js';
2
3
  import { readDocument, runBeforeOperation } from '../../../pipeline/run.server.js';
3
4
  export const findById = async (args) => {
@@ -26,6 +27,7 @@ export const findById = async (args) => {
26
27
  locale,
27
28
  localeFallback,
28
29
  select,
30
+ resolve: isSystemOperation ? undefined : readableReferences(config.fields, event.locals.user),
29
31
  // `draft` and `versionId` are request parameters; which row they name is the feature's answer.
30
32
  content: ctx.versionQuery({ latest, versionId })
31
33
  });