rimecms 0.28.10 → 0.30.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 (356) hide show
  1. package/README.md +3 -3
  2. package/dist/adapter-sqlite/area.server.js +8 -8
  3. package/dist/adapter-sqlite/generate-schema/column.server.d.ts +13 -0
  4. package/dist/adapter-sqlite/generate-schema/column.server.js +77 -0
  5. package/dist/adapter-sqlite/generate-schema/index.server.js +7 -12
  6. package/dist/adapter-sqlite/generate-schema/root.server.js +35 -39
  7. package/dist/adapter-sqlite/generate-schema/templates.server.d.ts +12 -0
  8. package/dist/adapter-sqlite/generate-schema/templates.server.js +19 -0
  9. package/dist/adapter-sqlite/generate-schema/{util.d.ts → util.server.d.ts} +2 -2
  10. package/dist/adapter-sqlite/generate-schema/{util.js → util.server.js} +2 -2
  11. package/dist/adapter-sqlite/generate-schema/write.server.js +1 -1
  12. package/dist/adapter-sqlite/relations.server.js +6 -1
  13. package/dist/adapter-sqlite/transform.server.js +1 -1
  14. package/dist/adapter-sqlite/util.server.d.ts +1 -6
  15. package/dist/adapter-sqlite/util.server.js +6 -0
  16. package/dist/adapter-sqlite/where.server.js +17 -16
  17. package/dist/adapter-sqlite/with.server.js +10 -10
  18. package/dist/core/areas/{api → rest}/get.server.d.ts +4 -2
  19. package/dist/core/areas/rest/get.server.js +45 -0
  20. package/dist/core/areas/rest/index.server.d.ts +6 -0
  21. package/dist/core/areas/rest/index.server.js +3 -0
  22. package/dist/core/areas/{api → rest}/update.server.d.ts +4 -2
  23. package/dist/core/areas/rest/update.server.js +43 -0
  24. package/dist/core/collections/auth/fields.d.ts +2 -182
  25. package/dist/core/collections/auth/hooks/before-upsert/augment-fields-password.server.d.ts +1 -1
  26. package/dist/core/collections/config/augment-auth.server.js +1 -1
  27. package/dist/core/collections/config/augment-nested.server.js +1 -1
  28. package/dist/core/collections/config/augment-panel.d.ts +1 -1
  29. package/dist/core/collections/config/augment-upload.js +2 -2
  30. package/dist/core/collections/config/augment-upload.server.js +4 -1
  31. package/dist/core/collections/operations/duplicate.js +31 -12
  32. package/dist/core/collections/operations/updateById.js +6 -5
  33. package/dist/core/collections/{api → rest}/create.server.d.ts +4 -2
  34. package/dist/core/collections/rest/create.server.js +37 -0
  35. package/dist/core/collections/{api → rest}/delete.server.d.ts +4 -2
  36. package/dist/core/collections/rest/delete.server.js +37 -0
  37. package/dist/core/collections/{api → rest}/deleteById.server.d.ts +4 -2
  38. package/dist/core/collections/rest/deleteById.server.js +21 -0
  39. package/dist/core/collections/{api → rest}/duplicate.server.d.ts +1 -1
  40. package/dist/core/collections/rest/duplicate.server.js +20 -0
  41. package/dist/core/collections/{api → rest}/get.server.d.ts +4 -2
  42. package/dist/core/collections/rest/get.server.js +50 -0
  43. package/dist/core/collections/{api → rest}/getById.server.d.ts +4 -2
  44. package/dist/core/collections/rest/getById.server.js +35 -0
  45. package/dist/core/collections/rest/index.server.d.ts +16 -0
  46. package/dist/core/collections/rest/index.server.js +16 -0
  47. package/dist/core/collections/{api → rest}/updateById.server.d.ts +4 -2
  48. package/dist/core/collections/rest/updateById.server.js +44 -0
  49. package/dist/core/collections/upload/disk/delete.server.d.ts +1 -1
  50. package/dist/core/collections/upload/disk/delete.server.js +48 -1
  51. package/dist/core/collections/upload/hooks/clean-up-files.server.js +2 -2
  52. package/dist/core/collections/upload/hooks/convert-base64.server.d.ts +1 -1
  53. package/dist/core/collections/upload/hooks/extract-path.server.d.ts +2 -2
  54. package/dist/core/collections/upload/hooks/extract-path.server.js +1 -1
  55. package/dist/core/collections/upload/hooks/handle-path-creation.server.d.ts +1 -1
  56. package/dist/core/collections/upload/hooks/process-file-upload.server.d.ts +1 -1
  57. package/dist/core/collections/upload/hooks/process-file-upload.server.js +3 -3
  58. package/dist/core/config/auth/better-auth.server.d.ts +2 -2
  59. package/dist/core/config/client/augment-directories.js +1 -1
  60. package/dist/core/config/config-context.server.d.ts +3 -3
  61. package/dist/core/config/server/augment-directories.server.js +1 -1
  62. package/dist/core/config/server/augment-panel-access.server.d.ts +1 -1
  63. package/dist/core/config/server/build-config.server.d.ts +11 -11
  64. package/dist/core/config/server/validate.server.js +51 -31
  65. package/dist/core/config/shared/find-thumbnail.js +13 -13
  66. package/dist/core/config/shared/find-title.js +13 -13
  67. package/dist/core/config/shared/upload-directories.js +1 -1
  68. package/dist/core/constant.d.ts +1 -1
  69. package/dist/core/constant.js +1 -1
  70. package/dist/core/constant.server.d.ts +1 -0
  71. package/dist/core/constant.server.js +2 -0
  72. package/dist/core/dev/cache/index.server.js +9 -9
  73. package/dist/core/dev/cli/build/index.d.ts +1 -0
  74. package/dist/core/dev/cli/build/index.js +37 -8
  75. package/dist/core/dev/cli/build/templates.d.ts +1 -0
  76. package/dist/core/dev/cli/build/templates.js +24 -0
  77. package/dist/core/dev/cli/clear/index.server.js +3 -2
  78. package/dist/core/dev/cli/generate/index.server.js +3 -2
  79. package/dist/core/dev/cli/index.js +20 -0
  80. package/dist/core/dev/cli/init/index.server.js +4 -4
  81. package/dist/core/dev/cli/init/templates.d.ts +1 -1
  82. package/dist/core/dev/cli/init/templates.js +2 -2
  83. package/dist/core/dev/cli/util/log.server.d.ts +1 -0
  84. package/dist/core/dev/cli/util/log.server.js +4 -0
  85. package/dist/core/dev/cli/util/package-manager.server.d.ts +9 -0
  86. package/dist/core/dev/cli/{init/package-manager-util.server.js → util/package-manager.server.js} +15 -0
  87. package/dist/core/dev/cli/util/package.server.d.ts +9 -0
  88. package/dist/core/dev/cli/{init/get-package-info.server.js → util/package.server.js} +10 -0
  89. package/dist/core/dev/generate/routes/common.server.d.ts +10 -1
  90. package/dist/core/dev/generate/routes/common.server.js +248 -29
  91. package/dist/core/dev/generate/routes/index.server.d.ts +7 -1
  92. package/dist/core/dev/generate/routes/index.server.js +16 -55
  93. package/dist/core/dev/generate/routes/util.server.d.ts +6 -16
  94. package/dist/core/dev/generate/routes/util.server.js +8 -21
  95. package/dist/core/dev/generate/types/index.server.js +22 -20
  96. package/dist/core/dev/vite/index.server.js +22 -6
  97. package/dist/core/errors/handler.server.d.ts +22 -1
  98. package/dist/core/errors/handler.server.js +25 -2
  99. package/dist/core/errors/index.d.ts +0 -1
  100. package/dist/core/errors/index.js +0 -1
  101. package/dist/core/fields/builders/boolean-builder.d.ts +3 -1
  102. package/dist/core/fields/builders/boolean-builder.js +3 -0
  103. package/dist/core/fields/builders/field-builder.d.ts +35 -2
  104. package/dist/core/fields/builders/field-builder.js +33 -2
  105. package/dist/core/fields/builders/form-field-builder.d.ts +71 -12
  106. package/dist/core/fields/builders/form-field-builder.js +96 -6
  107. package/dist/core/fields/builders/select-builder.d.ts +4 -1
  108. package/dist/core/fields/builders/select-builder.js +3 -0
  109. package/dist/core/fields/util.d.ts +9 -17
  110. package/dist/core/fields/util.js +49 -83
  111. package/dist/core/handlers/routes.server.d.ts +70 -1
  112. package/dist/core/handlers/routes.server.js +71 -4
  113. package/dist/core/naming.d.ts +34 -0
  114. package/dist/core/naming.js +39 -0
  115. package/dist/core/operations/blocks/diff.server.js +1 -1
  116. package/dist/core/operations/blocks/extract.server.js +1 -1
  117. package/dist/core/operations/configMap/buildTreeMap.d.ts +3 -2
  118. package/dist/core/operations/configMap/buildTreeMap.js +1 -1
  119. package/dist/core/operations/configMap/index.d.ts +2 -1
  120. package/dist/core/operations/configMap/index.js +13 -13
  121. package/dist/core/operations/configMap/types.d.ts +2 -2
  122. package/dist/core/operations/hooks/before-read/process-document-fields.server.js +14 -17
  123. package/dist/core/operations/hooks/before-upsert/data-config-map.server.d.ts +1 -1
  124. package/dist/core/operations/hooks/before-upsert/data-config-map.server.js +1 -1
  125. package/dist/core/operations/hooks/before-upsert/handle-new-version.server.d.ts +1 -1
  126. package/dist/core/operations/hooks/before-upsert/original-config-map.server.d.ts +1 -1
  127. package/dist/core/operations/hooks/before-upsert/original-config-map.server.js +1 -1
  128. package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +3 -5
  129. package/dist/core/operations/hooks/before-upsert/set-default-values.server.js +10 -15
  130. package/dist/core/operations/hooks/before-upsert/validate-fields.server.d.ts +1 -1
  131. package/dist/core/operations/hooks/before-upsert/validate-fields.server.js +49 -31
  132. package/dist/core/operations/relations/extract.server.js +5 -5
  133. package/dist/core/operations/shared/fallback-data-from-original.js +2 -2
  134. package/dist/core/operations/tree/diff.server.js +1 -1
  135. package/dist/core/operations/tree/extract.server.js +1 -1
  136. package/dist/core/plugins/api-init/index.server.js +10 -5
  137. package/dist/core/plugins/cache/cache.server.js +4 -4
  138. package/dist/core/rime.server.d.ts +10 -10
  139. package/dist/core/rime.server.js +5 -1
  140. package/dist/fields/blocks/component/AddBlockButton.svelte +7 -7
  141. package/dist/fields/blocks/component/AddBlockButton.svelte.d.ts +2 -2
  142. package/dist/fields/blocks/component/Blocks.svelte +6 -7
  143. package/dist/fields/blocks/component/props.d.ts +2 -2
  144. package/dist/fields/blocks/index.d.ts +1 -1
  145. package/dist/fields/blocks/index.js +3 -3
  146. package/dist/fields/blocks/index.server.js +1 -1
  147. package/dist/fields/checkbox/component/Checkbox.svelte +2 -2
  148. package/dist/fields/checkbox/component/props.d.ts +2 -2
  149. package/dist/fields/checkbox/index.server.d.ts +1 -2
  150. package/dist/fields/checkbox/index.server.js +1 -10
  151. package/dist/fields/combobox/component/ComboBox.svelte +3 -3
  152. package/dist/fields/combobox/component/props.d.ts +2 -2
  153. package/dist/fields/combobox/index.server.d.ts +1 -2
  154. package/dist/fields/combobox/index.server.js +2 -11
  155. package/dist/fields/component/index.d.ts +1 -1
  156. package/dist/fields/date/component/Date.svelte +4 -4
  157. package/dist/fields/date/component/Date.svelte.d.ts +2 -2
  158. package/dist/fields/date/index.d.ts +3 -1
  159. package/dist/fields/date/index.js +3 -0
  160. package/dist/fields/date/index.server.d.ts +1 -2
  161. package/dist/fields/date/index.server.js +1 -10
  162. package/dist/fields/email/component/Email.svelte +5 -6
  163. package/dist/fields/email/component/props.d.ts +2 -3
  164. package/dist/fields/email/index.d.ts +3 -2
  165. package/dist/fields/email/index.js +5 -2
  166. package/dist/fields/email/index.server.d.ts +0 -3
  167. package/dist/fields/email/index.server.js +0 -9
  168. package/dist/fields/group/component/Group.svelte +9 -15
  169. package/dist/fields/group/component/Group.svelte.d.ts +2 -2
  170. package/dist/fields/group/index.d.ts +4 -2
  171. package/dist/fields/group/index.server.js +2 -2
  172. package/dist/fields/index.server.d.ts +1 -4
  173. package/dist/fields/index.server.js +17 -13
  174. package/dist/fields/link/component/Link.svelte +5 -5
  175. package/dist/fields/link/component/RessourceInput.svelte +1 -1
  176. package/dist/fields/link/component/props.d.ts +2 -2
  177. package/dist/fields/link/index.d.ts +5 -2
  178. package/dist/fields/link/index.js +10 -11
  179. package/dist/fields/link/runtime.d.ts +2 -0
  180. package/dist/fields/link/runtime.js +1 -0
  181. package/dist/fields/link/{index.server.d.ts → runtime.server.d.ts} +1 -2
  182. package/dist/fields/link/{index.server.js → runtime.server.js} +2 -11
  183. package/dist/fields/number/component/Number.svelte +6 -6
  184. package/dist/fields/number/component/props.d.ts +2 -2
  185. package/dist/fields/number/index.d.ts +4 -10
  186. package/dist/fields/number/index.js +3 -4
  187. package/dist/fields/number/index.server.d.ts +1 -2
  188. package/dist/fields/number/index.server.js +1 -10
  189. package/dist/fields/radio/component/Radio.svelte +6 -7
  190. package/dist/fields/radio/component/props.d.ts +2 -2
  191. package/dist/fields/radio/index.server.d.ts +1 -2
  192. package/dist/fields/radio/index.server.js +2 -11
  193. package/dist/fields/relation/client.d.ts +1 -1
  194. package/dist/fields/relation/client.js +1 -1
  195. package/dist/fields/relation/component/Cell.svelte +1 -1
  196. package/dist/fields/relation/component/Relation.svelte +19 -15
  197. package/dist/fields/relation/component/Relation.svelte.d.ts +2 -2
  198. package/dist/fields/relation/component/upload/Browse.svelte +1 -1
  199. package/dist/fields/relation/index.d.ts +8 -5
  200. package/dist/fields/relation/index.js +8 -47
  201. package/dist/fields/relation/runtime.d.ts +5 -0
  202. package/dist/fields/relation/runtime.js +4 -0
  203. package/dist/fields/relation/runtime.server.d.ts +8 -0
  204. package/dist/fields/relation/runtime.server.js +49 -0
  205. package/dist/fields/rich-text/component/RichText.svelte +5 -5
  206. package/dist/fields/rich-text/component/props.d.ts +2 -2
  207. package/dist/fields/rich-text/core/features/fields/extension.d.ts +2 -2
  208. package/dist/fields/rich-text/core/features/fields/fields.svelte +2 -2
  209. package/dist/fields/rich-text/core/features/link/component/link-selector.svelte +1 -1
  210. package/dist/fields/rich-text/core/features/resource/resource-extension.d.ts +1 -1
  211. package/dist/fields/rich-text/core/features/resource/resource.svelte +1 -1
  212. package/dist/fields/rich-text/core/features/upload/upload-extension.d.ts +1 -1
  213. package/dist/fields/rich-text/core/features/upload/upload.svelte +1 -1
  214. package/dist/fields/rich-text/index.d.ts +2 -0
  215. package/dist/fields/rich-text/index.js +7 -2
  216. package/dist/fields/rich-text/index.server.d.ts +1 -2
  217. package/dist/fields/rich-text/index.server.js +1 -10
  218. package/dist/fields/select/component/Select.svelte +16 -16
  219. package/dist/fields/select/component/props.d.ts +2 -2
  220. package/dist/fields/select/index.d.ts +2 -0
  221. package/dist/fields/select/index.js +3 -0
  222. package/dist/fields/select/index.server.d.ts +1 -2
  223. package/dist/fields/select/index.server.js +2 -17
  224. package/dist/fields/slug/component/Slug.svelte +14 -10
  225. package/dist/fields/slug/component/Slug.svelte.d.ts +2 -2
  226. package/dist/fields/slug/index.d.ts +5 -2
  227. package/dist/fields/slug/index.js +3 -0
  228. package/dist/fields/slug/index.server.d.ts +1 -2
  229. package/dist/fields/slug/index.server.js +1 -10
  230. package/dist/fields/tabs/component/Tabs.svelte +15 -15
  231. package/dist/fields/tabs/component/Tabs.svelte.d.ts +2 -2
  232. package/dist/fields/tabs/index.d.ts +4 -16
  233. package/dist/fields/tabs/index.js +1 -8
  234. package/dist/fields/tabs/index.server.js +3 -3
  235. package/dist/fields/text/component/Text.svelte +5 -5
  236. package/dist/fields/text/component/props.d.ts +2 -3
  237. package/dist/fields/text/index.d.ts +4 -10
  238. package/dist/fields/text/index.js +3 -4
  239. package/dist/fields/text/index.server.d.ts +1 -2
  240. package/dist/fields/text/index.server.js +1 -10
  241. package/dist/fields/textarea/component/TextArea.svelte +3 -3
  242. package/dist/fields/textarea/component/props.d.ts +2 -2
  243. package/dist/fields/textarea/index.d.ts +4 -1
  244. package/dist/fields/textarea/index.js +3 -0
  245. package/dist/fields/textarea/index.server.d.ts +1 -2
  246. package/dist/fields/textarea/index.server.js +1 -10
  247. package/dist/fields/time/component/Time.svelte +5 -5
  248. package/dist/fields/time/component/Time.svelte.d.ts +1 -1
  249. package/dist/fields/time/component/props.d.ts +2 -2
  250. package/dist/fields/time/index.d.ts +2 -0
  251. package/dist/fields/time/index.js +3 -0
  252. package/dist/fields/time/index.server.d.ts +1 -2
  253. package/dist/fields/time/index.server.js +1 -10
  254. package/dist/fields/toggle/component/Toggle.svelte +3 -3
  255. package/dist/fields/toggle/component/Toggle.svelte.d.ts +1 -1
  256. package/dist/fields/toggle/component/props.d.ts +2 -2
  257. package/dist/fields/toggle/index.d.ts +2 -1
  258. package/dist/fields/toggle/index.server.d.ts +1 -2
  259. package/dist/fields/toggle/index.server.js +1 -10
  260. package/dist/fields/tree/component/AddItemButton.svelte +1 -2
  261. package/dist/fields/tree/component/Tree.svelte +6 -6
  262. package/dist/fields/tree/component/TreeBlock.svelte +5 -12
  263. package/dist/fields/tree/component/props.d.ts +3 -3
  264. package/dist/fields/tree/index.d.ts +3 -1
  265. package/dist/fields/tree/index.js +2 -2
  266. package/dist/fields/types.d.ts +11 -5
  267. package/dist/index.d.ts +8 -3
  268. package/dist/index.js +7 -3
  269. package/dist/panel/components/fields/FieldsPreview.svelte +4 -5
  270. package/dist/panel/components/fields/Hint.svelte +5 -4
  271. package/dist/panel/components/fields/Hint.svelte.d.ts +3 -2
  272. package/dist/panel/components/fields/Label.svelte +6 -11
  273. package/dist/panel/components/fields/Label.svelte.d.ts +3 -2
  274. package/dist/panel/components/fields/LabelFor.svelte +4 -4
  275. package/dist/panel/components/fields/LabelFor.svelte.d.ts +2 -1
  276. package/dist/panel/components/fields/RenderFields.svelte +11 -16
  277. package/dist/panel/components/fields/{root.svelte.d.ts → fieldset.svelte.d.ts} +1 -1
  278. package/dist/panel/components/fields/{root.svelte.js → fieldset.svelte.js} +1 -1
  279. package/dist/panel/components/fields/index.d.ts +5 -5
  280. package/dist/panel/components/fields/index.js +2 -2
  281. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
  282. package/dist/panel/components/sections/document/AuthFooter.svelte +2 -7
  283. package/dist/panel/components/sections/document/ButtonStatus.svelte +1 -1
  284. package/dist/panel/components/sections/document/CurrentlyEdited.svelte +1 -1
  285. package/dist/panel/components/sections/document/Settings.svelte +1 -1
  286. package/dist/panel/components/sections/live/LiveEditPanel.svelte +2 -2
  287. package/dist/panel/context/collection.svelte.js +10 -10
  288. package/dist/panel/context/documentForm.svelte.d.ts +8 -21
  289. package/dist/panel/context/documentForm.svelte.js +46 -54
  290. package/dist/panel/context/form.svelte.d.ts +6 -3
  291. package/dist/panel/context/form.svelte.js +22 -18
  292. package/dist/panel/context/live.svelte.js +1 -1
  293. package/dist/panel/index.d.ts +9 -1
  294. package/dist/panel/index.js +7 -1
  295. package/dist/panel/pages/area/actions.server.d.ts +2 -21
  296. package/dist/panel/pages/area/actions.server.js +28 -27
  297. package/dist/panel/pages/area/load.server.d.ts +2 -17
  298. package/dist/panel/pages/area/load.server.js +37 -46
  299. package/dist/panel/pages/auth/fields.d.ts +4 -4
  300. package/dist/panel/pages/auth/fields.js +6 -22
  301. package/dist/panel/pages/auth/reset-password/ResetPassword.svelte +3 -10
  302. package/dist/panel/pages/auth/sign-in/SignIn.svelte +7 -1
  303. package/dist/panel/pages/collection/load.server.d.ts +6 -6
  304. package/dist/panel/pages/collection/load.server.js +70 -72
  305. package/dist/panel/pages/collection-document/actions.server.d.ts +1 -1
  306. package/dist/panel/pages/collection-document/actions.server.js +78 -70
  307. package/dist/panel/pages/collection-document/load.server.d.ts +5 -20
  308. package/dist/panel/pages/collection-document/load.server.js +80 -82
  309. package/dist/server.d.ts +7 -0
  310. package/dist/server.js +7 -0
  311. package/dist/types.d.ts +1 -0
  312. package/dist/util/doc.js +15 -17
  313. package/dist/util/index.d.ts +9 -1
  314. package/dist/util/index.js +12 -1
  315. package/package.json +8 -50
  316. package/dist/core/api/index.d.ts +0 -7
  317. package/dist/core/api/index.js +0 -10
  318. package/dist/core/api/index.server.d.ts +0 -3
  319. package/dist/core/api/index.server.js +0 -3
  320. package/dist/core/areas/api/get.server.js +0 -36
  321. package/dist/core/areas/api/index.server.d.ts +0 -7
  322. package/dist/core/areas/api/index.server.js +0 -4
  323. package/dist/core/areas/api/update.server.js +0 -33
  324. package/dist/core/collections/api/create.server.js +0 -29
  325. package/dist/core/collections/api/delete.server.js +0 -32
  326. package/dist/core/collections/api/deleteById.server.js +0 -16
  327. package/dist/core/collections/api/duplicate.server.js +0 -18
  328. package/dist/core/collections/api/get.server.js +0 -45
  329. package/dist/core/collections/api/getById.server.js +0 -30
  330. package/dist/core/collections/api/index.server.d.ts +0 -17
  331. package/dist/core/collections/api/index.server.js +0 -9
  332. package/dist/core/collections/api/updateById.server.js +0 -38
  333. package/dist/core/dev/cli/init/get-package-info.server.d.ts +0 -1
  334. package/dist/core/dev/cli/init/package-manager-util.server.d.ts +0 -3
  335. package/dist/core/dev/generate/routes/area.server.d.ts +0 -7
  336. package/dist/core/dev/generate/routes/area.server.js +0 -69
  337. package/dist/core/dev/generate/routes/collection.server.d.ts +0 -14
  338. package/dist/core/dev/generate/routes/collection.server.js +0 -129
  339. package/dist/fields/relation/index.server.d.ts +0 -4
  340. package/dist/fields/relation/index.server.js +0 -13
  341. package/dist/live.d.ts +0 -4
  342. package/dist/live.js +0 -4
  343. package/dist/panel/index.server.d.ts +0 -4
  344. package/dist/panel/index.server.js +0 -4
  345. package/dist/panel/pages/auth/index.d.ts +0 -4
  346. package/dist/panel/pages/auth/index.js +0 -4
  347. package/dist/panel/pages/auth/index.server.d.ts +0 -18
  348. package/dist/panel/pages/auth/index.server.js +0 -12
  349. package/dist/panel/pages/index.actions.server.d.ts +0 -13
  350. package/dist/panel/pages/index.actions.server.js +0 -10
  351. package/dist/panel/pages/index.load.server.d.ts +0 -23
  352. package/dist/panel/pages/index.load.server.js +0 -16
  353. package/dist/panel/ui.d.ts +0 -4
  354. package/dist/panel/ui.js +0 -5
  355. /package/dist/core/dev/cli/{util.server.d.ts → util/prompt.server.d.ts} +0 -0
  356. /package/dist/core/dev/cli/{util.server.js → util/prompt.server.js} +0 -0
@@ -146,7 +146,7 @@ export async function generateTypesString(config) {
146
146
  const treeBlocksTypes = [];
147
147
  const registeredBlocks = [];
148
148
  const registeredTreeBlocks = [];
149
- let imports = new Set(['BaseDoc', 'Navigation', 'User']);
149
+ let imports = new Set(['BaseDoc', 'Navigation', 'RouteHandlers', 'User']);
150
150
  const addImport = (string) => {
151
151
  imports = new Set([...imports, string]);
152
152
  };
@@ -171,50 +171,50 @@ export async function generateTypesString(config) {
171
171
  for (const field of fields) {
172
172
  if (field instanceof BlocksBuilder) {
173
173
  {
174
- for (const block of field.raw.blocks) {
175
- if (!registeredBlocks.includes(block.raw.name)) {
176
- const templates = await buildFieldsTypes(block.raw.fields
174
+ for (const block of field.get.blocks) {
175
+ if (!registeredBlocks.includes(block.name)) {
176
+ const templates = await buildFieldsTypes(block.get.fields
177
177
  .filter((field) => field instanceof FormFieldBuilder)
178
178
  .filter((field) => field.name !== 'type'));
179
- blocksTypes.push(makeBlockType(block.raw.name, templates.join('\n\t')));
180
- registeredBlocks.push(block.raw.name);
181
- buildblocksTypes(block.raw.fields);
179
+ blocksTypes.push(makeBlockType(block.name, templates.join('\n\t')));
180
+ registeredBlocks.push(block.name);
181
+ buildblocksTypes(block.get.fields);
182
182
  }
183
183
  }
184
184
  }
185
185
  }
186
186
  else if (field instanceof TabsBuilder) {
187
- for (const tab of field.raw.tabs) {
188
- await buildblocksTypes(tab.raw.fields);
187
+ for (const tab of field.get.tabs) {
188
+ await buildblocksTypes(tab.get.fields);
189
189
  }
190
190
  }
191
191
  else if (field instanceof GroupFieldBuilder) {
192
- await buildblocksTypes(field.raw.fields);
192
+ await buildblocksTypes(field.get.fields);
193
193
  }
194
194
  else if (field instanceof TreeBuilder) {
195
- await buildblocksTypes(field.raw.fields);
195
+ await buildblocksTypes(field.get.fields);
196
196
  }
197
197
  }
198
198
  };
199
199
  const buildTreeBlockTypes = async (fields) => {
200
200
  for (const field of fields) {
201
201
  if (field instanceof BlocksBuilder) {
202
- for (const block of field.raw.blocks) {
203
- await buildTreeBlockTypes(block.raw.fields);
202
+ for (const block of field.get.blocks) {
203
+ await buildTreeBlockTypes(block.get.fields);
204
204
  }
205
205
  }
206
206
  else if (field instanceof TabsBuilder) {
207
- for (const tab of field.raw.tabs) {
208
- await buildTreeBlockTypes(tab.raw.fields);
207
+ for (const tab of field.get.tabs) {
208
+ await buildTreeBlockTypes(tab.get.fields);
209
209
  }
210
210
  }
211
211
  else if (field instanceof GroupFieldBuilder) {
212
- await buildTreeBlockTypes(field.raw.fields);
212
+ await buildTreeBlockTypes(field.get.fields);
213
213
  }
214
214
  else if (field instanceof TreeBuilder) {
215
215
  const treeBlockTypeName = `Tree${toPascalCase(field.name)}`;
216
216
  if (!registeredTreeBlocks.includes(treeBlockTypeName)) {
217
- const treeFieldsTypes = await buildFieldsTypes(field.raw.fields.filter((field) => field instanceof FormFieldBuilder));
217
+ const treeFieldsTypes = await buildFieldsTypes(field.get.fields.filter((field) => field instanceof FormFieldBuilder));
218
218
  const treeBlockType = makeTreeBlockType(treeBlockTypeName, treeFieldsTypes.join('\n'));
219
219
  treeBlocksTypes.push(treeBlockType);
220
220
  registeredTreeBlocks.push(treeBlockTypeName);
@@ -227,7 +227,7 @@ export async function generateTypesString(config) {
227
227
  if (isUploadConfig(collection) && collection.upload.imageSizes?.length) {
228
228
  fields = collection.fields
229
229
  .filter((f) => f instanceof FormFieldBuilder)
230
- .filter((field) => !collection.upload.imageSizes.some((size) => size.name === field.raw.name));
230
+ .filter((field) => !collection.upload.imageSizes.some((size) => size.name === field.name));
231
231
  }
232
232
  const fieldsTypesList = await buildFieldsTypes(fields);
233
233
  if (collection.versions) {
@@ -297,8 +297,10 @@ export async function generateTypesString(config) {
297
297
  >;
298
298
  /** Flag enabled by the core plugin rime.cache when the API cache is ON */
299
299
  cacheEnabled: boolean;
300
- /** Available in panel, routes for sidebar */
301
- routes: Navigation;
300
+ /** Available in panel, nav routes for sidebar */
301
+ navigation: Navigation;
302
+ /** Dispatch facade backing the fixed /panel/[slug]/... and /api/[slug]/... routes */
303
+ routes: RouteHandlers;
302
304
  /**
303
305
  * Current locale if applicable
304
306
  * set following this prioroty :
@@ -1,6 +1,7 @@
1
1
  import dotenv from 'dotenv';
2
2
  import { existsSync, rmSync } from 'node:fs';
3
3
  import path from 'node:path';
4
+ import { RIME_DEV_CACHE_DIR } from '../../constant.server.js';
4
5
  import { ensureHasInit } from '../../ensure.server.js';
5
6
  import { logger } from '../../logger/index.server.js';
6
7
  import { INPUT_DIR, OUTPUT_DIR } from '../constants.js';
@@ -10,6 +11,13 @@ const dev = process.env.NODE_ENV === 'development';
10
11
  export function rime() {
11
12
  const VCoreId = '$rime/config';
12
13
  const VSchemaId = '$rime/schema';
14
+ /** General-purpose server/browser split, usable anywhere in the app (not just rime's own
15
+ * field code — see relation/index.ts for the first user). `import { x } from '$rime/runtime'`
16
+ * resolves to a sibling `server.ts` (server builds) or `browser.ts` (browser builds) next
17
+ * to whichever file does the importing — the importer's path travels encoded in the
18
+ * resolved id since `load()` only receives the id, not the importer. */
19
+ const VRuntimeId = '$rime/runtime';
20
+ const VRuntimeMarker = `\0${VRuntimeId}::`;
13
21
  const resolvedVModule = (name) => '\0' + name;
14
22
  return {
15
23
  name: 'virtual-rime',
@@ -19,10 +27,9 @@ export function rime() {
19
27
  dev && ensureHasInit();
20
28
  // Check if we need to rebuild
21
29
  const shouldRebuild = process.argv.includes('--rebuild');
22
- const rimeDevCacheDir = path.resolve(process.cwd(), '.rime');
23
- if (shouldRebuild && existsSync(rimeDevCacheDir)) {
24
- rmSync(rimeDevCacheDir, { recursive: true, force: true });
25
- logger.info('--rebuild : .rime folder deleted');
30
+ if (shouldRebuild && existsSync(RIME_DEV_CACHE_DIR)) {
31
+ rmSync(RIME_DEV_CACHE_DIR, { recursive: true, force: true });
32
+ logger.info('--rebuild : node_modules/.rime folder deleted');
26
33
  }
27
34
  });
28
35
  // Add a watcher for sanitizing config changes
@@ -86,19 +93,22 @@ export function rime() {
86
93
  return [module];
87
94
  }
88
95
  },
89
- resolveId(id) {
96
+ resolveId(id, importer) {
90
97
  if (id === VCoreId) {
91
98
  return resolvedVModule(id);
92
99
  }
93
100
  if (id === VSchemaId) {
94
101
  return resolvedVModule(id);
95
102
  }
103
+ if (id === VRuntimeId && importer) {
104
+ return `${VRuntimeMarker}${importer}`;
105
+ }
96
106
  return null;
97
107
  },
98
108
  load(id) {
99
109
  const isServer = this.environment?.config?.consumer === 'server';
100
110
  if (id === resolvedVModule(VCoreId)) {
101
- const corePath = isServer ? 'rimecms/config/server' : 'rimecms/config/client';
111
+ const corePath = isServer ? 'rimecms/config/server' : 'rimecms/config';
102
112
  return `export * from '${corePath}';`;
103
113
  }
104
114
  if (id === resolvedVModule(VSchemaId) && isServer) {
@@ -108,6 +118,12 @@ export function rime() {
108
118
  return `export * from '${modulePath}'; export { default } from '${modulePath}';`;
109
119
  }
110
120
  }
121
+ if (id.startsWith(VRuntimeMarker)) {
122
+ const importer = id.slice(VRuntimeMarker.length);
123
+ const dir = path.dirname(importer);
124
+ const target = path.join(dir, isServer ? 'runtime.server.ts' : 'runtime.ts');
125
+ return `export * from '${target.replace(/\.ts$/, '.js')}';`;
126
+ }
111
127
  return null;
112
128
  }
113
129
  };
@@ -2,13 +2,34 @@ export declare const ERROR_CONTEXT: {
2
2
  readonly ACTION: "action";
3
3
  readonly API: "api";
4
4
  readonly LOAD: "load";
5
- readonly HANDLER: "handler";
6
5
  };
7
6
  export type ErrorContext = (typeof ERROR_CONTEXT)[keyof typeof ERROR_CONTEXT];
8
7
  type ErrorHandlerOptions = {
9
8
  context: ErrorContext;
10
9
  formData?: Record<string, any>;
11
10
  };
11
+ /**
12
+ * Only called at the route boundary: +server.ts handlers, load functions,
13
+ * form actions. Everywhere else, just `throw new RimeError(...)` (centralizes
14
+ * error codes/messages) — it bubbles up and gets caught here, where `context`
15
+ * tells this function which SvelteKit primitive to translate it into:
16
+ * `error()` (api/load), `redirect()`, or `fail()` (action form errors).
17
+ *
18
+ * Always call it as `return handleError(...)`. Most branches throw internally
19
+ * (`error`/`redirect`), so `return` never runs — but the `fail()` branch (form
20
+ * errors in actions) is a real return value, so `return` is required there.
21
+ *
22
+ * @example +server.ts endpoint
23
+ * if (!id) return handleError(new RimeError(RimeError.NOT_FOUND), { context: ERROR_CONTEXT.API });
24
+ *
25
+ * @example load function
26
+ * const [err, doc] = await trycatch(() => getDoc(id));
27
+ * if (err) return handleError(err, { context: ERROR_CONTEXT.LOAD });
28
+ *
29
+ * @example form action
30
+ * const [err] = await trycatch(() => save(data));
31
+ * if (err) return handleError(err, { context: ERROR_CONTEXT.ACTION, formData: data });
32
+ */
12
33
  export declare function handleError(err: Error, options: ErrorHandlerOptions): import("@sveltejs/kit").ActionFailure<{
13
34
  form: Record<string, any>;
14
35
  errors: import("../../types.js").FormErrors;
@@ -6,9 +6,30 @@ import { RimeError, RimeFormError } from './index.js';
6
6
  export const ERROR_CONTEXT = {
7
7
  ACTION: 'action',
8
8
  API: 'api',
9
- LOAD: 'load',
10
- HANDLER: 'handler'
9
+ LOAD: 'load'
11
10
  };
11
+ /**
12
+ * Only called at the route boundary: +server.ts handlers, load functions,
13
+ * form actions. Everywhere else, just `throw new RimeError(...)` (centralizes
14
+ * error codes/messages) — it bubbles up and gets caught here, where `context`
15
+ * tells this function which SvelteKit primitive to translate it into:
16
+ * `error()` (api/load), `redirect()`, or `fail()` (action form errors).
17
+ *
18
+ * Always call it as `return handleError(...)`. Most branches throw internally
19
+ * (`error`/`redirect`), so `return` never runs — but the `fail()` branch (form
20
+ * errors in actions) is a real return value, so `return` is required there.
21
+ *
22
+ * @example +server.ts endpoint
23
+ * if (!id) return handleError(new RimeError(RimeError.NOT_FOUND), { context: ERROR_CONTEXT.API });
24
+ *
25
+ * @example load function
26
+ * const [err, doc] = await trycatch(() => getDoc(id));
27
+ * if (err) return handleError(err, { context: ERROR_CONTEXT.LOAD });
28
+ *
29
+ * @example form action
30
+ * const [err] = await trycatch(() => save(data));
31
+ * if (err) return handleError(err, { context: ERROR_CONTEXT.ACTION, formData: data });
32
+ */
12
33
  export function handleError(err, options) {
13
34
  const { context, formData } = options;
14
35
  /****************************************************/
@@ -17,6 +38,8 @@ export function handleError(err, options) {
17
38
  if (err instanceof RimeFormError) {
18
39
  switch (context) {
19
40
  case ERROR_CONTEXT.ACTION:
41
+ // fail() returns an ActionFailure — lets SvelteKit re-render the form
42
+ // with `errors`/`form` instead of navigating to the error boundary.
20
43
  return fail(400, {
21
44
  form: formData || {},
22
45
  errors: err.errors
@@ -20,7 +20,6 @@ declare class RimeError extends Error {
20
20
  constructor(code: string, message?: string, ...args: any);
21
21
  }
22
22
  declare class RimeFormError extends RimeError {
23
- static INVALID_DATA: string;
24
23
  static INVALID_EMAIL: string;
25
24
  static INVALID_FIELD: string;
26
25
  static INVALID_PHONE: string;
@@ -33,7 +33,6 @@ class RimeError extends Error {
33
33
  }
34
34
  }
35
35
  class RimeFormError extends RimeError {
36
- static INVALID_DATA = 'invalid_data';
37
36
  static INVALID_EMAIL = 'invalid_email';
38
37
  static INVALID_FIELD = 'invalid_field';
39
38
  static INVALID_PHONE = 'invalid_phone';
@@ -1,4 +1,5 @@
1
1
  import type { DefaultValueFn, FieldValidationFunc, FormField } from '../../../fields/types.js';
2
+ import type { DataType } from './form-field-builder.js';
2
3
  import { FormFieldBuilder } from './form-field-builder.js';
3
4
  type BooleanField = FormField & {
4
5
  type: any;
@@ -6,9 +7,10 @@ type BooleanField = FormField & {
6
7
  defaultValue?: boolean | DefaultValueFn<boolean>;
7
8
  validate?: FieldValidationFunc<BooleanField>;
8
9
  };
9
- export declare class BooleanFieldBuilder<T extends BooleanField> extends FormFieldBuilder<T> {
10
+ export declare class BooleanFieldBuilder<T extends BooleanField = BooleanField> extends FormFieldBuilder<T> {
10
11
  constructor(name: string, type: string);
11
12
  defaultValue(value: boolean | DefaultValueFn<boolean>): this;
13
+ get dataType(): DataType;
12
14
  compile(): import("../../../util/types.js").WithoutBuilders<T> & {
13
15
  component: import("svelte").Component<any>;
14
16
  cell?: import("svelte").Component<{
@@ -8,6 +8,9 @@ export class BooleanFieldBuilder extends FormFieldBuilder {
8
8
  this.field.defaultValue = value;
9
9
  return this;
10
10
  }
11
+ get dataType() {
12
+ return 'boolean';
13
+ }
11
14
  compile() {
12
15
  if (!this.field.validate) {
13
16
  this.field.validate = (value) => typeof value === 'boolean' || 'Should be true/false';
@@ -1,10 +1,22 @@
1
1
  import type { WithoutBuilders } from '../../../util/types.js';
2
2
  import type { Component } from 'svelte';
3
- import type { Field } from '../../../fields/types.js';
3
+ import type { Field, FieldAccess } from '../../../fields/types.js';
4
+ /** Method-syntax (not `foo: () => ...` property syntax) so subtype checks
5
+ * like `FormFieldBuilder<SlugField> -> FormFieldBuilder<FormField>` — used
6
+ * all over the panel, where a concrete field builder flows into a
7
+ * generically-typed prop — stay bivariant on their params, exactly like the
8
+ * class methods this replaced. Property syntax would make TS check those
9
+ * params strictly/contravariantly and break that assignability. */
10
+ export type FieldRun = {
11
+ canRead(...args: Parameters<FieldAccess>): boolean;
12
+ canCreate(...args: Parameters<FieldAccess>): boolean;
13
+ canUpdate(...args: Parameters<FieldAccess>): boolean;
14
+ };
4
15
  export declare class FieldBuilder<T extends Field = Field> {
5
16
  field: T;
6
17
  _metaUrl?: string;
7
18
  constructor(type: string);
19
+ get name(): string;
8
20
  className(str: string): this;
9
21
  compile(): WithoutBuilders<T> & {
10
22
  component: Component<any>;
@@ -14,7 +26,28 @@ export declare class FieldBuilder<T extends Field = Field> {
14
26
  };
15
27
  live(bool: boolean): this;
16
28
  get type(): string;
17
- get raw(): T;
29
+ /**
30
+ * Raw field data, plus the couple of properties that a bare `this.field`
31
+ * read can't give you: `localized`/`root` default to `false` here since
32
+ * only FormFieldBuilder fields ever set them — container fields like Tabs
33
+ * answer `false` rather than making every caller check
34
+ * `instanceof FormFieldBuilder` first just to ask this one question.
35
+ * Everything else on `T` (Tabs' `tabs`, Blocks' `blocks`, ...) comes
36
+ * through unchanged via the spread — no per-subclass override needed.
37
+ */
38
+ get get(): T & {
39
+ localized: boolean;
40
+ root: boolean;
41
+ };
42
+ /** Behavior the builder runs on your behalf (invoking a stored function) —
43
+ * see `.get` for plain data reads. Fields without an access concept
44
+ * (Tabs) default every check to allowed, matching how the field-less case
45
+ * already behaved. Params are unused here but must match FormFieldBuilder's
46
+ * override signature — TS checks generic-constraint satisfaction
47
+ * (`T extends FieldBuilder<any>`) strictly, not with the bivariant
48
+ * leniency normal overrides get, so a param-less base signature breaks
49
+ * assignability everywhere. */
50
+ get run(): FieldRun;
18
51
  get component(): Component<any> | null;
19
52
  get cell(): Component<{
20
53
  value: any;
@@ -3,10 +3,14 @@ export class FieldBuilder {
3
3
  _metaUrl;
4
4
  constructor(type) {
5
5
  this.field = {
6
+ name: '',
6
7
  type,
7
8
  live: true
8
9
  };
9
10
  }
11
+ get name() {
12
+ return this.field.name;
13
+ }
10
14
  className(str) {
11
15
  this.field.className = str;
12
16
  return this;
@@ -25,8 +29,35 @@ export class FieldBuilder {
25
29
  get type() {
26
30
  return this.field.type;
27
31
  }
28
- get raw() {
29
- return this.field;
32
+ /**
33
+ * Raw field data, plus the couple of properties that a bare `this.field`
34
+ * read can't give you: `localized`/`root` default to `false` here since
35
+ * only FormFieldBuilder fields ever set them — container fields like Tabs
36
+ * answer `false` rather than making every caller check
37
+ * `instanceof FormFieldBuilder` first just to ask this one question.
38
+ * Everything else on `T` (Tabs' `tabs`, Blocks' `blocks`, ...) comes
39
+ * through unchanged via the spread — no per-subclass override needed.
40
+ */
41
+ get get() {
42
+ return { ...this.field, localized: false, root: false };
43
+ }
44
+ /** Behavior the builder runs on your behalf (invoking a stored function) —
45
+ * see `.get` for plain data reads. Fields without an access concept
46
+ * (Tabs) default every check to allowed, matching how the field-less case
47
+ * already behaved. Params are unused here but must match FormFieldBuilder's
48
+ * override signature — TS checks generic-constraint satisfaction
49
+ * (`T extends FieldBuilder<any>`) strictly, not with the bivariant
50
+ * leniency normal overrides get, so a param-less base signature breaks
51
+ * assignability everywhere. */
52
+ get run() {
53
+ return {
54
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
55
+ canRead: (..._args) => true,
56
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
57
+ canCreate: (..._args) => true,
58
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
+ canUpdate: (..._args) => true
60
+ };
30
61
  }
31
62
  get component() {
32
63
  return null;
@@ -1,16 +1,54 @@
1
1
  import type { FieldPanelTableConfig } from '../../../types.js';
2
2
  import type { Dic } from '../../../util/types.js';
3
- import type { FieldAccess, FieldHook, FieldHookClient, FieldHookShared, FieldValidationFunc, FieldWidth, FormField } from '../../../fields/types.js';
4
- import { FieldBuilder } from './field-builder.js';
5
- type GenerateSchemaFn = (args: {
6
- camel: string;
7
- snake: string;
8
- suffix: string;
9
- }) => string;
10
- export declare class FormFieldBuilder<T extends FormField> extends FieldBuilder<T> {
11
- _generateSchema: null | GenerateSchemaFn;
3
+ import type { RequestEvent } from '@sveltejs/kit';
4
+ import type { FieldAccess, FieldHook, FieldHookClient, FieldHookContext, FieldHookShared, FieldValidationFunc, FieldWidth, FormField } from '../../../fields/types.js';
5
+ import { FieldBuilder, type FieldRun } from './field-builder.js';
6
+ /** Adapter-agnostic storage primitive — column syntax only, not default-value semantics. */
7
+ export type DataType = 'text' | 'boolean' | 'number' | 'timestamp' | 'json';
8
+ /** Method-syntax, same reasoning as `FieldRun` — keeps `run`'s params
9
+ * bivariant across concrete field types so e.g. `SlugFieldBuilder` still
10
+ * satisfies a prop typed `FormFieldBuilder<FormField>`. */
11
+ export type FormFieldRun<T extends FormField> = FieldRun & {
12
+ isEmpty(value: unknown): boolean;
13
+ validate(value: unknown, context: Parameters<FieldValidationFunc<T>>[1]): true | string;
14
+ condition(doc: Dic, siblings: Dic): boolean;
15
+ onChange(value: unknown, context: Parameters<FieldHookClient>[1]): void;
16
+ beforeRead(value: unknown, context: Omit<FieldHookContext<T>, 'config'>): Promise<any>;
17
+ beforeSave(value: unknown, context: FieldHookContext<T>): Promise<any>;
18
+ beforeValidate(value: unknown, context: Parameters<FieldHookShared>[1]): Promise<any>;
19
+ /** Resolves `field.defaultValue` — calling it if it's a `DefaultValueFn`,
20
+ * returning it as-is otherwise. Every field type stores `defaultValue` as
21
+ * plain data (never a fluent-setter name collision on `.field` itself),
22
+ * but several concrete builders (Select, Link, Slug, Relation) *do* expose
23
+ * a `.defaultValue(...)` fluent setter — bare `config.defaultValue` on
24
+ * those would silently return that setter, not the stored value. */
25
+ defaultValue(context?: {
26
+ event?: RequestEvent;
27
+ }): unknown;
28
+ };
29
+ export type ReferentialAction = 'cascade' | 'set null' | 'restrict' | 'no action';
30
+ export type FieldReferenceOptions = {
31
+ onDelete?: ReferentialAction;
32
+ onUpdate?: ReferentialAction;
33
+ /** Referenced table is this field's own table (self-FK); adapters need this
34
+ * to emit a `(): any =>` accessor and avoid a TS circular-declaration error. */
35
+ selfReferencing?: boolean;
36
+ };
37
+ export type FieldReference = FieldReferenceOptions & {
38
+ table: string;
39
+ };
40
+ export declare class FormFieldBuilder<T extends FormField = FormField> extends FieldBuilder<T> {
41
+ /** Every concrete leaf field builder is expected to implement a
42
+ * `get dataType(): DataType` accessor (see e.g. `$lib/fields/text/index.ts`).
43
+ * Not declared here — TS doesn't allow `declare` on accessors in this
44
+ * project's config, and a plain base field would conflict with subclasses
45
+ * that need a computed getter (e.g. `select`, whose dataType depends on
46
+ * `many`). Container builders (Group/Tabs/Blocks/Tree) never get asked,
47
+ * since the adapter's tree-walker special-cases them before reaching the
48
+ * generic column-rendering branch; `column.server.ts` reads `.dataType`
49
+ * via a narrow cast for the same reason it already casts `unique`. */
50
+ _references: FieldReference | null;
12
51
  constructor(name: string, type: string);
13
- get name(): string;
14
52
  label(label: string): this;
15
53
  hidden(): this;
16
54
  localized(): this;
@@ -19,17 +57,38 @@ export declare class FormFieldBuilder<T extends FormField> extends FieldBuilder<
19
57
  table(params?: FieldPanelTableConfig | number): this;
20
58
  width(value: FieldWidth): this;
21
59
  required(bool?: boolean): this;
60
+ /**
61
+ * Force the field to be on the root table — usefull for fields that
62
+ * should not be versioned (ex: _parent for nested structures should
63
+ * always be on the root table to prevent different versions from having
64
+ * different parents).
65
+ */
66
+ _root(): this;
67
+ /** `label`/`localized`/`root`/`required` are the only properties that need
68
+ * anything beyond a plain `this.field` read (a fallback default, or a
69
+ * boolean coercion) — everything else a concrete field type adds
70
+ * (Group's `fields`, Relation's `relationTo`, Select's `options`, ...)
71
+ * comes through unchanged via the spread, no per-subclass override needed. */
72
+ get get(): T & {
73
+ localized: boolean;
74
+ root: boolean;
75
+ label: string;
76
+ required: boolean;
77
+ };
22
78
  access(access: {
23
79
  create?: FieldAccess;
24
80
  read?: FieldAccess;
25
81
  update?: FieldAccess;
26
82
  }): this;
27
83
  onChange(hook: FieldHookClient): this;
84
+ /** Behavior the builder runs on your behalf — invoking a stored function or
85
+ * hook list, not a data read (see `.get` for that). */
86
+ get run(): FormFieldRun<T>;
28
87
  hint(hint: string): this;
29
88
  clone(): typeof this;
30
- $generateSchema(fn: GenerateSchemaFn): this;
89
+ /** Server-side schema concern, same family as $beforeRead/$beforeSave. */
90
+ $references(table: string, options?: FieldReferenceOptions): this;
31
91
  $beforeRead(hook: FieldHook<T>): this;
32
92
  $beforeSave(hook: FieldHook<T>): this;
33
93
  beforeValidate(hook: FieldHookShared): this;
34
94
  }
35
- export {};
@@ -1,7 +1,17 @@
1
+ import { capitalize } from '../../../util/string.js';
1
2
  import cloneDeep from 'clone-deep';
2
3
  import { FieldBuilder } from './field-builder.js';
3
4
  export class FormFieldBuilder extends FieldBuilder {
4
- _generateSchema = null;
5
+ /** Every concrete leaf field builder is expected to implement a
6
+ * `get dataType(): DataType` accessor (see e.g. `$lib/fields/text/index.ts`).
7
+ * Not declared here — TS doesn't allow `declare` on accessors in this
8
+ * project's config, and a plain base field would conflict with subclasses
9
+ * that need a computed getter (e.g. `select`, whose dataType depends on
10
+ * `many`). Container builders (Group/Tabs/Blocks/Tree) never get asked,
11
+ * since the adapter's tree-walker special-cases them before reaching the
12
+ * generic column-rendering branch; `column.server.ts` reads `.dataType`
13
+ * via a narrow cast for the same reason it already casts `unique`. */
14
+ _references = null;
5
15
  constructor(name, type) {
6
16
  super(type);
7
17
  this.field.name = name;
@@ -15,9 +25,6 @@ export class FormFieldBuilder extends FieldBuilder {
15
25
  };
16
26
  return this;
17
27
  }
18
- get name() {
19
- return this.field.name;
20
- }
21
28
  label(label) {
22
29
  this.field.label = label;
23
30
  return this;
@@ -58,6 +65,30 @@ export class FormFieldBuilder extends FieldBuilder {
58
65
  this.field.required = typeof bool === 'undefined' ? true : bool;
59
66
  return this;
60
67
  }
68
+ /**
69
+ * Force the field to be on the root table — usefull for fields that
70
+ * should not be versioned (ex: _parent for nested structures should
71
+ * always be on the root table to prevent different versions from having
72
+ * different parents).
73
+ */
74
+ _root() {
75
+ this.field._root = true;
76
+ return this;
77
+ }
78
+ /** `label`/`localized`/`root`/`required` are the only properties that need
79
+ * anything beyond a plain `this.field` read (a fallback default, or a
80
+ * boolean coercion) — everything else a concrete field type adds
81
+ * (Group's `fields`, Relation's `relationTo`, Select's `options`, ...)
82
+ * comes through unchanged via the spread, no per-subclass override needed. */
83
+ get get() {
84
+ return {
85
+ ...this.field,
86
+ localized: !!this.field.localized,
87
+ root: !!this.field._root,
88
+ label: this.field.label || capitalize(this.field.name),
89
+ required: !!this.field.required
90
+ };
91
+ }
61
92
  access(access) {
62
93
  this.field.access = { ...this.field.access, ...access };
63
94
  return this;
@@ -67,6 +98,64 @@ export class FormFieldBuilder extends FieldBuilder {
67
98
  this.field.hooks.onChange.push(hook);
68
99
  return this;
69
100
  }
101
+ /** Behavior the builder runs on your behalf — invoking a stored function or
102
+ * hook list, not a data read (see `.get` for that). */
103
+ get run() {
104
+ return {
105
+ isEmpty: (value) => this.field.isEmpty(value),
106
+ validate: (value, context) => {
107
+ if (this.field.validate) {
108
+ return this.field.validate(value, { ...context, config: this.field });
109
+ }
110
+ return true;
111
+ },
112
+ condition: (doc, siblings) => {
113
+ if (this.field.condition) {
114
+ try {
115
+ return this.field.condition(doc, siblings);
116
+ }
117
+ catch (err) {
118
+ console.error(err.message);
119
+ return false;
120
+ }
121
+ }
122
+ return true;
123
+ },
124
+ canRead: (...args) => !!this.field.access?.read?.(...args),
125
+ canCreate: (...args) => !!this.field.access?.create?.(...args),
126
+ canUpdate: (...args) => !!this.field.access?.update?.(...args),
127
+ onChange: (value, context) => {
128
+ for (const hook of this.field.hooks?.onChange ?? []) {
129
+ hook(value, context);
130
+ }
131
+ },
132
+ beforeRead: async (value, context) => {
133
+ let result = value;
134
+ for (const hook of this.field.hooks?.beforeRead ?? []) {
135
+ result = await hook(result, { ...context, config: this.field });
136
+ }
137
+ return result;
138
+ },
139
+ beforeSave: async (value, context) => {
140
+ let result = value;
141
+ for (const hook of this.field.hooks?.beforeSave ?? []) {
142
+ result = await hook(result, { ...context, config: this.field });
143
+ }
144
+ return result;
145
+ },
146
+ beforeValidate: async (value, context) => {
147
+ let result = value;
148
+ for (const hook of this.field.hooks?.beforeValidate ?? []) {
149
+ result = await hook(result, { ...context, config: this.field });
150
+ }
151
+ return result;
152
+ },
153
+ defaultValue: (context = {}) => {
154
+ const value = this.field.defaultValue;
155
+ return typeof value === 'function' ? value(context) : value;
156
+ }
157
+ };
158
+ }
70
159
  hint(hint) {
71
160
  this.field.hint = hint;
72
161
  return this;
@@ -83,8 +172,9 @@ export class FormFieldBuilder extends FieldBuilder {
83
172
  clone.field = cloneDeep(this.field);
84
173
  return clone;
85
174
  }
86
- $generateSchema(fn) {
87
- this._generateSchema = fn;
175
+ /** Server-side schema concern, same family as $beforeRead/$beforeSave. */
176
+ $references(table, options) {
177
+ this._references = { table, ...options };
88
178
  return this;
89
179
  }
90
180
  $beforeRead(hook) {