@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.
- package/README.md +4 -0
- package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
- package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
- package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
- package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
- package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
- package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
- package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
- package/dist/collection_editor_ui.d.ts +2 -0
- package/dist/collection_editor_ui.js +6 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/DeleteEntityDialog.d.ts +2 -3
- package/dist/components/RebaseLayout.d.ts +11 -4
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/editor/sanitize-html.d.ts +15 -0
- package/dist/editor.js +195 -10
- package/dist/editor.js.map +1 -1
- package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
- package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
- package/dist/form/components/LabelWithIcon.d.ts +10 -0
- package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
- package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
- package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
- package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
- package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
- package/dist/index.js +78 -33
- package/dist/index.js.map +1 -1
- package/dist/util/propertyConfigMapper.d.ts +1 -1
- package/dist/util-CfLFggP7.js +57 -0
- package/dist/util-CfLFggP7.js.map +1 -0
- package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
- package/dist/util-DE1WQW6h.js.map +1 -0
- package/package.json +42 -34
- package/dist/util-DVqnqlLn.js.map +0 -1
- package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
- package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
- package/src/collection_editor/_cms_internals.ts +0 -41
- package/src/collection_editor/api/generateCollectionApi.ts +0 -126
- package/src/collection_editor/api/index.ts +0 -1
- package/src/collection_editor/extensibility_types.ts +0 -168
- package/src/collection_editor/index.ts +0 -108
- package/src/collection_editor/liveSchemaClient.ts +0 -285
- package/src/collection_editor/relation_kinds.ts +0 -44
- package/src/collection_editor/serializable_types.ts +0 -535
- package/src/collection_editor/serializable_utils.ts +0 -729
- package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
- package/src/collection_editor/types/collection_inference.ts +0 -18
- package/src/collection_editor/types/config_controller.tsx +0 -121
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
- package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
- package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
- package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
- package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
- package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
- package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
- package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
- package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
- package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
- package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
- package/src/collection_editor/ui/collection_editor/util.ts +0 -28
- package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
- package/src/collection_editor/useCollectionEditorController.tsx +0 -9
- package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
- package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
- package/src/collection_editor/useSafeSnackbarController.ts +0 -9
- package/src/collection_editor/validateCollectionJson.ts +0 -440
- package/src/collection_editor_ui.ts +0 -21
- package/src/components/AdditionalFieldValue.tsx +0 -68
- package/src/components/AdminModeSyncer.tsx +0 -56
- package/src/components/ArrayContainer.tsx +0 -542
- package/src/components/ClearFilterSortButton.tsx +0 -56
- package/src/components/CollectionEditorDialogs.tsx +0 -69
- package/src/components/CollectionPanel.tsx +0 -179
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
- package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
- package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
- package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
- package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
- package/src/components/CollectionTableBinding/index.tsx +0 -14
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
- package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
- package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
- package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
- package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
- package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
- package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
- package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
- package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
- package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
- package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
- package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
- package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
- package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
- package/src/components/CollectionViewBinding/utils.ts +0 -22
- package/src/components/DefaultAppBar.tsx +0 -264
- package/src/components/DefaultDrawer.tsx +0 -593
- package/src/components/DeleteEntityDialog.tsx +0 -205
- package/src/components/DetailViewBinding.tsx +0 -731
- package/src/components/DrawerNavigationGroup.tsx +0 -141
- package/src/components/DrawerNavigationItem.tsx +0 -115
- package/src/components/EditFormActions.tsx +0 -303
- package/src/components/EditViewBinding.tsx +0 -1069
- package/src/components/EntityDisplayHeader.tsx +0 -170
- package/src/components/EntityIdentityBar.tsx +0 -428
- package/src/components/EntityInspector.tsx +0 -156
- package/src/components/EntityPreviewBinding.tsx +0 -432
- package/src/components/EntityPreviewNesting.tsx +0 -50
- package/src/components/EntityViewBinding.tsx +0 -374
- package/src/components/FieldCaption.tsx +0 -14
- package/src/components/HomePage/ContentHomePage.tsx +0 -586
- package/src/components/HomePage/FavouritesView.tsx +0 -60
- package/src/components/HomePage/HomePageDnD.tsx +0 -704
- package/src/components/HomePage/NavigationCard.tsx +0 -81
- package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
- package/src/components/HomePage/NavigationGroup.tsx +0 -156
- package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
- package/src/components/HomePage/index.tsx +0 -5
- package/src/components/InlineEntityPreview.tsx +0 -149
- package/src/components/JsonPreviewBinding.tsx +0 -66
- package/src/components/PropertyCollectionView.tsx +0 -336
- package/src/components/PropertyConfigBadge.tsx +0 -28
- package/src/components/PropertyIdCopyTooltip.tsx +0 -47
- package/src/components/RebaseAuthGate.tsx +0 -44
- package/src/components/RebaseCMS.tsx +0 -30
- package/src/components/RebaseLayout.tsx +0 -80
- package/src/components/RebaseNavigation.tsx +0 -369
- package/src/components/RebaseRouteDefs.tsx +0 -127
- package/src/components/RebaseShell.tsx +0 -83
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
- package/src/components/ReferenceWidget.tsx +0 -156
- package/src/components/RelationSelector.tsx +0 -926
- package/src/components/SearchIconsView.tsx +0 -78
- package/src/components/SelectableTable/SelectableTable.tsx +0 -309
- package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
- package/src/components/SelectableTable/SelectionStore.ts +0 -43
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
- package/src/components/SelectableTable/filters/null_filter.ts +0 -63
- package/src/components/SideDialogs.tsx +0 -238
- package/src/components/SidePanelBinding.tsx +0 -361
- package/src/components/SidePanelProvider.tsx +0 -80
- package/src/components/UserSelector.tsx +0 -513
- package/src/components/admin/CreationResultDialog.tsx +0 -138
- package/src/components/admin/index.ts +0 -1
- package/src/components/app/AppBar.tsx +0 -17
- package/src/components/app/Drawer.tsx +0 -38
- package/src/components/app/Scaffold.tsx +0 -366
- package/src/components/app/index.ts +0 -4
- package/src/components/app/useApp.tsx +0 -36
- package/src/components/common/default_entity_actions.tsx +0 -440
- package/src/components/common/index.ts +0 -1
- package/src/components/field_configs.tsx +0 -506
- package/src/components/history/EntityHistoryEntry.tsx +0 -203
- package/src/components/history/EntityHistoryView.tsx +0 -206
- package/src/components/history/LastEditedByFormAction.tsx +0 -24
- package/src/components/history/LastEditedByIndicator.tsx +0 -95
- package/src/components/history/UserChip.tsx +0 -15
- package/src/components/history/index.tsx +0 -5
- package/src/components/index.ts +0 -63
- package/src/contexts/BreacrumbsContext.tsx +0 -45
- package/src/contexts/SideDialogsControllerContext.tsx +0 -5
- package/src/contexts/SidePanelControllerContext.tsx +0 -5
- package/src/data_export/export/BasicExportAction.tsx +0 -142
- package/src/data_export/export/ExportCollectionAction.tsx +0 -321
- package/src/data_export/export/export.ts +0 -295
- package/src/data_export/export/fetch_export_data.ts +0 -90
- package/src/data_export/export/index.ts +0 -4
- package/src/data_export/index.ts +0 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
- package/src/data_import/components/ImportFileUpload.tsx +0 -42
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
- package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
- package/src/data_import/components/index.ts +0 -4
- package/src/data_import/hooks/index.ts +0 -1
- package/src/data_import/hooks/useImportConfig.tsx +0 -34
- package/src/data_import/import/ImportCollectionAction.tsx +0 -461
- package/src/data_import/import/index.ts +0 -1
- package/src/data_import/index.ts +0 -5
- package/src/data_import/types/column_mapping.ts +0 -32
- package/src/data_import/types/index.ts +0 -1
- package/src/data_import/utils/csv.ts +0 -153
- package/src/data_import/utils/data.ts +0 -181
- package/src/data_import/utils/file_headers.ts +0 -14
- package/src/data_import/utils/file_to_json.ts +0 -149
- package/src/data_import/utils/get_import_inference_type.ts +0 -33
- package/src/data_import/utils/get_properties_mapping.ts +0 -67
- package/src/data_import/utils/index.ts +0 -5
- package/src/data_import/utils/save_entities.ts +0 -138
- package/src/data_import/utils/transforms.ts +0 -70
- package/src/editor/components/SlashCommandMenu.tsx +0 -532
- package/src/editor/components/editor-bubble-item.tsx +0 -32
- package/src/editor/components/editor-bubble.tsx +0 -143
- package/src/editor/components/image-bubble.tsx +0 -183
- package/src/editor/components/index.ts +0 -14
- package/src/editor/components/table-bubble.tsx +0 -233
- package/src/editor/editor.tsx +0 -529
- package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
- package/src/editor/extensions/Image.ts +0 -159
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
- package/src/editor/extensions/clipboard.ts +0 -72
- package/src/editor/extensions/custom-keymap.ts +0 -25
- package/src/editor/extensions/drag-and-drop.tsx +0 -508
- package/src/editor/hooks/useProseMirror.ts +0 -126
- package/src/editor/hooks/useProseMirrorContext.ts +0 -15
- package/src/editor/index.ts +0 -2
- package/src/editor/markdown-it-plugins.d.ts +0 -24
- package/src/editor/markdown.ts +0 -204
- package/src/editor/nodeViews/ImageComponent.tsx +0 -20
- package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
- package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
- package/src/editor/nodeViews/index.ts +0 -35
- package/src/editor/plugins/index.ts +0 -58
- package/src/editor/plugins/inputrules.ts +0 -82
- package/src/editor/plugins/placeholderPlugin.ts +0 -55
- package/src/editor/plugins/slashCommandPlugin.ts +0 -65
- package/src/editor/schema.ts +0 -339
- package/src/editor/selectors/ai-selector.tsx +0 -110
- package/src/editor/selectors/color-selector.tsx +0 -199
- package/src/editor/selectors/link-selector.tsx +0 -122
- package/src/editor/selectors/node-selector.tsx +0 -159
- package/src/editor/selectors/text-buttons.tsx +0 -79
- package/src/editor/types.ts +0 -6
- package/src/editor/useProseMirror.ts +0 -125
- package/src/editor/utils/prosemirror-utils.ts +0 -113
- package/src/editor/utils/remove_classes.ts +0 -18
- package/src/editor/utils/useDebouncedCallback.ts +0 -25
- package/src/form/EntityForm.tsx +0 -761
- package/src/form/EntityFormActions.tsx +0 -160
- package/src/form/EntityFormBinding.tsx +0 -342
- package/src/form/PropertyFieldBinding.tsx +0 -348
- package/src/form/components/ErrorFocus.tsx +0 -44
- package/src/form/components/FieldBlock.tsx +0 -189
- package/src/form/components/FieldHelperText.tsx +0 -84
- package/src/form/components/FormRail.tsx +0 -153
- package/src/form/components/FormSections.tsx +0 -145
- package/src/form/components/LabelWithIcon.tsx +0 -43
- package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
- package/src/form/components/LocalChangesMenu.tsx +0 -147
- package/src/form/components/StorageItemPreview.tsx +0 -81
- package/src/form/components/StorageUploadProgress.tsx +0 -118
- package/src/form/components/index.tsx +0 -6
- package/src/form/components/useRailVisible.tsx +0 -47
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
- package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
- package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
- package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
- package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
- package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
- package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
- package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
- package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
- package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
- package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
- package/src/form/form_utils.ts +0 -243
- package/src/form/index.tsx +0 -36
- package/src/form/useClearRestoreValue.tsx +0 -36
- package/src/form/useUndoableDiscard.ts +0 -39
- package/src/form/validation.ts +0 -583
- package/src/hooks/index.ts +0 -16
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
- package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
- package/src/hooks/navigation/contexts/index.ts +0 -14
- package/src/hooks/navigation/useAsyncResolver.ts +0 -100
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
- package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
- package/src/hooks/navigation/useNavigationResolution.ts +0 -271
- package/src/hooks/navigation/useResolvedCollections.ts +0 -102
- package/src/hooks/navigation/useResolvedViews.tsx +0 -139
- package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
- package/src/hooks/navigation/utils.ts +0 -200
- package/src/hooks/useAdminContext.tsx +0 -83
- package/src/hooks/useBreadcrumbsController.tsx +0 -17
- package/src/hooks/useBuildSideDialogsController.tsx +0 -145
- package/src/hooks/useBuildSidePanel.tsx +0 -315
- package/src/hooks/useChildViewSource.ts +0 -46
- package/src/hooks/useEntityDisplay.tsx +0 -262
- package/src/hooks/useEntityDisplayTitle.tsx +0 -49
- package/src/hooks/useHistory.ts +0 -178
- package/src/hooks/useRecordActions.tsx +0 -69
- package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
- package/src/hooks/useResolvedUsers.ts +0 -148
- package/src/hooks/useSelectionDialog.tsx +0 -58
- package/src/hooks/useSideDialogsController.tsx +0 -25
- package/src/hooks/useSidePanel.tsx +0 -13
- package/src/index.ts +0 -124
- package/src/preview/PropertyPreview.tsx +0 -331
- package/src/preview/compact_text.ts +0 -68
- package/src/preview/components/ArrayEnumPreview.tsx +0 -39
- package/src/preview/components/BooleanPreview.tsx +0 -28
- package/src/preview/components/DatePreview.tsx +0 -106
- package/src/preview/components/EmptyValue.tsx +0 -10
- package/src/preview/components/EnumValuesChip.tsx +0 -39
- package/src/preview/components/ImagePreview.tsx +0 -144
- package/src/preview/components/InlineEntityListPreview.tsx +0 -42
- package/src/preview/components/ReferencePreview.tsx +0 -235
- package/src/preview/components/RelationPreview.tsx +0 -271
- package/src/preview/components/StorageThumbnail.tsx +0 -147
- package/src/preview/components/UrlComponentPreview.tsx +0 -116
- package/src/preview/components/UserPreview.tsx +0 -30
- package/src/preview/components/date_fns_locales.ts +0 -125
- package/src/preview/index.ts +0 -26
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
- package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
- package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
- package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
- package/src/preview/util.ts +0 -39
- package/src/routes/CustomViewRoute.tsx +0 -33
- package/src/routes/RebaseRoute.tsx +0 -467
- package/src/routes/index.ts +0 -2
- package/src/types/components/EntityFormActionsProps.tsx +0 -20
- package/src/types/components/EntityFormProps.tsx +0 -119
- package/src/types/components/PropertyPreviewProps.tsx +0 -85
- package/src/types/components/formex.tsx +0 -2
- package/src/types/components/index.ts +0 -3
- package/src/types/fields.tsx +0 -340
- package/src/types/index.ts +0 -4
- package/src/util/dataControllerAdapter.ts +0 -88
- package/src/util/entity_actions.ts +0 -28
- package/src/util/index.ts +0 -5
- package/src/util/navigation_utils.ts +0 -89
- package/src/util/number_format.ts +0 -46
- package/src/util/previews.ts +0 -131
- package/src/util/propertyConfigMapper.ts +0 -134
- package/src/util/property_utils.tsx +0 -236
- package/src/util/resolutions.ts +0 -96
- package/src/util/view_constants.ts +0 -33
- 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
|
-
}
|