@webiny/api-headless-cms 6.1.0-beta.3 → 6.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/context.d.ts +2 -5
- package/context.js +16 -7
- package/context.js.map +1 -1
- package/crud/AccessControl/AccessControl.d.ts +18 -28
- package/crud/AccessControl/AccessControl.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createEntryData.js +17 -6
- package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +9 -3
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -1
- package/crud/contentEntry/entryDataValidation.d.ts +1 -1
- package/crud/contentEntry/entryDataValidation.js +16 -13
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry/searchableFields.d.ts +2 -3
- package/crud/contentEntry/searchableFields.js +10 -18
- package/crud/contentEntry/searchableFields.js.map +1 -1
- package/crud/contentModel.crud.js +2 -1
- package/crud/contentModel.crud.js.map +1 -1
- package/domain/contentModel/validation/modelFields.js +15 -20
- package/domain/contentModel/validation/modelFields.js.map +1 -1
- package/exports/api/cms/graphql.d.ts +1 -0
- package/exports/api/cms/graphql.js +3 -0
- package/exports/api/cms/graphql.js.map +1 -0
- package/exports/api/cms/storage.d.ts +3 -0
- package/exports/api/cms/storage.js +5 -0
- package/exports/api/cms/storage.js.map +1 -0
- package/exports/api/cms/validation.d.ts +4 -0
- package/exports/api/cms/validation.js +6 -0
- package/exports/api/cms/validation.js.map +1 -0
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.d.ts +3 -3
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +3 -3
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntry/events.d.ts +2 -2
- package/features/contentEntry/CreateEntry/events.js +1 -1
- package/features/contentEntry/CreateEntry/events.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +3 -3
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +3 -3
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/events.d.ts +2 -2
- package/features/contentEntry/CreateEntryRevisionFrom/events.js +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/events.js.map +1 -1
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.d.ts +1 -1
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js +1 -1
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.d.ts +2 -2
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js +2 -2
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntry/events.d.ts +2 -2
- package/features/contentEntry/DeleteEntry/events.js +1 -1
- package/features/contentEntry/DeleteEntry/events.js.map +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.d.ts +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntryRevision/events.d.ts +2 -2
- package/features/contentEntry/DeleteEntryRevision/events.js +1 -1
- package/features/contentEntry/DeleteEntryRevision/events.js.map +1 -1
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.d.ts +1 -1
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js +1 -1
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js.map +1 -1
- package/features/contentEntry/DeleteMultipleEntries/events.d.ts +2 -2
- package/features/contentEntry/DeleteMultipleEntries/events.js +1 -1
- package/features/contentEntry/DeleteMultipleEntries/events.js.map +1 -1
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js +6 -11
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js.map +1 -1
- package/features/contentEntry/ListEntries/ListEntriesUseCase.d.ts +1 -1
- package/features/contentEntry/ListEntries/ListEntriesUseCase.js +1 -1
- package/features/contentEntry/ListEntries/ListEntriesUseCase.js.map +1 -1
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.d.ts +1 -1
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.js +1 -1
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.js.map +1 -1
- package/features/contentEntry/MoveEntry/events.d.ts +2 -2
- package/features/contentEntry/MoveEntry/events.js +1 -1
- package/features/contentEntry/MoveEntry/events.js.map +1 -1
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +2 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/PublishEntry/events.d.ts +2 -2
- package/features/contentEntry/PublishEntry/events.js +1 -1
- package/features/contentEntry/PublishEntry/events.js.map +1 -1
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +2 -2
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/RepublishEntry/events.d.ts +2 -2
- package/features/contentEntry/RepublishEntry/events.js +1 -1
- package/features/contentEntry/RepublishEntry/events.js.map +1 -1
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.d.ts +2 -2
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js +2 -2
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js.map +1 -1
- package/features/contentEntry/RestoreEntryFromBin/events.d.ts +2 -2
- package/features/contentEntry/RestoreEntryFromBin/events.js +1 -1
- package/features/contentEntry/RestoreEntryFromBin/events.js.map +1 -1
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +2 -2
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UnpublishEntry/events.d.ts +2 -2
- package/features/contentEntry/UnpublishEntry/events.js +1 -1
- package/features/contentEntry/UnpublishEntry/events.js.map +1 -1
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.d.ts +3 -3
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +3 -3
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateEntry/events.d.ts +2 -2
- package/features/contentEntry/UpdateEntry/events.js +1 -1
- package/features/contentEntry/UpdateEntry/events.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.d.ts +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelUseCase.d.ts +3 -3
- package/features/contentModel/CreateModel/CreateModelUseCase.js +3 -3
- package/features/contentModel/CreateModel/CreateModelUseCase.js.map +1 -1
- package/features/contentModel/CreateModel/events.d.ts +2 -2
- package/features/contentModel/CreateModel/events.js +1 -1
- package/features/contentModel/CreateModel/events.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.d.ts +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.d.ts +3 -3
- package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js +4 -3
- package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js.map +1 -1
- package/features/contentModel/CreateModelFrom/events.d.ts +2 -2
- package/features/contentModel/CreateModelFrom/events.js +1 -1
- package/features/contentModel/CreateModelFrom/events.js.map +1 -1
- package/features/contentModel/DeleteModel/DeleteModelUseCase.d.ts +1 -1
- package/features/contentModel/DeleteModel/DeleteModelUseCase.js +1 -1
- package/features/contentModel/DeleteModel/DeleteModelUseCase.js.map +1 -1
- package/features/contentModel/DeleteModel/events.d.ts +2 -2
- package/features/contentModel/DeleteModel/events.js +1 -1
- package/features/contentModel/DeleteModel/events.js.map +1 -1
- package/features/contentModel/ModelToAstConverter/ModelToAstConverter.d.ts +3 -3
- package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js +6 -6
- package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js.map +1 -1
- package/features/contentModel/UpdateModel/UpdateModelUseCase.d.ts +2 -2
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js +2 -2
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js.map +1 -1
- package/features/contentModel/UpdateModel/events.d.ts +2 -2
- package/features/contentModel/UpdateModel/events.js +1 -1
- package/features/contentModel/UpdateModel/events.js.map +1 -1
- package/features/contentModel/shared/ModelsFetcher.d.ts +1 -1
- package/features/contentModel/shared/ModelsFetcher.js +1 -1
- package/features/contentModel/shared/ModelsFetcher.js.map +1 -1
- package/features/contentModelGroup/CreateGroup/CreateGroupRepository.d.ts +1 -1
- package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js +1 -1
- package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js.map +1 -1
- package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.d.ts +3 -3
- package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js +3 -3
- package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js.map +1 -1
- package/features/contentModelGroup/CreateGroup/events.d.ts +2 -2
- package/features/contentModelGroup/CreateGroup/events.js +1 -1
- package/features/contentModelGroup/CreateGroup/events.js.map +1 -1
- package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.d.ts +1 -1
- package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js +1 -1
- package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js.map +1 -1
- package/features/contentModelGroup/DeleteGroup/events.d.ts +2 -2
- package/features/contentModelGroup/DeleteGroup/events.js +1 -1
- package/features/contentModelGroup/DeleteGroup/events.js.map +1 -1
- package/features/contentModelGroup/GetGroup/GetGroupRepository.d.ts +2 -2
- package/features/contentModelGroup/GetGroup/GetGroupRepository.js +2 -2
- package/features/contentModelGroup/GetGroup/GetGroupRepository.js.map +1 -1
- package/features/contentModelGroup/ListGroups/ListGroupsRepository.d.ts +2 -2
- package/features/contentModelGroup/ListGroups/ListGroupsRepository.js +2 -2
- package/features/contentModelGroup/ListGroups/ListGroupsRepository.js.map +1 -1
- package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.d.ts +2 -2
- package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js +2 -2
- package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js.map +1 -1
- package/features/contentModelGroup/UpdateGroup/events.d.ts +2 -2
- package/features/contentModelGroup/UpdateGroup/events.js +1 -1
- package/features/contentModelGroup/UpdateGroup/events.js.map +1 -1
- package/features/contentModelGroup/shared/PluginGroupsProvider.d.ts +2 -2
- package/features/contentModelGroup/shared/PluginGroupsProvider.js +2 -2
- package/features/contentModelGroup/shared/PluginGroupsProvider.js.map +1 -1
- package/features/graphql/feature.d.ts +1 -0
- package/features/graphql/feature.js +34 -0
- package/features/graphql/feature.js.map +1 -0
- package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.d.ts +13 -0
- package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js +27 -0
- package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js.map +1 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.d.ts +97 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js +4 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js.map +1 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.d.ts +10 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js +4 -0
- package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js.map +1 -0
- package/features/graphql/fields/base/BooleanToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/BooleanToGraphQL.js +68 -0
- package/features/graphql/fields/base/BooleanToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/DateTimeToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/DateTimeToGraphQL.js +97 -0
- package/features/graphql/fields/base/DateTimeToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/DynamicZoneToGraphQL.d.ts +30 -0
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js +280 -0
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/FileToGraphQL.d.ts +22 -0
- package/features/graphql/fields/base/FileToGraphQL.js +39 -0
- package/features/graphql/fields/base/FileToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/JsonToGraphQL.d.ts +24 -0
- package/features/graphql/fields/base/JsonToGraphQL.js +52 -0
- package/features/graphql/fields/base/JsonToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/LongTextToGraphQL.d.ts +24 -0
- package/features/graphql/fields/base/LongTextToGraphQL.js +57 -0
- package/features/graphql/fields/base/LongTextToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/NumberToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/NumberToGraphQL.js +78 -0
- package/features/graphql/fields/base/NumberToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/ObjectToGraphQL.d.ts +31 -0
- package/features/graphql/fields/base/ObjectToGraphQL.js +264 -0
- package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/RefToGraphQL.d.ts +29 -0
- package/features/graphql/fields/base/RefToGraphQL.js +261 -0
- package/features/graphql/fields/base/RefToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/RichTextToGraphQL.d.ts +25 -0
- package/features/graphql/fields/base/RichTextToGraphQL.js +58 -0
- package/features/graphql/fields/base/RichTextToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/SearchableJsonToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/SearchableJsonToGraphQL.js +62 -0
- package/features/graphql/fields/base/SearchableJsonToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/TextToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/TextToGraphQL.js +74 -0
- package/features/graphql/fields/base/TextToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.d.ts +16 -0
- package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js +37 -0
- package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js.map +1 -0
- package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.d.ts +3 -0
- package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js +14 -0
- package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js.map +1 -0
- package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.d.ts +1 -1
- package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.js +2 -2
- package/features/graphql/fields/base/richText/richTextResolver.js.map +1 -0
- package/{graphqlFields/helpers.d.ts → features/graphql/fields/base/utils/createGraphQLInputField.d.ts} +1 -1
- package/features/graphql/fields/base/utils/createGraphQLInputField.js +17 -0
- package/features/graphql/fields/base/utils/createGraphQLInputField.js.map +1 -0
- package/features/graphql/index.d.ts +4 -0
- package/features/graphql/index.js +6 -0
- package/features/graphql/index.js.map +1 -0
- package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.d.ts +13 -0
- package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js +4 -0
- package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js.map +1 -0
- package/features/installer/CmsInstaller.d.ts +1 -1
- package/features/installer/CmsInstaller.js +1 -1
- package/features/installer/CmsInstaller.js.map +1 -1
- package/features/shared/abstractions.d.ts +9 -2
- package/features/shared/abstractions.js +1 -0
- package/features/shared/abstractions.js.map +1 -1
- package/features/storage/StorageTransformRegistry.d.ts +13 -0
- package/features/storage/StorageTransformRegistry.js +27 -0
- package/features/storage/StorageTransformRegistry.js.map +1 -0
- package/features/storage/abstractions/StorageTransform.d.ts +26 -0
- package/features/storage/abstractions/StorageTransform.js +4 -0
- package/features/storage/abstractions/StorageTransform.js.map +1 -0
- package/features/storage/abstractions/StorageTransformRegistry.d.ts +10 -0
- package/features/storage/abstractions/StorageTransformRegistry.js +4 -0
- package/features/storage/abstractions/StorageTransformRegistry.js.map +1 -0
- package/features/storage/feature.d.ts +1 -0
- package/features/storage/feature.js +24 -0
- package/features/storage/feature.js.map +1 -0
- package/features/storage/fields/DateStorageTransform.d.ts +10 -0
- package/features/storage/fields/DateStorageTransform.js +110 -0
- package/features/storage/fields/DateStorageTransform.js.map +1 -0
- package/features/storage/fields/DefaultStorageTransform.d.ts +10 -0
- package/features/storage/fields/DefaultStorageTransform.js +20 -0
- package/features/storage/fields/DefaultStorageTransform.js.map +1 -0
- package/features/storage/fields/DynamicZoneStorageTransform.d.ts +10 -0
- package/features/storage/fields/DynamicZoneStorageTransform.js +142 -0
- package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -0
- package/features/storage/fields/JsonStorageTransform.d.ts +13 -0
- package/features/storage/fields/JsonStorageTransform.js +31 -0
- package/features/storage/fields/JsonStorageTransform.js.map +1 -0
- package/features/storage/fields/LongTextStorageTransform.d.ts +18 -0
- package/features/storage/fields/LongTextStorageTransform.js +55 -0
- package/features/storage/fields/LongTextStorageTransform.js.map +1 -0
- package/features/storage/fields/ObjectStorageTransform.d.ts +10 -0
- package/features/storage/fields/ObjectStorageTransform.js +99 -0
- package/features/storage/fields/ObjectStorageTransform.js.map +1 -0
- package/features/storage/fields/RichTextStorageTransform.d.ts +13 -0
- package/features/storage/fields/RichTextStorageTransform.js +39 -0
- package/features/storage/fields/RichTextStorageTransform.js.map +1 -0
- package/features/storage/index.d.ts +3 -0
- package/features/storage/index.js +5 -0
- package/features/storage/index.js.map +1 -0
- package/features/validation/CmsModelFieldPatternValidatorRegistry.d.ts +12 -0
- package/features/validation/CmsModelFieldPatternValidatorRegistry.js +21 -0
- package/features/validation/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
- package/features/validation/CmsModelFieldValidatorRegistry.d.ts +12 -0
- package/features/validation/CmsModelFieldValidatorRegistry.js +23 -0
- package/features/validation/CmsModelFieldValidatorRegistry.js.map +1 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidator.d.ts +13 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidator.js +4 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidator.js.map +1 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.d.ts +9 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js +4 -0
- package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
- package/features/validation/abstractions/CmsModelFieldValidator.d.ts +11 -0
- package/features/validation/abstractions/CmsModelFieldValidator.js +4 -0
- package/features/validation/abstractions/CmsModelFieldValidator.js.map +1 -0
- package/features/validation/abstractions/CmsModelFieldValidatorRegistry.d.ts +9 -0
- package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js +4 -0
- package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js.map +1 -0
- package/features/validation/feature.d.ts +1 -0
- package/features/validation/feature.js +48 -0
- package/features/validation/feature.js.map +1 -0
- package/features/validation/index.d.ts +5 -0
- package/features/validation/index.js +7 -0
- package/features/validation/index.js.map +1 -0
- package/features/validation/validators/DateGteValidator.d.ts +10 -0
- package/features/validation/validators/DateGteValidator.js +26 -0
- package/features/validation/validators/DateGteValidator.js.map +1 -0
- package/features/validation/validators/DateLteValidator.d.ts +10 -0
- package/features/validation/validators/DateLteValidator.js +26 -0
- package/features/validation/validators/DateLteValidator.js.map +1 -0
- package/features/validation/validators/GteValidator.d.ts +10 -0
- package/features/validation/validators/GteValidator.js +21 -0
- package/features/validation/validators/GteValidator.js.map +1 -0
- package/features/validation/validators/InValidator.d.ts +10 -0
- package/features/validation/validators/InValidator.js +21 -0
- package/features/validation/validators/InValidator.js.map +1 -0
- package/features/validation/validators/LteValidator.d.ts +10 -0
- package/features/validation/validators/LteValidator.js +21 -0
- package/features/validation/validators/LteValidator.js.map +1 -0
- package/features/validation/validators/MaxLengthValidator.d.ts +10 -0
- package/features/validation/validators/MaxLengthValidator.js +21 -0
- package/features/validation/validators/MaxLengthValidator.js.map +1 -0
- package/features/validation/validators/MinLengthValidator.d.ts +10 -0
- package/features/validation/validators/MinLengthValidator.js +21 -0
- package/features/validation/validators/MinLengthValidator.js.map +1 -0
- package/features/validation/validators/PatternValidator.d.ts +13 -0
- package/features/validation/validators/PatternValidator.js +38 -0
- package/features/validation/validators/PatternValidator.js.map +1 -0
- package/features/validation/validators/RequiredValidator.d.ts +10 -0
- package/features/validation/validators/RequiredValidator.js +16 -0
- package/features/validation/validators/RequiredValidator.js.map +1 -0
- package/features/validation/validators/TimeGteValidator.d.ts +10 -0
- package/features/validation/validators/TimeGteValidator.js +21 -0
- package/features/validation/validators/TimeGteValidator.js.map +1 -0
- package/features/validation/validators/TimeLteValidator.d.ts +10 -0
- package/features/validation/validators/TimeLteValidator.js +21 -0
- package/features/validation/validators/TimeLteValidator.js.map +1 -0
- package/features/validation/validators/UniqueValidator.d.ts +10 -0
- package/features/validation/validators/UniqueValidator.js +47 -0
- package/features/validation/validators/UniqueValidator.js.map +1 -0
- package/features/validation/validators/patterns/EmailPattern.d.ts +12 -0
- package/features/validation/validators/patterns/EmailPattern.js +14 -0
- package/features/validation/validators/patterns/EmailPattern.js.map +1 -0
- package/features/validation/validators/patterns/LowerCasePattern.d.ts +12 -0
- package/features/validation/validators/patterns/LowerCasePattern.js +14 -0
- package/features/validation/validators/patterns/LowerCasePattern.js.map +1 -0
- package/features/validation/validators/patterns/LowerCaseSpacePattern.d.ts +12 -0
- package/features/validation/validators/patterns/LowerCaseSpacePattern.js +14 -0
- package/features/validation/validators/patterns/LowerCaseSpacePattern.js.map +1 -0
- package/features/validation/validators/patterns/UpperCasePattern.d.ts +12 -0
- package/features/validation/validators/patterns/UpperCasePattern.js +14 -0
- package/features/validation/validators/patterns/UpperCasePattern.js.map +1 -0
- package/features/validation/validators/patterns/UpperCaseSpacePattern.d.ts +12 -0
- package/features/validation/validators/patterns/UpperCaseSpacePattern.js +14 -0
- package/features/validation/validators/patterns/UpperCaseSpacePattern.js.map +1 -0
- package/features/validation/validators/patterns/UrlPattern.d.ts +12 -0
- package/features/validation/validators/patterns/UrlPattern.js +14 -0
- package/features/validation/validators/patterns/UrlPattern.js.map +1 -0
- package/graphql/getSchema/generateCacheKey.js +1 -1
- package/graphql/getSchema/generateCacheKey.js.map +1 -1
- package/graphql/schema/baseSchema.d.ts +2 -1
- package/graphql/schema/baseSchema.js +11 -9
- package/graphql/schema/baseSchema.js.map +1 -1
- package/graphql/schema/createFieldResolvers.d.ts +3 -2
- package/graphql/schema/createFieldResolvers.js +5 -4
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createManageResolvers.d.ts +3 -2
- package/graphql/schema/createManageResolvers.js +3 -3
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.d.ts +4 -4
- package/graphql/schema/createManageSDL.js +8 -8
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/createPreviewResolvers.d.ts +3 -2
- package/graphql/schema/createPreviewResolvers.js +4 -4
- package/graphql/schema/createPreviewResolvers.js.map +1 -1
- package/graphql/schema/createReadResolvers.d.ts +3 -2
- package/graphql/schema/createReadResolvers.js +4 -4
- package/graphql/schema/createReadResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.d.ts +4 -4
- package/graphql/schema/createReadSDL.js +7 -7
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/createSingularResolvers.d.ts +3 -2
- package/graphql/schema/createSingularResolvers.js +3 -3
- package/graphql/schema/createSingularResolvers.js.map +1 -1
- package/graphql/schema/createSingularSDL.d.ts +3 -2
- package/graphql/schema/createSingularSDL.js +3 -3
- package/graphql/schema/createSingularSDL.js.map +1 -1
- package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js +6 -7
- package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js.map +1 -1
- package/graphql/schema/schemaPlugins.js +14 -17
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/index.d.ts +1 -4
- package/index.js +2 -6
- package/index.js.map +1 -1
- package/package.json +25 -25
- package/plugins/index.d.ts +0 -2
- package/plugins/index.js +0 -2
- package/plugins/index.js.map +1 -1
- package/types/modelField.d.ts +1 -1
- package/types/modelField.js.map +1 -1
- package/types/plugins.d.ts +1 -305
- package/types/plugins.js.map +1 -1
- package/types/types.d.ts +4 -44
- package/types/types.js +0 -4
- package/types/types.js.map +1 -1
- package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.d.ts +3 -2
- package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js +3 -3
- package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js.map +1 -1
- package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.d.ts +4 -3
- package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js +3 -3
- package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js.map +1 -1
- package/utils/converters/ConverterCollection.d.ts +2 -0
- package/utils/converters/ConverterCollection.js +3 -2
- package/utils/converters/ConverterCollection.js.map +1 -1
- package/utils/converters/valueKeyFromStorageConverter.d.ts +2 -0
- package/utils/converters/valueKeyFromStorageConverter.js +4 -2
- package/utils/converters/valueKeyFromStorageConverter.js.map +1 -1
- package/utils/converters/valueKeyStorageConverter.d.ts +2 -3
- package/utils/converters/valueKeyStorageConverter.js +7 -3
- package/utils/converters/valueKeyStorageConverter.js.map +1 -1
- package/utils/converters/valueKeyToStorageConverter.d.ts +2 -0
- package/utils/converters/valueKeyToStorageConverter.js +4 -2
- package/utils/converters/valueKeyToStorageConverter.js.map +1 -1
- package/utils/createTypeFromFields.d.ts +3 -2
- package/utils/createTypeFromFields.js +3 -3
- package/utils/createTypeFromFields.js.map +1 -1
- package/utils/entryStorage.d.ts +8 -15
- package/utils/entryStorage.js +31 -59
- package/utils/entryStorage.js.map +1 -1
- package/utils/getBaseFieldType.js +3 -0
- package/utils/getBaseFieldType.js.map +1 -1
- package/utils/getSchemaFromFieldPlugins.d.ts +3 -2
- package/utils/getSchemaFromFieldPlugins.js +5 -9
- package/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/utils/renderFields.d.ts +4 -3
- package/utils/renderFields.js +14 -9
- package/utils/renderFields.js.map +1 -1
- package/utils/renderGetFilterFields.d.ts +3 -2
- package/utils/renderGetFilterFields.js +2 -2
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderInputFields.d.ts +4 -3
- package/utils/renderInputFields.js +5 -11
- package/utils/renderInputFields.js.map +1 -1
- package/utils/renderListFilterFields.d.ts +3 -2
- package/utils/renderListFilterFields.js +5 -3
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +4 -4
- package/utils/renderSortEnum.js +11 -11
- package/utils/renderSortEnum.js.map +1 -1
- package/graphql/schema/createFieldTypePluginRecords.d.ts +0 -3
- package/graphql/schema/createFieldTypePluginRecords.js +0 -8
- package/graphql/schema/createFieldTypePluginRecords.js.map +0 -1
- package/graphqlFields/boolean.d.ts +0 -2
- package/graphqlFields/boolean.js +0 -52
- package/graphqlFields/boolean.js.map +0 -1
- package/graphqlFields/datetime.d.ts +0 -2
- package/graphqlFields/datetime.js +0 -71
- package/graphqlFields/datetime.js.map +0 -1
- package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +0 -2
- package/graphqlFields/dynamicZone/dynamicZoneField.js +0 -313
- package/graphqlFields/dynamicZone/dynamicZoneField.js.map +0 -1
- package/graphqlFields/dynamicZone/index.d.ts +0 -1
- package/graphqlFields/dynamicZone/index.js +0 -3
- package/graphqlFields/dynamicZone/index.js.map +0 -1
- package/graphqlFields/file.d.ts +0 -2
- package/graphqlFields/file.js +0 -37
- package/graphqlFields/file.js.map +0 -1
- package/graphqlFields/helpers.js +0 -20
- package/graphqlFields/helpers.js.map +0 -1
- package/graphqlFields/index.d.ts +0 -2
- package/graphqlFields/index.js +0 -15
- package/graphqlFields/index.js.map +0 -1
- package/graphqlFields/json.d.ts +0 -2
- package/graphqlFields/json.js +0 -42
- package/graphqlFields/json.js.map +0 -1
- package/graphqlFields/longText.d.ts +0 -2
- package/graphqlFields/longText.js +0 -57
- package/graphqlFields/longText.js.map +0 -1
- package/graphqlFields/number.d.ts +0 -2
- package/graphqlFields/number.js +0 -63
- package/graphqlFields/number.js.map +0 -1
- package/graphqlFields/object.d.ts +0 -2
- package/graphqlFields/object.js +0 -245
- package/graphqlFields/object.js.map +0 -1
- package/graphqlFields/ref.d.ts +0 -2
- package/graphqlFields/ref.js +0 -286
- package/graphqlFields/ref.js.map +0 -1
- package/graphqlFields/richText/richTextResolver.js.map +0 -1
- package/graphqlFields/richText.d.ts +0 -2
- package/graphqlFields/richText.js +0 -48
- package/graphqlFields/richText.js.map +0 -1
- package/graphqlFields/searchableJson.d.ts +0 -2
- package/graphqlFields/searchableJson.js +0 -53
- package/graphqlFields/searchableJson.js.map +0 -1
- package/graphqlFields/text.d.ts +0 -2
- package/graphqlFields/text.js +0 -59
- package/graphqlFields/text.js.map +0 -1
- package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +0 -20
- package/plugins/CmsGraphQLSchemaSorterPlugin.js +0 -19
- package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +0 -1
- package/plugins/StorageTransformPlugin.d.ts +0 -35
- package/plugins/StorageTransformPlugin.js +0 -26
- package/plugins/StorageTransformPlugin.js.map +0 -1
- package/storage/date.d.ts +0 -3
- package/storage/date.js +0 -110
- package/storage/date.js.map +0 -1
- package/storage/default.d.ts +0 -2
- package/storage/default.js +0 -19
- package/storage/default.js.map +0 -1
- package/storage/dynamicZone.d.ts +0 -2
- package/storage/dynamicZone.js +0 -149
- package/storage/dynamicZone.js.map +0 -1
- package/storage/index.d.ts +0 -1
- package/storage/index.js +0 -13
- package/storage/index.js.map +0 -1
- package/storage/json.d.ts +0 -2
- package/storage/json.js +0 -49
- package/storage/json.js.map +0 -1
- package/storage/object.d.ts +0 -2
- package/storage/object.js +0 -104
- package/storage/object.js.map +0 -1
- package/validators/dateGte.d.ts +0 -2
- package/validators/dateGte.js +0 -25
- package/validators/dateGte.js.map +0 -1
- package/validators/dateLte.d.ts +0 -2
- package/validators/dateLte.js +0 -25
- package/validators/dateLte.js.map +0 -1
- package/validators/gte.d.ts +0 -2
- package/validators/gte.js +0 -22
- package/validators/gte.js.map +0 -1
- package/validators/in.d.ts +0 -2
- package/validators/in.js +0 -22
- package/validators/in.js.map +0 -1
- package/validators/index.d.ts +0 -1
- package/validators/index.js +0 -16
- package/validators/index.js.map +0 -1
- package/validators/lte.d.ts +0 -2
- package/validators/lte.js +0 -22
- package/validators/lte.js.map +0 -1
- package/validators/maxLength.d.ts +0 -2
- package/validators/maxLength.js +0 -22
- package/validators/maxLength.js.map +0 -1
- package/validators/minLength.d.ts +0 -2
- package/validators/minLength.js +0 -22
- package/validators/minLength.js.map +0 -1
- package/validators/pattern.d.ts +0 -2
- package/validators/pattern.js +0 -36
- package/validators/pattern.js.map +0 -1
- package/validators/patternPlugins/email.d.ts +0 -2
- package/validators/patternPlugins/email.js +0 -13
- package/validators/patternPlugins/email.js.map +0 -1
- package/validators/patternPlugins/index.d.ts +0 -2
- package/validators/patternPlugins/index.js +0 -11
- package/validators/patternPlugins/index.js.map +0 -1
- package/validators/patternPlugins/lowerCase.d.ts +0 -2
- package/validators/patternPlugins/lowerCase.js +0 -13
- package/validators/patternPlugins/lowerCase.js.map +0 -1
- package/validators/patternPlugins/lowerCaseSpace.d.ts +0 -2
- package/validators/patternPlugins/lowerCaseSpace.js +0 -13
- package/validators/patternPlugins/lowerCaseSpace.js.map +0 -1
- package/validators/patternPlugins/upperCase.d.ts +0 -2
- package/validators/patternPlugins/upperCase.js +0 -13
- package/validators/patternPlugins/upperCase.js.map +0 -1
- package/validators/patternPlugins/upperCaseSpace.d.ts +0 -2
- package/validators/patternPlugins/upperCaseSpace.js +0 -13
- package/validators/patternPlugins/upperCaseSpace.js.map +0 -1
- package/validators/patternPlugins/url.d.ts +0 -2
- package/validators/patternPlugins/url.js +0 -13
- package/validators/patternPlugins/url.js.map +0 -1
- package/validators/required.d.ts +0 -2
- package/validators/required.js +0 -17
- package/validators/required.js.map +0 -1
- package/validators/timeGte.d.ts +0 -2
- package/validators/timeGte.js +0 -20
- package/validators/timeGte.js.map +0 -1
- package/validators/timeLte.d.ts +0 -2
- package/validators/timeLte.js +0 -20
- package/validators/timeLte.js.map +0 -1
- package/validators/unique.d.ts +0 -6
- package/validators/unique.js +0 -57
- package/validators/unique.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getDate","getIdentity","mapAndCleanUpdatedInputData","validateModelEntryDataOrThrow","referenceFieldsMapping","createIdentifier","parseIdentifier","WebinyError","STATUS_DRAFT","STATUS_PUBLISHED","STATUS_UNPUBLISHED","getSystem","createEntryRevisionFromData","sourceId","model","rawInput","options","context","getSecurityIdentity","originalEntry","latestStorageEntry","accessControl","initialValues","values","entry","skipValidators","validateEntries","latestId","id","version","nextVersion","increaseEntryIdVersion","currentIdentity","currentDateTime","Date","status","ensureCanAccessEntry","pw","locked","revisionLevelPublishingMetaFields","revisionFirstPublishedOn","revisionLastPublishedOn","revisionFirstPublishedBy","revisionLastPublishedBy","entryLevelPublishingMetaFields","firstPublishedOn","lastPublishedOn","firstPublishedBy","lastPublishedBy","createdOn","savedOn","modifiedOn","createdBy","savedBy","modifiedBy","revisionCreatedOn","revisionSavedOn","revisionModifiedOn","revisionCreatedBy","revisionSavedBy","revisionModifiedBy","system","input","original","live","structuredClone","entryId"],"sources":["createEntryRevisionFromData.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { getDate } from \"~/utils/date.js\";\nimport { getIdentity } from \"~/utils/identity.js\";\nimport { mapAndCleanUpdatedInputData } from \".//mapAndCleanUpdatedInputData.js\";\nimport { validateModelEntryDataOrThrow } from \"../entryDataValidation.js\";\nimport { referenceFieldsMapping } from \"../referenceFieldsMapping.js\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport WebinyError from \"@webiny/error\";\nimport type { SecurityIdentity } from \"@webiny/api-core/types/security.js\";\nimport type { Tenant } from \"@webiny/api-core/types/tenancy.js\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"./statuses.js\";\nimport type { AccessControl } from \"~/crud/AccessControl/AccessControl.js\";\nimport { getSystem } from \"./system.js\";\n\ninterface CreateEntryRevisionFromDataParams<TValues extends CmsEntryValues = CmsEntryValues> {\n sourceId: string;\n model: CmsModel;\n rawInput: CreateCmsEntryInput<TValues>;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n originalEntry: CmsEntry<TValues>;\n latestStorageEntry: CmsEntry<TValues>;\n accessControl: AccessControl;\n}\n\ninterface ICreateEntryRevisionFromDataResponse<TValues extends CmsEntryValues = CmsEntryValues> {\n entry: CmsEntry<TValues>;\n input: CreateCmsEntryInput<TValues>;\n}\n\nexport const createEntryRevisionFromData = async <TValues extends CmsEntryValues = CmsEntryValues>({\n sourceId,\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n originalEntry,\n latestStorageEntry,\n accessControl\n}: CreateEntryRevisionFromDataParams<TValues>): Promise<\n ICreateEntryRevisionFromDataResponse<TValues>\n> => {\n /**\n * Make sure we only work with fields that are defined in the model.\n *\n * Also, we can be certain to cast as TValues because originalValues and new ones are being merged.\n */\n const initialValues = {\n ...originalEntry.values,\n ...mapAndCleanUpdatedInputData<TValues>(model, rawInput.values)\n };\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n values: initialValues,\n entry: originalEntry,\n skipValidators: options?.skipValidators\n });\n\n const values = await referenceFieldsMapping<TValues>({\n context,\n model,\n values: initialValues,\n validateEntries: false\n });\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n /**\n * Users can set the initial status of the entry. If so, we need to make\n * sure they have the required permissions and also that all the fields\n * are filled in correctly.\n */\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n await accessControl.ensureCanAccessEntry({ model, pw: \"p\" });\n } else if (status === STATUS_UNPUBLISHED) {\n // If setting the status other than draft, we have to check if the user has permissions to publish.\n await accessControl.ensureCanAccessEntry({ model, pw: \"u\" });\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, null),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, null),\n revisionFirstPublishedBy: getIdentity(rawInput.revisionFirstPublishedBy, null),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, null)\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy)\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, currentDateTime),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, currentIdentity)\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(\n rawInput.firstPublishedOn,\n latestStorageEntry.firstPublishedOn\n ),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\n\n const entry: CmsEntry<TValues> = {\n ...originalEntry,\n id,\n version: nextVersion,\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, latestStorageEntry.createdOn),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, currentDateTime),\n createdBy: getIdentity(rawInput.createdBy, latestStorageEntry.createdBy)!,\n savedBy: getIdentity(rawInput.savedBy, currentIdentity)!,\n modifiedBy: getIdentity(rawInput.modifiedBy, currentIdentity),\n ...entryLevelPublishingMetaFields,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity)!,\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity)!,\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n ...revisionLevelPublishingMetaFields,\n\n locked,\n status,\n values,\n system: getSystem({\n input: rawInput,\n original: originalEntry\n }),\n live: originalEntry.live\n };\n\n return {\n entry,\n input: {\n ...rawInput,\n values: structuredClone(values)\n }\n };\n};\n\nconst increaseEntryIdVersion = (id: string) => {\n const { id: entryId, version } = parseIdentifier(id);\n if (!version) {\n throw new WebinyError(\n \"Cannot increase version on the ID without the version part.\",\n \"WRONG_ID\",\n {\n id\n }\n );\n }\n return {\n entryId,\n version: version + 1,\n id: createIdentifier({\n id: entryId,\n version: version + 1\n })\n };\n};\n"],"mappings":"AAQA,SAASA,OAAO;AAChB,SAASC,WAAW;AACpB,SAASC,2BAA2B;AACpC,SAASC,6BAA6B;AACtC,SAASC,sBAAsB;AAC/B,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,eAAe;AACjE,OAAOC,WAAW,MAAM,eAAe;AAGvC,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,kBAAkB;AAE3D,SAASC,SAAS;AAoBlB,OAAO,MAAMC,2BAA2B,GAAG,MAAAA,CAAwD;EAC/FC,QAAQ;EACRC,KAAK;EACLC,QAAQ;EACRC,OAAO;EACPC,OAAO;EACPhB,WAAW,EAAEiB,mBAAmB;EAChCC,aAAa;EACbC,kBAAkB;EAClBC;AACwC,CAAC,KAExC;EACD;AACJ;AACA;AACA;AACA;EACI,MAAMC,aAAa,GAAG;IAClB,GAAGH,aAAa,CAACI,MAAM;IACvB,GAAGrB,2BAA2B,CAAUY,KAAK,EAAEC,QAAQ,CAACQ,MAAM;EAClE,CAAC;EAED,MAAMpB,6BAA6B,CAAC;IAChCc,OAAO;IACPH,KAAK;IACLS,MAAM,EAAED,aAAa;IACrBE,KAAK,EAAEL,aAAa;IACpBM,cAAc,EAAET,OAAO,EAAES;EAC7B,CAAC,CAAC;EAEF,MAAMF,MAAM,GAAG,MAAMnB,sBAAsB,CAAU;IACjDa,OAAO;IACPH,KAAK;IACLS,MAAM,EAAED,aAAa;IACrBI,eAAe,EAAE;EACrB,CAAC,CAAC;EAEF,MAAMC,QAAQ,GAAGP,kBAAkB,GAAGA,kBAAkB,CAACQ,EAAE,GAAGf,QAAQ;EACtE,MAAM;IAAEe,EAAE;IAAEC,OAAO,EAAEC;EAAY,CAAC,GAAGC,sBAAsB,CAACJ,QAAQ,CAAC;EAErE,MAAMK,eAAe,GAAGd,mBAAmB,CAAC,CAAC;EAC7C,MAAMe,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC;;EAElC;AACJ;AACA;AACA;AACA;EACI,MAAMC,MAAM,GAAGpB,QAAQ,CAACoB,MAAM,IAAI3B,YAAY;EAC9C,IAAI2B,MAAM,KAAK3B,YAAY,EAAE;IACzB,IAAI2B,MAAM,KAAK1B,gBAAgB,EAAE;MAC7B,MAAMY,aAAa,CAACe,oBAAoB,CAAC;QAAEtB,KAAK;QAAEuB,EAAE,EAAE;MAAI,CAAC,CAAC;IAChE,CAAC,MAAM,IAAIF,MAAM,KAAKzB,kBAAkB,EAAE;MACtC;MACA,MAAMW,aAAa,CAACe,oBAAoB,CAAC;QAAEtB,KAAK;QAAEuB,EAAE,EAAE;MAAI,CAAC,CAAC;IAChE;EACJ;EAEA,MAAMC,MAAM,GAAGH,MAAM,KAAK3B,YAAY;EAEtC,IAAI+B,iCAMH,GAAG;IACAC,wBAAwB,EAAExC,OAAO,CAACe,QAAQ,CAACyB,wBAAwB,EAAE,IAAI,CAAC;IAC1EC,uBAAuB,EAAEzC,OAAO,CAACe,QAAQ,CAAC0B,uBAAuB,EAAE,IAAI,CAAC;IACxEC,wBAAwB,EAAEzC,WAAW,CAACc,QAAQ,CAAC2B,wBAAwB,EAAE,IAAI,CAAC;IAC9EC,uBAAuB,EAAE1C,WAAW,CAACc,QAAQ,CAAC4B,uBAAuB,EAAE,IAAI;EAC/E,CAAC;EAED,IAAIC,8BAGH,GAAG;IACAC,gBAAgB,EAAE7C,OAAO,CAACe,QAAQ,CAAC8B,gBAAgB,EAAEzB,kBAAkB,CAACyB,gBAAgB,CAAC;IACzFC,eAAe,EAAE9C,OAAO,CAACe,QAAQ,CAAC+B,eAAe,EAAE1B,kBAAkB,CAAC0B,eAAe,CAAC;IACtFC,gBAAgB,EAAE9C,WAAW,CACzBc,QAAQ,CAACgC,gBAAgB,EACzB3B,kBAAkB,CAAC2B,gBACvB,CAAC;IACDC,eAAe,EAAE/C,WAAW,CAACc,QAAQ,CAACiC,eAAe,EAAE5B,kBAAkB,CAAC4B,eAAe;EAC7F,CAAC;EAED,IAAIb,MAAM,KAAK1B,gBAAgB,EAAE;IAC7B8B,iCAAiC,GAAG;MAChCC,wBAAwB,EAAExC,OAAO,CAACe,QAAQ,CAACyB,wBAAwB,EAAEP,eAAe,CAAC;MACrFQ,uBAAuB,EAAEzC,OAAO,CAACe,QAAQ,CAAC0B,uBAAuB,EAAER,eAAe,CAAC;MACnFS,wBAAwB,EAAEzC,WAAW,CACjCc,QAAQ,CAAC2B,wBAAwB,EACjCV,eACJ,CAAC;MACDW,uBAAuB,EAAE1C,WAAW,CAACc,QAAQ,CAAC4B,uBAAuB,EAAEX,eAAe;IAC1F,CAAC;IAEDY,8BAA8B,GAAG;MAC7BC,gBAAgB,EAAE7C,OAAO,CACrBe,QAAQ,CAAC8B,gBAAgB,EACzBzB,kBAAkB,CAACyB,gBACvB,CAAC;MACDC,eAAe,EAAE9C,OAAO,CAACe,QAAQ,CAAC+B,eAAe,EAAEb,eAAe,CAAC;MACnEc,gBAAgB,EAAE9C,WAAW,CACzBc,QAAQ,CAACgC,gBAAgB,EACzB3B,kBAAkB,CAAC2B,gBACvB,CAAC;MACDC,eAAe,EAAE/C,WAAW,CAACc,QAAQ,CAACiC,eAAe,EAAEhB,eAAe;IAC1E,CAAC;EACL;EAEA,MAAMR,KAAwB,GAAG;IAC7B,GAAGL,aAAa;IAChBS,EAAE;IACFC,OAAO,EAAEC,WAAW;IAEpB;AACR;AACA;IACQmB,SAAS,EAAEjD,OAAO,CAACe,QAAQ,CAACkC,SAAS,EAAE7B,kBAAkB,CAAC6B,SAAS,CAAC;IACpEC,OAAO,EAAElD,OAAO,CAACe,QAAQ,CAACmC,OAAO,EAAEjB,eAAe,CAAC;IACnDkB,UAAU,EAAEnD,OAAO,CAACe,QAAQ,CAACoC,UAAU,EAAElB,eAAe,CAAC;IACzDmB,SAAS,EAAEnD,WAAW,CAACc,QAAQ,CAACqC,SAAS,EAAEhC,kBAAkB,CAACgC,SAAS,CAAE;IACzEC,OAAO,EAAEpD,WAAW,CAACc,QAAQ,CAACsC,OAAO,EAAErB,eAAe,CAAE;IACxDsB,UAAU,EAAErD,WAAW,CAACc,QAAQ,CAACuC,UAAU,EAAEtB,eAAe,CAAC;IAC7D,GAAGY,8BAA8B;IAEjC;AACR;AACA;IACQW,iBAAiB,EAAEvD,OAAO,CAACe,QAAQ,CAACwC,iBAAiB,EAAEtB,eAAe,CAAC;IACvEuB,eAAe,EAAExD,OAAO,CAACe,QAAQ,CAACyC,eAAe,EAAEvB,eAAe,CAAC;IACnEwB,kBAAkB,EAAEzD,OAAO,CAACe,QAAQ,CAAC0C,kBAAkB,EAAE,IAAI,CAAC;IAC9DC,iBAAiB,EAAEzD,WAAW,CAACc,QAAQ,CAAC2C,iBAAiB,EAAE1B,eAAe,CAAE;IAC5E2B,eAAe,EAAE1D,WAAW,CAACc,QAAQ,CAAC4C,eAAe,EAAE3B,eAAe,CAAE;IACxE4B,kBAAkB,EAAE3D,WAAW,CAACc,QAAQ,CAAC6C,kBAAkB,EAAE,IAAI,CAAC;IAClE,GAAGrB,iCAAiC;IAEpCD,MAAM;IACNH,MAAM;IACNZ,MAAM;IACNsC,MAAM,EAAElD,SAAS,CAAC;MACdmD,KAAK,EAAE/C,QAAQ;MACfgD,QAAQ,EAAE5C;IACd,CAAC,CAAC;IACF6C,IAAI,EAAE7C,aAAa,CAAC6C;EACxB,CAAC;EAED,OAAO;IACHxC,KAAK;IACLsC,KAAK,EAAE;MACH,GAAG/C,QAAQ;MACXQ,MAAM,EAAE0C,eAAe,CAAC1C,MAAM;IAClC;EACJ,CAAC;AACL,CAAC;AAED,MAAMQ,sBAAsB,GAAIH,EAAU,IAAK;EAC3C,MAAM;IAAEA,EAAE,EAAEsC,OAAO;IAAErC;EAAQ,CAAC,GAAGvB,eAAe,CAACsB,EAAE,CAAC;EACpD,IAAI,CAACC,OAAO,EAAE;IACV,MAAM,IAAItB,WAAW,CACjB,6DAA6D,EAC7D,UAAU,EACV;MACIqB;IACJ,CACJ,CAAC;EACL;EACA,OAAO;IACHsC,OAAO;IACPrC,OAAO,EAAEA,OAAO,GAAG,CAAC;IACpBD,EAAE,EAAEvB,gBAAgB,CAAC;MACjBuB,EAAE,EAAEsC,OAAO;MACXrC,OAAO,EAAEA,OAAO,GAAG;IACvB,CAAC;EACL,CAAC;AACL,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getDate","getIdentity","mapAndCleanUpdatedInputData","validateModelEntryDataOrThrow","referenceFieldsMapping","createIdentifier","parseIdentifier","WebinyError","STATUS_DRAFT","STATUS_PUBLISHED","STATUS_UNPUBLISHED","NotAuthorizedError","getSystem","createEntryRevisionFromData","sourceId","model","rawInput","options","context","getSecurityIdentity","originalEntry","latestStorageEntry","accessControl","initialValues","values","entry","skipValidators","validateEntries","latestId","id","version","nextVersion","increaseEntryIdVersion","currentIdentity","currentDateTime","Date","status","canPublish","canAccessEntry","pw","modelId","canUnpublish","locked","revisionLevelPublishingMetaFields","revisionFirstPublishedOn","revisionLastPublishedOn","revisionFirstPublishedBy","revisionLastPublishedBy","entryLevelPublishingMetaFields","firstPublishedOn","lastPublishedOn","firstPublishedBy","lastPublishedBy","createdOn","savedOn","modifiedOn","createdBy","savedBy","modifiedBy","revisionCreatedOn","revisionSavedOn","revisionModifiedOn","revisionCreatedBy","revisionSavedBy","revisionModifiedBy","system","input","original","live","structuredClone","entryId"],"sources":["createEntryRevisionFromData.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { getDate } from \"~/utils/date.js\";\nimport { getIdentity } from \"~/utils/identity.js\";\nimport { mapAndCleanUpdatedInputData } from \".//mapAndCleanUpdatedInputData.js\";\nimport { validateModelEntryDataOrThrow } from \"../entryDataValidation.js\";\nimport { referenceFieldsMapping } from \"../referenceFieldsMapping.js\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport WebinyError from \"@webiny/error\";\nimport type { SecurityIdentity } from \"@webiny/api-core/types/security.js\";\nimport type { Tenant } from \"@webiny/api-core/types/tenancy.js\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"./statuses.js\";\nimport type { AccessControl } from \"~/crud/AccessControl/AccessControl.js\";\nimport { NotAuthorizedError } from \"~/utils/errors.js\";\nimport { getSystem } from \"./system.js\";\n\ninterface CreateEntryRevisionFromDataParams<TValues extends CmsEntryValues = CmsEntryValues> {\n sourceId: string;\n model: CmsModel;\n rawInput: CreateCmsEntryInput<TValues>;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n originalEntry: CmsEntry<TValues>;\n latestStorageEntry: CmsEntry<TValues>;\n accessControl: AccessControl;\n}\n\ninterface ICreateEntryRevisionFromDataResponse<TValues extends CmsEntryValues = CmsEntryValues> {\n entry: CmsEntry<TValues>;\n input: CreateCmsEntryInput<TValues>;\n}\n\nexport const createEntryRevisionFromData = async <TValues extends CmsEntryValues = CmsEntryValues>({\n sourceId,\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n originalEntry,\n latestStorageEntry,\n accessControl\n}: CreateEntryRevisionFromDataParams<TValues>): Promise<\n ICreateEntryRevisionFromDataResponse<TValues>\n> => {\n /**\n * Make sure we only work with fields that are defined in the model.\n *\n * Also, we can be certain to cast as TValues because originalValues and new ones are being merged.\n */\n const initialValues = {\n ...originalEntry.values,\n ...mapAndCleanUpdatedInputData<TValues>(model, rawInput.values)\n };\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n values: initialValues,\n entry: originalEntry,\n skipValidators: options?.skipValidators\n });\n\n const values = await referenceFieldsMapping<TValues>({\n context,\n model,\n values: initialValues,\n validateEntries: false\n });\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n /**\n * Users can set the initial status of the entry. If so, we need to make\n * sure they have the required permissions and also that all the fields\n * are filled in correctly.\n */\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n const canPublish = await accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canPublish) {\n throw new NotAuthorizedError(`Not allowed to access \"${model.modelId}\" entries.`);\n }\n } else if (status === STATUS_UNPUBLISHED) {\n const canUnpublish = await accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canUnpublish) {\n throw new NotAuthorizedError(`Not allowed to access \"${model.modelId}\" entries.`);\n }\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, null),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, null),\n revisionFirstPublishedBy: getIdentity(rawInput.revisionFirstPublishedBy, null),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, null)\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy)\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, currentDateTime),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, currentIdentity)\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(\n rawInput.firstPublishedOn,\n latestStorageEntry.firstPublishedOn\n ),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\n\n const entry: CmsEntry<TValues> = {\n ...originalEntry,\n id,\n version: nextVersion,\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, latestStorageEntry.createdOn),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, currentDateTime),\n createdBy: getIdentity(rawInput.createdBy, latestStorageEntry.createdBy)!,\n savedBy: getIdentity(rawInput.savedBy, currentIdentity)!,\n modifiedBy: getIdentity(rawInput.modifiedBy, currentIdentity),\n ...entryLevelPublishingMetaFields,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity)!,\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity)!,\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n ...revisionLevelPublishingMetaFields,\n\n locked,\n status,\n values,\n system: getSystem({\n input: rawInput,\n original: originalEntry\n }),\n live: originalEntry.live\n };\n\n return {\n entry,\n input: {\n ...rawInput,\n values: structuredClone(values)\n }\n };\n};\n\nconst increaseEntryIdVersion = (id: string) => {\n const { id: entryId, version } = parseIdentifier(id);\n if (!version) {\n throw new WebinyError(\n \"Cannot increase version on the ID without the version part.\",\n \"WRONG_ID\",\n {\n id\n }\n );\n }\n return {\n entryId,\n version: version + 1,\n id: createIdentifier({\n id: entryId,\n version: version + 1\n })\n };\n};\n"],"mappings":"AAQA,SAASA,OAAO;AAChB,SAASC,WAAW;AACpB,SAASC,2BAA2B;AACpC,SAASC,6BAA6B;AACtC,SAASC,sBAAsB;AAC/B,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,eAAe;AACjE,OAAOC,WAAW,MAAM,eAAe;AAGvC,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,kBAAkB;AAE3D,SAASC,kBAAkB;AAC3B,SAASC,SAAS;AAoBlB,OAAO,MAAMC,2BAA2B,GAAG,MAAAA,CAAwD;EAC/FC,QAAQ;EACRC,KAAK;EACLC,QAAQ;EACRC,OAAO;EACPC,OAAO;EACPjB,WAAW,EAAEkB,mBAAmB;EAChCC,aAAa;EACbC,kBAAkB;EAClBC;AACwC,CAAC,KAExC;EACD;AACJ;AACA;AACA;AACA;EACI,MAAMC,aAAa,GAAG;IAClB,GAAGH,aAAa,CAACI,MAAM;IACvB,GAAGtB,2BAA2B,CAAUa,KAAK,EAAEC,QAAQ,CAACQ,MAAM;EAClE,CAAC;EAED,MAAMrB,6BAA6B,CAAC;IAChCe,OAAO;IACPH,KAAK;IACLS,MAAM,EAAED,aAAa;IACrBE,KAAK,EAAEL,aAAa;IACpBM,cAAc,EAAET,OAAO,EAAES;EAC7B,CAAC,CAAC;EAEF,MAAMF,MAAM,GAAG,MAAMpB,sBAAsB,CAAU;IACjDc,OAAO;IACPH,KAAK;IACLS,MAAM,EAAED,aAAa;IACrBI,eAAe,EAAE;EACrB,CAAC,CAAC;EAEF,MAAMC,QAAQ,GAAGP,kBAAkB,GAAGA,kBAAkB,CAACQ,EAAE,GAAGf,QAAQ;EACtE,MAAM;IAAEe,EAAE;IAAEC,OAAO,EAAEC;EAAY,CAAC,GAAGC,sBAAsB,CAACJ,QAAQ,CAAC;EAErE,MAAMK,eAAe,GAAGd,mBAAmB,CAAC,CAAC;EAC7C,MAAMe,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC;;EAElC;AACJ;AACA;AACA;AACA;EACI,MAAMC,MAAM,GAAGpB,QAAQ,CAACoB,MAAM,IAAI5B,YAAY;EAC9C,IAAI4B,MAAM,KAAK5B,YAAY,EAAE;IACzB,IAAI4B,MAAM,KAAK3B,gBAAgB,EAAE;MAC7B,MAAM4B,UAAU,GAAG,MAAMf,aAAa,CAACgB,cAAc,CAAC;QAAEvB,KAAK;QAAEwB,EAAE,EAAE;MAAI,CAAC,CAAC;MACzE,IAAI,CAACF,UAAU,EAAE;QACb,MAAM,IAAI1B,kBAAkB,CAAC,0BAA0BI,KAAK,CAACyB,OAAO,YAAY,CAAC;MACrF;IACJ,CAAC,MAAM,IAAIJ,MAAM,KAAK1B,kBAAkB,EAAE;MACtC,MAAM+B,YAAY,GAAG,MAAMnB,aAAa,CAACgB,cAAc,CAAC;QAAEvB,KAAK;QAAEwB,EAAE,EAAE;MAAI,CAAC,CAAC;MAC3E,IAAI,CAACE,YAAY,EAAE;QACf,MAAM,IAAI9B,kBAAkB,CAAC,0BAA0BI,KAAK,CAACyB,OAAO,YAAY,CAAC;MACrF;IACJ;EACJ;EAEA,MAAME,MAAM,GAAGN,MAAM,KAAK5B,YAAY;EAEtC,IAAImC,iCAMH,GAAG;IACAC,wBAAwB,EAAE5C,OAAO,CAACgB,QAAQ,CAAC4B,wBAAwB,EAAE,IAAI,CAAC;IAC1EC,uBAAuB,EAAE7C,OAAO,CAACgB,QAAQ,CAAC6B,uBAAuB,EAAE,IAAI,CAAC;IACxEC,wBAAwB,EAAE7C,WAAW,CAACe,QAAQ,CAAC8B,wBAAwB,EAAE,IAAI,CAAC;IAC9EC,uBAAuB,EAAE9C,WAAW,CAACe,QAAQ,CAAC+B,uBAAuB,EAAE,IAAI;EAC/E,CAAC;EAED,IAAIC,8BAGH,GAAG;IACAC,gBAAgB,EAAEjD,OAAO,CAACgB,QAAQ,CAACiC,gBAAgB,EAAE5B,kBAAkB,CAAC4B,gBAAgB,CAAC;IACzFC,eAAe,EAAElD,OAAO,CAACgB,QAAQ,CAACkC,eAAe,EAAE7B,kBAAkB,CAAC6B,eAAe,CAAC;IACtFC,gBAAgB,EAAElD,WAAW,CACzBe,QAAQ,CAACmC,gBAAgB,EACzB9B,kBAAkB,CAAC8B,gBACvB,CAAC;IACDC,eAAe,EAAEnD,WAAW,CAACe,QAAQ,CAACoC,eAAe,EAAE/B,kBAAkB,CAAC+B,eAAe;EAC7F,CAAC;EAED,IAAIhB,MAAM,KAAK3B,gBAAgB,EAAE;IAC7BkC,iCAAiC,GAAG;MAChCC,wBAAwB,EAAE5C,OAAO,CAACgB,QAAQ,CAAC4B,wBAAwB,EAAEV,eAAe,CAAC;MACrFW,uBAAuB,EAAE7C,OAAO,CAACgB,QAAQ,CAAC6B,uBAAuB,EAAEX,eAAe,CAAC;MACnFY,wBAAwB,EAAE7C,WAAW,CACjCe,QAAQ,CAAC8B,wBAAwB,EACjCb,eACJ,CAAC;MACDc,uBAAuB,EAAE9C,WAAW,CAACe,QAAQ,CAAC+B,uBAAuB,EAAEd,eAAe;IAC1F,CAAC;IAEDe,8BAA8B,GAAG;MAC7BC,gBAAgB,EAAEjD,OAAO,CACrBgB,QAAQ,CAACiC,gBAAgB,EACzB5B,kBAAkB,CAAC4B,gBACvB,CAAC;MACDC,eAAe,EAAElD,OAAO,CAACgB,QAAQ,CAACkC,eAAe,EAAEhB,eAAe,CAAC;MACnEiB,gBAAgB,EAAElD,WAAW,CACzBe,QAAQ,CAACmC,gBAAgB,EACzB9B,kBAAkB,CAAC8B,gBACvB,CAAC;MACDC,eAAe,EAAEnD,WAAW,CAACe,QAAQ,CAACoC,eAAe,EAAEnB,eAAe;IAC1E,CAAC;EACL;EAEA,MAAMR,KAAwB,GAAG;IAC7B,GAAGL,aAAa;IAChBS,EAAE;IACFC,OAAO,EAAEC,WAAW;IAEpB;AACR;AACA;IACQsB,SAAS,EAAErD,OAAO,CAACgB,QAAQ,CAACqC,SAAS,EAAEhC,kBAAkB,CAACgC,SAAS,CAAC;IACpEC,OAAO,EAAEtD,OAAO,CAACgB,QAAQ,CAACsC,OAAO,EAAEpB,eAAe,CAAC;IACnDqB,UAAU,EAAEvD,OAAO,CAACgB,QAAQ,CAACuC,UAAU,EAAErB,eAAe,CAAC;IACzDsB,SAAS,EAAEvD,WAAW,CAACe,QAAQ,CAACwC,SAAS,EAAEnC,kBAAkB,CAACmC,SAAS,CAAE;IACzEC,OAAO,EAAExD,WAAW,CAACe,QAAQ,CAACyC,OAAO,EAAExB,eAAe,CAAE;IACxDyB,UAAU,EAAEzD,WAAW,CAACe,QAAQ,CAAC0C,UAAU,EAAEzB,eAAe,CAAC;IAC7D,GAAGe,8BAA8B;IAEjC;AACR;AACA;IACQW,iBAAiB,EAAE3D,OAAO,CAACgB,QAAQ,CAAC2C,iBAAiB,EAAEzB,eAAe,CAAC;IACvE0B,eAAe,EAAE5D,OAAO,CAACgB,QAAQ,CAAC4C,eAAe,EAAE1B,eAAe,CAAC;IACnE2B,kBAAkB,EAAE7D,OAAO,CAACgB,QAAQ,CAAC6C,kBAAkB,EAAE,IAAI,CAAC;IAC9DC,iBAAiB,EAAE7D,WAAW,CAACe,QAAQ,CAAC8C,iBAAiB,EAAE7B,eAAe,CAAE;IAC5E8B,eAAe,EAAE9D,WAAW,CAACe,QAAQ,CAAC+C,eAAe,EAAE9B,eAAe,CAAE;IACxE+B,kBAAkB,EAAE/D,WAAW,CAACe,QAAQ,CAACgD,kBAAkB,EAAE,IAAI,CAAC;IAClE,GAAGrB,iCAAiC;IAEpCD,MAAM;IACNN,MAAM;IACNZ,MAAM;IACNyC,MAAM,EAAErD,SAAS,CAAC;MACdsD,KAAK,EAAElD,QAAQ;MACfmD,QAAQ,EAAE/C;IACd,CAAC,CAAC;IACFgD,IAAI,EAAEhD,aAAa,CAACgD;EACxB,CAAC;EAED,OAAO;IACH3C,KAAK;IACLyC,KAAK,EAAE;MACH,GAAGlD,QAAQ;MACXQ,MAAM,EAAE6C,eAAe,CAAC7C,MAAM;IAClC;EACJ,CAAC;AACL,CAAC;AAED,MAAMQ,sBAAsB,GAAIH,EAAU,IAAK;EAC3C,MAAM;IAAEA,EAAE,EAAEyC,OAAO;IAAExC;EAAQ,CAAC,GAAGxB,eAAe,CAACuB,EAAE,CAAC;EACpD,IAAI,CAACC,OAAO,EAAE;IACV,MAAM,IAAIvB,WAAW,CACjB,6DAA6D,EAC7D,UAAU,EACV;MACIsB;IACJ,CACJ,CAAC;EACL;EACA,OAAO;IACHyC,OAAO;IACPxC,OAAO,EAAEA,OAAO,GAAG,CAAC;IACpBD,EAAE,EAAExB,gBAAgB,CAAC;MACjBwB,EAAE,EAAEyC,OAAO;MACXxC,OAAO,EAAEA,OAAO,GAAG;IACvB,CAAC;EACL,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@ interface IValidateModelEntryDataParams<TValues extends CmsEntryValues = CmsEntr
|
|
|
6
6
|
entry?: CmsEntry<TValues>;
|
|
7
7
|
skipValidators?: string[];
|
|
8
8
|
}
|
|
9
|
-
export declare const validateModelEntryData: <TValues extends CmsEntryValues = CmsEntryValues>(params: IValidateModelEntryDataParams) => Promise<FieldError[]>;
|
|
9
|
+
export declare const validateModelEntryData: <TValues extends CmsEntryValues = CmsEntryValues>(params: IValidateModelEntryDataParams<TValues>) => Promise<FieldError[]>;
|
|
10
10
|
export declare const validateModelEntryDataOrThrow: <TValues extends CmsEntryValues = CmsEntryValues>(params: IValidateModelEntryDataParams<TValues>) => Promise<void>;
|
|
11
11
|
/**
|
|
12
12
|
*
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import camelCase from "lodash/camelCase.js";
|
|
2
2
|
import { EntryValidationError } from "../../domain/contentEntry/errors.js";
|
|
3
|
+
import { CmsModelFieldValidatorRegistry } from "../../features/validation/index.js";
|
|
3
4
|
const validateValue = async (params, fieldValidators, value) => {
|
|
4
5
|
if (!fieldValidators) {
|
|
5
6
|
return null;
|
|
@@ -127,30 +128,32 @@ export const validateModelEntryData = async params => {
|
|
|
127
128
|
values,
|
|
128
129
|
skipValidators
|
|
129
130
|
} = params;
|
|
130
|
-
const isValidatorSkipped =
|
|
131
|
+
const isValidatorSkipped = validator => {
|
|
131
132
|
if (!skipValidators) {
|
|
132
133
|
return false;
|
|
133
134
|
}
|
|
134
|
-
return skipValidators.includes(camelCase(
|
|
135
|
+
return skipValidators.includes(camelCase(validator.name));
|
|
135
136
|
};
|
|
136
137
|
const skippedValidators = new Set();
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* To later simplify searching for the validations we map them to a name.
|
|
140
|
-
* @see CmsModelFieldValidatorPlugin.validator.validate
|
|
141
|
-
*/
|
|
142
138
|
const validatorList = {};
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
139
|
+
const registry = context.container.resolve(CmsModelFieldValidatorRegistry);
|
|
140
|
+
const validators = registry.getAll();
|
|
141
|
+
for (const validator of validators) {
|
|
142
|
+
const name = validator.name;
|
|
146
143
|
if (!validatorList[name]) {
|
|
147
144
|
validatorList[name] = [];
|
|
148
145
|
}
|
|
149
|
-
const isSkipped = isValidatorSkipped(
|
|
146
|
+
const isSkipped = isValidatorSkipped(validator);
|
|
150
147
|
if (isSkipped) {
|
|
151
148
|
skippedValidators.add(name);
|
|
149
|
+
validatorList[name].push(async () => {
|
|
150
|
+
return true;
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
152
153
|
}
|
|
153
|
-
validatorList[name].push(
|
|
154
|
+
validatorList[name].push(params => {
|
|
155
|
+
return validator.validate(params);
|
|
156
|
+
});
|
|
154
157
|
}
|
|
155
158
|
/**
|
|
156
159
|
* No point in continuing if all validators are skipped.
|
|
@@ -163,7 +166,7 @@ export const validateModelEntryData = async params => {
|
|
|
163
166
|
validatorList,
|
|
164
167
|
context,
|
|
165
168
|
model,
|
|
166
|
-
entry
|
|
169
|
+
entry,
|
|
167
170
|
parents: [],
|
|
168
171
|
fields: model.fields,
|
|
169
172
|
values: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["camelCase","EntryValidationError","validateValue","params","fieldValidators","value","validatorList","context","field","model","entry","fieldValidator","name","validations","length","validate","result","validator","message","ex","validatePredefinedValue","enabled","values","predefinedValues","Array","isArray","undefined","predefinedValue","getFieldValidation","listValidation","filter","item","runFieldMultipleValuesValidations","initialValues","fieldId","valuesError","valueError","validation","predefinedValueError","runFieldValueValidations","error","execValidation","list","validateModelEntryData","skipValidators","isValidatorSkipped","plugin","includes","skippedValidators","Set","validators","plugins","byType","isSkipped","add","push","keys","Object","size","parents","fields","validateModelEntryDataOrThrow","invalidFields","executeFieldValidation","type","settings","id","storageId","objectValue","index","childField","errors","concat","templates","template","fieldData","templateValue","gqlTypeName","results","Promise","all","map"],"sources":["entryDataValidation.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsDynamicZoneTemplate,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField,\n CmsModelFieldValidation,\n CmsModelFieldValidatorPlugin,\n CmsModelFieldValidatorValidateParams\n} from \"~/types/index.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\n\ntype PluginValidationCallable = (params: CmsModelFieldValidatorValidateParams) => Promise<boolean>;\ntype PluginValidationList = Record<string, PluginValidationCallable[]>;\n\ninterface ExecuteValidationParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n field: CmsModelField;\n model: CmsModel;\n values: TValues;\n context: CmsContext;\n entry?: CmsEntry<TValues>;\n}\n\ntype PossibleValue = boolean | number | string | null | undefined;\n\nconst validateValue = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>,\n fieldValidators: CmsModelFieldValidation[],\n value: PossibleValue | PossibleValue[]\n): Promise<string | null> => {\n if (!fieldValidators) {\n return null;\n }\n const { validatorList, context, field, model, entry } = params;\n try {\n for (const fieldValidator of fieldValidators) {\n const name = fieldValidator.name;\n const validations = validatorList[name];\n if (!validations || validations.length === 0) {\n return `There are no \"${name}\" validators defined.`;\n }\n for (const validate of validations) {\n const result = await validate({\n value,\n context,\n validator: fieldValidator,\n field,\n model,\n entry\n });\n if (!result) {\n return fieldValidator.message;\n }\n }\n }\n } catch (ex) {\n return ex.message;\n }\n\n return null;\n};\n\nconst validatePredefinedValue = (field: CmsModelField, value: any | any[]): string | null => {\n const { enabled = false, values: predefinedValues = [] } = field.predefinedValues || {};\n if (!enabled) {\n return null;\n } else if (Array.isArray(predefinedValues) === false || predefinedValues.length === 0) {\n return \"Missing predefined values to validate against.\";\n } else if (value === \"\" || value === null || value === undefined) {\n return null;\n }\n for (const predefinedValue of predefinedValues) {\n /**\n * No strict compare because the value sent can be 12345 (number) and predefinedValue can be \"12345\" (string),\n * and we want it to match.\n */\n if (predefinedValue.value == value) {\n return null;\n }\n }\n return \"Value sent does not match any of the available predefined values.\";\n};\n\nconst getFieldValidation = (\n listValidation?: CmsModelFieldValidation[]\n): CmsModelFieldValidation[] => {\n if (!listValidation?.length) {\n return [];\n }\n return listValidation.filter(item => item.name !== \"dynamicZone\");\n};\n/**\n * When multiple values is selected we must run validations on the array containing the values\n * And then on each value in the array\n */\nconst runFieldMultipleValuesValidations = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>\n): Promise<string | null> => {\n const { field, values: initialValues } = params;\n const values = initialValues[field.fieldId as keyof TValues] as\n | PossibleValue[]\n | null\n | undefined;\n const valuesError = await validateValue(\n params,\n getFieldValidation(field.listValidation),\n values\n );\n if (valuesError) {\n return valuesError;\n }\n if (values === null || values === undefined) {\n return null;\n }\n for (const value of values) {\n const valueError = await validateValue(params, getFieldValidation(field.validation), value);\n if (valueError) {\n return valueError;\n }\n const predefinedValueError = validatePredefinedValue(field, value);\n if (predefinedValueError) {\n return predefinedValueError;\n }\n }\n return null;\n};\n/**\n * Runs validation on given value.\n */\nconst runFieldValueValidations = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>\n): Promise<string | null> => {\n const { values, field } = params;\n const value = values[field.fieldId as keyof TValues] as PossibleValue | null | undefined;\n const error = await validateValue(params, field.validation || [], value);\n if (error) {\n return error;\n }\n return validatePredefinedValue(field, value);\n};\n\nconst execValidation = async (params: ExecuteValidationParams): Promise<string | null> => {\n const { field } = params;\n if (field.list) {\n return await runFieldMultipleValuesValidations(params);\n }\n return await runFieldValueValidations(params);\n};\n\ninterface IValidateModelEntryDataParams<TValues extends CmsEntryValues = CmsEntryValues> {\n context: CmsContext;\n model: CmsModel;\n values: TValues;\n entry?: CmsEntry<TValues>;\n skipValidators?: string[];\n}\n\nexport const validateModelEntryData = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: IValidateModelEntryDataParams\n) => {\n const { context, model, entry, values, skipValidators } = params;\n\n const isValidatorSkipped = (plugin: CmsModelFieldValidatorPlugin) => {\n if (!skipValidators) {\n return false;\n }\n return skipValidators.includes(camelCase(plugin.validator.name));\n };\n\n const skippedValidators = new Set<string>();\n\n /**\n * To later simplify searching for the validations we map them to a name.\n * @see CmsModelFieldValidatorPlugin.validator.validate\n */\n const validatorList: PluginValidationList = {};\n const validators = context.plugins.byType<CmsModelFieldValidatorPlugin>(\n \"cms-model-field-validator\"\n );\n for (const plugin of validators) {\n const name = plugin.validator.name;\n if (!validatorList[name]) {\n validatorList[name] = [];\n }\n const isSkipped = isValidatorSkipped(plugin);\n if (isSkipped) {\n skippedValidators.add(name);\n }\n validatorList[name].push(isSkipped ? async () => true : plugin.validator.validate);\n }\n /**\n * No point in continuing if all validators are skipped.\n */\n const keys = Object.keys(validatorList);\n if (keys.length === skippedValidators.size) {\n return [];\n }\n\n return await validate<TValues>({\n validatorList,\n context,\n model,\n entry: entry as CmsEntry<TValues>,\n parents: [],\n fields: model.fields,\n values: {\n ...(entry?.values as TValues),\n ...values\n }\n });\n};\n\nexport const validateModelEntryDataOrThrow = async <\n TValues extends CmsEntryValues = CmsEntryValues\n>(\n params: IValidateModelEntryDataParams<TValues>\n) => {\n const invalidFields = await validateModelEntryData(params);\n if (invalidFields.length === 0) {\n return;\n }\n throw new EntryValidationError(\"Validation failed.\", invalidFields);\n};\n\n/**\n *\n */\ninterface FieldError {\n id: string;\n fieldId: string;\n storageId: string;\n error: any;\n parents: string[];\n}\n\ninterface ValidateFieldParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n parents: string[];\n model: CmsModel;\n values: TValues;\n context: CmsContext;\n field: CmsModelField;\n entry?: CmsEntry<TValues>;\n}\n\nconst executeFieldValidation = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ValidateFieldParams<TValues>\n): Promise<FieldError[]> => {\n // TODO put per-field validation into plugins.\n const { field } = params;\n /**\n * Object field.\n */\n if (field.type === \"object\") {\n const fields = field.settings?.fields;\n if (!Array.isArray(fields)) {\n return [];\n }\n const validations: FieldError[] = [];\n /**\n * We need to validate the object field as well.\n */\n const error = await execValidation({\n ...params,\n field\n });\n if (error) {\n validations.push({\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n });\n }\n const objectValue = params.values[field.fieldId as keyof TValues];\n if (!objectValue) {\n return validations;\n }\n const values = (Array.isArray(objectValue) ? objectValue : [objectValue]) as TValues[];\n for (const index in values) {\n const parents = field.list ? [field.fieldId, index] : [field.fieldId];\n const value = values[index] as TValues;\n for (const childField of fields) {\n const errors = await executeFieldValidation<typeof value>({\n ...params,\n parents: params.parents.concat(parents),\n field: childField,\n values: value\n });\n if (errors.length === 0) {\n continue;\n }\n validations.push(...errors);\n }\n }\n return validations;\n }\n /**\n * Dynamic Zone Field\n */\n //\n else if (field.type === \"dynamicZone\") {\n const validations: FieldError[] = [];\n\n const error = await execValidation({\n ...params,\n field\n });\n if (error) {\n validations.push({\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n });\n }\n\n const templates = (field.settings?.templates || []) as CmsDynamicZoneTemplate[];\n for (const template of templates) {\n const fields = template.fields;\n const fieldData = params.values[field.fieldId as keyof TValues];\n if (!fieldData) {\n continue;\n }\n const values: TValues[keyof TValues][] = Array.isArray(fieldData)\n ? fieldData\n : [fieldData];\n for (const index in values) {\n const templateValue = values[index]?.[template.gqlTypeName];\n if (!templateValue) {\n continue;\n }\n /**\n * Order of the parents must be\n * - fieldId\n * - index (if multiple values)\n * - gqlTypeName\n */\n const parents = [field.fieldId];\n if (field.list) {\n parents.push(index);\n }\n parents.push(template.gqlTypeName);\n for (const childField of fields) {\n const errors = await executeFieldValidation({\n ...params,\n parents: params.parents.concat(parents),\n field: childField,\n values: templateValue\n });\n if (errors.length === 0) {\n continue;\n }\n validations.push(...errors);\n }\n }\n }\n\n return validations;\n }\n const error = await execValidation({\n ...params\n });\n if (!error) {\n return [];\n }\n return [\n {\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n }\n ];\n};\n\ninterface ValidateFieldsParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n parents: string[];\n model: CmsModel;\n values: TValues;\n fields: CmsModelField[];\n context: CmsContext;\n entry?: CmsEntry<TValues>;\n}\n\nconst validate = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ValidateFieldsParams<TValues>\n): Promise<FieldError[]> => {\n const { fields } = params;\n const errors: FieldError[] = [];\n\n const results = await Promise.all(\n fields.map(async field => {\n return await executeFieldValidation<TValues>({\n ...params,\n field\n });\n })\n );\n\n for (const result of results) {\n if (result.length === 0) {\n continue;\n }\n errors.push(...result);\n }\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["camelCase","EntryValidationError","CmsModelFieldValidatorRegistry","validateValue","params","fieldValidators","value","validatorList","context","field","model","entry","fieldValidator","name","validations","length","validate","result","validator","message","ex","validatePredefinedValue","enabled","values","predefinedValues","Array","isArray","undefined","predefinedValue","getFieldValidation","listValidation","filter","item","runFieldMultipleValuesValidations","initialValues","fieldId","valuesError","valueError","validation","predefinedValueError","runFieldValueValidations","error","execValidation","list","validateModelEntryData","skipValidators","isValidatorSkipped","includes","skippedValidators","Set","registry","container","resolve","validators","getAll","isSkipped","add","push","keys","Object","size","parents","fields","validateModelEntryDataOrThrow","invalidFields","executeFieldValidation","type","settings","id","storageId","objectValue","index","childField","errors","concat","templates","template","fieldData","templateValue","gqlTypeName","results","Promise","all","map"],"sources":["entryDataValidation.ts"],"sourcesContent":["import type {\n CmsContext,\n CmsDynamicZoneTemplate,\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField,\n CmsModelFieldValidation\n} from \"~/types/index.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport {\n type CmsModelFieldValidator,\n CmsModelFieldValidatorRegistry\n} from \"~/features/validation/index.js\";\n\ntype PluginValidationCallable = (\n params: CmsModelFieldValidator.Params\n) => CmsModelFieldValidator.Response;\ntype PluginValidationList = Record<string, PluginValidationCallable[]>;\n\ninterface ExecuteValidationParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n field: CmsModelField;\n model: CmsModel;\n values: TValues;\n context: CmsContext;\n entry?: CmsEntry<TValues>;\n}\n\ntype PossibleValue = boolean | number | string | null | undefined;\n\nconst validateValue = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>,\n fieldValidators: CmsModelFieldValidation[],\n value: PossibleValue | PossibleValue[]\n): Promise<string | null> => {\n if (!fieldValidators) {\n return null;\n }\n const { validatorList, context, field, model, entry } = params;\n try {\n for (const fieldValidator of fieldValidators) {\n const name = fieldValidator.name;\n const validations = validatorList[name];\n if (!validations || validations.length === 0) {\n return `There are no \"${name}\" validators defined.`;\n }\n for (const validate of validations) {\n const result = await validate({\n value,\n context,\n validator: fieldValidator,\n field,\n model,\n entry\n });\n if (!result) {\n return fieldValidator.message;\n }\n }\n }\n } catch (ex) {\n return ex.message;\n }\n\n return null;\n};\n\nconst validatePredefinedValue = (field: CmsModelField, value: any | any[]): string | null => {\n const { enabled = false, values: predefinedValues = [] } = field.predefinedValues || {};\n if (!enabled) {\n return null;\n } else if (Array.isArray(predefinedValues) === false || predefinedValues.length === 0) {\n return \"Missing predefined values to validate against.\";\n } else if (value === \"\" || value === null || value === undefined) {\n return null;\n }\n for (const predefinedValue of predefinedValues) {\n /**\n * No strict compare because the value sent can be 12345 (number) and predefinedValue can be \"12345\" (string),\n * and we want it to match.\n */\n if (predefinedValue.value == value) {\n return null;\n }\n }\n return \"Value sent does not match any of the available predefined values.\";\n};\n\nconst getFieldValidation = (\n listValidation?: CmsModelFieldValidation[]\n): CmsModelFieldValidation[] => {\n if (!listValidation?.length) {\n return [];\n }\n return listValidation.filter(item => item.name !== \"dynamicZone\");\n};\n/**\n * When multiple values is selected we must run validations on the array containing the values\n * And then on each value in the array\n */\nconst runFieldMultipleValuesValidations = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>\n): Promise<string | null> => {\n const { field, values: initialValues } = params;\n const values = initialValues[field.fieldId as keyof TValues] as\n | PossibleValue[]\n | null\n | undefined;\n const valuesError = await validateValue(\n params,\n getFieldValidation(field.listValidation),\n values\n );\n if (valuesError) {\n return valuesError;\n }\n if (values === null || values === undefined) {\n return null;\n }\n for (const value of values) {\n const valueError = await validateValue(params, getFieldValidation(field.validation), value);\n if (valueError) {\n return valueError;\n }\n const predefinedValueError = validatePredefinedValue(field, value);\n if (predefinedValueError) {\n return predefinedValueError;\n }\n }\n return null;\n};\n/**\n * Runs validation on given value.\n */\nconst runFieldValueValidations = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ExecuteValidationParams<TValues>\n): Promise<string | null> => {\n const { values, field } = params;\n const value = values[field.fieldId as keyof TValues];\n const error = await validateValue(params, field.validation || [], value);\n if (error) {\n return error;\n }\n return validatePredefinedValue(field, value);\n};\n\nconst execValidation = async (params: ExecuteValidationParams): Promise<string | null> => {\n const { field } = params;\n if (field.list) {\n return await runFieldMultipleValuesValidations(params);\n }\n return await runFieldValueValidations(params);\n};\n\ninterface IValidateModelEntryDataParams<TValues extends CmsEntryValues = CmsEntryValues> {\n context: CmsContext;\n model: CmsModel;\n values: TValues;\n entry?: CmsEntry<TValues>;\n skipValidators?: string[];\n}\n\nexport const validateModelEntryData = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: IValidateModelEntryDataParams<TValues>\n) => {\n const { context, model, entry, values, skipValidators } = params;\n\n const isValidatorSkipped = (validator: CmsModelFieldValidator.Interface) => {\n if (!skipValidators) {\n return false;\n }\n return skipValidators.includes(camelCase(validator.name));\n };\n\n const skippedValidators = new Set<string>();\n\n const validatorList: PluginValidationList = {};\n const registry = context.container.resolve(CmsModelFieldValidatorRegistry);\n const validators = registry.getAll();\n for (const validator of validators) {\n const name = validator.name;\n if (!validatorList[name]) {\n validatorList[name] = [];\n }\n const isSkipped = isValidatorSkipped(validator);\n if (isSkipped) {\n skippedValidators.add(name);\n validatorList[name].push(async () => {\n return true;\n });\n continue;\n }\n validatorList[name].push(params => {\n return validator.validate(params);\n });\n }\n /**\n * No point in continuing if all validators are skipped.\n */\n const keys = Object.keys(validatorList);\n if (keys.length === skippedValidators.size) {\n return [];\n }\n\n return await validate<TValues>({\n validatorList,\n context,\n model,\n entry,\n parents: [],\n fields: model.fields,\n values: {\n ...entry?.values,\n ...values\n }\n });\n};\n\nexport const validateModelEntryDataOrThrow = async <\n TValues extends CmsEntryValues = CmsEntryValues\n>(\n params: IValidateModelEntryDataParams<TValues>\n) => {\n const invalidFields = await validateModelEntryData(params);\n if (invalidFields.length === 0) {\n return;\n }\n throw new EntryValidationError(\"Validation failed.\", invalidFields);\n};\n\n/**\n *\n */\ninterface FieldError {\n id: string;\n fieldId: string;\n storageId: string;\n error: any;\n parents: string[];\n}\n\ninterface ValidateFieldParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n parents: string[];\n model: CmsModel;\n values: TValues;\n context: CmsContext;\n field: CmsModelField;\n entry?: CmsEntry<TValues>;\n}\n\nconst executeFieldValidation = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ValidateFieldParams<TValues>\n): Promise<FieldError[]> => {\n // TODO put per-field validation into plugins.\n const { field } = params;\n /**\n * Object field.\n */\n if (field.type === \"object\") {\n const fields = field.settings?.fields;\n if (!Array.isArray(fields)) {\n return [];\n }\n const validations: FieldError[] = [];\n /**\n * We need to validate the object field as well.\n */\n const error = await execValidation({\n ...params,\n field\n });\n if (error) {\n validations.push({\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n });\n }\n const objectValue = params.values[field.fieldId as keyof TValues];\n if (!objectValue) {\n return validations;\n }\n const values = (Array.isArray(objectValue) ? objectValue : [objectValue]) as TValues[];\n for (const index in values) {\n const parents = field.list ? [field.fieldId, index] : [field.fieldId];\n const value = values[index] as TValues;\n for (const childField of fields) {\n const errors = await executeFieldValidation<typeof value>({\n ...params,\n parents: params.parents.concat(parents),\n field: childField,\n values: value\n });\n if (errors.length === 0) {\n continue;\n }\n validations.push(...errors);\n }\n }\n return validations;\n }\n /**\n * Dynamic Zone Field\n */\n //\n else if (field.type === \"dynamicZone\") {\n const validations: FieldError[] = [];\n\n const error = await execValidation({\n ...params,\n field\n });\n if (error) {\n validations.push({\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n });\n }\n\n const templates = (field.settings?.templates || []) as CmsDynamicZoneTemplate[];\n for (const template of templates) {\n const fields = template.fields;\n const fieldData = params.values[field.fieldId as keyof TValues];\n if (!fieldData) {\n continue;\n }\n const values: TValues[keyof TValues][] = Array.isArray(fieldData)\n ? fieldData\n : [fieldData];\n for (const index in values) {\n const templateValue = values[index]?.[template.gqlTypeName];\n if (!templateValue) {\n continue;\n }\n /**\n * Order of the parents must be\n * - fieldId\n * - index (if multiple values)\n * - gqlTypeName\n */\n const parents = [field.fieldId];\n if (field.list) {\n parents.push(index);\n }\n parents.push(template.gqlTypeName);\n for (const childField of fields) {\n const errors = await executeFieldValidation({\n ...params,\n parents: params.parents.concat(parents),\n field: childField,\n values: templateValue\n });\n if (errors.length === 0) {\n continue;\n }\n validations.push(...errors);\n }\n }\n }\n\n return validations;\n }\n const error = await execValidation({\n ...params\n });\n if (!error) {\n return [];\n }\n return [\n {\n id: field.id,\n fieldId: field.fieldId,\n storageId: field.storageId,\n error,\n parents: params.parents\n }\n ];\n};\n\ninterface ValidateFieldsParams<TValues extends CmsEntryValues = CmsEntryValues> {\n validatorList: PluginValidationList;\n parents: string[];\n model: CmsModel;\n values: TValues;\n fields: CmsModelField[];\n context: CmsContext;\n entry?: CmsEntry<TValues>;\n}\n\nconst validate = async <TValues extends CmsEntryValues = CmsEntryValues>(\n params: ValidateFieldsParams<TValues>\n): Promise<FieldError[]> => {\n const { fields } = params;\n const errors: FieldError[] = [];\n\n const results = await Promise.all(\n fields.map(async field => {\n return await executeFieldValidation<TValues>({\n ...params,\n field\n });\n })\n );\n\n for (const result of results) {\n if (result.length === 0) {\n continue;\n }\n errors.push(...result);\n }\n return errors;\n};\n"],"mappings":"AASA,OAAOA,SAAS,MAAM,qBAAqB;AAC3C,SAASC,oBAAoB;AAC7B,SAEIC,8BAA8B;AAmBlC,MAAMC,aAAa,GAAG,MAAAA,CAClBC,MAAwC,EACxCC,eAA0C,EAC1CC,KAAsC,KACb;EACzB,IAAI,CAACD,eAAe,EAAE;IAClB,OAAO,IAAI;EACf;EACA,MAAM;IAAEE,aAAa;IAAEC,OAAO;IAAEC,KAAK;IAAEC,KAAK;IAAEC;EAAM,CAAC,GAAGP,MAAM;EAC9D,IAAI;IACA,KAAK,MAAMQ,cAAc,IAAIP,eAAe,EAAE;MAC1C,MAAMQ,IAAI,GAAGD,cAAc,CAACC,IAAI;MAChC,MAAMC,WAAW,GAAGP,aAAa,CAACM,IAAI,CAAC;MACvC,IAAI,CAACC,WAAW,IAAIA,WAAW,CAACC,MAAM,KAAK,CAAC,EAAE;QAC1C,OAAO,iBAAiBF,IAAI,uBAAuB;MACvD;MACA,KAAK,MAAMG,QAAQ,IAAIF,WAAW,EAAE;QAChC,MAAMG,MAAM,GAAG,MAAMD,QAAQ,CAAC;UAC1BV,KAAK;UACLE,OAAO;UACPU,SAAS,EAAEN,cAAc;UACzBH,KAAK;UACLC,KAAK;UACLC;QACJ,CAAC,CAAC;QACF,IAAI,CAACM,MAAM,EAAE;UACT,OAAOL,cAAc,CAACO,OAAO;QACjC;MACJ;IACJ;EACJ,CAAC,CAAC,OAAOC,EAAE,EAAE;IACT,OAAOA,EAAE,CAACD,OAAO;EACrB;EAEA,OAAO,IAAI;AACf,CAAC;AAED,MAAME,uBAAuB,GAAGA,CAACZ,KAAoB,EAAEH,KAAkB,KAAoB;EACzF,MAAM;IAAEgB,OAAO,GAAG,KAAK;IAAEC,MAAM,EAAEC,gBAAgB,GAAG;EAAG,CAAC,GAAGf,KAAK,CAACe,gBAAgB,IAAI,CAAC,CAAC;EACvF,IAAI,CAACF,OAAO,EAAE;IACV,OAAO,IAAI;EACf,CAAC,MAAM,IAAIG,KAAK,CAACC,OAAO,CAACF,gBAAgB,CAAC,KAAK,KAAK,IAAIA,gBAAgB,CAACT,MAAM,KAAK,CAAC,EAAE;IACnF,OAAO,gDAAgD;EAC3D,CAAC,MAAM,IAAIT,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKqB,SAAS,EAAE;IAC9D,OAAO,IAAI;EACf;EACA,KAAK,MAAMC,eAAe,IAAIJ,gBAAgB,EAAE;IAC5C;AACR;AACA;AACA;IACQ,IAAII,eAAe,CAACtB,KAAK,IAAIA,KAAK,EAAE;MAChC,OAAO,IAAI;IACf;EACJ;EACA,OAAO,mEAAmE;AAC9E,CAAC;AAED,MAAMuB,kBAAkB,GACpBC,cAA0C,IACd;EAC5B,IAAI,CAACA,cAAc,EAAEf,MAAM,EAAE;IACzB,OAAO,EAAE;EACb;EACA,OAAOe,cAAc,CAACC,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACnB,IAAI,KAAK,aAAa,CAAC;AACrE,CAAC;AACD;AACA;AACA;AACA;AACA,MAAMoB,iCAAiC,GAAG,MACtC7B,MAAwC,IACf;EACzB,MAAM;IAAEK,KAAK;IAAEc,MAAM,EAAEW;EAAc,CAAC,GAAG9B,MAAM;EAC/C,MAAMmB,MAAM,GAAGW,aAAa,CAACzB,KAAK,CAAC0B,OAAO,CAG3B;EACf,MAAMC,WAAW,GAAG,MAAMjC,aAAa,CACnCC,MAAM,EACNyB,kBAAkB,CAACpB,KAAK,CAACqB,cAAc,CAAC,EACxCP,MACJ,CAAC;EACD,IAAIa,WAAW,EAAE;IACb,OAAOA,WAAW;EACtB;EACA,IAAIb,MAAM,KAAK,IAAI,IAAIA,MAAM,KAAKI,SAAS,EAAE;IACzC,OAAO,IAAI;EACf;EACA,KAAK,MAAMrB,KAAK,IAAIiB,MAAM,EAAE;IACxB,MAAMc,UAAU,GAAG,MAAMlC,aAAa,CAACC,MAAM,EAAEyB,kBAAkB,CAACpB,KAAK,CAAC6B,UAAU,CAAC,EAAEhC,KAAK,CAAC;IAC3F,IAAI+B,UAAU,EAAE;MACZ,OAAOA,UAAU;IACrB;IACA,MAAME,oBAAoB,GAAGlB,uBAAuB,CAACZ,KAAK,EAAEH,KAAK,CAAC;IAClE,IAAIiC,oBAAoB,EAAE;MACtB,OAAOA,oBAAoB;IAC/B;EACJ;EACA,OAAO,IAAI;AACf,CAAC;AACD;AACA;AACA;AACA,MAAMC,wBAAwB,GAAG,MAC7BpC,MAAwC,IACf;EACzB,MAAM;IAAEmB,MAAM;IAAEd;EAAM,CAAC,GAAGL,MAAM;EAChC,MAAME,KAAK,GAAGiB,MAAM,CAACd,KAAK,CAAC0B,OAAO,CAAkB;EACpD,MAAMM,KAAK,GAAG,MAAMtC,aAAa,CAACC,MAAM,EAAEK,KAAK,CAAC6B,UAAU,IAAI,EAAE,EAAEhC,KAAK,CAAC;EACxE,IAAImC,KAAK,EAAE;IACP,OAAOA,KAAK;EAChB;EACA,OAAOpB,uBAAuB,CAACZ,KAAK,EAAEH,KAAK,CAAC;AAChD,CAAC;AAED,MAAMoC,cAAc,GAAG,MAAOtC,MAA+B,IAA6B;EACtF,MAAM;IAAEK;EAAM,CAAC,GAAGL,MAAM;EACxB,IAAIK,KAAK,CAACkC,IAAI,EAAE;IACZ,OAAO,MAAMV,iCAAiC,CAAC7B,MAAM,CAAC;EAC1D;EACA,OAAO,MAAMoC,wBAAwB,CAACpC,MAAM,CAAC;AACjD,CAAC;AAUD,OAAO,MAAMwC,sBAAsB,GAAG,MAClCxC,MAA8C,IAC7C;EACD,MAAM;IAAEI,OAAO;IAAEE,KAAK;IAAEC,KAAK;IAAEY,MAAM;IAAEsB;EAAe,CAAC,GAAGzC,MAAM;EAEhE,MAAM0C,kBAAkB,GAAI5B,SAA2C,IAAK;IACxE,IAAI,CAAC2B,cAAc,EAAE;MACjB,OAAO,KAAK;IAChB;IACA,OAAOA,cAAc,CAACE,QAAQ,CAAC/C,SAAS,CAACkB,SAAS,CAACL,IAAI,CAAC,CAAC;EAC7D,CAAC;EAED,MAAMmC,iBAAiB,GAAG,IAAIC,GAAG,CAAS,CAAC;EAE3C,MAAM1C,aAAmC,GAAG,CAAC,CAAC;EAC9C,MAAM2C,QAAQ,GAAG1C,OAAO,CAAC2C,SAAS,CAACC,OAAO,CAAClD,8BAA8B,CAAC;EAC1E,MAAMmD,UAAU,GAAGH,QAAQ,CAACI,MAAM,CAAC,CAAC;EACpC,KAAK,MAAMpC,SAAS,IAAImC,UAAU,EAAE;IAChC,MAAMxC,IAAI,GAAGK,SAAS,CAACL,IAAI;IAC3B,IAAI,CAACN,aAAa,CAACM,IAAI,CAAC,EAAE;MACtBN,aAAa,CAACM,IAAI,CAAC,GAAG,EAAE;IAC5B;IACA,MAAM0C,SAAS,GAAGT,kBAAkB,CAAC5B,SAAS,CAAC;IAC/C,IAAIqC,SAAS,EAAE;MACXP,iBAAiB,CAACQ,GAAG,CAAC3C,IAAI,CAAC;MAC3BN,aAAa,CAACM,IAAI,CAAC,CAAC4C,IAAI,CAAC,YAAY;QACjC,OAAO,IAAI;MACf,CAAC,CAAC;MACF;IACJ;IACAlD,aAAa,CAACM,IAAI,CAAC,CAAC4C,IAAI,CAACrD,MAAM,IAAI;MAC/B,OAAOc,SAAS,CAACF,QAAQ,CAACZ,MAAM,CAAC;IACrC,CAAC,CAAC;EACN;EACA;AACJ;AACA;EACI,MAAMsD,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACnD,aAAa,CAAC;EACvC,IAAImD,IAAI,CAAC3C,MAAM,KAAKiC,iBAAiB,CAACY,IAAI,EAAE;IACxC,OAAO,EAAE;EACb;EAEA,OAAO,MAAM5C,QAAQ,CAAU;IAC3BT,aAAa;IACbC,OAAO;IACPE,KAAK;IACLC,KAAK;IACLkD,OAAO,EAAE,EAAE;IACXC,MAAM,EAAEpD,KAAK,CAACoD,MAAM;IACpBvC,MAAM,EAAE;MACJ,GAAGZ,KAAK,EAAEY,MAAM;MAChB,GAAGA;IACP;EACJ,CAAC,CAAC;AACN,CAAC;AAED,OAAO,MAAMwC,6BAA6B,GAAG,MAGzC3D,MAA8C,IAC7C;EACD,MAAM4D,aAAa,GAAG,MAAMpB,sBAAsB,CAACxC,MAAM,CAAC;EAC1D,IAAI4D,aAAa,CAACjD,MAAM,KAAK,CAAC,EAAE;IAC5B;EACJ;EACA,MAAM,IAAId,oBAAoB,CAAC,oBAAoB,EAAE+D,aAAa,CAAC;AACvE,CAAC;;AAED;AACA;AACA;;AAmBA,MAAMC,sBAAsB,GAAG,MAC3B7D,MAAoC,IACZ;EACxB;EACA,MAAM;IAAEK;EAAM,CAAC,GAAGL,MAAM;EACxB;AACJ;AACA;EACI,IAAIK,KAAK,CAACyD,IAAI,KAAK,QAAQ,EAAE;IACzB,MAAMJ,MAAM,GAAGrD,KAAK,CAAC0D,QAAQ,EAAEL,MAAM;IACrC,IAAI,CAACrC,KAAK,CAACC,OAAO,CAACoC,MAAM,CAAC,EAAE;MACxB,OAAO,EAAE;IACb;IACA,MAAMhD,WAAyB,GAAG,EAAE;IACpC;AACR;AACA;IACQ,MAAM2B,KAAK,GAAG,MAAMC,cAAc,CAAC;MAC/B,GAAGtC,MAAM;MACTK;IACJ,CAAC,CAAC;IACF,IAAIgC,KAAK,EAAE;MACP3B,WAAW,CAAC2C,IAAI,CAAC;QACbW,EAAE,EAAE3D,KAAK,CAAC2D,EAAE;QACZjC,OAAO,EAAE1B,KAAK,CAAC0B,OAAO;QACtBkC,SAAS,EAAE5D,KAAK,CAAC4D,SAAS;QAC1B5B,KAAK;QACLoB,OAAO,EAAEzD,MAAM,CAACyD;MACpB,CAAC,CAAC;IACN;IACA,MAAMS,WAAW,GAAGlE,MAAM,CAACmB,MAAM,CAACd,KAAK,CAAC0B,OAAO,CAAkB;IACjE,IAAI,CAACmC,WAAW,EAAE;MACd,OAAOxD,WAAW;IACtB;IACA,MAAMS,MAAM,GAAIE,KAAK,CAACC,OAAO,CAAC4C,WAAW,CAAC,GAAGA,WAAW,GAAG,CAACA,WAAW,CAAe;IACtF,KAAK,MAAMC,KAAK,IAAIhD,MAAM,EAAE;MACxB,MAAMsC,OAAO,GAAGpD,KAAK,CAACkC,IAAI,GAAG,CAAClC,KAAK,CAAC0B,OAAO,EAAEoC,KAAK,CAAC,GAAG,CAAC9D,KAAK,CAAC0B,OAAO,CAAC;MACrE,MAAM7B,KAAK,GAAGiB,MAAM,CAACgD,KAAK,CAAY;MACtC,KAAK,MAAMC,UAAU,IAAIV,MAAM,EAAE;QAC7B,MAAMW,MAAM,GAAG,MAAMR,sBAAsB,CAAe;UACtD,GAAG7D,MAAM;UACTyD,OAAO,EAAEzD,MAAM,CAACyD,OAAO,CAACa,MAAM,CAACb,OAAO,CAAC;UACvCpD,KAAK,EAAE+D,UAAU;UACjBjD,MAAM,EAAEjB;QACZ,CAAC,CAAC;QACF,IAAImE,MAAM,CAAC1D,MAAM,KAAK,CAAC,EAAE;UACrB;QACJ;QACAD,WAAW,CAAC2C,IAAI,CAAC,GAAGgB,MAAM,CAAC;MAC/B;IACJ;IACA,OAAO3D,WAAW;EACtB;EACA;AACJ;AACA;EACI;EAAA,KACK,IAAIL,KAAK,CAACyD,IAAI,KAAK,aAAa,EAAE;IACnC,MAAMpD,WAAyB,GAAG,EAAE;IAEpC,MAAM2B,KAAK,GAAG,MAAMC,cAAc,CAAC;MAC/B,GAAGtC,MAAM;MACTK;IACJ,CAAC,CAAC;IACF,IAAIgC,KAAK,EAAE;MACP3B,WAAW,CAAC2C,IAAI,CAAC;QACbW,EAAE,EAAE3D,KAAK,CAAC2D,EAAE;QACZjC,OAAO,EAAE1B,KAAK,CAAC0B,OAAO;QACtBkC,SAAS,EAAE5D,KAAK,CAAC4D,SAAS;QAC1B5B,KAAK;QACLoB,OAAO,EAAEzD,MAAM,CAACyD;MACpB,CAAC,CAAC;IACN;IAEA,MAAMc,SAAS,GAAIlE,KAAK,CAAC0D,QAAQ,EAAEQ,SAAS,IAAI,EAA+B;IAC/E,KAAK,MAAMC,QAAQ,IAAID,SAAS,EAAE;MAC9B,MAAMb,MAAM,GAAGc,QAAQ,CAACd,MAAM;MAC9B,MAAMe,SAAS,GAAGzE,MAAM,CAACmB,MAAM,CAACd,KAAK,CAAC0B,OAAO,CAAkB;MAC/D,IAAI,CAAC0C,SAAS,EAAE;QACZ;MACJ;MACA,MAAMtD,MAAgC,GAAGE,KAAK,CAACC,OAAO,CAACmD,SAAS,CAAC,GAC3DA,SAAS,GACT,CAACA,SAAS,CAAC;MACjB,KAAK,MAAMN,KAAK,IAAIhD,MAAM,EAAE;QACxB,MAAMuD,aAAa,GAAGvD,MAAM,CAACgD,KAAK,CAAC,GAAGK,QAAQ,CAACG,WAAW,CAAC;QAC3D,IAAI,CAACD,aAAa,EAAE;UAChB;QACJ;QACA;AAChB;AACA;AACA;AACA;AACA;QACgB,MAAMjB,OAAO,GAAG,CAACpD,KAAK,CAAC0B,OAAO,CAAC;QAC/B,IAAI1B,KAAK,CAACkC,IAAI,EAAE;UACZkB,OAAO,CAACJ,IAAI,CAACc,KAAK,CAAC;QACvB;QACAV,OAAO,CAACJ,IAAI,CAACmB,QAAQ,CAACG,WAAW,CAAC;QAClC,KAAK,MAAMP,UAAU,IAAIV,MAAM,EAAE;UAC7B,MAAMW,MAAM,GAAG,MAAMR,sBAAsB,CAAC;YACxC,GAAG7D,MAAM;YACTyD,OAAO,EAAEzD,MAAM,CAACyD,OAAO,CAACa,MAAM,CAACb,OAAO,CAAC;YACvCpD,KAAK,EAAE+D,UAAU;YACjBjD,MAAM,EAAEuD;UACZ,CAAC,CAAC;UACF,IAAIL,MAAM,CAAC1D,MAAM,KAAK,CAAC,EAAE;YACrB;UACJ;UACAD,WAAW,CAAC2C,IAAI,CAAC,GAAGgB,MAAM,CAAC;QAC/B;MACJ;IACJ;IAEA,OAAO3D,WAAW;EACtB;EACA,MAAM2B,KAAK,GAAG,MAAMC,cAAc,CAAC;IAC/B,GAAGtC;EACP,CAAC,CAAC;EACF,IAAI,CAACqC,KAAK,EAAE;IACR,OAAO,EAAE;EACb;EACA,OAAO,CACH;IACI2B,EAAE,EAAE3D,KAAK,CAAC2D,EAAE;IACZjC,OAAO,EAAE1B,KAAK,CAAC0B,OAAO;IACtBkC,SAAS,EAAE5D,KAAK,CAAC4D,SAAS;IAC1B5B,KAAK;IACLoB,OAAO,EAAEzD,MAAM,CAACyD;EACpB,CAAC,CACJ;AACL,CAAC;AAYD,MAAM7C,QAAQ,GAAG,MACbZ,MAAqC,IACb;EACxB,MAAM;IAAE0D;EAAO,CAAC,GAAG1D,MAAM;EACzB,MAAMqE,MAAoB,GAAG,EAAE;EAE/B,MAAMO,OAAO,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC7BpB,MAAM,CAACqB,GAAG,CAAC,MAAM1E,KAAK,IAAI;IACtB,OAAO,MAAMwD,sBAAsB,CAAU;MACzC,GAAG7D,MAAM;MACTK;IACJ,CAAC,CAAC;EACN,CAAC,CACL,CAAC;EAED,KAAK,MAAMQ,MAAM,IAAI+D,OAAO,EAAE;IAC1B,IAAI/D,MAAM,CAACF,MAAM,KAAK,CAAC,EAAE;MACrB;IACJ;IACA0D,MAAM,CAAChB,IAAI,CAAC,GAAGxC,MAAM,CAAC;EAC1B;EACA,OAAOwD,MAAM;AACjB,CAAC","ignoreList":[]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { CmsModelField } from "../../types/index.js";
|
|
2
|
-
import type { PluginsContainer } from "@webiny/plugins";
|
|
1
|
+
import type { CmsContext, CmsModelField } from "../../types/index.js";
|
|
3
2
|
interface Params {
|
|
4
3
|
input: string[];
|
|
5
4
|
fields: CmsModelField[];
|
|
6
|
-
|
|
5
|
+
context: Pick<CmsContext, "container">;
|
|
7
6
|
}
|
|
8
7
|
export declare const getSearchableFields: (params: Params) => string[];
|
|
9
8
|
export {};
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
+
import { CmsModelFieldToGraphQLRegistry } from "../../features/graphql/index.js";
|
|
1
2
|
const buildSearchableFieldList = params => {
|
|
2
3
|
const {
|
|
3
4
|
input,
|
|
4
|
-
|
|
5
|
+
registry,
|
|
5
6
|
fields,
|
|
6
7
|
parents
|
|
7
8
|
} = params;
|
|
8
9
|
return fields.reduce((result, field) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
const plugin = plugins[field.type];
|
|
13
|
-
if (!plugin) {
|
|
10
|
+
const fieldImpl = registry.get(field.type);
|
|
11
|
+
if (!fieldImpl) {
|
|
14
12
|
return result;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
@@ -18,13 +16,10 @@ const buildSearchableFieldList = params => {
|
|
|
18
16
|
*/
|
|
19
17
|
const childFields = field.settings?.fields || [];
|
|
20
18
|
if (childFields.length > 0) {
|
|
21
|
-
/**
|
|
22
|
-
* So we build a list of searchable child fields and push it into the main result set.
|
|
23
|
-
*/
|
|
24
19
|
const childResults = buildSearchableFieldList({
|
|
25
20
|
fields: childFields,
|
|
26
21
|
parents: [...parents, field.fieldId],
|
|
27
|
-
|
|
22
|
+
registry,
|
|
28
23
|
input
|
|
29
24
|
});
|
|
30
25
|
result.push(...childResults);
|
|
@@ -33,7 +28,7 @@ const buildSearchableFieldList = params => {
|
|
|
33
28
|
/**
|
|
34
29
|
* If not searchable, continue further.
|
|
35
30
|
*/
|
|
36
|
-
if (!
|
|
31
|
+
if (!fieldImpl.isFullTextSearchable || field.settings?.disableFullTextSearch === true) {
|
|
37
32
|
return result;
|
|
38
33
|
}
|
|
39
34
|
|
|
@@ -45,24 +40,21 @@ const buildSearchableFieldList = params => {
|
|
|
45
40
|
return result;
|
|
46
41
|
},
|
|
47
42
|
/**
|
|
48
|
-
* We always add id and entry id
|
|
43
|
+
* We always add id and entry id.
|
|
49
44
|
*/
|
|
50
45
|
["id", "entryId"]);
|
|
51
46
|
};
|
|
52
47
|
export const getSearchableFields = params => {
|
|
53
48
|
const {
|
|
54
|
-
|
|
49
|
+
context,
|
|
55
50
|
input,
|
|
56
51
|
fields
|
|
57
52
|
} = params;
|
|
58
|
-
const
|
|
59
|
-
collection[field.fieldType] = field;
|
|
60
|
-
return collection;
|
|
61
|
-
}, {});
|
|
53
|
+
const registry = context.container.resolve(CmsModelFieldToGraphQLRegistry);
|
|
62
54
|
return buildSearchableFieldList({
|
|
63
55
|
fields,
|
|
64
56
|
input,
|
|
65
|
-
|
|
57
|
+
registry,
|
|
66
58
|
parents: ["values"]
|
|
67
59
|
});
|
|
68
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildSearchableFieldList","params","input","
|
|
1
|
+
{"version":3,"names":["CmsModelFieldToGraphQLRegistry","buildSearchableFieldList","params","input","registry","fields","parents","reduce","result","field","fieldImpl","get","type","childFields","settings","length","childResults","fieldId","push","isFullTextSearchable","disableFullTextSearch","path","join","getSearchableFields","context","container","resolve"],"sources":["searchableFields.ts"],"sourcesContent":["import type { CmsContext, CmsModelField } from \"~/types/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"~/features/graphql/index.js\";\n\ninterface BuildParams {\n input: string[];\n fields: CmsModelField[];\n registry: CmsModelFieldToGraphQLRegistry.Interface;\n parents: string[];\n}\nconst buildSearchableFieldList = (params: BuildParams): string[] => {\n const { input, registry, fields, parents } = params;\n return fields.reduce<string[]>(\n (result, field) => {\n const fieldImpl = registry.get(field.type);\n if (!fieldImpl) {\n return result;\n }\n /**\n * There is a possibility that searchable fields exist in nested object field, so check that as well.\n */\n const childFields = field.settings?.fields || [];\n if (childFields.length > 0) {\n const childResults = buildSearchableFieldList({\n fields: childFields,\n parents: [...parents, field.fieldId],\n registry,\n input\n });\n\n result.push(...childResults);\n return result;\n }\n /**\n * If not searchable, continue further.\n */\n if (!fieldImpl.isFullTextSearchable || field.settings?.disableFullTextSearch === true) {\n return result;\n }\n\n /**\n * Combine all parent paths with the current one and push it.\n */\n const path = [...parents, field.fieldId].join(\".\");\n result.push(path);\n\n return result;\n },\n /**\n * We always add id and entry id.\n */\n [\"id\", \"entryId\"]\n );\n};\n\ninterface Params {\n input: string[];\n fields: CmsModelField[];\n context: Pick<CmsContext, \"container\">;\n}\nexport const getSearchableFields = (params: Params): string[] => {\n const { context, input, fields } = params;\n\n const registry = context.container.resolve(CmsModelFieldToGraphQLRegistry);\n\n return buildSearchableFieldList({\n fields,\n input,\n registry,\n parents: [\"values\"]\n });\n};\n"],"mappings":"AACA,SAASA,8BAA8B;AAQvC,MAAMC,wBAAwB,GAAIC,MAAmB,IAAe;EAChE,MAAM;IAAEC,KAAK;IAAEC,QAAQ;IAAEC,MAAM;IAAEC;EAAQ,CAAC,GAAGJ,MAAM;EACnD,OAAOG,MAAM,CAACE,MAAM,CAChB,CAACC,MAAM,EAAEC,KAAK,KAAK;IACf,MAAMC,SAAS,GAAGN,QAAQ,CAACO,GAAG,CAACF,KAAK,CAACG,IAAI,CAAC;IAC1C,IAAI,CAACF,SAAS,EAAE;MACZ,OAAOF,MAAM;IACjB;IACA;AACZ;AACA;IACY,MAAMK,WAAW,GAAGJ,KAAK,CAACK,QAAQ,EAAET,MAAM,IAAI,EAAE;IAChD,IAAIQ,WAAW,CAACE,MAAM,GAAG,CAAC,EAAE;MACxB,MAAMC,YAAY,GAAGf,wBAAwB,CAAC;QAC1CI,MAAM,EAAEQ,WAAW;QACnBP,OAAO,EAAE,CAAC,GAAGA,OAAO,EAAEG,KAAK,CAACQ,OAAO,CAAC;QACpCb,QAAQ;QACRD;MACJ,CAAC,CAAC;MAEFK,MAAM,CAACU,IAAI,CAAC,GAAGF,YAAY,CAAC;MAC5B,OAAOR,MAAM;IACjB;IACA;AACZ;AACA;IACY,IAAI,CAACE,SAAS,CAACS,oBAAoB,IAAIV,KAAK,CAACK,QAAQ,EAAEM,qBAAqB,KAAK,IAAI,EAAE;MACnF,OAAOZ,MAAM;IACjB;;IAEA;AACZ;AACA;IACY,MAAMa,IAAI,GAAG,CAAC,GAAGf,OAAO,EAAEG,KAAK,CAACQ,OAAO,CAAC,CAACK,IAAI,CAAC,GAAG,CAAC;IAClDd,MAAM,CAACU,IAAI,CAACG,IAAI,CAAC;IAEjB,OAAOb,MAAM;EACjB,CAAC;EACD;AACR;AACA;EACQ,CAAC,IAAI,EAAE,SAAS,CACpB,CAAC;AACL,CAAC;AAOD,OAAO,MAAMe,mBAAmB,GAAIrB,MAAc,IAAe;EAC7D,MAAM;IAAEsB,OAAO;IAAErB,KAAK;IAAEE;EAAO,CAAC,GAAGH,MAAM;EAEzC,MAAME,QAAQ,GAAGoB,OAAO,CAACC,SAAS,CAACC,OAAO,CAAC1B,8BAA8B,CAAC;EAE1E,OAAOC,wBAAwB,CAAC;IAC5BI,MAAM;IACNF,KAAK;IACLC,QAAQ;IACRE,OAAO,EAAE,CAAC,QAAQ;EACtB,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ import { GetModelUseCase } from "../features/contentModel/GetModel/index.js";
|
|
|
7
7
|
import { ListModelsUseCase } from "../features/contentModel/ListModels/index.js";
|
|
8
8
|
import { createMemoryCache } from "../utils/index.js";
|
|
9
9
|
import { CmsModelFieldToAstConverterFromPlugins, CmsModelToAstConverter } from "../utils/contentModelAst/index.js";
|
|
10
|
+
import { CmsModelFieldToGraphQLRegistry } from "../features/graphql/index.js";
|
|
10
11
|
export const createModelsCrud = params => {
|
|
11
12
|
const {
|
|
12
13
|
context
|
|
@@ -17,7 +18,7 @@ export const createModelsCrud = params => {
|
|
|
17
18
|
listDatabaseModelsCache.clear();
|
|
18
19
|
listFilteredModelsCache.clear();
|
|
19
20
|
};
|
|
20
|
-
const fieldTypePlugins = context.
|
|
21
|
+
const fieldTypePlugins = context.container.resolve(CmsModelFieldToGraphQLRegistry).getAll();
|
|
21
22
|
const getModelToAstConverter = () => {
|
|
22
23
|
return new CmsModelToAstConverter(new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins));
|
|
23
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebinyError","CreateModelUseCase","CreateModelFromUseCase","UpdateModelUseCase","DeleteModelUseCase","GetModelUseCase","ListModelsUseCase","createMemoryCache","CmsModelFieldToAstConverterFromPlugins","CmsModelToAstConverter","createModelsCrud","params","context","listFilteredModelsCache","listDatabaseModelsCache","clearModelsCache","clear","fieldTypePlugins","plugins","byType","getModelToAstConverter","listModels","input","benchmark","measure","useCase","container","resolve","result","execute","isFail","error","message","code","data","value","getModel","modelId","createModel","updateModel","createModelFrom","deleteModel","userInput"],"sources":["contentModel.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelFieldToGraphQLPlugin,\n ICmsModelListParams\n} from \"~/types/index.js\";\nimport { CreateModelUseCase } from \"~/features/contentModel/CreateModel/index.js\";\nimport { CreateModelFromUseCase } from \"~/features/contentModel/CreateModelFrom/index.js\";\nimport { UpdateModelUseCase } from \"~/features/contentModel/UpdateModel/index.js\";\nimport { DeleteModelUseCase } from \"~/features/contentModel/DeleteModel/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\nimport { ListModelsUseCase } from \"~/features/contentModel/ListModels/index.js\";\nimport { createMemoryCache } from \"~/utils/index.js\";\nimport {\n CmsModelFieldToAstConverterFromPlugins,\n CmsModelToAstConverter\n} from \"~/utils/contentModelAst/index.js\";\n\nexport interface CreateModelsCrudParams {\n context: CmsContext;\n}\n\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { context } = params;\n\n const listFilteredModelsCache = createMemoryCache<Promise<CmsModel[]>>();\n const listDatabaseModelsCache = createMemoryCache<Promise<CmsModel[]>>();\n const clearModelsCache = (): void => {\n listDatabaseModelsCache.clear();\n listFilteredModelsCache.clear();\n };\n\n const fieldTypePlugins = context.plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n const getModelToAstConverter = () => {\n return new CmsModelToAstConverter(\n new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins)\n );\n };\n\n /**\n * The list models cache is a key -> Promise pair so it the listModels() can be called multiple times but executed only once.\n *\n * We always fetch the plugins and database models separately.\n * Then we combine them and run access filtering on them\n */\n const listModels = async (input?: ICmsModelListParams) => {\n return context.benchmark.measure(\"headlessCms.crud.models.listModels\", async () => {\n // Delegate to new ListModels use case\n const useCase = context.container.resolve(ListModelsUseCase);\n const result = await useCase.execute(input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n return context.benchmark.measure(\"headlessCms.crud.models.getModel\", async () => {\n // Delegate to new GetModel use case\n const useCase = context.container.resolve(GetModelUseCase);\n const result = await useCase.execute(modelId);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n });\n };\n\n /**\n * CRUD methods\n */\n const createModel: CmsModelContext[\"createModel\"] = async input => {\n // Delegate to new CreateModel use case\n const useCase = context.container.resolve(CreateModelUseCase);\n const result = await useCase.execute(input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n const updateModel: CmsModelContext[\"updateModel\"] = async (modelId, input) => {\n // Delegate to new UpdateModel use case\n const useCase = context.container.resolve(UpdateModelUseCase);\n const result = await useCase.execute(modelId, input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n\n const createModelFrom: CmsModelContext[\"createModelFrom\"] = async (modelId, input) => {\n // Delegate to new CreateModelFrom use case\n const useCase = context.container.resolve(CreateModelFromUseCase);\n const result = await useCase.execute(modelId, input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n const deleteModel: CmsModelContext[\"deleteModel\"] = async modelId => {\n // Delegate to new DeleteModel use case\n const useCase = context.container.resolve(DeleteModelUseCase);\n const result = await useCase.execute(modelId);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n };\n\n return {\n clearModelsCache,\n getModel,\n getModelToAstConverter,\n listModels,\n async createModel(input) {\n return context.benchmark.measure(\"headlessCms.crud.models.createModel\", async () => {\n return createModel(input);\n });\n },\n\n async createModelFrom(modelId, userInput) {\n return context.benchmark.measure(\n \"headlessCms.crud.models.createModelFrom\",\n async () => {\n return createModelFrom(modelId, userInput);\n }\n );\n },\n async updateModel(modelId, input) {\n return context.benchmark.measure(\"headlessCms.crud.models.updateModel\", async () => {\n return updateModel(modelId, input);\n });\n },\n async deleteModel(modelId) {\n return context.benchmark.measure(\"headlessCms.crud.models.deleteModel\", async () => {\n return deleteModel(modelId);\n });\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["WebinyError","CreateModelUseCase","CreateModelFromUseCase","UpdateModelUseCase","DeleteModelUseCase","GetModelUseCase","ListModelsUseCase","createMemoryCache","CmsModelFieldToAstConverterFromPlugins","CmsModelToAstConverter","CmsModelFieldToGraphQLRegistry","createModelsCrud","params","context","listFilteredModelsCache","listDatabaseModelsCache","clearModelsCache","clear","fieldTypePlugins","container","resolve","getAll","getModelToAstConverter","listModels","input","benchmark","measure","useCase","result","execute","isFail","error","message","code","data","value","getModel","modelId","createModel","updateModel","createModelFrom","deleteModel","userInput"],"sources":["contentModel.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { CmsContext, CmsModel, CmsModelContext, ICmsModelListParams } from \"~/types/index.js\";\nimport { CreateModelUseCase } from \"~/features/contentModel/CreateModel/index.js\";\nimport { CreateModelFromUseCase } from \"~/features/contentModel/CreateModelFrom/index.js\";\nimport { UpdateModelUseCase } from \"~/features/contentModel/UpdateModel/index.js\";\nimport { DeleteModelUseCase } from \"~/features/contentModel/DeleteModel/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\nimport { ListModelsUseCase } from \"~/features/contentModel/ListModels/index.js\";\nimport { createMemoryCache } from \"~/utils/index.js\";\nimport {\n CmsModelFieldToAstConverterFromPlugins,\n CmsModelToAstConverter\n} from \"~/utils/contentModelAst/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"~/features/graphql/index.js\";\n\nexport interface CreateModelsCrudParams {\n context: CmsContext;\n}\n\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { context } = params;\n\n const listFilteredModelsCache = createMemoryCache<Promise<CmsModel[]>>();\n const listDatabaseModelsCache = createMemoryCache<Promise<CmsModel[]>>();\n const clearModelsCache = (): void => {\n listDatabaseModelsCache.clear();\n listFilteredModelsCache.clear();\n };\n\n const fieldTypePlugins = context.container.resolve(CmsModelFieldToGraphQLRegistry).getAll();\n\n const getModelToAstConverter = () => {\n return new CmsModelToAstConverter(\n new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins)\n );\n };\n\n /**\n * The list models cache is a key -> Promise pair so it the listModels() can be called multiple times but executed only once.\n *\n * We always fetch the plugins and database models separately.\n * Then we combine them and run access filtering on them\n */\n const listModels = async (input?: ICmsModelListParams) => {\n return context.benchmark.measure(\"headlessCms.crud.models.listModels\", async () => {\n // Delegate to new ListModels use case\n const useCase = context.container.resolve(ListModelsUseCase);\n const result = await useCase.execute(input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n return context.benchmark.measure(\"headlessCms.crud.models.getModel\", async () => {\n // Delegate to new GetModel use case\n const useCase = context.container.resolve(GetModelUseCase);\n const result = await useCase.execute(modelId);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n });\n };\n\n /**\n * CRUD methods\n */\n const createModel: CmsModelContext[\"createModel\"] = async input => {\n // Delegate to new CreateModel use case\n const useCase = context.container.resolve(CreateModelUseCase);\n const result = await useCase.execute(input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n const updateModel: CmsModelContext[\"updateModel\"] = async (modelId, input) => {\n // Delegate to new UpdateModel use case\n const useCase = context.container.resolve(UpdateModelUseCase);\n const result = await useCase.execute(modelId, input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n\n const createModelFrom: CmsModelContext[\"createModelFrom\"] = async (modelId, input) => {\n // Delegate to new CreateModelFrom use case\n const useCase = context.container.resolve(CreateModelFromUseCase);\n const result = await useCase.execute(modelId, input);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n\n return result.value;\n };\n const deleteModel: CmsModelContext[\"deleteModel\"] = async modelId => {\n // Delegate to new DeleteModel use case\n const useCase = context.container.resolve(DeleteModelUseCase);\n const result = await useCase.execute(modelId);\n\n if (result.isFail()) {\n throw new WebinyError(result.error.message, result.error.code, result.error.data);\n }\n };\n\n return {\n clearModelsCache,\n getModel,\n getModelToAstConverter,\n listModels,\n async createModel(input) {\n return context.benchmark.measure(\"headlessCms.crud.models.createModel\", async () => {\n return createModel(input);\n });\n },\n\n async createModelFrom(modelId, userInput) {\n return context.benchmark.measure(\n \"headlessCms.crud.models.createModelFrom\",\n async () => {\n return createModelFrom(modelId, userInput);\n }\n );\n },\n async updateModel(modelId, input) {\n return context.benchmark.measure(\"headlessCms.crud.models.updateModel\", async () => {\n return updateModel(modelId, input);\n });\n },\n async deleteModel(modelId) {\n return context.benchmark.measure(\"headlessCms.crud.models.deleteModel\", async () => {\n return deleteModel(modelId);\n });\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,9 +7,10 @@ import { getBaseFieldType } from "../../../utils/getBaseFieldType.js";
|
|
|
7
7
|
import { getContentModelTitleFieldId } from "./fields/titleField.js";
|
|
8
8
|
import { getContentModelDescriptionFieldId } from "./fields/descriptionField.js";
|
|
9
9
|
import { getContentModelImageFieldId } from "./fields/imageField.js";
|
|
10
|
-
import { CmsGraphQLSchemaPlugin
|
|
10
|
+
import { CmsGraphQLSchemaPlugin } from "../../../plugins/index.js";
|
|
11
11
|
import { buildSchemaPlugins } from "../../../graphql/buildSchemaPlugins.js";
|
|
12
12
|
import { createExecutableSchema } from "../../../graphql/createExecutableSchema.js";
|
|
13
|
+
import { CmsGraphQLSchemaSorter, CmsModelFieldToGraphQLRegistry } from "../../../features/graphql/index.js";
|
|
13
14
|
const extractInvalidField = (model, err) => {
|
|
14
15
|
const sdl = err.source?.body || "";
|
|
15
16
|
|
|
@@ -53,7 +54,7 @@ const extractInvalidField = (model, err) => {
|
|
|
53
54
|
message: [`Model "${model.modelId}" was not saved!`, message].join("\n")
|
|
54
55
|
};
|
|
55
56
|
};
|
|
56
|
-
const createValidateChildFields =
|
|
57
|
+
const createValidateChildFields = registry => {
|
|
57
58
|
return ({
|
|
58
59
|
fields,
|
|
59
60
|
originalFields
|
|
@@ -64,13 +65,13 @@ const createValidateChildFields = plugins => {
|
|
|
64
65
|
validateFields({
|
|
65
66
|
fields,
|
|
66
67
|
originalFields,
|
|
67
|
-
|
|
68
|
+
registry
|
|
68
69
|
});
|
|
69
70
|
};
|
|
70
71
|
};
|
|
71
72
|
const validateFields = params => {
|
|
72
73
|
const {
|
|
73
|
-
|
|
74
|
+
registry,
|
|
74
75
|
fields,
|
|
75
76
|
originalFields
|
|
76
77
|
} = params;
|
|
@@ -79,8 +80,8 @@ const validateFields = params => {
|
|
|
79
80
|
const storageIdList = [];
|
|
80
81
|
for (const field of fields) {
|
|
81
82
|
const baseType = getBaseFieldType(field);
|
|
82
|
-
const
|
|
83
|
-
if (!
|
|
83
|
+
const fieldImpl = registry.get(baseType);
|
|
84
|
+
if (!fieldImpl) {
|
|
84
85
|
throw new Error(`Cannot update content model because of the unknown "${baseType}" field.`);
|
|
85
86
|
}
|
|
86
87
|
/**
|
|
@@ -143,11 +144,11 @@ const validateFields = params => {
|
|
|
143
144
|
* There might be some plugins which allow child fields.
|
|
144
145
|
* We use this method to validate them as well.
|
|
145
146
|
*/
|
|
146
|
-
if (!
|
|
147
|
+
if (!fieldImpl.validateChildFields) {
|
|
147
148
|
continue;
|
|
148
149
|
}
|
|
149
|
-
const validateChildFields = createValidateChildFields(
|
|
150
|
-
|
|
150
|
+
const validateChildFields = createValidateChildFields(registry);
|
|
151
|
+
fieldImpl.validateChildFields({
|
|
151
152
|
field,
|
|
152
153
|
originalField,
|
|
153
154
|
validate: validateChildFields
|
|
@@ -205,9 +206,6 @@ export const validateModelFields = async params => {
|
|
|
205
206
|
descriptionFieldId,
|
|
206
207
|
imageFieldId
|
|
207
208
|
} = model;
|
|
208
|
-
const {
|
|
209
|
-
plugins
|
|
210
|
-
} = context;
|
|
211
209
|
|
|
212
210
|
/**
|
|
213
211
|
* There should be fields/locked fields in either model or data to be updated.
|
|
@@ -220,25 +218,22 @@ export const validateModelFields = async params => {
|
|
|
220
218
|
* Let's inspect the fields of the received content model. We prevent saving of a content model if it
|
|
221
219
|
* contains a field for which a "cms-model-field-to-graphql" plugin does not exist on the backend.
|
|
222
220
|
*/
|
|
223
|
-
const
|
|
221
|
+
const fieldRegistry = context.container.resolve(CmsModelFieldToGraphQLRegistry);
|
|
222
|
+
const sorters = context.container.resolveAll(CmsGraphQLSchemaSorter);
|
|
224
223
|
validateFields({
|
|
225
224
|
fields,
|
|
226
225
|
originalFields: original?.fields || [],
|
|
227
|
-
|
|
226
|
+
registry: fieldRegistry
|
|
228
227
|
});
|
|
229
228
|
if (fields.length) {
|
|
230
|
-
const sorterPlugins = plugins.byType(CmsGraphQLSchemaSorterPlugin.type);
|
|
231
229
|
/**
|
|
232
230
|
* Make sure that this model can be safely converted to a GraphQL SDL
|
|
233
231
|
*/
|
|
234
232
|
const schema = createManageSDL({
|
|
235
233
|
models,
|
|
236
234
|
model,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
[pl.fieldType]: pl
|
|
240
|
-
}), {}),
|
|
241
|
-
sorterPlugins
|
|
235
|
+
fieldRegistry,
|
|
236
|
+
sorters
|
|
242
237
|
});
|
|
243
238
|
try {
|
|
244
239
|
gql(schema);
|