@rebasepro/cms 0.17.3 → 0.18.1

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 (449) hide show
  1. package/README.md +4 -0
  2. package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
  3. package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
  4. package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
  5. package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
  6. package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
  7. package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
  8. package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
  9. package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
  10. package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
  11. package/dist/collection_editor_ui.d.ts +2 -0
  12. package/dist/collection_editor_ui.js +6 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/DeleteEntityDialog.d.ts +2 -3
  15. package/dist/components/RebaseLayout.d.ts +11 -4
  16. package/dist/components/field_configs.d.ts +1 -1
  17. package/dist/editor/sanitize-html.d.ts +15 -0
  18. package/dist/editor.js +195 -10
  19. package/dist/editor.js.map +1 -1
  20. package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
  21. package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
  22. package/dist/form/components/LabelWithIcon.d.ts +10 -0
  23. package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
  24. package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
  25. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
  26. package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
  27. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
  28. package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
  29. package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
  30. package/dist/index.js +78 -33
  31. package/dist/index.js.map +1 -1
  32. package/dist/util/propertyConfigMapper.d.ts +1 -1
  33. package/dist/util-CfLFggP7.js +57 -0
  34. package/dist/util-CfLFggP7.js.map +1 -0
  35. package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
  36. package/dist/util-DE1WQW6h.js.map +1 -0
  37. package/package.json +42 -34
  38. package/dist/util-DVqnqlLn.js.map +0 -1
  39. package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
  40. package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
  41. package/src/collection_editor/_cms_internals.ts +0 -41
  42. package/src/collection_editor/api/generateCollectionApi.ts +0 -126
  43. package/src/collection_editor/api/index.ts +0 -1
  44. package/src/collection_editor/extensibility_types.ts +0 -168
  45. package/src/collection_editor/index.ts +0 -108
  46. package/src/collection_editor/liveSchemaClient.ts +0 -285
  47. package/src/collection_editor/relation_kinds.ts +0 -44
  48. package/src/collection_editor/serializable_types.ts +0 -535
  49. package/src/collection_editor/serializable_utils.ts +0 -729
  50. package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
  51. package/src/collection_editor/types/collection_inference.ts +0 -18
  52. package/src/collection_editor/types/config_controller.tsx +0 -121
  53. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
  54. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
  55. package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
  56. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
  57. package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
  58. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
  59. package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
  60. package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
  61. package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
  62. package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
  63. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
  64. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
  65. package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
  66. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
  67. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
  68. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
  69. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
  70. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
  71. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
  72. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
  73. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
  74. package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
  75. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
  76. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
  77. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
  78. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
  79. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
  80. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
  81. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
  82. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
  83. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
  84. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
  85. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
  86. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
  87. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
  88. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
  89. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
  90. package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
  92. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
  93. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
  94. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
  95. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
  96. package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
  97. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
  98. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
  99. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
  100. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
  101. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
  102. package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
  103. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
  104. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
  105. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
  106. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
  107. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
  108. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
  109. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
  110. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
  111. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
  112. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
  113. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
  114. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
  115. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
  116. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
  117. package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
  118. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
  119. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
  120. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
  121. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
  122. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
  123. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
  124. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
  125. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
  126. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
  127. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
  128. package/src/collection_editor/ui/collection_editor/util.ts +0 -28
  129. package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
  130. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
  131. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
  132. package/src/collection_editor/useCollectionEditorController.tsx +0 -9
  133. package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
  134. package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
  135. package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
  136. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
  137. package/src/collection_editor/useSafeSnackbarController.ts +0 -9
  138. package/src/collection_editor/validateCollectionJson.ts +0 -440
  139. package/src/collection_editor_ui.ts +0 -21
  140. package/src/components/AdditionalFieldValue.tsx +0 -68
  141. package/src/components/AdminModeSyncer.tsx +0 -56
  142. package/src/components/ArrayContainer.tsx +0 -542
  143. package/src/components/ClearFilterSortButton.tsx +0 -56
  144. package/src/components/CollectionEditorDialogs.tsx +0 -69
  145. package/src/components/CollectionPanel.tsx +0 -179
  146. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
  147. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
  148. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
  149. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
  150. package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
  151. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
  152. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
  153. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
  154. package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
  155. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
  156. package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
  157. package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
  158. package/src/components/CollectionTableBinding/index.tsx +0 -14
  159. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
  160. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
  161. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
  162. package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
  163. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
  164. package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
  165. package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
  166. package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
  167. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
  168. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
  169. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
  170. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
  171. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
  172. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
  173. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
  174. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
  175. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
  176. package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
  177. package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
  178. package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
  179. package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
  180. package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
  181. package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
  182. package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
  183. package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
  184. package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
  185. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
  186. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
  187. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
  188. package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
  189. package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
  190. package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
  191. package/src/components/CollectionViewBinding/utils.ts +0 -22
  192. package/src/components/DefaultAppBar.tsx +0 -264
  193. package/src/components/DefaultDrawer.tsx +0 -593
  194. package/src/components/DeleteEntityDialog.tsx +0 -205
  195. package/src/components/DetailViewBinding.tsx +0 -731
  196. package/src/components/DrawerNavigationGroup.tsx +0 -141
  197. package/src/components/DrawerNavigationItem.tsx +0 -115
  198. package/src/components/EditFormActions.tsx +0 -303
  199. package/src/components/EditViewBinding.tsx +0 -1069
  200. package/src/components/EntityDisplayHeader.tsx +0 -170
  201. package/src/components/EntityIdentityBar.tsx +0 -428
  202. package/src/components/EntityInspector.tsx +0 -156
  203. package/src/components/EntityPreviewBinding.tsx +0 -432
  204. package/src/components/EntityPreviewNesting.tsx +0 -50
  205. package/src/components/EntityViewBinding.tsx +0 -374
  206. package/src/components/FieldCaption.tsx +0 -14
  207. package/src/components/HomePage/ContentHomePage.tsx +0 -586
  208. package/src/components/HomePage/FavouritesView.tsx +0 -60
  209. package/src/components/HomePage/HomePageDnD.tsx +0 -704
  210. package/src/components/HomePage/NavigationCard.tsx +0 -81
  211. package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
  212. package/src/components/HomePage/NavigationGroup.tsx +0 -156
  213. package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
  214. package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
  215. package/src/components/HomePage/index.tsx +0 -5
  216. package/src/components/InlineEntityPreview.tsx +0 -149
  217. package/src/components/JsonPreviewBinding.tsx +0 -66
  218. package/src/components/PropertyCollectionView.tsx +0 -336
  219. package/src/components/PropertyConfigBadge.tsx +0 -28
  220. package/src/components/PropertyIdCopyTooltip.tsx +0 -47
  221. package/src/components/RebaseAuthGate.tsx +0 -44
  222. package/src/components/RebaseCMS.tsx +0 -30
  223. package/src/components/RebaseLayout.tsx +0 -80
  224. package/src/components/RebaseNavigation.tsx +0 -369
  225. package/src/components/RebaseRouteDefs.tsx +0 -127
  226. package/src/components/RebaseShell.tsx +0 -83
  227. package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
  228. package/src/components/ReferenceWidget.tsx +0 -156
  229. package/src/components/RelationSelector.tsx +0 -926
  230. package/src/components/SearchIconsView.tsx +0 -78
  231. package/src/components/SelectableTable/SelectableTable.tsx +0 -309
  232. package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
  233. package/src/components/SelectableTable/SelectionStore.ts +0 -43
  234. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
  235. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
  236. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
  237. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
  238. package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
  239. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
  240. package/src/components/SelectableTable/filters/null_filter.ts +0 -63
  241. package/src/components/SideDialogs.tsx +0 -238
  242. package/src/components/SidePanelBinding.tsx +0 -361
  243. package/src/components/SidePanelProvider.tsx +0 -80
  244. package/src/components/UserSelector.tsx +0 -513
  245. package/src/components/admin/CreationResultDialog.tsx +0 -138
  246. package/src/components/admin/index.ts +0 -1
  247. package/src/components/app/AppBar.tsx +0 -17
  248. package/src/components/app/Drawer.tsx +0 -38
  249. package/src/components/app/Scaffold.tsx +0 -366
  250. package/src/components/app/index.ts +0 -4
  251. package/src/components/app/useApp.tsx +0 -36
  252. package/src/components/common/default_entity_actions.tsx +0 -440
  253. package/src/components/common/index.ts +0 -1
  254. package/src/components/field_configs.tsx +0 -506
  255. package/src/components/history/EntityHistoryEntry.tsx +0 -203
  256. package/src/components/history/EntityHistoryView.tsx +0 -206
  257. package/src/components/history/LastEditedByFormAction.tsx +0 -24
  258. package/src/components/history/LastEditedByIndicator.tsx +0 -95
  259. package/src/components/history/UserChip.tsx +0 -15
  260. package/src/components/history/index.tsx +0 -5
  261. package/src/components/index.ts +0 -63
  262. package/src/contexts/BreacrumbsContext.tsx +0 -45
  263. package/src/contexts/SideDialogsControllerContext.tsx +0 -5
  264. package/src/contexts/SidePanelControllerContext.tsx +0 -5
  265. package/src/data_export/export/BasicExportAction.tsx +0 -142
  266. package/src/data_export/export/ExportCollectionAction.tsx +0 -321
  267. package/src/data_export/export/export.ts +0 -295
  268. package/src/data_export/export/fetch_export_data.ts +0 -90
  269. package/src/data_export/export/index.ts +0 -4
  270. package/src/data_export/index.ts +0 -1
  271. package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
  272. package/src/data_import/components/ImportFileUpload.tsx +0 -42
  273. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
  274. package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
  275. package/src/data_import/components/index.ts +0 -4
  276. package/src/data_import/hooks/index.ts +0 -1
  277. package/src/data_import/hooks/useImportConfig.tsx +0 -34
  278. package/src/data_import/import/ImportCollectionAction.tsx +0 -461
  279. package/src/data_import/import/index.ts +0 -1
  280. package/src/data_import/index.ts +0 -5
  281. package/src/data_import/types/column_mapping.ts +0 -32
  282. package/src/data_import/types/index.ts +0 -1
  283. package/src/data_import/utils/csv.ts +0 -153
  284. package/src/data_import/utils/data.ts +0 -181
  285. package/src/data_import/utils/file_headers.ts +0 -14
  286. package/src/data_import/utils/file_to_json.ts +0 -149
  287. package/src/data_import/utils/get_import_inference_type.ts +0 -33
  288. package/src/data_import/utils/get_properties_mapping.ts +0 -67
  289. package/src/data_import/utils/index.ts +0 -5
  290. package/src/data_import/utils/save_entities.ts +0 -138
  291. package/src/data_import/utils/transforms.ts +0 -70
  292. package/src/editor/components/SlashCommandMenu.tsx +0 -532
  293. package/src/editor/components/editor-bubble-item.tsx +0 -32
  294. package/src/editor/components/editor-bubble.tsx +0 -143
  295. package/src/editor/components/image-bubble.tsx +0 -183
  296. package/src/editor/components/index.ts +0 -14
  297. package/src/editor/components/table-bubble.tsx +0 -233
  298. package/src/editor/editor.tsx +0 -529
  299. package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
  300. package/src/editor/extensions/Image.ts +0 -159
  301. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
  302. package/src/editor/extensions/clipboard.ts +0 -72
  303. package/src/editor/extensions/custom-keymap.ts +0 -25
  304. package/src/editor/extensions/drag-and-drop.tsx +0 -508
  305. package/src/editor/hooks/useProseMirror.ts +0 -126
  306. package/src/editor/hooks/useProseMirrorContext.ts +0 -15
  307. package/src/editor/index.ts +0 -2
  308. package/src/editor/markdown-it-plugins.d.ts +0 -24
  309. package/src/editor/markdown.ts +0 -204
  310. package/src/editor/nodeViews/ImageComponent.tsx +0 -20
  311. package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
  312. package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
  313. package/src/editor/nodeViews/index.ts +0 -35
  314. package/src/editor/plugins/index.ts +0 -58
  315. package/src/editor/plugins/inputrules.ts +0 -82
  316. package/src/editor/plugins/placeholderPlugin.ts +0 -55
  317. package/src/editor/plugins/slashCommandPlugin.ts +0 -65
  318. package/src/editor/schema.ts +0 -339
  319. package/src/editor/selectors/ai-selector.tsx +0 -110
  320. package/src/editor/selectors/color-selector.tsx +0 -199
  321. package/src/editor/selectors/link-selector.tsx +0 -122
  322. package/src/editor/selectors/node-selector.tsx +0 -159
  323. package/src/editor/selectors/text-buttons.tsx +0 -79
  324. package/src/editor/types.ts +0 -6
  325. package/src/editor/useProseMirror.ts +0 -125
  326. package/src/editor/utils/prosemirror-utils.ts +0 -113
  327. package/src/editor/utils/remove_classes.ts +0 -18
  328. package/src/editor/utils/useDebouncedCallback.ts +0 -25
  329. package/src/form/EntityForm.tsx +0 -761
  330. package/src/form/EntityFormActions.tsx +0 -160
  331. package/src/form/EntityFormBinding.tsx +0 -342
  332. package/src/form/PropertyFieldBinding.tsx +0 -348
  333. package/src/form/components/ErrorFocus.tsx +0 -44
  334. package/src/form/components/FieldBlock.tsx +0 -189
  335. package/src/form/components/FieldHelperText.tsx +0 -84
  336. package/src/form/components/FormRail.tsx +0 -153
  337. package/src/form/components/FormSections.tsx +0 -145
  338. package/src/form/components/LabelWithIcon.tsx +0 -43
  339. package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
  340. package/src/form/components/LocalChangesMenu.tsx +0 -147
  341. package/src/form/components/StorageItemPreview.tsx +0 -81
  342. package/src/form/components/StorageUploadProgress.tsx +0 -118
  343. package/src/form/components/index.tsx +0 -6
  344. package/src/form/components/useRailVisible.tsx +0 -47
  345. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
  346. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
  347. package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
  348. package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
  349. package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
  350. package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
  351. package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
  352. package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
  353. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
  354. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
  355. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
  356. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
  357. package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
  358. package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
  359. package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
  360. package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
  361. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
  362. package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
  363. package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
  364. package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
  365. package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
  366. package/src/form/form_utils.ts +0 -243
  367. package/src/form/index.tsx +0 -36
  368. package/src/form/useClearRestoreValue.tsx +0 -36
  369. package/src/form/useUndoableDiscard.ts +0 -39
  370. package/src/form/validation.ts +0 -583
  371. package/src/hooks/index.ts +0 -16
  372. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
  373. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
  374. package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
  375. package/src/hooks/navigation/contexts/index.ts +0 -14
  376. package/src/hooks/navigation/useAsyncResolver.ts +0 -100
  377. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
  378. package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
  379. package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
  380. package/src/hooks/navigation/useNavigationResolution.ts +0 -271
  381. package/src/hooks/navigation/useResolvedCollections.ts +0 -102
  382. package/src/hooks/navigation/useResolvedViews.tsx +0 -139
  383. package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
  384. package/src/hooks/navigation/utils.ts +0 -200
  385. package/src/hooks/useAdminContext.tsx +0 -83
  386. package/src/hooks/useBreadcrumbsController.tsx +0 -17
  387. package/src/hooks/useBuildSideDialogsController.tsx +0 -145
  388. package/src/hooks/useBuildSidePanel.tsx +0 -315
  389. package/src/hooks/useChildViewSource.ts +0 -46
  390. package/src/hooks/useEntityDisplay.tsx +0 -262
  391. package/src/hooks/useEntityDisplayTitle.tsx +0 -49
  392. package/src/hooks/useHistory.ts +0 -178
  393. package/src/hooks/useRecordActions.tsx +0 -69
  394. package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
  395. package/src/hooks/useResolvedUsers.ts +0 -148
  396. package/src/hooks/useSelectionDialog.tsx +0 -58
  397. package/src/hooks/useSideDialogsController.tsx +0 -25
  398. package/src/hooks/useSidePanel.tsx +0 -13
  399. package/src/index.ts +0 -124
  400. package/src/preview/PropertyPreview.tsx +0 -331
  401. package/src/preview/compact_text.ts +0 -68
  402. package/src/preview/components/ArrayEnumPreview.tsx +0 -39
  403. package/src/preview/components/BooleanPreview.tsx +0 -28
  404. package/src/preview/components/DatePreview.tsx +0 -106
  405. package/src/preview/components/EmptyValue.tsx +0 -10
  406. package/src/preview/components/EnumValuesChip.tsx +0 -39
  407. package/src/preview/components/ImagePreview.tsx +0 -144
  408. package/src/preview/components/InlineEntityListPreview.tsx +0 -42
  409. package/src/preview/components/ReferencePreview.tsx +0 -235
  410. package/src/preview/components/RelationPreview.tsx +0 -271
  411. package/src/preview/components/StorageThumbnail.tsx +0 -147
  412. package/src/preview/components/UrlComponentPreview.tsx +0 -116
  413. package/src/preview/components/UserPreview.tsx +0 -30
  414. package/src/preview/components/date_fns_locales.ts +0 -125
  415. package/src/preview/index.ts +0 -26
  416. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
  417. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
  418. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
  419. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
  420. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
  421. package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
  422. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
  423. package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
  424. package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
  425. package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
  426. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
  427. package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
  428. package/src/preview/util.ts +0 -39
  429. package/src/routes/CustomViewRoute.tsx +0 -33
  430. package/src/routes/RebaseRoute.tsx +0 -467
  431. package/src/routes/index.ts +0 -2
  432. package/src/types/components/EntityFormActionsProps.tsx +0 -20
  433. package/src/types/components/EntityFormProps.tsx +0 -119
  434. package/src/types/components/PropertyPreviewProps.tsx +0 -85
  435. package/src/types/components/formex.tsx +0 -2
  436. package/src/types/components/index.ts +0 -3
  437. package/src/types/fields.tsx +0 -340
  438. package/src/types/index.ts +0 -4
  439. package/src/util/dataControllerAdapter.ts +0 -88
  440. package/src/util/entity_actions.ts +0 -28
  441. package/src/util/index.ts +0 -5
  442. package/src/util/navigation_utils.ts +0 -89
  443. package/src/util/number_format.ts +0 -46
  444. package/src/util/previews.ts +0 -131
  445. package/src/util/propertyConfigMapper.ts +0 -134
  446. package/src/util/property_utils.tsx +0 -236
  447. package/src/util/resolutions.ts +0 -96
  448. package/src/util/view_constants.ts +0 -33
  449. package/src/util/view_mode.ts +0 -176
@@ -1,729 +0,0 @@
1
- /**
2
- * Conversion utilities between the full Rebase types and their
3
- * JSON-serializable counterparts.
4
- *
5
- * - `toSerializableCollectionConfig` / `toSerializableProperty` — strip non-serializable fields
6
- * - `fromSerializableCollectionConfig` / `fromSerializableProperty` — reconstruct original types
7
- *
8
- * @module
9
- */
10
-
11
- import { isRelationalCollectionConfig, type Relation, type ArrayProperty, type BinaryProperty, type BooleanProperty, type DateProperty, type GeopointProperty, type MapProperty, type NumberProperty, type Properties, type Property, type ReferenceProperty, type RelationProperty, type StorageConfig, type StringProperty, type VectorProperty } from "@rebasepro/types";
12
- import type { AdminPropertyOptions } from "@rebasepro/cms-types";
13
- import type { AdminCollection } from "@rebasepro/cms-types";
14
-
15
- import type {
16
- SerializableArrayProperty,
17
- SerializableBaseProperty,
18
- SerializableAdminBaseOptions,
19
- SerializableBinaryProperty,
20
- SerializableBooleanProperty,
21
- SerializableCollectionConfig,
22
- SerializableDateProperty,
23
- SerializableDateValidation,
24
- SerializableGeopointProperty,
25
- SerializableMapProperty,
26
- SerializableNumberProperty,
27
- SerializableProperties,
28
- SerializableProperty,
29
- SerializableReferenceProperty,
30
- SerializableRelation,
31
- SerializableRelationProperty,
32
- SerializableStorageConfig,
33
- SerializableStringProperty,
34
- SerializableStringValidation,
35
- SerializableVectorProperty
36
- } from "./serializable_types";
37
-
38
- /**
39
- * Resolves a collection slug to the collection it names.
40
- *
41
- * Needed on the way back from JSON: a relation's `target` is a thunk, which
42
- * does not serialize, so it travels as a slug and has to be made callable
43
- * again against the other collections in the same set.
44
- */
45
- export type CollectionLookup = (slug: string) => AdminCollection | undefined;
46
-
47
- /**
48
- * Rebuild a serialized relation's `target` slug into the thunk consumers call.
49
- *
50
- * Shared by the relation *property* and the collection-level `relations` array.
51
- * They are the same shape on the wire and they need the same treatment coming
52
- * back, but only the property path had it — so a collection imported from an
53
- * existing table came off disk with `relations[n].target` still a string, which
54
- * typechecks (the serializable shape erases the difference) and throws "target
55
- * is not a function" at the first consumer.
56
- *
57
- * The lookup is consulted lazily, inside the thunk, so collections may
58
- * reference each other in any order, including circularly.
59
- */
60
- function fromSerializableRelation<R extends { target?: string; relationName?: string }>(
61
- relation: R,
62
- label: string,
63
- lookup?: CollectionLookup
64
- ): R & { target: () => AdminCollection } {
65
- const slug = relation.target;
66
- return {
67
- ...relation,
68
- target: () => {
69
- const found = slug ? lookup?.(slug) : undefined;
70
- if (!found) {
71
- throw new Error(
72
- `Relation "${relation.relationName ?? label}" targets collection "${slug ?? "(none)"}", ` +
73
- "which is not among the collections it was deserialized with. Pass the whole set to " +
74
- "`fromSerializableCollectionConfigs` so slugs can be resolved against each other."
75
- );
76
- }
77
- return found;
78
- }
79
- };
80
- }
81
-
82
- // ═══════════════════════════════════════════════════════════════════════
83
- // PROPERTY CONVERSION: Original → Serializable
84
- // ═══════════════════════════════════════════════════════════════════════
85
-
86
- /**
87
- * Strip non-serializable fields from a `AdminPropertyOptions`.
88
- * Removes `Field` and `Preview` (ComponentRef).
89
- */
90
- /**
91
- * Every `ComponentRef` on a property's admin block. These are components, not
92
- * data, and none of them survives `JSON.stringify` — a function-valued key is
93
- * dropped from the output object with no error, so a component written here
94
- * would leave a key that reads back as missing rather than as itself.
95
- *
96
- * `Filter` was absent from this list while `Field` and `Preview` were named
97
- * twice, once destructured and once compared by string.
98
- */
99
- const NON_SERIALIZABLE_ADMIN_KEYS = ["Field", "Preview", "Filter"];
100
-
101
- function toSerializableAdminOptions(ui: AdminPropertyOptions | undefined): SerializableAdminBaseOptions | undefined {
102
- if (!ui) return undefined;
103
- const result: Record<string, unknown> = {};
104
- for (const [key, value] of Object.entries(ui as Record<string, unknown>)) {
105
- if (!NON_SERIALIZABLE_ADMIN_KEYS.includes(key) && value !== undefined) {
106
- result[key] = value;
107
- }
108
- }
109
- return Object.keys(result).length > 0 ? result as SerializableAdminBaseOptions : undefined;
110
- }
111
-
112
- /**
113
- * Convert a `StorageConfig` to its serializable form.
114
- * Drops function variants of `storagePath`, `fileName`, and all function fields.
115
- */
116
- function toSerializableStorageConfig(storage: StorageConfig | undefined): SerializableStorageConfig | undefined {
117
- if (!storage) return undefined;
118
-
119
- // storagePath must be a string for serialization
120
- const storagePath = typeof storage.storagePath === "string" ? storage.storagePath : undefined;
121
- if (!storagePath) return undefined;
122
-
123
- const result: SerializableStorageConfig = { storagePath };
124
-
125
- if (storage.acceptedFiles) result.acceptedFiles = storage.acceptedFiles;
126
- if (storage.imageResize) result.imageResize = storage.imageResize;
127
- if (storage.metadata) result.metadata = storage.metadata;
128
- if (typeof storage.fileName === "string") result.fileName = storage.fileName;
129
- if (storage.includeBucketUrl !== undefined) result.includeBucketUrl = storage.includeBucketUrl;
130
- if (storage.storeUrl !== undefined) result.storeUrl = storage.storeUrl;
131
- if (storage.maxSize !== undefined) result.maxSize = storage.maxSize;
132
- if (storage.storageSource !== undefined) result.storageSource = storage.storageSource;
133
- // processFile, postProcess, previewUrl are intentionally dropped (functions)
134
-
135
- return result;
136
- }
137
-
138
- /**
139
- * Convert a RegExp or string `matches` validation to a plain string.
140
- */
141
- function serializeMatches(matches: string | RegExp | undefined): string | undefined {
142
- if (matches === undefined) return undefined;
143
- if (typeof matches === "string") return matches;
144
- return matches.source;
145
- }
146
-
147
- /**
148
- * Resolve a relation target to a string slug.
149
- * Functions are called to extract the target; AdminCollection objects
150
- * use their slug.
151
- */
152
- function resolveRelationTarget(target: RelationProperty["relation"] extends infer R ? R extends { target: infer T } ? T : never : never): string | undefined {
153
- if (!target) return undefined;
154
- if (typeof target === "string") return target;
155
- if (typeof target === "function") {
156
- try {
157
- const resolved = target();
158
- if (typeof resolved === "string") return resolved;
159
- if (resolved && typeof resolved === "object" && "slug" in resolved) {
160
- return (resolved as AdminCollection).slug;
161
- }
162
- } catch {
163
- // If the lazy resolver throws (e.g., circular dependency not yet ready), return undefined
164
- }
165
- }
166
- return undefined;
167
- }
168
-
169
- /**
170
- * A `Relation` as JSON: `target` resolved from its thunk down to a slug.
171
- *
172
- * Switched on `kind` and assigned without a cast, so the compiler checks that
173
- * each branch writes the fields its kind owns and no others. This used to be
174
- * built as an untyped bag and cast into place — which is how the target
175
- * interface drifted a whole refactor behind the code writing to it.
176
- *
177
- * Shared by the relation *property* and the collection-level `relations` array,
178
- * which had no serializer at all: `buildCollectionFromTableMetadata` fills that
179
- * array from the table's foreign keys and junctions on import, and every one of
180
- * them was dropped on save.
181
- */
182
- function toSerializableRelation(link: Relation): SerializableRelation {
183
- const target = resolveRelationTarget(link.target);
184
- const common = {
185
- ...(target ? { target } : {}),
186
- ...(link.relationName ? { relationName: link.relationName } : {}),
187
- ...(link.onUpdate ? { onUpdate: link.onUpdate } : {}),
188
- ...(link.onDelete ? { onDelete: link.onDelete } : {})
189
- };
190
- switch (link.kind) {
191
- case "belongsTo":
192
- return { kind: "belongsTo", ...common, ...(link.localKey ? { localKey: link.localKey } : {}) };
193
- case "hasOne":
194
- case "hasMany":
195
- return {
196
- kind: link.kind,
197
- ...common,
198
- ...(link.foreignKeyOnTarget ? { foreignKeyOnTarget: link.foreignKeyOnTarget } : {}),
199
- ...(link.sourceKey ? { sourceKey: link.sourceKey } : {})
200
- };
201
- case "manyToMany":
202
- return { kind: "manyToMany", ...common, ...(link.through ? { through: link.through } : {}) };
203
- case "via":
204
- return { kind: "via", ...common, cardinality: link.cardinality, joinPath: link.joinPath };
205
- default: {
206
- const exhaustive: never = link;
207
- throw new Error(`Unhandled relation kind: ${JSON.stringify(exhaustive)}`);
208
- }
209
- }
210
- }
211
-
212
- /**
213
- * Strip non-serializable base property fields.
214
- * Returns a clean object with only the common serializable fields from BaseProperty.
215
- * Validation is intentionally excluded — each property type handles its own.
216
- */
217
- function toSerializableBaseFields(property: Property): Omit<SerializableBaseProperty, "validation"> {
218
- const result: Partial<Omit<SerializableBaseProperty, "validation">> = {
219
- name: property.name
220
- };
221
-
222
- if (property.description) result.description = property.description;
223
- if (property.propertyConfig) result.propertyConfig = property.propertyConfig;
224
- if (property.columnName) result.columnName = property.columnName;
225
- if (property.excludeFromApi !== undefined) result.excludeFromApi = property.excludeFromApi;
226
- if (property.defaultValue !== undefined) result.defaultValue = property.defaultValue;
227
- if (property.conditions) result.conditions = property.conditions;
228
- if (property.metadata) result.metadata = property.metadata;
229
- // dynamicProps and callbacks are intentionally dropped (functions)
230
-
231
- const ui = toSerializableAdminOptions(property.admin);
232
- if (ui) result.admin = ui;
233
-
234
- return result as Omit<SerializableBaseProperty, "validation">;
235
- }
236
-
237
- /**
238
- * Convert a single `Property` to its JSON-serializable form.
239
- * Strips functions, converts RegExp to string, Date to ISO string.
240
- */
241
- export function toSerializableProperty(property: Property): SerializableProperty {
242
- const base = toSerializableBaseFields(property);
243
-
244
- switch (property.type) {
245
- case "string": {
246
- const sp = property as StringProperty;
247
- const result: SerializableStringProperty = {
248
- ...base,
249
- type: "string"
250
- };
251
- if (sp.columnType) result.columnType = sp.columnType;
252
- if (sp.isId !== undefined) result.isId = sp.isId;
253
- if (sp.enum) result.enum = sp.enum;
254
- if (sp.userSelect) result.userSelect = sp.userSelect;
255
- if (sp.email) result.email = sp.email;
256
- if (sp.url) result.url = sp.url;
257
-
258
- // Convert validation.matches from RegExp to string
259
- if (sp.validation) {
260
- const { matches, ...restValidation } = sp.validation;
261
- const serializedValidation: SerializableStringValidation = { ...restValidation };
262
- const matchStr = serializeMatches(matches);
263
- if (matchStr !== undefined) serializedValidation.matches = matchStr;
264
- result.validation = serializedValidation;
265
- }
266
-
267
- // Storage: convert to serializable form
268
- const storage = toSerializableStorageConfig(sp.storage);
269
- if (storage) result.storage = storage;
270
-
271
- return result;
272
- }
273
-
274
- case "number": {
275
- const np = property as NumberProperty;
276
- const result: SerializableNumberProperty = {
277
- ...base,
278
- type: "number"
279
- };
280
- if (np.columnType) result.columnType = np.columnType;
281
- if (np.validation) result.validation = np.validation;
282
- if (np.isId !== undefined) result.isId = np.isId;
283
- if (np.enum) result.enum = np.enum;
284
- return result;
285
- }
286
-
287
- case "boolean": {
288
- const bp = property as BooleanProperty;
289
- const result: SerializableBooleanProperty = {
290
- ...base,
291
- type: "boolean"
292
- };
293
- if (bp.validation) result.validation = bp.validation;
294
- return result;
295
- }
296
-
297
- case "date": {
298
- const dp = property as DateProperty;
299
- const result: SerializableDateProperty = {
300
- ...base,
301
- type: "date"
302
- };
303
- if (dp.columnType) result.columnType = dp.columnType;
304
- if (dp.mode) result.mode = dp.mode;
305
- if (dp.timezone) result.timezone = dp.timezone;
306
- if (dp.autoValue) result.autoValue = dp.autoValue;
307
-
308
- // Convert Date validation min/max to ISO strings
309
- if (dp.validation) {
310
- const serializedValidation: SerializableDateValidation = {};
311
- if (dp.validation.required !== undefined) serializedValidation.required = dp.validation.required;
312
- if (dp.validation.requiredMessage) serializedValidation.requiredMessage = dp.validation.requiredMessage;
313
- if (dp.validation.unique) serializedValidation.unique = dp.validation.unique;
314
- if (dp.validation.uniqueInArray) serializedValidation.uniqueInArray = dp.validation.uniqueInArray;
315
- if (dp.validation.min instanceof Date) {
316
- serializedValidation.min = dp.validation.min.toISOString();
317
- } else if (typeof dp.validation.min === "string") {
318
- serializedValidation.min = dp.validation.min;
319
- }
320
- if (dp.validation.max instanceof Date) {
321
- serializedValidation.max = dp.validation.max.toISOString();
322
- } else if (typeof dp.validation.max === "string") {
323
- serializedValidation.max = dp.validation.max;
324
- }
325
- result.validation = serializedValidation;
326
- }
327
- return result;
328
- }
329
-
330
- case "geopoint": {
331
- const gp = property as GeopointProperty;
332
- const result: SerializableGeopointProperty = {
333
- ...base,
334
- type: "geopoint"
335
- };
336
- if (gp.validation) result.validation = gp.validation;
337
- return result;
338
- }
339
-
340
- case "reference": {
341
- const rp = property as ReferenceProperty;
342
- const result: SerializableReferenceProperty = {
343
- ...base,
344
- type: "reference"
345
- };
346
- if (rp.isId !== undefined) result.isId = rp.isId;
347
- if (rp.path) result.path = rp.path;
348
- return result;
349
- }
350
-
351
- case "relation": {
352
- const rl = property as RelationProperty;
353
- const result: SerializableRelationProperty = {
354
- ...base,
355
- type: "relation"
356
- };
357
- if (rl.isId !== undefined) result.isId = rl.isId;
358
- // The link is one nested object now, so it serializes as one:
359
- // its `kind` says which fields are even meaningful.
360
- const link = rl.relation;
361
- if (link) {
362
- // Switched on `kind` and assigned without a cast: the
363
- // serialized union mirrors the authored one, so the compiler
364
- // checks that each branch writes the fields its kind owns and
365
- // no others. This used to be built as an untyped bag and cast
366
- // into place — which is how the target interface drifted a
367
- // whole refactor behind the code writing to it.
368
- result.relation = toSerializableRelation(link);
369
- }
370
- // overrides are dropped (may hold a non-serializable CollectionConfig)
371
- return result;
372
- }
373
-
374
- case "array": {
375
- const ap = property as ArrayProperty;
376
- const result: SerializableArrayProperty = {
377
- ...base,
378
- type: "array"
379
- };
380
- if (ap.columnType) result.columnType = ap.columnType;
381
- if (ap.validation) result.validation = ap.validation;
382
-
383
- // Recursively serialize the "of" property
384
- if (ap.of) {
385
- if (Array.isArray(ap.of)) {
386
- result.of = ap.of.map(toSerializableProperty);
387
- } else {
388
- result.of = toSerializableProperty(ap.of);
389
- }
390
- }
391
-
392
- // Recursively serialize oneOf properties
393
- if (ap.oneOf) {
394
- result.oneOf = {
395
- properties: toSerializableProperties(ap.oneOf.properties)
396
- };
397
- if (ap.oneOf.propertiesOrder) result.oneOf.propertiesOrder = ap.oneOf.propertiesOrder;
398
- if (ap.oneOf.typeField) result.oneOf.typeField = ap.oneOf.typeField;
399
- if (ap.oneOf.valueField) result.oneOf.valueField = ap.oneOf.valueField;
400
- }
401
- return result;
402
- }
403
-
404
- case "map": {
405
- const mp = property as MapProperty;
406
- const result: SerializableMapProperty = {
407
- ...base,
408
- type: "map"
409
- };
410
- if (mp.columnType) result.columnType = mp.columnType;
411
- if (mp.validation) result.validation = mp.validation;
412
- if (mp.propertiesOrder) result.propertiesOrder = mp.propertiesOrder;
413
- if (mp.keyValue) result.keyValue = mp.keyValue;
414
-
415
- // Recursively serialize nested properties
416
- if (mp.properties) {
417
- result.properties = toSerializableProperties(mp.properties);
418
- }
419
- return result;
420
- }
421
-
422
- case "vector": {
423
- const vp = property as VectorProperty;
424
- const result: SerializableVectorProperty = {
425
- ...base,
426
- type: "vector",
427
- dimensions: vp.dimensions
428
- };
429
- if (vp.validation) result.validation = vp.validation;
430
- return result;
431
- }
432
-
433
- case "binary": {
434
- const bp = property as BinaryProperty;
435
- const result: SerializableBinaryProperty = {
436
- ...base,
437
- type: "binary"
438
- };
439
- if (bp.validation) result.validation = bp.validation;
440
- return result;
441
- }
442
-
443
- default:
444
- // Exhaustive check: if new types are added, this will produce a compile error
445
- return base as SerializableProperty;
446
- }
447
- }
448
-
449
- /**
450
- * Convert a `Properties` record to its serializable form.
451
- */
452
- export function toSerializableProperties(properties: Properties): SerializableProperties {
453
- const result: SerializableProperties = {};
454
- for (const [key, property] of Object.entries(properties)) {
455
- result[key] = toSerializableProperty(property);
456
- }
457
- return result;
458
- }
459
-
460
- // ═══════════════════════════════════════════════════════════════════════
461
- // COLLECTION CONVERSION: Original → Serializable
462
- // ═══════════════════════════════════════════════════════════════════════
463
-
464
- /**
465
- * Convert an `AdminCollection` to its JSON-serializable form.
466
- *
467
- * Strips all non-serializable fields (functions, React nodes, class instances)
468
- * while preserving the structural schema that the collection editor works with.
469
- *
470
- * The result is safe for `JSON.stringify()` and database storage.
471
- */
472
- export function toSerializableCollectionConfig(collection: AdminCollection): SerializableCollectionConfig {
473
- const result: SerializableCollectionConfig = {
474
- slug: collection.slug,
475
- name: collection.name,
476
- properties: toSerializableProperties(collection.properties)
477
- };
478
-
479
- // String fields
480
- if (collection.singularName) result.singularName = collection.singularName;
481
- if (collection.description) result.description = collection.description;
482
- if (collection.group) result.group = collection.group;
483
- if (collection.engine) result.engine = collection.engine;
484
- if (collection.dataSource) result.dataSource = collection.dataSource;
485
- if (collection.databaseId) result.databaseId = collection.databaseId;
486
- if (collection.ownerId) result.ownerId = collection.ownerId;
487
- if (collection.metadata) result.metadata = collection.metadata;
488
- if (isRelationalCollectionConfig(collection) && collection.table) result.table = collection.table;
489
- if (isRelationalCollectionConfig(collection) && collection.relations?.length) {
490
- result.relations = collection.relations.map(toSerializableRelation);
491
- }
492
- if ("schema" in collection && collection.schema) result.schema = collection.schema as string;
493
- if (collection.orderProperty) result.orderProperty = collection.orderProperty as string;
494
-
495
- // Icon: only keep string variant
496
- if (typeof collection.icon === "string") result.icon = collection.icon;
497
-
498
- // Array fields
499
- if (collection.propertiesOrder) result.propertiesOrder = collection.propertiesOrder as string[];
500
- if (collection.previewProperties) result.previewProperties = collection.previewProperties;
501
- if (collection.listProperties) result.listProperties = collection.listProperties;
502
- if (collection.enabledViews) result.enabledViews = collection.enabledViews;
503
- // Inline views are dropped rather than mangled: their `Builder` cannot be
504
- // serialized, and writing back a half of one would delete it from the
505
- // running config. Keys survive, so a collection edited in the panel keeps
506
- // whichever registered views it named.
507
- if (collection.customViews) {
508
- const keys = collection.customViews.filter((v): v is string => typeof v === "string");
509
- if (keys.length > 0) result.customViews = keys;
510
- }
511
- if (collection.disableDefaultActions) result.disableDefaultActions = collection.disableDefaultActions;
512
- if (collection.securityRules) result.securityRules = collection.securityRules;
513
- if (isRelationalCollectionConfig(collection) && collection.disableDefaultPolicies !== undefined) {
514
- result.disableDefaultPolicies = collection.disableDefaultPolicies;
515
- }
516
- if (collection.strictWrites !== undefined) result.strictWrites = collection.strictWrites;
517
-
518
- // Enum-like fields
519
- if (collection.openEntityMode) result.openEntityMode = collection.openEntityMode;
520
- if (collection.defaultEntityAction) result.defaultEntityAction = collection.defaultEntityAction;
521
- if (collection.defaultViewMode) result.defaultViewMode = collection.defaultViewMode;
522
- if (collection.defaultSize) result.defaultSize = collection.defaultSize;
523
- if (collection.localChangesBackup !== undefined) result.localChangesBackup = collection.localChangesBackup;
524
-
525
- // Kanban
526
- if (collection.kanban) result.kanban = collection.kanban as SerializableCollectionConfig["kanban"];
527
-
528
- // Filters and sorting
529
- if (collection.fixedFilter) result.fixedFilter = collection.fixedFilter as SerializableCollectionConfig["fixedFilter"];
530
- if (collection.defaultFilter) result.defaultFilter = collection.defaultFilter as SerializableCollectionConfig["defaultFilter"];
531
- if (collection.filterPresets) result.filterPresets = collection.filterPresets as SerializableCollectionConfig["filterPresets"];
532
- if (collection.sort) result.sort = collection.sort as SerializableCollectionConfig["sort"];
533
-
534
- // Numeric / boolean flags
535
- if (collection.pagination !== undefined) result.pagination = collection.pagination;
536
- if (collection.selectionEnabled !== undefined) result.selectionEnabled = collection.selectionEnabled;
537
- if (collection.inlineEditing !== undefined) result.inlineEditing = collection.inlineEditing;
538
- if (collection.hideFromNavigation !== undefined) result.hideFromNavigation = collection.hideFromNavigation;
539
- if (collection.hideIdFromForm !== undefined) result.hideIdFromForm = collection.hideIdFromForm;
540
- if (collection.hideIdFromCollection !== undefined) result.hideIdFromCollection = collection.hideIdFromCollection;
541
- if (collection.formAutoSave !== undefined) result.formAutoSave = collection.formAutoSave;
542
- if (collection.alwaysApplyDefaultValues !== undefined) result.alwaysApplyDefaultValues = collection.alwaysApplyDefaultValues;
543
- if (collection.includeJsonView !== undefined) result.includeJsonView = collection.includeJsonView;
544
- if (collection.history !== undefined) result.history = collection.history;
545
- if (collection.sideDialogWidth !== undefined) result.sideDialogWidth = collection.sideDialogWidth;
546
-
547
- // Exportable: only keep boolean variant
548
- if (typeof collection.exportable === "boolean") result.exportable = collection.exportable;
549
-
550
- // Auth: only keep boolean variant
551
- if (typeof collection.auth === "boolean") result.auth = collection.auth;
552
-
553
- // defaultSelectedView: only keep string variant
554
- if (typeof collection.defaultSelectedView === "string") result.defaultSelectedView = collection.defaultSelectedView;
555
-
556
- return result;
557
- }
558
-
559
- // ═══════════════════════════════════════════════════════════════════════
560
- // PROPERTY CONVERSION: Serializable → Original
561
- // ═══════════════════════════════════════════════════════════════════════
562
-
563
- /**
564
- * Convert a serializable property back to the original `Property` type.
565
- *
566
- * This is a mostly pass-through operation since serializable properties
567
- * are a subset of the original types. The main conversions are:
568
- * - `validation.matches` (string) stays as string (compatible with Property)
569
- * - `validation.min/max` on dates: ISO strings → Date objects
570
- */
571
- export function fromSerializableProperty(
572
- serialized: SerializableProperty,
573
- lookup?: CollectionLookup
574
- ): Property {
575
- switch (serialized.type) {
576
- case "date": {
577
- const sp = serialized as SerializableDateProperty;
578
- const { validation: dateValidation, ...dateRest } = sp;
579
- const result: Record<string, unknown> = { ...dateRest,
580
- type: "date" };
581
- // Convert ISO string dates back to Date objects
582
- if (dateValidation) {
583
- const convertedValidation: Record<string, unknown> = { ...dateValidation };
584
- if (typeof dateValidation.min === "string") {
585
- convertedValidation.min = new Date(dateValidation.min);
586
- }
587
- if (typeof dateValidation.max === "string") {
588
- convertedValidation.max = new Date(dateValidation.max);
589
- }
590
- result.validation = convertedValidation;
591
- }
592
- return result as unknown as DateProperty;
593
- }
594
-
595
- case "array": {
596
- const sp = serialized as SerializableArrayProperty;
597
- const result = { ...sp } as unknown as ArrayProperty;
598
- // Recursively convert "of" property
599
- if (sp.of) {
600
- if (Array.isArray(sp.of)) {
601
- result.of = sp.of.map(prop => fromSerializableProperty(prop, lookup));
602
- } else {
603
- result.of = fromSerializableProperty(sp.of, lookup);
604
- }
605
- }
606
- // Recursively convert oneOf properties
607
- if (sp.oneOf) {
608
- result.oneOf = {
609
- ...sp.oneOf,
610
- properties: fromSerializableProperties(sp.oneOf.properties, lookup)
611
- };
612
- }
613
- return result;
614
- }
615
-
616
- case "map": {
617
- const sp = serialized as SerializableMapProperty;
618
- const result = { ...sp } as unknown as MapProperty;
619
- // Recursively convert nested properties
620
- if (sp.properties) {
621
- result.properties = fromSerializableProperties(sp.properties, lookup);
622
- }
623
- return result;
624
- }
625
-
626
- case "string": {
627
- const sp = serialized as SerializableStringProperty;
628
- const result = { ...sp } as unknown as StringProperty;
629
- return result;
630
- }
631
-
632
- case "relation": {
633
- // The one property whose serialized form is *not* already a valid
634
- // Property. `target` survives the round trip as a collection slug,
635
- // because a `() => CollectionConfig` thunk cannot be written to
636
- // JSON — so it has to be made callable again on the way back.
637
- //
638
- // Falling through to the pass-through below returned a relation
639
- // whose `target` was a string, and every consumer calls `target()`.
640
- // Nothing caught it: the cast to `Property` erased the difference.
641
- const sp = serialized as SerializableRelationProperty;
642
- const { relation, ...rest } = sp;
643
- const result = { ...rest,
644
- type: "relation" } as unknown as RelationProperty;
645
- if (relation) {
646
- result.relation = fromSerializableRelation(
647
- relation,
648
- sp.name ?? "",
649
- lookup
650
- ) as unknown as RelationProperty["relation"];
651
- }
652
- return result as Property;
653
- }
654
-
655
- default:
656
- // For all other types, the serializable form is already a valid Property
657
- return serialized as unknown as Property;
658
- }
659
- }
660
-
661
- /**
662
- * Convert a `SerializableProperties` record back to `Properties`.
663
- */
664
- export function fromSerializableProperties(
665
- serialized: SerializableProperties,
666
- lookup?: CollectionLookup
667
- ): Properties {
668
- const result: Properties = {};
669
- for (const [key, property] of Object.entries(serialized)) {
670
- result[key] = fromSerializableProperty(property, lookup);
671
- }
672
- return result;
673
- }
674
-
675
- // ═══════════════════════════════════════════════════════════════════════
676
- // COLLECTION CONVERSION: Serializable → Original
677
- // ═══════════════════════════════════════════════════════════════════════
678
-
679
- /**
680
- * Convert a `SerializableCollectionConfig` back to an `AdminCollection`.
681
- *
682
- * The result will NOT contain any of the non-serializable fields
683
- * (callbacks, entityActions, etc.) — those must be re-attached by the
684
- * consumer if needed.
685
- */
686
- export function fromSerializableCollectionConfig(
687
- serialized: SerializableCollectionConfig,
688
- lookup?: CollectionLookup
689
- ): AdminCollection {
690
- const { properties, relations, ...rest } = serialized as SerializableCollectionConfig & {
691
- relations?: SerializableRelation[]
692
- };
693
-
694
- return {
695
- ...rest,
696
- ...(relations
697
- ? {
698
- relations: relations.map((relation, index) =>
699
- fromSerializableRelation(relation, `relations[${index}]`, lookup))
700
- }
701
- : {}),
702
- properties: fromSerializableProperties(properties, lookup)
703
- } as AdminCollection;
704
- }
705
-
706
- /**
707
- * Deserialize a whole set of collections, resolving relation targets against
708
- * each other.
709
- *
710
- * This is the entry point to prefer. A relation's `target` is a slug on the
711
- * wire, and a slug only means something relative to the other collections — so
712
- * deserializing one at a time cannot rebuild a working thunk, and produces
713
- * relations that throw the moment anything resolves them.
714
- *
715
- * The lookup is consulted lazily, inside the thunk, so the collections may
716
- * reference each other in any order, including circularly.
717
- */
718
- export function fromSerializableCollectionConfigs(
719
- serialized: SerializableCollectionConfig[]
720
- ): AdminCollection[] {
721
- const bySlug = new Map<string, AdminCollection>();
722
- const lookup: CollectionLookup = slug => bySlug.get(slug);
723
-
724
- const collections = serialized.map(c => fromSerializableCollectionConfig(c, lookup));
725
- for (const collection of collections) {
726
- if (collection.slug) bySlug.set(collection.slug, collection);
727
- }
728
- return collections;
729
- }