@webiny/api-headless-cms 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/context.d.ts +2 -5
  2. package/context.js +16 -7
  3. package/context.js.map +1 -1
  4. package/crud/AccessControl/AccessControl.d.ts +18 -28
  5. package/crud/AccessControl/AccessControl.js.map +1 -1
  6. package/crud/contentEntry/entryDataFactories/createEntryData.js +17 -6
  7. package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -1
  8. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +9 -3
  9. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -1
  10. package/crud/contentEntry/entryDataValidation.d.ts +1 -1
  11. package/crud/contentEntry/entryDataValidation.js +16 -13
  12. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  13. package/crud/contentEntry/searchableFields.d.ts +2 -3
  14. package/crud/contentEntry/searchableFields.js +10 -18
  15. package/crud/contentEntry/searchableFields.js.map +1 -1
  16. package/crud/contentModel.crud.js +2 -1
  17. package/crud/contentModel.crud.js.map +1 -1
  18. package/domain/contentModel/validation/modelFields.js +15 -20
  19. package/domain/contentModel/validation/modelFields.js.map +1 -1
  20. package/exports/api/cms/graphql.d.ts +1 -0
  21. package/exports/api/cms/graphql.js +3 -0
  22. package/exports/api/cms/graphql.js.map +1 -0
  23. package/exports/api/cms/storage.d.ts +3 -0
  24. package/exports/api/cms/storage.js +5 -0
  25. package/exports/api/cms/storage.js.map +1 -0
  26. package/exports/api/cms/validation.d.ts +4 -0
  27. package/exports/api/cms/validation.js +6 -0
  28. package/exports/api/cms/validation.js.map +1 -0
  29. package/features/contentEntry/CreateEntry/CreateEntryUseCase.d.ts +3 -3
  30. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +3 -3
  31. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
  32. package/features/contentEntry/CreateEntry/events.d.ts +2 -2
  33. package/features/contentEntry/CreateEntry/events.js +1 -1
  34. package/features/contentEntry/CreateEntry/events.js.map +1 -1
  35. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +3 -3
  36. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +3 -3
  37. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
  38. package/features/contentEntry/CreateEntryRevisionFrom/events.d.ts +2 -2
  39. package/features/contentEntry/CreateEntryRevisionFrom/events.js +1 -1
  40. package/features/contentEntry/CreateEntryRevisionFrom/events.js.map +1 -1
  41. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.d.ts +1 -1
  42. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js +1 -1
  43. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js.map +1 -1
  44. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.d.ts +2 -2
  45. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js +2 -2
  46. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js.map +1 -1
  47. package/features/contentEntry/DeleteEntry/events.d.ts +2 -2
  48. package/features/contentEntry/DeleteEntry/events.js +1 -1
  49. package/features/contentEntry/DeleteEntry/events.js.map +1 -1
  50. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.d.ts +1 -1
  51. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js +1 -1
  52. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js.map +1 -1
  53. package/features/contentEntry/DeleteEntryRevision/events.d.ts +2 -2
  54. package/features/contentEntry/DeleteEntryRevision/events.js +1 -1
  55. package/features/contentEntry/DeleteEntryRevision/events.js.map +1 -1
  56. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.d.ts +1 -1
  57. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js +1 -1
  58. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js.map +1 -1
  59. package/features/contentEntry/DeleteMultipleEntries/events.d.ts +2 -2
  60. package/features/contentEntry/DeleteMultipleEntries/events.js +1 -1
  61. package/features/contentEntry/DeleteMultipleEntries/events.js.map +1 -1
  62. package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js +6 -11
  63. package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js.map +1 -1
  64. package/features/contentEntry/ListEntries/ListEntriesUseCase.d.ts +1 -1
  65. package/features/contentEntry/ListEntries/ListEntriesUseCase.js +1 -1
  66. package/features/contentEntry/ListEntries/ListEntriesUseCase.js.map +1 -1
  67. package/features/contentEntry/MoveEntry/MoveEntryUseCase.d.ts +1 -1
  68. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js +1 -1
  69. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js.map +1 -1
  70. package/features/contentEntry/MoveEntry/events.d.ts +2 -2
  71. package/features/contentEntry/MoveEntry/events.js +1 -1
  72. package/features/contentEntry/MoveEntry/events.js.map +1 -1
  73. package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
  74. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +2 -2
  75. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  76. package/features/contentEntry/PublishEntry/events.d.ts +2 -2
  77. package/features/contentEntry/PublishEntry/events.js +1 -1
  78. package/features/contentEntry/PublishEntry/events.js.map +1 -1
  79. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.d.ts +2 -2
  80. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +2 -2
  81. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
  82. package/features/contentEntry/RepublishEntry/events.d.ts +2 -2
  83. package/features/contentEntry/RepublishEntry/events.js +1 -1
  84. package/features/contentEntry/RepublishEntry/events.js.map +1 -1
  85. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.d.ts +2 -2
  86. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js +2 -2
  87. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js.map +1 -1
  88. package/features/contentEntry/RestoreEntryFromBin/events.d.ts +2 -2
  89. package/features/contentEntry/RestoreEntryFromBin/events.js +1 -1
  90. package/features/contentEntry/RestoreEntryFromBin/events.js.map +1 -1
  91. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.d.ts +2 -2
  92. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +2 -2
  93. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
  94. package/features/contentEntry/UnpublishEntry/events.d.ts +2 -2
  95. package/features/contentEntry/UnpublishEntry/events.js +1 -1
  96. package/features/contentEntry/UnpublishEntry/events.js.map +1 -1
  97. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.d.ts +3 -3
  98. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +3 -3
  99. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
  100. package/features/contentEntry/UpdateEntry/events.d.ts +2 -2
  101. package/features/contentEntry/UpdateEntry/events.js +1 -1
  102. package/features/contentEntry/UpdateEntry/events.js.map +1 -1
  103. package/features/contentModel/CreateModel/CreateModelRepository.d.ts +1 -1
  104. package/features/contentModel/CreateModel/CreateModelRepository.js +1 -1
  105. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  106. package/features/contentModel/CreateModel/CreateModelUseCase.d.ts +3 -3
  107. package/features/contentModel/CreateModel/CreateModelUseCase.js +3 -3
  108. package/features/contentModel/CreateModel/CreateModelUseCase.js.map +1 -1
  109. package/features/contentModel/CreateModel/events.d.ts +2 -2
  110. package/features/contentModel/CreateModel/events.js +1 -1
  111. package/features/contentModel/CreateModel/events.js.map +1 -1
  112. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.d.ts +1 -1
  113. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +1 -1
  114. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  115. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.d.ts +3 -3
  116. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js +4 -3
  117. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js.map +1 -1
  118. package/features/contentModel/CreateModelFrom/events.d.ts +2 -2
  119. package/features/contentModel/CreateModelFrom/events.js +1 -1
  120. package/features/contentModel/CreateModelFrom/events.js.map +1 -1
  121. package/features/contentModel/DeleteModel/DeleteModelUseCase.d.ts +1 -1
  122. package/features/contentModel/DeleteModel/DeleteModelUseCase.js +1 -1
  123. package/features/contentModel/DeleteModel/DeleteModelUseCase.js.map +1 -1
  124. package/features/contentModel/DeleteModel/events.d.ts +2 -2
  125. package/features/contentModel/DeleteModel/events.js +1 -1
  126. package/features/contentModel/DeleteModel/events.js.map +1 -1
  127. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.d.ts +3 -3
  128. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js +6 -6
  129. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js.map +1 -1
  130. package/features/contentModel/UpdateModel/UpdateModelUseCase.d.ts +2 -2
  131. package/features/contentModel/UpdateModel/UpdateModelUseCase.js +2 -2
  132. package/features/contentModel/UpdateModel/UpdateModelUseCase.js.map +1 -1
  133. package/features/contentModel/UpdateModel/events.d.ts +2 -2
  134. package/features/contentModel/UpdateModel/events.js +1 -1
  135. package/features/contentModel/UpdateModel/events.js.map +1 -1
  136. package/features/contentModel/shared/ModelsFetcher.d.ts +1 -1
  137. package/features/contentModel/shared/ModelsFetcher.js +1 -1
  138. package/features/contentModel/shared/ModelsFetcher.js.map +1 -1
  139. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.d.ts +1 -1
  140. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js +1 -1
  141. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js.map +1 -1
  142. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.d.ts +3 -3
  143. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js +3 -3
  144. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js.map +1 -1
  145. package/features/contentModelGroup/CreateGroup/events.d.ts +2 -2
  146. package/features/contentModelGroup/CreateGroup/events.js +1 -1
  147. package/features/contentModelGroup/CreateGroup/events.js.map +1 -1
  148. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.d.ts +1 -1
  149. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js +1 -1
  150. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js.map +1 -1
  151. package/features/contentModelGroup/DeleteGroup/events.d.ts +2 -2
  152. package/features/contentModelGroup/DeleteGroup/events.js +1 -1
  153. package/features/contentModelGroup/DeleteGroup/events.js.map +1 -1
  154. package/features/contentModelGroup/GetGroup/GetGroupRepository.d.ts +2 -2
  155. package/features/contentModelGroup/GetGroup/GetGroupRepository.js +2 -2
  156. package/features/contentModelGroup/GetGroup/GetGroupRepository.js.map +1 -1
  157. package/features/contentModelGroup/ListGroups/ListGroupsRepository.d.ts +2 -2
  158. package/features/contentModelGroup/ListGroups/ListGroupsRepository.js +2 -2
  159. package/features/contentModelGroup/ListGroups/ListGroupsRepository.js.map +1 -1
  160. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.d.ts +2 -2
  161. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js +2 -2
  162. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js.map +1 -1
  163. package/features/contentModelGroup/UpdateGroup/events.d.ts +2 -2
  164. package/features/contentModelGroup/UpdateGroup/events.js +1 -1
  165. package/features/contentModelGroup/UpdateGroup/events.js.map +1 -1
  166. package/features/contentModelGroup/shared/PluginGroupsProvider.d.ts +2 -2
  167. package/features/contentModelGroup/shared/PluginGroupsProvider.js +2 -2
  168. package/features/contentModelGroup/shared/PluginGroupsProvider.js.map +1 -1
  169. package/features/graphql/feature.d.ts +1 -0
  170. package/features/graphql/feature.js +34 -0
  171. package/features/graphql/feature.js.map +1 -0
  172. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.d.ts +13 -0
  173. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js +27 -0
  174. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js.map +1 -0
  175. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.d.ts +97 -0
  176. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js +4 -0
  177. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js.map +1 -0
  178. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.d.ts +10 -0
  179. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js +4 -0
  180. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js.map +1 -0
  181. package/features/graphql/fields/base/BooleanToGraphQL.d.ts +26 -0
  182. package/features/graphql/fields/base/BooleanToGraphQL.js +68 -0
  183. package/features/graphql/fields/base/BooleanToGraphQL.js.map +1 -0
  184. package/features/graphql/fields/base/DateTimeToGraphQL.d.ts +26 -0
  185. package/features/graphql/fields/base/DateTimeToGraphQL.js +97 -0
  186. package/features/graphql/fields/base/DateTimeToGraphQL.js.map +1 -0
  187. package/features/graphql/fields/base/DynamicZoneToGraphQL.d.ts +30 -0
  188. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +280 -0
  189. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -0
  190. package/features/graphql/fields/base/FileToGraphQL.d.ts +22 -0
  191. package/features/graphql/fields/base/FileToGraphQL.js +39 -0
  192. package/features/graphql/fields/base/FileToGraphQL.js.map +1 -0
  193. package/features/graphql/fields/base/JsonToGraphQL.d.ts +24 -0
  194. package/features/graphql/fields/base/JsonToGraphQL.js +52 -0
  195. package/features/graphql/fields/base/JsonToGraphQL.js.map +1 -0
  196. package/features/graphql/fields/base/LongTextToGraphQL.d.ts +24 -0
  197. package/features/graphql/fields/base/LongTextToGraphQL.js +57 -0
  198. package/features/graphql/fields/base/LongTextToGraphQL.js.map +1 -0
  199. package/features/graphql/fields/base/NumberToGraphQL.d.ts +26 -0
  200. package/features/graphql/fields/base/NumberToGraphQL.js +78 -0
  201. package/features/graphql/fields/base/NumberToGraphQL.js.map +1 -0
  202. package/features/graphql/fields/base/ObjectToGraphQL.d.ts +31 -0
  203. package/features/graphql/fields/base/ObjectToGraphQL.js +264 -0
  204. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -0
  205. package/features/graphql/fields/base/RefToGraphQL.d.ts +29 -0
  206. package/features/graphql/fields/base/RefToGraphQL.js +261 -0
  207. package/features/graphql/fields/base/RefToGraphQL.js.map +1 -0
  208. package/features/graphql/fields/base/RichTextToGraphQL.d.ts +25 -0
  209. package/features/graphql/fields/base/RichTextToGraphQL.js +58 -0
  210. package/features/graphql/fields/base/RichTextToGraphQL.js.map +1 -0
  211. package/features/graphql/fields/base/SearchableJsonToGraphQL.d.ts +26 -0
  212. package/features/graphql/fields/base/SearchableJsonToGraphQL.js +62 -0
  213. package/features/graphql/fields/base/SearchableJsonToGraphQL.js.map +1 -0
  214. package/features/graphql/fields/base/TextToGraphQL.d.ts +26 -0
  215. package/features/graphql/fields/base/TextToGraphQL.js +74 -0
  216. package/features/graphql/fields/base/TextToGraphQL.js.map +1 -0
  217. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.d.ts +16 -0
  218. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js +37 -0
  219. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js.map +1 -0
  220. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.d.ts +3 -0
  221. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js +14 -0
  222. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js.map +1 -0
  223. package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.d.ts +1 -1
  224. package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.js +2 -2
  225. package/features/graphql/fields/base/richText/richTextResolver.js.map +1 -0
  226. package/{graphqlFields/helpers.d.ts → features/graphql/fields/base/utils/createGraphQLInputField.d.ts} +1 -1
  227. package/features/graphql/fields/base/utils/createGraphQLInputField.js +17 -0
  228. package/features/graphql/fields/base/utils/createGraphQLInputField.js.map +1 -0
  229. package/features/graphql/index.d.ts +4 -0
  230. package/features/graphql/index.js +6 -0
  231. package/features/graphql/index.js.map +1 -0
  232. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.d.ts +13 -0
  233. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js +4 -0
  234. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js.map +1 -0
  235. package/features/installer/CmsInstaller.d.ts +1 -1
  236. package/features/installer/CmsInstaller.js +1 -1
  237. package/features/installer/CmsInstaller.js.map +1 -1
  238. package/features/shared/abstractions.d.ts +9 -2
  239. package/features/shared/abstractions.js +1 -0
  240. package/features/shared/abstractions.js.map +1 -1
  241. package/features/storage/StorageTransformRegistry.d.ts +13 -0
  242. package/features/storage/StorageTransformRegistry.js +27 -0
  243. package/features/storage/StorageTransformRegistry.js.map +1 -0
  244. package/features/storage/abstractions/StorageTransform.d.ts +26 -0
  245. package/features/storage/abstractions/StorageTransform.js +4 -0
  246. package/features/storage/abstractions/StorageTransform.js.map +1 -0
  247. package/features/storage/abstractions/StorageTransformRegistry.d.ts +10 -0
  248. package/features/storage/abstractions/StorageTransformRegistry.js +4 -0
  249. package/features/storage/abstractions/StorageTransformRegistry.js.map +1 -0
  250. package/features/storage/feature.d.ts +1 -0
  251. package/features/storage/feature.js +24 -0
  252. package/features/storage/feature.js.map +1 -0
  253. package/features/storage/fields/DateStorageTransform.d.ts +10 -0
  254. package/features/storage/fields/DateStorageTransform.js +110 -0
  255. package/features/storage/fields/DateStorageTransform.js.map +1 -0
  256. package/features/storage/fields/DefaultStorageTransform.d.ts +10 -0
  257. package/features/storage/fields/DefaultStorageTransform.js +20 -0
  258. package/features/storage/fields/DefaultStorageTransform.js.map +1 -0
  259. package/features/storage/fields/DynamicZoneStorageTransform.d.ts +10 -0
  260. package/features/storage/fields/DynamicZoneStorageTransform.js +142 -0
  261. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -0
  262. package/features/storage/fields/JsonStorageTransform.d.ts +13 -0
  263. package/features/storage/fields/JsonStorageTransform.js +31 -0
  264. package/features/storage/fields/JsonStorageTransform.js.map +1 -0
  265. package/features/storage/fields/LongTextStorageTransform.d.ts +18 -0
  266. package/features/storage/fields/LongTextStorageTransform.js +55 -0
  267. package/features/storage/fields/LongTextStorageTransform.js.map +1 -0
  268. package/features/storage/fields/ObjectStorageTransform.d.ts +10 -0
  269. package/features/storage/fields/ObjectStorageTransform.js +99 -0
  270. package/features/storage/fields/ObjectStorageTransform.js.map +1 -0
  271. package/features/storage/fields/RichTextStorageTransform.d.ts +13 -0
  272. package/features/storage/fields/RichTextStorageTransform.js +39 -0
  273. package/features/storage/fields/RichTextStorageTransform.js.map +1 -0
  274. package/features/storage/index.d.ts +3 -0
  275. package/features/storage/index.js +5 -0
  276. package/features/storage/index.js.map +1 -0
  277. package/features/validation/CmsModelFieldPatternValidatorRegistry.d.ts +12 -0
  278. package/features/validation/CmsModelFieldPatternValidatorRegistry.js +21 -0
  279. package/features/validation/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
  280. package/features/validation/CmsModelFieldValidatorRegistry.d.ts +12 -0
  281. package/features/validation/CmsModelFieldValidatorRegistry.js +23 -0
  282. package/features/validation/CmsModelFieldValidatorRegistry.js.map +1 -0
  283. package/features/validation/abstractions/CmsModelFieldPatternValidator.d.ts +13 -0
  284. package/features/validation/abstractions/CmsModelFieldPatternValidator.js +4 -0
  285. package/features/validation/abstractions/CmsModelFieldPatternValidator.js.map +1 -0
  286. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.d.ts +9 -0
  287. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js +4 -0
  288. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
  289. package/features/validation/abstractions/CmsModelFieldValidator.d.ts +11 -0
  290. package/features/validation/abstractions/CmsModelFieldValidator.js +4 -0
  291. package/features/validation/abstractions/CmsModelFieldValidator.js.map +1 -0
  292. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.d.ts +9 -0
  293. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js +4 -0
  294. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js.map +1 -0
  295. package/features/validation/feature.d.ts +1 -0
  296. package/features/validation/feature.js +48 -0
  297. package/features/validation/feature.js.map +1 -0
  298. package/features/validation/index.d.ts +5 -0
  299. package/features/validation/index.js +7 -0
  300. package/features/validation/index.js.map +1 -0
  301. package/features/validation/validators/DateGteValidator.d.ts +10 -0
  302. package/features/validation/validators/DateGteValidator.js +26 -0
  303. package/features/validation/validators/DateGteValidator.js.map +1 -0
  304. package/features/validation/validators/DateLteValidator.d.ts +10 -0
  305. package/features/validation/validators/DateLteValidator.js +26 -0
  306. package/features/validation/validators/DateLteValidator.js.map +1 -0
  307. package/features/validation/validators/GteValidator.d.ts +10 -0
  308. package/features/validation/validators/GteValidator.js +21 -0
  309. package/features/validation/validators/GteValidator.js.map +1 -0
  310. package/features/validation/validators/InValidator.d.ts +10 -0
  311. package/features/validation/validators/InValidator.js +21 -0
  312. package/features/validation/validators/InValidator.js.map +1 -0
  313. package/features/validation/validators/LteValidator.d.ts +10 -0
  314. package/features/validation/validators/LteValidator.js +21 -0
  315. package/features/validation/validators/LteValidator.js.map +1 -0
  316. package/features/validation/validators/MaxLengthValidator.d.ts +10 -0
  317. package/features/validation/validators/MaxLengthValidator.js +21 -0
  318. package/features/validation/validators/MaxLengthValidator.js.map +1 -0
  319. package/features/validation/validators/MinLengthValidator.d.ts +10 -0
  320. package/features/validation/validators/MinLengthValidator.js +21 -0
  321. package/features/validation/validators/MinLengthValidator.js.map +1 -0
  322. package/features/validation/validators/PatternValidator.d.ts +13 -0
  323. package/features/validation/validators/PatternValidator.js +38 -0
  324. package/features/validation/validators/PatternValidator.js.map +1 -0
  325. package/features/validation/validators/RequiredValidator.d.ts +10 -0
  326. package/features/validation/validators/RequiredValidator.js +16 -0
  327. package/features/validation/validators/RequiredValidator.js.map +1 -0
  328. package/features/validation/validators/TimeGteValidator.d.ts +10 -0
  329. package/features/validation/validators/TimeGteValidator.js +21 -0
  330. package/features/validation/validators/TimeGteValidator.js.map +1 -0
  331. package/features/validation/validators/TimeLteValidator.d.ts +10 -0
  332. package/features/validation/validators/TimeLteValidator.js +21 -0
  333. package/features/validation/validators/TimeLteValidator.js.map +1 -0
  334. package/features/validation/validators/UniqueValidator.d.ts +10 -0
  335. package/features/validation/validators/UniqueValidator.js +47 -0
  336. package/features/validation/validators/UniqueValidator.js.map +1 -0
  337. package/features/validation/validators/patterns/EmailPattern.d.ts +12 -0
  338. package/features/validation/validators/patterns/EmailPattern.js +14 -0
  339. package/features/validation/validators/patterns/EmailPattern.js.map +1 -0
  340. package/features/validation/validators/patterns/LowerCasePattern.d.ts +12 -0
  341. package/features/validation/validators/patterns/LowerCasePattern.js +14 -0
  342. package/features/validation/validators/patterns/LowerCasePattern.js.map +1 -0
  343. package/features/validation/validators/patterns/LowerCaseSpacePattern.d.ts +12 -0
  344. package/features/validation/validators/patterns/LowerCaseSpacePattern.js +14 -0
  345. package/features/validation/validators/patterns/LowerCaseSpacePattern.js.map +1 -0
  346. package/features/validation/validators/patterns/UpperCasePattern.d.ts +12 -0
  347. package/features/validation/validators/patterns/UpperCasePattern.js +14 -0
  348. package/features/validation/validators/patterns/UpperCasePattern.js.map +1 -0
  349. package/features/validation/validators/patterns/UpperCaseSpacePattern.d.ts +12 -0
  350. package/features/validation/validators/patterns/UpperCaseSpacePattern.js +14 -0
  351. package/features/validation/validators/patterns/UpperCaseSpacePattern.js.map +1 -0
  352. package/features/validation/validators/patterns/UrlPattern.d.ts +12 -0
  353. package/features/validation/validators/patterns/UrlPattern.js +14 -0
  354. package/features/validation/validators/patterns/UrlPattern.js.map +1 -0
  355. package/graphql/getSchema/generateCacheKey.js +1 -1
  356. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  357. package/graphql/schema/baseSchema.d.ts +2 -1
  358. package/graphql/schema/baseSchema.js +11 -9
  359. package/graphql/schema/baseSchema.js.map +1 -1
  360. package/graphql/schema/createFieldResolvers.d.ts +3 -2
  361. package/graphql/schema/createFieldResolvers.js +5 -4
  362. package/graphql/schema/createFieldResolvers.js.map +1 -1
  363. package/graphql/schema/createManageResolvers.d.ts +3 -2
  364. package/graphql/schema/createManageResolvers.js +3 -3
  365. package/graphql/schema/createManageResolvers.js.map +1 -1
  366. package/graphql/schema/createManageSDL.d.ts +4 -4
  367. package/graphql/schema/createManageSDL.js +8 -8
  368. package/graphql/schema/createManageSDL.js.map +1 -1
  369. package/graphql/schema/createPreviewResolvers.d.ts +3 -2
  370. package/graphql/schema/createPreviewResolvers.js +4 -4
  371. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  372. package/graphql/schema/createReadResolvers.d.ts +3 -2
  373. package/graphql/schema/createReadResolvers.js +4 -4
  374. package/graphql/schema/createReadResolvers.js.map +1 -1
  375. package/graphql/schema/createReadSDL.d.ts +4 -4
  376. package/graphql/schema/createReadSDL.js +7 -7
  377. package/graphql/schema/createReadSDL.js.map +1 -1
  378. package/graphql/schema/createSingularResolvers.d.ts +3 -2
  379. package/graphql/schema/createSingularResolvers.js +3 -3
  380. package/graphql/schema/createSingularResolvers.js.map +1 -1
  381. package/graphql/schema/createSingularSDL.d.ts +3 -2
  382. package/graphql/schema/createSingularSDL.js +3 -3
  383. package/graphql/schema/createSingularSDL.js.map +1 -1
  384. package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js +6 -7
  385. package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js.map +1 -1
  386. package/graphql/schema/schemaPlugins.js +14 -17
  387. package/graphql/schema/schemaPlugins.js.map +1 -1
  388. package/index.d.ts +1 -4
  389. package/index.js +2 -6
  390. package/index.js.map +1 -1
  391. package/package.json +25 -25
  392. package/plugins/index.d.ts +0 -2
  393. package/plugins/index.js +0 -2
  394. package/plugins/index.js.map +1 -1
  395. package/types/modelField.d.ts +1 -1
  396. package/types/modelField.js.map +1 -1
  397. package/types/plugins.d.ts +1 -305
  398. package/types/plugins.js.map +1 -1
  399. package/types/types.d.ts +4 -44
  400. package/types/types.js +0 -4
  401. package/types/types.js.map +1 -1
  402. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.d.ts +3 -2
  403. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js +3 -3
  404. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js.map +1 -1
  405. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.d.ts +4 -3
  406. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js +3 -3
  407. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js.map +1 -1
  408. package/utils/converters/ConverterCollection.d.ts +2 -0
  409. package/utils/converters/ConverterCollection.js +3 -2
  410. package/utils/converters/ConverterCollection.js.map +1 -1
  411. package/utils/converters/valueKeyFromStorageConverter.d.ts +2 -0
  412. package/utils/converters/valueKeyFromStorageConverter.js +4 -2
  413. package/utils/converters/valueKeyFromStorageConverter.js.map +1 -1
  414. package/utils/converters/valueKeyStorageConverter.d.ts +2 -3
  415. package/utils/converters/valueKeyStorageConverter.js +7 -3
  416. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  417. package/utils/converters/valueKeyToStorageConverter.d.ts +2 -0
  418. package/utils/converters/valueKeyToStorageConverter.js +4 -2
  419. package/utils/converters/valueKeyToStorageConverter.js.map +1 -1
  420. package/utils/createTypeFromFields.d.ts +3 -2
  421. package/utils/createTypeFromFields.js +3 -3
  422. package/utils/createTypeFromFields.js.map +1 -1
  423. package/utils/entryStorage.d.ts +8 -15
  424. package/utils/entryStorage.js +31 -59
  425. package/utils/entryStorage.js.map +1 -1
  426. package/utils/getBaseFieldType.js +3 -0
  427. package/utils/getBaseFieldType.js.map +1 -1
  428. package/utils/getSchemaFromFieldPlugins.d.ts +3 -2
  429. package/utils/getSchemaFromFieldPlugins.js +5 -9
  430. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  431. package/utils/renderFields.d.ts +4 -3
  432. package/utils/renderFields.js +14 -9
  433. package/utils/renderFields.js.map +1 -1
  434. package/utils/renderGetFilterFields.d.ts +3 -2
  435. package/utils/renderGetFilterFields.js +2 -2
  436. package/utils/renderGetFilterFields.js.map +1 -1
  437. package/utils/renderInputFields.d.ts +4 -3
  438. package/utils/renderInputFields.js +5 -11
  439. package/utils/renderInputFields.js.map +1 -1
  440. package/utils/renderListFilterFields.d.ts +3 -2
  441. package/utils/renderListFilterFields.js +5 -3
  442. package/utils/renderListFilterFields.js.map +1 -1
  443. package/utils/renderSortEnum.d.ts +4 -4
  444. package/utils/renderSortEnum.js +11 -11
  445. package/utils/renderSortEnum.js.map +1 -1
  446. package/graphql/schema/createFieldTypePluginRecords.d.ts +0 -3
  447. package/graphql/schema/createFieldTypePluginRecords.js +0 -8
  448. package/graphql/schema/createFieldTypePluginRecords.js.map +0 -1
  449. package/graphqlFields/boolean.d.ts +0 -2
  450. package/graphqlFields/boolean.js +0 -52
  451. package/graphqlFields/boolean.js.map +0 -1
  452. package/graphqlFields/datetime.d.ts +0 -2
  453. package/graphqlFields/datetime.js +0 -71
  454. package/graphqlFields/datetime.js.map +0 -1
  455. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +0 -2
  456. package/graphqlFields/dynamicZone/dynamicZoneField.js +0 -313
  457. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +0 -1
  458. package/graphqlFields/dynamicZone/index.d.ts +0 -1
  459. package/graphqlFields/dynamicZone/index.js +0 -3
  460. package/graphqlFields/dynamicZone/index.js.map +0 -1
  461. package/graphqlFields/file.d.ts +0 -2
  462. package/graphqlFields/file.js +0 -37
  463. package/graphqlFields/file.js.map +0 -1
  464. package/graphqlFields/helpers.js +0 -20
  465. package/graphqlFields/helpers.js.map +0 -1
  466. package/graphqlFields/index.d.ts +0 -2
  467. package/graphqlFields/index.js +0 -15
  468. package/graphqlFields/index.js.map +0 -1
  469. package/graphqlFields/json.d.ts +0 -2
  470. package/graphqlFields/json.js +0 -42
  471. package/graphqlFields/json.js.map +0 -1
  472. package/graphqlFields/longText.d.ts +0 -2
  473. package/graphqlFields/longText.js +0 -57
  474. package/graphqlFields/longText.js.map +0 -1
  475. package/graphqlFields/number.d.ts +0 -2
  476. package/graphqlFields/number.js +0 -63
  477. package/graphqlFields/number.js.map +0 -1
  478. package/graphqlFields/object.d.ts +0 -2
  479. package/graphqlFields/object.js +0 -245
  480. package/graphqlFields/object.js.map +0 -1
  481. package/graphqlFields/ref.d.ts +0 -2
  482. package/graphqlFields/ref.js +0 -286
  483. package/graphqlFields/ref.js.map +0 -1
  484. package/graphqlFields/richText/richTextResolver.js.map +0 -1
  485. package/graphqlFields/richText.d.ts +0 -2
  486. package/graphqlFields/richText.js +0 -48
  487. package/graphqlFields/richText.js.map +0 -1
  488. package/graphqlFields/searchableJson.d.ts +0 -2
  489. package/graphqlFields/searchableJson.js +0 -53
  490. package/graphqlFields/searchableJson.js.map +0 -1
  491. package/graphqlFields/text.d.ts +0 -2
  492. package/graphqlFields/text.js +0 -59
  493. package/graphqlFields/text.js.map +0 -1
  494. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +0 -20
  495. package/plugins/CmsGraphQLSchemaSorterPlugin.js +0 -19
  496. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +0 -1
  497. package/plugins/StorageTransformPlugin.d.ts +0 -35
  498. package/plugins/StorageTransformPlugin.js +0 -26
  499. package/plugins/StorageTransformPlugin.js.map +0 -1
  500. package/storage/date.d.ts +0 -3
  501. package/storage/date.js +0 -110
  502. package/storage/date.js.map +0 -1
  503. package/storage/default.d.ts +0 -2
  504. package/storage/default.js +0 -19
  505. package/storage/default.js.map +0 -1
  506. package/storage/dynamicZone.d.ts +0 -2
  507. package/storage/dynamicZone.js +0 -149
  508. package/storage/dynamicZone.js.map +0 -1
  509. package/storage/index.d.ts +0 -1
  510. package/storage/index.js +0 -13
  511. package/storage/index.js.map +0 -1
  512. package/storage/json.d.ts +0 -2
  513. package/storage/json.js +0 -49
  514. package/storage/json.js.map +0 -1
  515. package/storage/object.d.ts +0 -2
  516. package/storage/object.js +0 -104
  517. package/storage/object.js.map +0 -1
  518. package/validators/dateGte.d.ts +0 -2
  519. package/validators/dateGte.js +0 -25
  520. package/validators/dateGte.js.map +0 -1
  521. package/validators/dateLte.d.ts +0 -2
  522. package/validators/dateLte.js +0 -25
  523. package/validators/dateLte.js.map +0 -1
  524. package/validators/gte.d.ts +0 -2
  525. package/validators/gte.js +0 -22
  526. package/validators/gte.js.map +0 -1
  527. package/validators/in.d.ts +0 -2
  528. package/validators/in.js +0 -22
  529. package/validators/in.js.map +0 -1
  530. package/validators/index.d.ts +0 -1
  531. package/validators/index.js +0 -16
  532. package/validators/index.js.map +0 -1
  533. package/validators/lte.d.ts +0 -2
  534. package/validators/lte.js +0 -22
  535. package/validators/lte.js.map +0 -1
  536. package/validators/maxLength.d.ts +0 -2
  537. package/validators/maxLength.js +0 -22
  538. package/validators/maxLength.js.map +0 -1
  539. package/validators/minLength.d.ts +0 -2
  540. package/validators/minLength.js +0 -22
  541. package/validators/minLength.js.map +0 -1
  542. package/validators/pattern.d.ts +0 -2
  543. package/validators/pattern.js +0 -36
  544. package/validators/pattern.js.map +0 -1
  545. package/validators/patternPlugins/email.d.ts +0 -2
  546. package/validators/patternPlugins/email.js +0 -13
  547. package/validators/patternPlugins/email.js.map +0 -1
  548. package/validators/patternPlugins/index.d.ts +0 -2
  549. package/validators/patternPlugins/index.js +0 -11
  550. package/validators/patternPlugins/index.js.map +0 -1
  551. package/validators/patternPlugins/lowerCase.d.ts +0 -2
  552. package/validators/patternPlugins/lowerCase.js +0 -13
  553. package/validators/patternPlugins/lowerCase.js.map +0 -1
  554. package/validators/patternPlugins/lowerCaseSpace.d.ts +0 -2
  555. package/validators/patternPlugins/lowerCaseSpace.js +0 -13
  556. package/validators/patternPlugins/lowerCaseSpace.js.map +0 -1
  557. package/validators/patternPlugins/upperCase.d.ts +0 -2
  558. package/validators/patternPlugins/upperCase.js +0 -13
  559. package/validators/patternPlugins/upperCase.js.map +0 -1
  560. package/validators/patternPlugins/upperCaseSpace.d.ts +0 -2
  561. package/validators/patternPlugins/upperCaseSpace.js +0 -13
  562. package/validators/patternPlugins/upperCaseSpace.js.map +0 -1
  563. package/validators/patternPlugins/url.d.ts +0 -2
  564. package/validators/patternPlugins/url.js +0 -13
  565. package/validators/patternPlugins/url.js.map +0 -1
  566. package/validators/required.d.ts +0 -2
  567. package/validators/required.js +0 -17
  568. package/validators/required.js.map +0 -1
  569. package/validators/timeGte.d.ts +0 -2
  570. package/validators/timeGte.js +0 -20
  571. package/validators/timeGte.js.map +0 -1
  572. package/validators/timeLte.d.ts +0 -2
  573. package/validators/timeLte.js +0 -20
  574. package/validators/timeLte.js.map +0 -1
  575. package/validators/unique.d.ts +0 -6
  576. package/validators/unique.js +0 -57
  577. package/validators/unique.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Result","CreateModelUseCase","UseCaseAbstraction","CreateModelRepository","EventPublisher","ModelBeforeCreateEvent","ModelAfterCreateEvent","ModelCreateErrorEvent","AccessControl","TenantContext","IdentityContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelCreateValidation","assignModelDefaultFields","CreateModelUseCaseImpl","constructor","eventPublisher","repository","accessControl","tenantContext","identityContext","execute","input","canAccess","canAccessModel","rwd","fail","validationResult","safeParseAsync","success","zodError","error","message","defaultFields","data","identity","getIdentity","tenant","getTenant","model","icon","modelId","id","createdOn","Date","toISOString","savedOn","createdBy","displayName","type","description","fields","layout","titleFieldId","descriptionFieldId","imageFieldId","fromModel","publish","result","isFail","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { ModelBeforeCreateEvent } from \"./events.js\";\nimport { ModelAfterCreateEvent } from \"./events.js\";\nimport { ModelCreateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelCreateValidation } from \"~/domain/contentModel/schemas.js\";\nimport { assignModelDefaultFields } from \"~/crud/contentModel/defaultFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelCreateInput } from \"~/types/index.js\";\n\n/**\n * CreateModelUseCase - Core model creation orchestration.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Create domain model object\n * - Assign default fields if requested\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n *\n * Note: This use case is decorated by CreateModelValidator which handles:\n * - ModelId generation\n * - ModelId allowed validation\n * - API name ending validation\n * - Field validation and plugin conflict checks\n */\nclass CreateModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateModelRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(input: CmsModelCreateInput): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createModelCreateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new ModelValidationError(zodError.message));\n }\n\n // Extract defaultFields flag and remove it from data\n const { defaultFields, ...data } = removeUndefinedValues(validationResult.data);\n\n // Assign default fields if requested\n if (defaultFields) {\n assignModelDefaultFields(data);\n }\n\n // Create the domain model object\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...data,\n icon: data.icon ?? null,\n modelId: data.modelId ?? \"\", // Will be set by repository\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n description: data.description || \"\",\n // Fields and layout from data\n fields: data.fields || [],\n layout: data.layout || [],\n // Title/description/image field IDs\n titleFieldId: data.titleFieldId || \"\",\n descriptionFieldId: data.descriptionFieldId,\n imageFieldId: data.imageFieldId\n };\n\n // Access control check on the created model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(new ModelBeforeCreateEvent({ model, input: data }));\n\n // Persist via repository (repository will validate and set modelId)\n const result = await this.repository.execute(model);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelCreateErrorEvent({\n input,\n model,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterCreateEvent({ model }));\n\n return Result.ok(model);\n }\n}\n\nexport const CreateModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateModelUseCaseImpl,\n dependencies: [\n EventPublisher,\n CreateModelRepository,\n AccessControl,\n TenantContext,\n IdentityContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","CreateModelUseCase","UseCaseAbstraction","CreateModelRepository","EventPublisher","ModelBeforeCreateEvent","ModelAfterCreateEvent","ModelCreateErrorEvent","AccessControl","TenantContext","IdentityContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelCreateValidation","assignModelDefaultFields","CreateModelUseCaseImpl","constructor","eventPublisher","repository","accessControl","tenantContext","identityContext","execute","input","canAccess","canAccessModel","rwd","fail","validationResult","safeParseAsync","success","zodError","error","message","defaultFields","data","identity","getIdentity","tenant","getTenant","model","icon","modelId","id","createdOn","Date","toISOString","savedOn","createdBy","displayName","type","description","fields","layout","titleFieldId","descriptionFieldId","imageFieldId","fromModel","publish","result","isFail","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { ModelBeforeCreateEvent } from \"./events.js\";\nimport { ModelAfterCreateEvent } from \"./events.js\";\nimport { ModelCreateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelCreateValidation } from \"~/domain/contentModel/schemas.js\";\nimport { assignModelDefaultFields } from \"~/crud/contentModel/defaultFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelCreateInput } from \"~/types/index.js\";\n\n/**\n * CreateModelUseCase - Core model creation orchestration.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Create domain model object\n * - Assign default fields if requested\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n *\n * Note: This use case is decorated by CreateModelValidator which handles:\n * - ModelId generation\n * - ModelId allowed validation\n * - API name ending validation\n * - Field validation and plugin conflict checks\n */\nclass CreateModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateModelRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(input: CmsModelCreateInput): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createModelCreateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new ModelValidationError(zodError.message));\n }\n\n // Extract defaultFields flag and remove it from data\n const { defaultFields, ...data } = removeUndefinedValues(validationResult.data);\n\n // Assign default fields if requested\n if (defaultFields) {\n assignModelDefaultFields(data);\n }\n\n // Create the domain model object\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...data,\n icon: data.icon ?? null,\n modelId: data.modelId ?? \"\", // Will be set by repository\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n description: data.description || \"\",\n // Fields and layout from data\n fields: data.fields || [],\n layout: data.layout || [],\n // Title/description/image field IDs\n titleFieldId: data.titleFieldId || \"\",\n descriptionFieldId: data.descriptionFieldId,\n imageFieldId: data.imageFieldId\n };\n\n // Access control check on the created model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(new ModelBeforeCreateEvent({ model, input: data }));\n\n // Persist via repository (repository will validate and set modelId)\n const result = await this.repository.execute(model);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelCreateErrorEvent({\n input,\n model,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterCreateEvent({ model }));\n\n return Result.ok(model);\n }\n}\n\nexport const CreateModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateModelUseCaseImpl,\n dependencies: [\n EventPublisher,\n CreateModelRepository,\n AccessControl,\n TenantContext,\n IdentityContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsModel, CmsModelCreateInput } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeCreateEvent","eventType","getHandlerAbstraction","ModelBeforeCreateEventHandler","ModelAfterCreateEvent","ModelAfterCreateEventHandler","ModelCreateErrorEvent","ModelCreateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsModel, CmsModelCreateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeCreateEventPayload {\n model: CmsModel;\n input: CmsModelCreateInput;\n}\n\nexport interface ModelAfterCreateEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelCreateErrorEventPayload {\n input: CmsModelCreateInput;\n model: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeCreateEvent - Published before creating a model\n */\nexport class ModelBeforeCreateEvent extends DomainEvent<ModelBeforeCreateEventPayload> {\n eventType = \"Cms/Model/BeforeCreate\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeCreateEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is created. */\nexport const ModelBeforeCreateEventHandler = createAbstraction<\n IEventHandler<ModelBeforeCreateEvent>\n>(\"ModelBeforeCreateEventHandler\");\n\nexport namespace ModelBeforeCreateEventHandler {\n export type Interface = IEventHandler<ModelBeforeCreateEvent>;\n export type Event = ModelBeforeCreateEvent;\n}\n\n/**\n * ModelAfterCreateEvent - Published after creating a model\n */\nexport class ModelAfterCreateEvent extends DomainEvent<ModelAfterCreateEventPayload> {\n eventType = \"Cms/Model/AfterCreate\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterCreateEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is created. */\nexport const ModelAfterCreateEventHandler = createAbstraction<IEventHandler<ModelAfterCreateEvent>>(\n \"ModelAfterCreateEventHandler\"\n);\n\nexport namespace ModelAfterCreateEventHandler {\n export type Interface = IEventHandler<ModelAfterCreateEvent>;\n export type Event = ModelAfterCreateEvent;\n}\n\n/**\n * ModelCreateErrorEvent - Published when create fails\n */\nexport class ModelCreateErrorEvent extends DomainEvent<ModelCreateErrorEventPayload> {\n eventType = \"Cms/Model/CreateError\" as const;\n\n getHandlerAbstraction() {\n return ModelCreateErrorEventHandler;\n }\n}\n\nexport const ModelCreateErrorEventHandler = createAbstraction<IEventHandler<ModelCreateErrorEvent>>(\n \"ModelCreateErrorEventHandler\"\n);\n\nexport namespace ModelCreateErrorEventHandler {\n export type Interface = IEventHandler<ModelCreateErrorEvent>;\n export type Event = ModelCreateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,0CAA0C;;AAGtE;AACA;AACA;;AAgBA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeCreateEvent","eventType","getHandlerAbstraction","ModelBeforeCreateEventHandler","ModelAfterCreateEvent","ModelAfterCreateEventHandler","ModelCreateErrorEvent","ModelCreateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsModel, CmsModelCreateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeCreateEventPayload {\n model: CmsModel;\n input: CmsModelCreateInput;\n}\n\nexport interface ModelAfterCreateEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelCreateErrorEventPayload {\n input: CmsModelCreateInput;\n model: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeCreateEvent - Published before creating a model\n */\nexport class ModelBeforeCreateEvent extends DomainEvent<ModelBeforeCreateEventPayload> {\n eventType = \"Cms/Model/BeforeCreate\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeCreateEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is created. */\nexport const ModelBeforeCreateEventHandler = createAbstraction<\n IEventHandler<ModelBeforeCreateEvent>\n>(\"ModelBeforeCreateEventHandler\");\n\nexport namespace ModelBeforeCreateEventHandler {\n export type Interface = IEventHandler<ModelBeforeCreateEvent>;\n export type Event = ModelBeforeCreateEvent;\n}\n\n/**\n * ModelAfterCreateEvent - Published after creating a model\n */\nexport class ModelAfterCreateEvent extends DomainEvent<ModelAfterCreateEventPayload> {\n eventType = \"Cms/Model/AfterCreate\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterCreateEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is created. */\nexport const ModelAfterCreateEventHandler = createAbstraction<IEventHandler<ModelAfterCreateEvent>>(\n \"ModelAfterCreateEventHandler\"\n);\n\nexport namespace ModelAfterCreateEventHandler {\n export type Interface = IEventHandler<ModelAfterCreateEvent>;\n export type Event = ModelAfterCreateEvent;\n}\n\n/**\n * ModelCreateErrorEvent - Published when create fails\n */\nexport class ModelCreateErrorEvent extends DomainEvent<ModelCreateErrorEventPayload> {\n eventType = \"Cms/Model/CreateError\" as const;\n\n getHandlerAbstraction() {\n return ModelCreateErrorEventHandler;\n }\n}\n\nexport const ModelCreateErrorEventHandler = createAbstraction<IEventHandler<ModelCreateErrorEvent>>(\n \"ModelCreateErrorEventHandler\"\n);\n\nexport namespace ModelCreateErrorEventHandler {\n export type Interface = IEventHandler<ModelCreateErrorEvent>;\n export type Event = ModelCreateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,mDAAmD;;AAG/E;AACA;AACA;;AAgBA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
@@ -4,7 +4,7 @@ import { ModelCache } from "../../../features/contentModel/shared/abstractions.j
4
4
  import { PluginModelsProvider } from "../../../features/contentModel/shared/abstractions.js";
5
5
  import { ModelsFetcher } from "../../../features/contentModel/shared/abstractions.js";
6
6
  import { StorageOperations } from "../../../features/shared/abstractions.js";
7
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
7
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
8
8
  import { CmsContext } from "../../../features/shared/abstractions.js";
9
9
  import type { CmsModel } from "../../../types/index.js";
10
10
  /**
@@ -8,7 +8,7 @@ import { ModelAlreadyExistsError } from "../../../domain/contentModel/errors.js"
8
8
  import { ModelPersistenceError } from "../../../domain/contentModel/errors.js";
9
9
  import { ModelValidationError } from "../../../domain/contentModel/errors.js";
10
10
  import { StorageOperations } from "../../shared/abstractions.js";
11
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
11
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
12
12
  import { CmsContext } from "../../shared/abstractions.js";
13
13
  import { validateExistingModelId, validateModelIdAllowed } from "../../../crud/contentModel/validate/modelId.js";
14
14
  import { validateEndingAllowed } from "../../../crud/contentModel/validate/endingAllowed.js";
@@ -1 +1 @@
1
- {"version":3,"names":["camelCase","Result","CreateModelFromRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ModelsFetcher","ModelAlreadyExistsError","ModelPersistenceError","ModelValidationError","StorageOperations","TenantContext","CmsContext","validateExistingModelId","validateModelIdAllowed","validateEndingAllowed","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","getModelId","model","modelId","name","value","trim","isModelIdValid","toLowerCase","CreateModelFromRepositoryImpl","constructor","modelCache","pluginModelsProvider","modelsFetcher","storageOperations","tenantContext","cmsContext","execute","tenant","getTenant","error","fail","message","data","modelsResult","fetchAll","isFail","existingModel","find","m","pluginModels","list","id","pluginModelConflict","pm","singularApiName","pluralApiName","models","context","tags","create","clear","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelFromRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { ModelCache } from \"~/features/contentModel/shared/abstractions.js\";\nimport { PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ModelsFetcher } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ModelAlreadyExistsError } from \"~/domain/contentModel/errors.js\";\nimport { ModelPersistenceError } from \"~/domain/contentModel/errors.js\";\nimport { ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model from method.`\n );\n};\n\n/**\n * CreateModelFromRepository - Validates domain rules and persists cloned model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelFromRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private modelCache: ModelCache.Interface,\n private pluginModelsProvider: PluginModelsProvider.Interface,\n private modelsFetcher: ModelsFetcher.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(model: CmsModel): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Generate modelId using the exact logic from beforeCreate.ts\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate modelId uniqueness (database)\n const modelsResult = await this.modelsFetcher.fetchAll();\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const existingModel = modelsResult.value.find(m => m.modelId === modelId);\n if (existingModel) {\n return Result.fail(new ModelAlreadyExistsError({ modelId }));\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return (\n pm.modelId === model.modelId ||\n pm.singularApiName === model.singularApiName ||\n pm.pluralApiName === model.pluralApiName\n );\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n const models = modelsResult.value;\n\n try {\n // Validate uniqueness\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n // Validate model fields\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n // Persist to storage\n await this.storageOperations.models.create({ model });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelFromRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelFromRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ModelsFetcher,\n StorageOperations,\n TenantContext,\n CmsContext\n ]\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,qBAAqB;AAC3C,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,yBAAyB,IAAIC,qBAAqB;AAC3D,SAASC,UAAU;AACnB,SAASC,oBAAoB;AAC7B,SAASC,aAAa;AACtB,SAASC,uBAAuB;AAChC,SAASC,qBAAqB;AAC9B,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,aAAa,QAAQ,yCAAyC;AACvE,SAASC,UAAU;AACnB,SACIC,uBAAuB,EACvBC,sBAAsB;AAE1B,SAASC,qBAAqB;AAC9B,SAASC,uBAAuB;AAChC,SAASC,qBAAqB;AAC9B,SAASC,mBAAmB;AAE5B,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,MAAMC,UAAU,GAAIC,KAA0C,IAAa;EACvE,MAAM;IAAEC,OAAO;IAAEC;EAAK,CAAC,GAAGF,KAAK;EAC/B,MAAMG,KAAK,GAAGF,OAAO,GAAGA,OAAO,CAACG,IAAI,CAAC,CAAC,GAAG,IAAI;EAC7C,IAAID,KAAK,EAAE;IACP,MAAME,cAAc,GAAG1B,SAAS,CAACwB,KAAK,CAAC,CAACG,WAAW,CAAC,CAAC,KAAKH,KAAK,CAACG,WAAW,CAAC,CAAC;IAC7E,IAAID,cAAc,EAAE;MAChB,OAAOF,KAAK;IAChB;IACA,OAAOxB,SAAS,CAACwB,KAAK,CAAC;EAC3B,CAAC,MAAM,IAAID,IAAI,EAAE;IACb,OAAOvB,SAAS,CAACuB,IAAI,CAACE,IAAI,CAAC,CAAC,CAAC;EACjC;EACA,MAAM,IAAIhB,oBAAoB,CAC1B,2EACJ,CAAC;AACL,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMmB,6BAA6B,CAA4C;EACpEC,WAAWA,CACNC,UAAgC,EAChCC,oBAAoD,EACpDC,aAAsC,EACtCC,iBAA8C,EAC9CC,aAAsC,EACtCC,UAAgC,EAC1C;IAAA,KANUL,UAAgC,GAAhCA,UAAgC;IAAA,KAChCC,oBAAoD,GAApDA,oBAAoD;IAAA,KACpDC,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,iBAA8C,GAA9CA,iBAA8C;IAAA,KAC9CC,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,UAAgC,GAAhCA,UAAgC;EACzC;EAEH,MAAMC,OAAOA,CAACf,KAAe,EAAsD;IAC/E,IAAI;MACA,MAAMgB,MAAM,GAAG,IAAI,CAACH,aAAa,CAACI,SAAS,CAAC,CAAC;;MAE7C;MACA,MAAMhB,OAAO,GAAGF,UAAU,CAACC,KAAK,CAAC;MACjCA,KAAK,CAACC,OAAO,GAAGA,OAAO;;MAEvB;MACA,IAAI;QACAR,sBAAsB,CAAC;UAAEO;QAAM,CAAC,CAAC;MACrC,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACZ,OAAOtC,MAAM,CAACuC,IAAI,CACd,IAAI/B,oBAAoB,CAAC;UAAEgC,OAAO,EAAEF,KAAK,CAACE,OAAO;UAAEC,IAAI,EAAEH,KAAK,CAACG;QAAK,CAAC,CACzE,CAAC;MACL;;MAEA;MACA,IAAI;QACA3B,qBAAqB,CAAC;UAAEM;QAAM,CAAC,CAAC;MACpC,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACZ,OAAOtC,MAAM,CAACuC,IAAI,CACd,IAAI/B,oBAAoB,CAAC;UAAEgC,OAAO,EAAEF,KAAK,CAACE,OAAO;UAAEC,IAAI,EAAEH,KAAK,CAACG;QAAK,CAAC,CACzE,CAAC;MACL;;MAEA;MACA,MAAMC,YAAY,GAAG,MAAM,IAAI,CAACX,aAAa,CAACY,QAAQ,CAAC,CAAC;MACxD,IAAID,YAAY,CAACE,MAAM,CAAC,CAAC,EAAE;QACvB,OAAO5C,MAAM,CAACuC,IAAI,CAAC,IAAIhC,qBAAqB,CAACmC,YAAY,CAACJ,KAAK,CAAC,CAAC;MACrE;MAEA,MAAMO,aAAa,GAAGH,YAAY,CAACnB,KAAK,CAACuB,IAAI,CAACC,CAAC,IAAIA,CAAC,CAAC1B,OAAO,KAAKA,OAAO,CAAC;MACzE,IAAIwB,aAAa,EAAE;QACf,OAAO7C,MAAM,CAACuC,IAAI,CAAC,IAAIjC,uBAAuB,CAAC;UAAEe;QAAQ,CAAC,CAAC,CAAC;MAChE;;MAEA;MACA,MAAM2B,YAAY,GAAG,MAAM,IAAI,CAAClB,oBAAoB,CAACmB,IAAI,CAACb,MAAM,CAACc,EAAE,CAAC;MACpE,MAAMC,mBAAmB,GAAGH,YAAY,CAACF,IAAI,CAACM,EAAE,IAAI;QAChD,OACIA,EAAE,CAAC/B,OAAO,KAAKD,KAAK,CAACC,OAAO,IAC5B+B,EAAE,CAACC,eAAe,KAAKjC,KAAK,CAACiC,eAAe,IAC5CD,EAAE,CAACE,aAAa,KAAKlC,KAAK,CAACkC,aAAa;MAEhD,CAAC,CAAC;MAEF,IAAIH,mBAAmB,EAAE;QACrB,OAAOnD,MAAM,CAACuC,IAAI,CACd,IAAIjC,uBAAuB,CAAC;UACxBe,OAAO;UACPmB,OAAO,EAAE,UAAUnB,OAAO;QAC9B,CAAC,CACL,CAAC;MACL;MAEA,MAAMkC,MAAM,GAAGb,YAAY,CAACnB,KAAK;MAEjC,IAAI;QACA;QACA,KAAK,MAAMsB,aAAa,IAAIU,MAAM,EAAE;UAChC3C,uBAAuB,CAAC;YACpBiC,aAAa;YACbzB;UACJ,CAAC,CAAC;UACFL,uBAAuB,CAAC;YACpB8B,aAAa;YACbzB;UACJ,CAAC,CAAC;UACFJ,qBAAqB,CAAC;YAClB6B,aAAa;YACbzB;UACJ,CAAC,CAAC;QACN;;QAEA;QACA,MAAMH,mBAAmB,CAAC;UACtBsC,MAAM;UACNnC,KAAK;UACLoC,OAAO,EAAE,IAAI,CAACtB;QAClB,CAAC,CAAC;MACN,CAAC,CAAC,OAAOI,KAAK,EAAE;QACZ,OAAOtC,MAAM,CAACuC,IAAI,CACd,IAAI/B,oBAAoB,CAAC;UAAEgC,OAAO,EAAEF,KAAK,CAACE,OAAO;UAAEC,IAAI,EAAEH,KAAK,CAACG;QAAK,CAAC,CACzE,CAAC;MACL;;MAEA;MACArB,KAAK,CAACqC,IAAI,GAAGvC,aAAa,CAACE,KAAK,CAAC;;MAEjC;MACA,MAAM,IAAI,CAACY,iBAAiB,CAACuB,MAAM,CAACG,MAAM,CAAC;QAAEtC;MAAM,CAAC,CAAC;;MAErD;MACA,IAAI,CAACS,UAAU,CAAC8B,KAAK,CAAC,CAAC;MAEvB,OAAO3D,MAAM,CAAC4D,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACZ,OAAOtC,MAAM,CAACuC,IAAI,CAAC,IAAIhC,qBAAqB,CAAC+B,KAAc,CAAC,CAAC;IACjE;EACJ;AACJ;AAEA,OAAO,MAAMrC,yBAAyB,GAAGC,qBAAqB,CAAC2D,oBAAoB,CAAC;EAChFC,cAAc,EAAEnC,6BAA6B;EAC7CoC,YAAY,EAAE,CACV5D,UAAU,EACVC,oBAAoB,EACpBC,aAAa,EACbI,iBAAiB,EACjBC,aAAa,EACbC,UAAU;AAElB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["camelCase","Result","CreateModelFromRepository","RepositoryAbstraction","ModelCache","PluginModelsProvider","ModelsFetcher","ModelAlreadyExistsError","ModelPersistenceError","ModelValidationError","StorageOperations","TenantContext","CmsContext","validateExistingModelId","validateModelIdAllowed","validateEndingAllowed","validateSingularApiName","validatePluralApiName","validateModelFields","ensureTypeTag","getModelId","model","modelId","name","value","trim","isModelIdValid","toLowerCase","CreateModelFromRepositoryImpl","constructor","modelCache","pluginModelsProvider","modelsFetcher","storageOperations","tenantContext","cmsContext","execute","tenant","getTenant","error","fail","message","data","modelsResult","fetchAll","isFail","existingModel","find","m","pluginModels","list","id","pluginModelConflict","pm","singularApiName","pluralApiName","models","context","tags","create","clear","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelFromRepository.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { ModelCache } from \"~/features/contentModel/shared/abstractions.js\";\nimport { PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ModelsFetcher } from \"~/features/contentModel/shared/abstractions.js\";\nimport { ModelAlreadyExistsError } from \"~/domain/contentModel/errors.js\";\nimport { ModelPersistenceError } from \"~/domain/contentModel/errors.js\";\nimport { ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport {\n validateExistingModelId,\n validateModelIdAllowed\n} from \"~/crud/contentModel/validate/modelId.js\";\nimport { validateEndingAllowed } from \"~/crud/contentModel/validate/endingAllowed.js\";\nimport { validateSingularApiName } from \"~/domain/contentModel/validation/singularApiName.js\";\nimport { validatePluralApiName } from \"~/domain/contentModel/validation/pluralApiName.js\";\nimport { validateModelFields } from \"~/domain/contentModel/validation/modelFields.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\n\n/**\n * Generate modelId from model following the exact logic from beforeCreate.ts\n */\nconst getModelId = (model: { modelId?: string; name?: string }): string => {\n const { modelId, name } = model;\n const value = modelId ? modelId.trim() : null;\n if (value) {\n const isModelIdValid = camelCase(value).toLowerCase() === value.toLowerCase();\n if (isModelIdValid) {\n return value;\n }\n return camelCase(value);\n } else if (name) {\n return camelCase(name.trim());\n }\n throw new ModelValidationError(\n `There is no \"modelId\" or \"name\" passed into the create model from method.`\n );\n};\n\n/**\n * CreateModelFromRepository - Validates domain rules and persists cloned model.\n *\n * Responsibilities:\n * - Generate modelId from input\n * - Validate modelId is allowed (not in disallowed list)\n * - Validate API name endings\n * - Validate modelId uniqueness (database + plugins)\n * - Validate API name uniqueness (database + plugins)\n * - Validate plugin conflicts\n * - Validate model fields\n * - Persist to storage\n * - Clear ModelCache after successful create\n */\nclass CreateModelFromRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private modelCache: ModelCache.Interface,\n private pluginModelsProvider: PluginModelsProvider.Interface,\n private modelsFetcher: ModelsFetcher.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(model: CmsModel): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Generate modelId using the exact logic from beforeCreate.ts\n const modelId = getModelId(model);\n model.modelId = modelId;\n\n // Validate modelId is allowed (not in disallowed list)\n try {\n validateModelIdAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate API name endings\n try {\n validateEndingAllowed({ model });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Validate modelId uniqueness (database)\n const modelsResult = await this.modelsFetcher.fetchAll();\n if (modelsResult.isFail()) {\n return Result.fail(new ModelPersistenceError(modelsResult.error));\n }\n\n const existingModel = modelsResult.value.find(m => m.modelId === modelId);\n if (existingModel) {\n return Result.fail(new ModelAlreadyExistsError({ modelId }));\n }\n\n // Check for plugin model conflicts\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n const pluginModelConflict = pluginModels.find(pm => {\n return (\n pm.modelId === model.modelId ||\n pm.singularApiName === model.singularApiName ||\n pm.pluralApiName === model.pluralApiName\n );\n });\n\n if (pluginModelConflict) {\n return Result.fail(\n new ModelAlreadyExistsError({\n modelId,\n message: `Model \"${modelId}\" is already registered via a plugin.`\n })\n );\n }\n\n const models = modelsResult.value;\n\n try {\n // Validate uniqueness\n for (const existingModel of models) {\n validateExistingModelId({\n existingModel,\n model\n });\n validateSingularApiName({\n existingModel,\n model\n });\n validatePluralApiName({\n existingModel,\n model\n });\n }\n\n // Validate model fields\n await validateModelFields({\n models,\n model,\n context: this.cmsContext\n });\n } catch (error) {\n return Result.fail(\n new ModelValidationError({ message: error.message, data: error.data })\n );\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n // Persist to storage\n await this.storageOperations.models.create({ model });\n\n // Clear cache\n this.modelCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n}\n\nexport const CreateModelFromRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateModelFromRepositoryImpl,\n dependencies: [\n ModelCache,\n PluginModelsProvider,\n ModelsFetcher,\n StorageOperations,\n TenantContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { CreateModelFromUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { CreateModelFromRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
6
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
7
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
7
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
8
8
  import type { CmsModel } from "../../../types/index.js";
9
9
  import type { CmsModelCreateFromInput } from "../../../types/index.js";
10
10
  import { GetModelUseCase } from "../../../features/contentModel/GetModel/index.js";
@@ -1,13 +1,13 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { CreateModelFromUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { CreateModelFromRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { ModelBeforeCreateFromEvent } from "./events.js";
6
6
  import { ModelAfterCreateFromEvent } from "./events.js";
7
7
  import { ModelCreateFromErrorEvent } from "./events.js";
8
8
  import { AccessControl } from "../../shared/abstractions.js";
9
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
10
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
9
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
10
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
11
11
  import { ModelNotAuthorizedError, ModelValidationError } from "../../../domain/contentModel/errors.js";
12
12
  import { createZodError } from "@webiny/utils";
13
13
  import { removeUndefinedValues } from "@webiny/utils";
@@ -70,6 +70,7 @@ class CreateModelFromUseCaseImpl {
70
70
  const tenant = this.tenantContext.getTenant();
71
71
  const model = {
72
72
  ...original,
73
+ isPlugin: undefined,
73
74
  group: input.group || original.group,
74
75
  singularApiName: data.singularApiName,
75
76
  pluralApiName: data.pluralApiName,
@@ -1 +1 @@
1
- {"version":3,"names":["Result","CreateModelFromUseCase","UseCaseAbstraction","CreateModelFromRepository","EventPublisher","ModelBeforeCreateFromEvent","ModelAfterCreateFromEvent","ModelCreateFromErrorEvent","AccessControl","TenantContext","IdentityContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelCreateFromValidation","GetModelUseCase","CreateModelFromUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","tenantContext","identityContext","execute","modelId","input","canAccess","canAccessModel","rwd","fail","getResult","isFail","original","value","validationResult","safeParseAsync","description","success","zodError","error","message","data","identity","getIdentity","tenant","getTenant","model","group","singularApiName","pluralApiName","icon","name","createdBy","id","displayName","type","createdOn","Date","toISOString","savedOn","fromModel","publish","result","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelFromUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateModelFromRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { ModelBeforeCreateFromEvent } from \"./events.js\";\nimport { ModelAfterCreateFromEvent } from \"./events.js\";\nimport { ModelCreateFromErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelCreateFromValidation } from \"~/domain/contentModel/schemas.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelCreateFromInput } from \"~/types/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * CreateModelFromUseCase - Clone/copy a model from existing model.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Fetch original model\n * - Create new model preserving fields and layout\n * - Handle group changes\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for validation and persistence\n * - Publish after event or error event\n *\n * Note: Repository handles domain validations (modelId generation, uniqueness, etc.)\n */\nclass CreateModelFromUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateModelFromRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(\n modelId: string,\n input: CmsModelCreateFromInput\n ): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the original model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = getResult.value;\n\n // Validate input (merge with original description if not provided)\n const validationResult = await createModelCreateFromValidation().safeParseAsync({\n ...input,\n description: input.description || original.description\n });\n\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new ModelValidationError(zodError.message));\n }\n\n const data = removeUndefinedValues(validationResult.data);\n\n // Create new model from original (preserve fields and layout)\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...original,\n group: input.group || original.group,\n singularApiName: data.singularApiName,\n pluralApiName: data.pluralApiName,\n icon: data.icon,\n name: data.name,\n modelId: data.modelId || \"\", // Will be set by repository\n description: data.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n tenant: original.tenant || tenant.id\n };\n\n // Access control check on the new model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(\n new ModelBeforeCreateFromEvent({ model, original, input: data })\n );\n\n // Persist via repository (repository will validate and set modelId)\n const result = await this.repository.execute(model);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelCreateFromErrorEvent({\n input: data,\n model,\n original,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterCreateFromEvent({ model, original }));\n\n return Result.ok(model);\n }\n}\n\nexport const CreateModelFromUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateModelFromUseCaseImpl,\n dependencies: [\n GetModelUseCase,\n EventPublisher,\n CreateModelFromRepository,\n AccessControl,\n TenantContext,\n IdentityContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","CreateModelFromUseCase","UseCaseAbstraction","CreateModelFromRepository","EventPublisher","ModelBeforeCreateFromEvent","ModelAfterCreateFromEvent","ModelCreateFromErrorEvent","AccessControl","TenantContext","IdentityContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelCreateFromValidation","GetModelUseCase","CreateModelFromUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","tenantContext","identityContext","execute","modelId","input","canAccess","canAccessModel","rwd","fail","getResult","isFail","original","value","validationResult","safeParseAsync","description","success","zodError","error","message","data","identity","getIdentity","tenant","getTenant","model","isPlugin","undefined","group","singularApiName","pluralApiName","icon","name","createdBy","id","displayName","type","createdOn","Date","toISOString","savedOn","fromModel","publish","result","ok","createImplementation","implementation","dependencies"],"sources":["CreateModelFromUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateModelFromUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateModelFromRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { ModelBeforeCreateFromEvent } from \"./events.js\";\nimport { ModelAfterCreateFromEvent } from \"./events.js\";\nimport { ModelCreateFromErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelCreateFromValidation } from \"~/domain/contentModel/schemas.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelCreateFromInput } from \"~/types/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * CreateModelFromUseCase - Clone/copy a model from existing model.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Fetch original model\n * - Create new model preserving fields and layout\n * - Handle group changes\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for validation and persistence\n * - Publish after event or error event\n *\n * Note: Repository handles domain validations (modelId generation, uniqueness, etc.)\n */\nclass CreateModelFromUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateModelFromRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(\n modelId: string,\n input: CmsModelCreateFromInput\n ): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the original model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = getResult.value;\n\n // Validate input (merge with original description if not provided)\n const validationResult = await createModelCreateFromValidation().safeParseAsync({\n ...input,\n description: input.description || original.description\n });\n\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new ModelValidationError(zodError.message));\n }\n\n const data = removeUndefinedValues(validationResult.data);\n\n // Create new model from original (preserve fields and layout)\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...original,\n isPlugin: undefined,\n group: input.group || original.group,\n singularApiName: data.singularApiName,\n pluralApiName: data.pluralApiName,\n icon: data.icon,\n name: data.name,\n modelId: data.modelId || \"\", // Will be set by repository\n description: data.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n tenant: original.tenant || tenant.id\n };\n\n // Access control check on the new model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(\n new ModelBeforeCreateFromEvent({ model, original, input: data })\n );\n\n // Persist via repository (repository will validate and set modelId)\n const result = await this.repository.execute(model);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelCreateFromErrorEvent({\n input: data,\n model,\n original,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterCreateFromEvent({ model, original }));\n\n return Result.ok(model);\n }\n}\n\nexport const CreateModelFromUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateModelFromUseCaseImpl,\n dependencies: [\n GetModelUseCase,\n EventPublisher,\n CreateModelFromRepository,\n AccessControl,\n TenantContext,\n IdentityContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsModel, CmsModelCreateFromInput } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeCreateFromEvent","eventType","getHandlerAbstraction","ModelBeforeCreateFromEventHandler","ModelAfterCreateFromEvent","ModelAfterCreateFromEventHandler","ModelCreateFromErrorEvent","ModelCreateFromErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsModel, CmsModelCreateFromInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeCreateFromEventPayload {\n model: CmsModel;\n original: CmsModel;\n input: CmsModelCreateFromInput;\n}\n\nexport interface ModelAfterCreateFromEventPayload {\n model: CmsModel;\n original: CmsModel;\n}\n\nexport interface ModelCreateFromErrorEventPayload {\n input: CmsModelCreateFromInput;\n model: CmsModel;\n original: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeCreateFromEvent - Published before creating a model from existing\n */\nexport class ModelBeforeCreateFromEvent extends DomainEvent<ModelBeforeCreateFromEventPayload> {\n eventType = \"Cms/Model/BeforeCreateFrom\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeCreateFromEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is cloned. */\nexport const ModelBeforeCreateFromEventHandler = createAbstraction<\n IEventHandler<ModelBeforeCreateFromEvent>\n>(\"ModelBeforeCreateFromEventHandler\");\n\nexport namespace ModelBeforeCreateFromEventHandler {\n export type Interface = IEventHandler<ModelBeforeCreateFromEvent>;\n export type Event = ModelBeforeCreateFromEvent;\n}\n\n/**\n * ModelAfterCreateFromEvent - Published after creating a model from existing\n */\nexport class ModelAfterCreateFromEvent extends DomainEvent<ModelAfterCreateFromEventPayload> {\n eventType = \"Cms/Model/AfterCreateFrom\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterCreateFromEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is cloned. */\nexport const ModelAfterCreateFromEventHandler = createAbstraction<\n IEventHandler<ModelAfterCreateFromEvent>\n>(\"ModelAfterCreateFromEventHandler\");\n\nexport namespace ModelAfterCreateFromEventHandler {\n export type Interface = IEventHandler<ModelAfterCreateFromEvent>;\n export type Event = ModelAfterCreateFromEvent;\n}\n\n/**\n * ModelCreateFromErrorEvent - Published when create from fails\n */\nexport class ModelCreateFromErrorEvent extends DomainEvent<ModelCreateFromErrorEventPayload> {\n eventType = \"Cms/Model/CreateFromError\" as const;\n\n getHandlerAbstraction() {\n return ModelCreateFromErrorEventHandler;\n }\n}\n\nexport const ModelCreateFromErrorEventHandler = createAbstraction<\n IEventHandler<ModelCreateFromErrorEvent>\n>(\"ModelCreateFromErrorEventHandler\");\n\nexport namespace ModelCreateFromErrorEventHandler {\n export type Interface = IEventHandler<ModelCreateFromErrorEvent>;\n export type Event = ModelCreateFromErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,0CAA0C;;AAGtE;AACA;AACA;;AAmBA;AACA;AACA;AACA,OAAO,MAAMC,0BAA0B,SAASD,WAAW,CAAoC;EAC3FE,SAAS,GAAG,4BAA4B;EAExCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,iCAAiC;EAC5C;AACJ;;AAEA;AACA,OAAO,MAAMA,iCAAiC,GAAGL,iBAAiB,CAEhE,mCAAmC,CAAC;AAOtC;AACA;AACA;AACA,OAAO,MAAMM,yBAAyB,SAASL,WAAW,CAAmC;EACzFE,SAAS,GAAG,2BAA2B;EAEvCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,gCAAgC;EAC3C;AACJ;;AAEA;AACA,OAAO,MAAMA,gCAAgC,GAAGP,iBAAiB,CAE/D,kCAAkC,CAAC;AAOrC;AACA;AACA;AACA,OAAO,MAAMQ,yBAAyB,SAASP,WAAW,CAAmC;EACzFE,SAAS,GAAG,2BAA2B;EAEvCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,gCAAgC;EAC3C;AACJ;AAEA,OAAO,MAAMA,gCAAgC,GAAGT,iBAAiB,CAE/D,kCAAkC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeCreateFromEvent","eventType","getHandlerAbstraction","ModelBeforeCreateFromEventHandler","ModelAfterCreateFromEvent","ModelAfterCreateFromEventHandler","ModelCreateFromErrorEvent","ModelCreateFromErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsModel, CmsModelCreateFromInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeCreateFromEventPayload {\n model: CmsModel;\n original: CmsModel;\n input: CmsModelCreateFromInput;\n}\n\nexport interface ModelAfterCreateFromEventPayload {\n model: CmsModel;\n original: CmsModel;\n}\n\nexport interface ModelCreateFromErrorEventPayload {\n input: CmsModelCreateFromInput;\n model: CmsModel;\n original: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeCreateFromEvent - Published before creating a model from existing\n */\nexport class ModelBeforeCreateFromEvent extends DomainEvent<ModelBeforeCreateFromEventPayload> {\n eventType = \"Cms/Model/BeforeCreateFrom\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeCreateFromEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is cloned. */\nexport const ModelBeforeCreateFromEventHandler = createAbstraction<\n IEventHandler<ModelBeforeCreateFromEvent>\n>(\"ModelBeforeCreateFromEventHandler\");\n\nexport namespace ModelBeforeCreateFromEventHandler {\n export type Interface = IEventHandler<ModelBeforeCreateFromEvent>;\n export type Event = ModelBeforeCreateFromEvent;\n}\n\n/**\n * ModelAfterCreateFromEvent - Published after creating a model from existing\n */\nexport class ModelAfterCreateFromEvent extends DomainEvent<ModelAfterCreateFromEventPayload> {\n eventType = \"Cms/Model/AfterCreateFrom\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterCreateFromEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is cloned. */\nexport const ModelAfterCreateFromEventHandler = createAbstraction<\n IEventHandler<ModelAfterCreateFromEvent>\n>(\"ModelAfterCreateFromEventHandler\");\n\nexport namespace ModelAfterCreateFromEventHandler {\n export type Interface = IEventHandler<ModelAfterCreateFromEvent>;\n export type Event = ModelAfterCreateFromEvent;\n}\n\n/**\n * ModelCreateFromErrorEvent - Published when create from fails\n */\nexport class ModelCreateFromErrorEvent extends DomainEvent<ModelCreateFromErrorEventPayload> {\n eventType = \"Cms/Model/CreateFromError\" as const;\n\n getHandlerAbstraction() {\n return ModelCreateFromErrorEventHandler;\n }\n}\n\nexport const ModelCreateFromErrorEventHandler = createAbstraction<\n IEventHandler<ModelCreateFromErrorEvent>\n>(\"ModelCreateFromErrorEventHandler\");\n\nexport namespace ModelCreateFromErrorEventHandler {\n export type Interface = IEventHandler<ModelCreateFromErrorEvent>;\n export type Event = ModelCreateFromErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,mDAAmD;;AAG/E;AACA;AACA;;AAmBA;AACA;AACA;AACA,OAAO,MAAMC,0BAA0B,SAASD,WAAW,CAAoC;EAC3FE,SAAS,GAAG,4BAA4B;EAExCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,iCAAiC;EAC5C;AACJ;;AAEA;AACA,OAAO,MAAMA,iCAAiC,GAAGL,iBAAiB,CAEhE,mCAAmC,CAAC;AAOtC;AACA;AACA;AACA,OAAO,MAAMM,yBAAyB,SAASL,WAAW,CAAmC;EACzFE,SAAS,GAAG,2BAA2B;EAEvCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,gCAAgC;EAC3C;AACJ;;AAEA;AACA,OAAO,MAAMA,gCAAgC,GAAGP,iBAAiB,CAE/D,kCAAkC,CAAC;AAOrC;AACA;AACA;AACA,OAAO,MAAMQ,yBAAyB,SAASP,WAAW,CAAmC;EACzFE,SAAS,GAAG,2BAA2B;EAEvCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,gCAAgC;EAC3C;AACJ;AAEA,OAAO,MAAMA,gCAAgC,GAAGT,iBAAiB,CAE/D,kCAAkC,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { DeleteModelUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { DeleteModelRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
6
6
  import { GetModelUseCase } from "../../../features/contentModel/GetModel/index.js";
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { DeleteModelUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { DeleteModelRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { ModelBeforeDeleteEvent } from "./events.js";
6
6
  import { ModelAfterDeleteEvent } from "./events.js";
7
7
  import { ModelDeleteErrorEvent } from "./events.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","DeleteModelUseCase","UseCaseAbstraction","DeleteModelRepository","EventPublisher","ModelBeforeDeleteEvent","ModelAfterDeleteEvent","ModelDeleteErrorEvent","AccessControl","ModelNotAuthorizedError","GetModelUseCase","DeleteModelUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","execute","modelId","canAccess","canAccessModel","rwd","fail","getResult","isFail","error","model","value","fromModel","publish","result","ok","createImplementation","implementation","dependencies"],"sources":["DeleteModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { DeleteModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { ModelBeforeDeleteEvent } from \"./events.js\";\nimport { ModelAfterDeleteEvent } from \"./events.js\";\nimport { ModelDeleteErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { ModelNotAuthorizedError } from \"~/domain/contentModel/errors.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * DeleteModelUseCase - Core model deletion orchestration.\n *\n * Responsibilities:\n * - Fetch model\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for deletion\n * - Publish after event or error event\n *\n * Note: Validation (e.g., checking for entries, plugin models) should be done in event handlers\n */\nclass DeleteModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: DeleteModelRepository.Interface,\n private accessControl: AccessControl.Interface\n ) {}\n\n async execute(modelId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"d\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const model = getResult.value;\n\n // Access control check on the specific model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"d\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(new ModelBeforeDeleteEvent({ model }));\n\n // Delete via repository\n const result = await this.repository.execute(model);\n\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelDeleteErrorEvent({\n model,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterDeleteEvent({ model }));\n\n return Result.ok();\n }\n}\n\nexport const DeleteModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: DeleteModelUseCaseImpl,\n dependencies: [GetModelUseCase, EventPublisher, DeleteModelRepository, AccessControl]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,kBAAkB,IAAIC,kBAAkB;AACjD,SAASC,qBAAqB;AAC9B,SAASC,cAAc,QAAQ,0CAA0C;AACzE,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,aAAa;AACtB,SAASC,uBAAuB;AAChC,SAASC,eAAe;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,sBAAsB,CAAyC;EAC1DC,WAAWA,CACNC,eAA0C,EAC1CC,cAAwC,EACxCC,UAA2C,EAC3CC,aAAsC,EAChD;IAAA,KAJUH,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;IAAA,KACxCC,UAA2C,GAA3CA,UAA2C;IAAA,KAC3CC,aAAsC,GAAtCA,aAAsC;EAC/C;EAEH,MAAMC,OAAOA,CAACC,OAAe,EAAmD;IAC5E;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACH,aAAa,CAACI,cAAc,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACvE,IAAI,CAACF,SAAS,EAAE;MACZ,OAAOnB,MAAM,CAACsB,IAAI,CAAC,IAAIb,uBAAuB,CAAC,CAAC,CAAC;IACrD;;IAEA;IACA,MAAMc,SAAS,GAAG,MAAM,IAAI,CAACV,eAAe,CAACI,OAAO,CAACC,OAAO,CAAC;IAC7D,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOxB,MAAM,CAACsB,IAAI,CAACC,SAAS,CAACE,KAAK,CAAC;IACvC;IAEA,MAAMC,KAAK,GAAGH,SAAS,CAACI,KAAK;;IAE7B;IACA,MAAMP,cAAc,GAAG,MAAM,IAAI,CAACJ,aAAa,CAACI,cAAc,CAAC;MAAEM,KAAK;MAAEL,GAAG,EAAE;IAAI,CAAC,CAAC;IACnF,IAAI,CAACD,cAAc,EAAE;MACjB,OAAOpB,MAAM,CAACsB,IAAI,CAACb,uBAAuB,CAACmB,SAAS,CAACF,KAAK,CAAC,CAAC;IAChE;;IAEA;IACA,MAAM,IAAI,CAACZ,cAAc,CAACe,OAAO,CAAC,IAAIxB,sBAAsB,CAAC;MAAEqB;IAAM,CAAC,CAAC,CAAC;;IAExE;IACA,MAAMI,MAAM,GAAG,MAAM,IAAI,CAACf,UAAU,CAACE,OAAO,CAACS,KAAK,CAAC;IAEnD,IAAII,MAAM,CAACN,MAAM,CAAC,CAAC,EAAE;MACjB;MACA,MAAM,IAAI,CAACV,cAAc,CAACe,OAAO,CAC7B,IAAItB,qBAAqB,CAAC;QACtBmB,KAAK;QACLD,KAAK,EAAEK,MAAM,CAACL;MAClB,CAAC,CACL,CAAC;MACD,OAAOzB,MAAM,CAACsB,IAAI,CAACQ,MAAM,CAACL,KAAK,CAAC;IACpC;;IAEA;IACA,MAAM,IAAI,CAACX,cAAc,CAACe,OAAO,CAAC,IAAIvB,qBAAqB,CAAC;MAAEoB;IAAM,CAAC,CAAC,CAAC;IAEvE,OAAO1B,MAAM,CAAC+B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAM9B,kBAAkB,GAAGC,kBAAkB,CAAC8B,oBAAoB,CAAC;EACtEC,cAAc,EAAEtB,sBAAsB;EACtCuB,YAAY,EAAE,CAACxB,eAAe,EAAEN,cAAc,EAAED,qBAAqB,EAAEK,aAAa;AACxF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","DeleteModelUseCase","UseCaseAbstraction","DeleteModelRepository","EventPublisher","ModelBeforeDeleteEvent","ModelAfterDeleteEvent","ModelDeleteErrorEvent","AccessControl","ModelNotAuthorizedError","GetModelUseCase","DeleteModelUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","execute","modelId","canAccess","canAccessModel","rwd","fail","getResult","isFail","error","model","value","fromModel","publish","result","ok","createImplementation","implementation","dependencies"],"sources":["DeleteModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { DeleteModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { ModelBeforeDeleteEvent } from \"./events.js\";\nimport { ModelAfterDeleteEvent } from \"./events.js\";\nimport { ModelDeleteErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { ModelNotAuthorizedError } from \"~/domain/contentModel/errors.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * DeleteModelUseCase - Core model deletion orchestration.\n *\n * Responsibilities:\n * - Fetch model\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for deletion\n * - Publish after event or error event\n *\n * Note: Validation (e.g., checking for entries, plugin models) should be done in event handlers\n */\nclass DeleteModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: DeleteModelRepository.Interface,\n private accessControl: AccessControl.Interface\n ) {}\n\n async execute(modelId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"d\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const model = getResult.value;\n\n // Access control check on the specific model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"d\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Publish before event\n await this.eventPublisher.publish(new ModelBeforeDeleteEvent({ model }));\n\n // Delete via repository\n const result = await this.repository.execute(model);\n\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelDeleteErrorEvent({\n model,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterDeleteEvent({ model }));\n\n return Result.ok();\n }\n}\n\nexport const DeleteModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: DeleteModelUseCaseImpl,\n dependencies: [GetModelUseCase, EventPublisher, DeleteModelRepository, AccessControl]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,kBAAkB,IAAIC,kBAAkB;AACjD,SAASC,qBAAqB;AAC9B,SAASC,cAAc,QAAQ,mDAAmD;AAClF,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,aAAa;AACtB,SAASC,uBAAuB;AAChC,SAASC,eAAe;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,sBAAsB,CAAyC;EAC1DC,WAAWA,CACNC,eAA0C,EAC1CC,cAAwC,EACxCC,UAA2C,EAC3CC,aAAsC,EAChD;IAAA,KAJUH,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;IAAA,KACxCC,UAA2C,GAA3CA,UAA2C;IAAA,KAC3CC,aAAsC,GAAtCA,aAAsC;EAC/C;EAEH,MAAMC,OAAOA,CAACC,OAAe,EAAmD;IAC5E;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACH,aAAa,CAACI,cAAc,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACvE,IAAI,CAACF,SAAS,EAAE;MACZ,OAAOnB,MAAM,CAACsB,IAAI,CAAC,IAAIb,uBAAuB,CAAC,CAAC,CAAC;IACrD;;IAEA;IACA,MAAMc,SAAS,GAAG,MAAM,IAAI,CAACV,eAAe,CAACI,OAAO,CAACC,OAAO,CAAC;IAC7D,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOxB,MAAM,CAACsB,IAAI,CAACC,SAAS,CAACE,KAAK,CAAC;IACvC;IAEA,MAAMC,KAAK,GAAGH,SAAS,CAACI,KAAK;;IAE7B;IACA,MAAMP,cAAc,GAAG,MAAM,IAAI,CAACJ,aAAa,CAACI,cAAc,CAAC;MAAEM,KAAK;MAAEL,GAAG,EAAE;IAAI,CAAC,CAAC;IACnF,IAAI,CAACD,cAAc,EAAE;MACjB,OAAOpB,MAAM,CAACsB,IAAI,CAACb,uBAAuB,CAACmB,SAAS,CAACF,KAAK,CAAC,CAAC;IAChE;;IAEA;IACA,MAAM,IAAI,CAACZ,cAAc,CAACe,OAAO,CAAC,IAAIxB,sBAAsB,CAAC;MAAEqB;IAAM,CAAC,CAAC,CAAC;;IAExE;IACA,MAAMI,MAAM,GAAG,MAAM,IAAI,CAACf,UAAU,CAACE,OAAO,CAACS,KAAK,CAAC;IAEnD,IAAII,MAAM,CAACN,MAAM,CAAC,CAAC,EAAE;MACjB;MACA,MAAM,IAAI,CAACV,cAAc,CAACe,OAAO,CAC7B,IAAItB,qBAAqB,CAAC;QACtBmB,KAAK;QACLD,KAAK,EAAEK,MAAM,CAACL;MAClB,CAAC,CACL,CAAC;MACD,OAAOzB,MAAM,CAACsB,IAAI,CAACQ,MAAM,CAACL,KAAK,CAAC;IACpC;;IAEA;IACA,MAAM,IAAI,CAACX,cAAc,CAACe,OAAO,CAAC,IAAIvB,qBAAqB,CAAC;MAAEoB;IAAM,CAAC,CAAC,CAAC;IAEvE,OAAO1B,MAAM,CAAC+B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAM9B,kBAAkB,GAAGC,kBAAkB,CAAC8B,oBAAoB,CAAC;EACtEC,cAAc,EAAEtB,sBAAsB;EACtCuB,YAAY,EAAE,CAACxB,eAAe,EAAEN,cAAc,EAAED,qBAAqB,EAAEK,aAAa;AACxF,CAAC,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsModel } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeDeleteEvent","eventType","getHandlerAbstraction","ModelBeforeDeleteEventHandler","ModelAfterDeleteEvent","ModelAfterDeleteEventHandler","ModelDeleteErrorEvent","ModelDeleteErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsModel } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeDeleteEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelAfterDeleteEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelDeleteErrorEventPayload {\n model: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeDeleteEvent - Published before deleting a model\n */\nexport class ModelBeforeDeleteEvent extends DomainEvent<ModelBeforeDeleteEventPayload> {\n eventType = \"Cms/Model/BeforeDelete\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeDeleteEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is deleted. */\nexport const ModelBeforeDeleteEventHandler = createAbstraction<\n IEventHandler<ModelBeforeDeleteEvent>\n>(\"ModelBeforeDeleteEventHandler\");\n\nexport namespace ModelBeforeDeleteEventHandler {\n export type Interface = IEventHandler<ModelBeforeDeleteEvent>;\n export type Event = ModelBeforeDeleteEvent;\n}\n\n/**\n * ModelAfterDeleteEvent - Published after deleting a model\n */\nexport class ModelAfterDeleteEvent extends DomainEvent<ModelAfterDeleteEventPayload> {\n eventType = \"Cms/Model/AfterDelete\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterDeleteEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is deleted. */\nexport const ModelAfterDeleteEventHandler = createAbstraction<IEventHandler<ModelAfterDeleteEvent>>(\n \"ModelAfterDeleteEventHandler\"\n);\n\nexport namespace ModelAfterDeleteEventHandler {\n export type Interface = IEventHandler<ModelAfterDeleteEvent>;\n export type Event = ModelAfterDeleteEvent;\n}\n\n/**\n * ModelDeleteErrorEvent - Published when delete fails\n */\nexport class ModelDeleteErrorEvent extends DomainEvent<ModelDeleteErrorEventPayload> {\n eventType = \"Cms/Model/DeleteError\" as const;\n\n getHandlerAbstraction() {\n return ModelDeleteErrorEventHandler;\n }\n}\n\nexport const ModelDeleteErrorEventHandler = createAbstraction<IEventHandler<ModelDeleteErrorEvent>>(\n \"ModelDeleteErrorEventHandler\"\n);\n\nexport namespace ModelDeleteErrorEventHandler {\n export type Interface = IEventHandler<ModelDeleteErrorEvent>;\n export type Event = ModelDeleteErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,0CAA0C;;AAGtE;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeDeleteEvent","eventType","getHandlerAbstraction","ModelBeforeDeleteEventHandler","ModelAfterDeleteEvent","ModelAfterDeleteEventHandler","ModelDeleteErrorEvent","ModelDeleteErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeDeleteEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelAfterDeleteEventPayload {\n model: CmsModel;\n}\n\nexport interface ModelDeleteErrorEventPayload {\n model: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeDeleteEvent - Published before deleting a model\n */\nexport class ModelBeforeDeleteEvent extends DomainEvent<ModelBeforeDeleteEventPayload> {\n eventType = \"Cms/Model/BeforeDelete\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeDeleteEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is deleted. */\nexport const ModelBeforeDeleteEventHandler = createAbstraction<\n IEventHandler<ModelBeforeDeleteEvent>\n>(\"ModelBeforeDeleteEventHandler\");\n\nexport namespace ModelBeforeDeleteEventHandler {\n export type Interface = IEventHandler<ModelBeforeDeleteEvent>;\n export type Event = ModelBeforeDeleteEvent;\n}\n\n/**\n * ModelAfterDeleteEvent - Published after deleting a model\n */\nexport class ModelAfterDeleteEvent extends DomainEvent<ModelAfterDeleteEventPayload> {\n eventType = \"Cms/Model/AfterDelete\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterDeleteEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is deleted. */\nexport const ModelAfterDeleteEventHandler = createAbstraction<IEventHandler<ModelAfterDeleteEvent>>(\n \"ModelAfterDeleteEventHandler\"\n);\n\nexport namespace ModelAfterDeleteEventHandler {\n export type Interface = IEventHandler<ModelAfterDeleteEvent>;\n export type Event = ModelAfterDeleteEvent;\n}\n\n/**\n * ModelDeleteErrorEvent - Published when delete fails\n */\nexport class ModelDeleteErrorEvent extends DomainEvent<ModelDeleteErrorEventPayload> {\n eventType = \"Cms/Model/DeleteError\" as const;\n\n getHandlerAbstraction() {\n return ModelDeleteErrorEventHandler;\n }\n}\n\nexport const ModelDeleteErrorEventHandler = createAbstraction<IEventHandler<ModelDeleteErrorEvent>>(\n \"ModelDeleteErrorEventHandler\"\n);\n\nexport namespace ModelDeleteErrorEventHandler {\n export type Interface = IEventHandler<ModelDeleteErrorEvent>;\n export type Event = ModelDeleteErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,mDAAmD;;AAG/E;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import { ModelToAstConverter as ConverterAbstraction } from "./abstractions.js";
2
2
  import type { CmsModel, CmsModelAst } from "../../../types/index.js";
3
- import { PluginsContainer } from "../../../legacy/abstractions.js";
3
+ import { CmsModelFieldToGraphQLRegistry } from "../../../features/graphql/index.js";
4
4
  /**
5
5
  * ModelToAstConverter implementation
6
6
  *
@@ -8,8 +8,8 @@ import { PluginsContainer } from "../../../legacy/abstractions.js";
8
8
  * for converting models to AST representation (used for GraphQL schema generation)
9
9
  */
10
10
  declare class ModelToAstConverterImpl implements ConverterAbstraction.Interface {
11
- private pluginsContainer;
12
- constructor(pluginsContainer: PluginsContainer.Interface);
11
+ private readonly registry;
12
+ constructor(registry: CmsModelFieldToGraphQLRegistry.Interface);
13
13
  toAst(model: CmsModel): CmsModelAst;
14
14
  }
15
15
  export declare const ModelToAstConverter: typeof ModelToAstConverterImpl & {
@@ -1,6 +1,6 @@
1
1
  import { ModelToAstConverter as ConverterAbstraction } from "./abstractions.js";
2
- import { CmsModelToAstConverter, CmsModelFieldToAstConverterFromPlugins } from "../../../utils/contentModelAst/index.js";
3
- import { PluginsContainer } from "../../../legacy/abstractions.js";
2
+ import { CmsModelFieldToAstConverterFromPlugins, CmsModelToAstConverter } from "../../../utils/contentModelAst/index.js";
3
+ import { CmsModelFieldToGraphQLRegistry } from "../../graphql/index.js";
4
4
 
5
5
  /**
6
6
  * ModelToAstConverter implementation
@@ -9,18 +9,18 @@ import { PluginsContainer } from "../../../legacy/abstractions.js";
9
9
  * for converting models to AST representation (used for GraphQL schema generation)
10
10
  */
11
11
  class ModelToAstConverterImpl {
12
- constructor(pluginsContainer) {
13
- this.pluginsContainer = pluginsContainer;
12
+ constructor(registry) {
13
+ this.registry = registry;
14
14
  }
15
15
  toAst(model) {
16
- const fieldTypePlugins = this.pluginsContainer.byType("cms-model-field-to-graphql");
16
+ const fieldTypePlugins = this.registry.getAll();
17
17
  const converter = new CmsModelToAstConverter(new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins));
18
18
  return converter.toAst(model);
19
19
  }
20
20
  }
21
21
  export const ModelToAstConverter = ConverterAbstraction.createImplementation({
22
22
  implementation: ModelToAstConverterImpl,
23
- dependencies: [PluginsContainer]
23
+ dependencies: [CmsModelFieldToGraphQLRegistry]
24
24
  });
25
25
 
26
26
  //# sourceMappingURL=ModelToAstConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ModelToAstConverter","ConverterAbstraction","CmsModelToAstConverter","CmsModelFieldToAstConverterFromPlugins","PluginsContainer","ModelToAstConverterImpl","constructor","pluginsContainer","toAst","model","fieldTypePlugins","byType","converter","createImplementation","implementation","dependencies"],"sources":["ModelToAstConverter.ts"],"sourcesContent":["import { ModelToAstConverter as ConverterAbstraction } from \"./abstractions.js\";\nimport {\n CmsModelToAstConverter,\n CmsModelFieldToAstConverterFromPlugins\n} from \"~/utils/contentModelAst/index.js\";\nimport type { CmsModel, CmsModelAst, CmsModelFieldToGraphQLPlugin } from \"~/types/index.js\";\nimport { PluginsContainer } from \"~/legacy/abstractions.js\";\n\n/**\n * ModelToAstConverter implementation\n *\n * Wraps CmsModelToAstConverter and provides it with field type plugins\n * for converting models to AST representation (used for GraphQL schema generation)\n */\nclass ModelToAstConverterImpl implements ConverterAbstraction.Interface {\n public constructor(private pluginsContainer: PluginsContainer.Interface) {}\n\n toAst(model: CmsModel): CmsModelAst {\n const fieldTypePlugins = this.pluginsContainer.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n const converter = new CmsModelToAstConverter(\n new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins)\n );\n\n return converter.toAst(model);\n }\n}\n\nexport const ModelToAstConverter = ConverterAbstraction.createImplementation({\n implementation: ModelToAstConverterImpl,\n dependencies: [PluginsContainer]\n});\n"],"mappings":"AAAA,SAASA,mBAAmB,IAAIC,oBAAoB;AACpD,SACIC,sBAAsB,EACtBC,sCAAsC;AAG1C,SAASC,gBAAgB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,uBAAuB,CAA2C;EAC7DC,WAAWA,CAASC,gBAA4C,EAAE;IAAA,KAA9CA,gBAA4C,GAA5CA,gBAA4C;EAAG;EAE1EC,KAAKA,CAACC,KAAe,EAAe;IAChC,MAAMC,gBAAgB,GAAG,IAAI,CAACH,gBAAgB,CAACI,MAAM,CACjD,4BACJ,CAAC;IAED,MAAMC,SAAS,GAAG,IAAIV,sBAAsB,CACxC,IAAIC,sCAAsC,CAACO,gBAAgB,CAC/D,CAAC;IAED,OAAOE,SAAS,CAACJ,KAAK,CAACC,KAAK,CAAC;EACjC;AACJ;AAEA,OAAO,MAAMT,mBAAmB,GAAGC,oBAAoB,CAACY,oBAAoB,CAAC;EACzEC,cAAc,EAAET,uBAAuB;EACvCU,YAAY,EAAE,CAACX,gBAAgB;AACnC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ModelToAstConverter","ConverterAbstraction","CmsModelFieldToAstConverterFromPlugins","CmsModelToAstConverter","CmsModelFieldToGraphQLRegistry","ModelToAstConverterImpl","constructor","registry","toAst","model","fieldTypePlugins","getAll","converter","createImplementation","implementation","dependencies"],"sources":["ModelToAstConverter.ts"],"sourcesContent":["import { ModelToAstConverter as ConverterAbstraction } from \"./abstractions.js\";\nimport {\n CmsModelFieldToAstConverterFromPlugins,\n CmsModelToAstConverter\n} from \"~/utils/contentModelAst/index.js\";\nimport type { CmsModel, CmsModelAst } from \"~/types/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"~/features/graphql/index.js\";\n\n/**\n * ModelToAstConverter implementation\n *\n * Wraps CmsModelToAstConverter and provides it with field type plugins\n * for converting models to AST representation (used for GraphQL schema generation)\n */\nclass ModelToAstConverterImpl implements ConverterAbstraction.Interface {\n public constructor(private readonly registry: CmsModelFieldToGraphQLRegistry.Interface) {}\n\n toAst(model: CmsModel): CmsModelAst {\n const fieldTypePlugins = this.registry.getAll();\n\n const converter = new CmsModelToAstConverter(\n new CmsModelFieldToAstConverterFromPlugins(fieldTypePlugins)\n );\n\n return converter.toAst(model);\n }\n}\n\nexport const ModelToAstConverter = ConverterAbstraction.createImplementation({\n implementation: ModelToAstConverterImpl,\n dependencies: [CmsModelFieldToGraphQLRegistry]\n});\n"],"mappings":"AAAA,SAASA,mBAAmB,IAAIC,oBAAoB;AACpD,SACIC,sCAAsC,EACtCC,sBAAsB;AAG1B,SAASC,8BAA8B;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,uBAAuB,CAA2C;EAC7DC,WAAWA,CAAkBC,QAAkD,EAAE;IAAA,KAApDA,QAAkD,GAAlDA,QAAkD;EAAG;EAEzFC,KAAKA,CAACC,KAAe,EAAe;IAChC,MAAMC,gBAAgB,GAAG,IAAI,CAACH,QAAQ,CAACI,MAAM,CAAC,CAAC;IAE/C,MAAMC,SAAS,GAAG,IAAIT,sBAAsB,CACxC,IAAID,sCAAsC,CAACQ,gBAAgB,CAC/D,CAAC;IAED,OAAOE,SAAS,CAACJ,KAAK,CAACC,KAAK,CAAC;EACjC;AACJ;AAEA,OAAO,MAAMT,mBAAmB,GAAGC,oBAAoB,CAACY,oBAAoB,CAAC;EACzEC,cAAc,EAAET,uBAAuB;EACvCU,YAAY,EAAE,CAACX,8BAA8B;AACjD,CAAC,CAAC","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { UpdateModelUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { UpdateModelRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
6
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
7
7
  import type { CmsModel } from "../../../types/index.js";
8
8
  import type { CmsModelUpdateInput } from "../../../types/index.js";
9
9
  import { GetModelUseCase } from "../../../features/contentModel/GetModel/index.js";
@@ -1,12 +1,12 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { UpdateModelUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { UpdateModelRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { ModelBeforeUpdateEvent } from "./events.js";
6
6
  import { ModelAfterUpdateEvent } from "./events.js";
7
7
  import { ModelUpdateErrorEvent } from "./events.js";
8
8
  import { AccessControl } from "../../shared/abstractions.js";
9
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
9
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
10
10
  import { ModelNotAuthorizedError, ModelValidationError } from "../../../domain/contentModel/errors.js";
11
11
  import { createZodError } from "@webiny/utils";
12
12
  import { removeUndefinedValues } from "@webiny/utils";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","UpdateModelUseCase","UseCaseAbstraction","UpdateModelRepository","EventPublisher","ModelBeforeUpdateEvent","ModelAfterUpdateEvent","ModelUpdateErrorEvent","AccessControl","TenantContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelUpdateValidation","ensureTypeTag","GetModelUseCase","UpdateModelUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","tenantContext","execute","modelId","input","canAccess","canAccessModel","rwd","fail","getResult","isFail","original","structuredClone","value","validationResult","safeParseAsync","success","zodError","error","message","data","Object","keys","length","ok","tenant","getTenant","model","icon","titleFieldId","undefined","descriptionFieldId","imageFieldId","description","id","savedOn","Date","toISOString","fromModel","tags","publish","result","createImplementation","implementation","dependencies"],"sources":["UpdateModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UpdateModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UpdateModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { ModelBeforeUpdateEvent } from \"./events.js\";\nimport { ModelAfterUpdateEvent } from \"./events.js\";\nimport { ModelUpdateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelUpdateValidation } from \"~/domain/contentModel/schemas.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelUpdateInput } from \"~/types/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * UpdateModelUseCase - Core model update orchestration.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Fetch original model\n * - Create updated domain model object\n * - Handle group changes\n * - Handle field ID changes (title, description, image)\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for validation and persistence\n * - Publish after event or error event\n *\n * Note: Repository handles domain validations (API name uniqueness, field validation, etc.)\n */\nclass UpdateModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateModelRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(\n modelId: string,\n input: CmsModelUpdateInput\n ): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the original model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = structuredClone(getResult.value);\n\n // Validate input\n const validationResult = await createModelUpdateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new ModelValidationError({\n message: zodError.message,\n data: zodError.data\n })\n );\n }\n\n const data = removeUndefinedValues(validationResult.data);\n\n // If no changes, return original\n if (Object.keys(data).length === 0) {\n return Result.ok(original);\n }\n\n // Create updated model\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...original,\n ...data,\n icon: data.icon ?? original.icon,\n // Handle optional field IDs explicitly\n titleFieldId:\n data.titleFieldId === undefined\n ? original.titleFieldId\n : (data.titleFieldId as string),\n descriptionFieldId:\n data.descriptionFieldId === undefined\n ? original.descriptionFieldId\n : data.descriptionFieldId,\n imageFieldId:\n data.imageFieldId === undefined ? original.imageFieldId : data.imageFieldId,\n description: data.description || original.description,\n tenant: original.tenant || tenant.id,\n savedOn: new Date().toISOString()\n };\n\n // Access control check on the updated model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n // Publish before event\n await this.eventPublisher.publish(\n new ModelBeforeUpdateEvent({ model, original, input: data })\n );\n\n // Persist via repository (repository will validate)\n const result = await this.repository.execute(model, original);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelUpdateErrorEvent({\n input: data,\n model,\n original,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterUpdateEvent({ model, original }));\n\n return Result.ok(model);\n }\n}\n\nexport const UpdateModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateModelUseCaseImpl,\n dependencies: [\n GetModelUseCase,\n EventPublisher,\n UpdateModelRepository,\n AccessControl,\n TenantContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","UpdateModelUseCase","UseCaseAbstraction","UpdateModelRepository","EventPublisher","ModelBeforeUpdateEvent","ModelAfterUpdateEvent","ModelUpdateErrorEvent","AccessControl","TenantContext","ModelNotAuthorizedError","ModelValidationError","createZodError","removeUndefinedValues","createModelUpdateValidation","ensureTypeTag","GetModelUseCase","UpdateModelUseCaseImpl","constructor","getModelUseCase","eventPublisher","repository","accessControl","tenantContext","execute","modelId","input","canAccess","canAccessModel","rwd","fail","getResult","isFail","original","structuredClone","value","validationResult","safeParseAsync","success","zodError","error","message","data","Object","keys","length","ok","tenant","getTenant","model","icon","titleFieldId","undefined","descriptionFieldId","imageFieldId","description","id","savedOn","Date","toISOString","fromModel","tags","publish","result","createImplementation","implementation","dependencies"],"sources":["UpdateModelUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UpdateModelUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UpdateModelRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { ModelBeforeUpdateEvent } from \"./events.js\";\nimport { ModelAfterUpdateEvent } from \"./events.js\";\nimport { ModelUpdateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ModelNotAuthorizedError, ModelValidationError } from \"~/domain/contentModel/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { removeUndefinedValues } from \"@webiny/utils\";\nimport { createModelUpdateValidation } from \"~/domain/contentModel/schemas.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport type { CmsModelUpdateInput } from \"~/types/index.js\";\nimport { GetModelUseCase } from \"~/features/contentModel/GetModel/index.js\";\n\n/**\n * UpdateModelUseCase - Core model update orchestration.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Fetch original model\n * - Create updated domain model object\n * - Handle group changes\n * - Handle field ID changes (title, description, image)\n * - Access control checks\n * - Publish before event\n * - Delegate to repository for validation and persistence\n * - Publish after event or error event\n *\n * Note: Repository handles domain validations (API name uniqueness, field validation, etc.)\n */\nclass UpdateModelUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateModelRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(\n modelId: string,\n input: CmsModelUpdateInput\n ): Promise<Result<CmsModel, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessModel({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new ModelNotAuthorizedError());\n }\n\n // Get the original model (with access control check)\n const getResult = await this.getModelUseCase.execute(modelId);\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = structuredClone(getResult.value);\n\n // Validate input\n const validationResult = await createModelUpdateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new ModelValidationError({\n message: zodError.message,\n data: zodError.data\n })\n );\n }\n\n const data = removeUndefinedValues(validationResult.data);\n\n // If no changes, return original\n if (Object.keys(data).length === 0) {\n return Result.ok(original);\n }\n\n // Create updated model\n const tenant = this.tenantContext.getTenant();\n\n const model: CmsModel = {\n ...original,\n ...data,\n icon: data.icon ?? original.icon,\n // Handle optional field IDs explicitly\n titleFieldId:\n data.titleFieldId === undefined\n ? original.titleFieldId\n : (data.titleFieldId as string),\n descriptionFieldId:\n data.descriptionFieldId === undefined\n ? original.descriptionFieldId\n : data.descriptionFieldId,\n imageFieldId:\n data.imageFieldId === undefined ? original.imageFieldId : data.imageFieldId,\n description: data.description || original.description,\n tenant: original.tenant || tenant.id,\n savedOn: new Date().toISOString()\n };\n\n // Access control check on the updated model\n const canAccessModel = await this.accessControl.canAccessModel({ model, rwd: \"w\" });\n if (!canAccessModel) {\n return Result.fail(ModelNotAuthorizedError.fromModel(model));\n }\n\n // Ensure type tags\n model.tags = ensureTypeTag(model);\n\n // Publish before event\n await this.eventPublisher.publish(\n new ModelBeforeUpdateEvent({ model, original, input: data })\n );\n\n // Persist via repository (repository will validate)\n const result = await this.repository.execute(model, original);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new ModelUpdateErrorEvent({\n input: data,\n model,\n original,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new ModelAfterUpdateEvent({ model, original }));\n\n return Result.ok(model);\n }\n}\n\nexport const UpdateModelUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateModelUseCaseImpl,\n dependencies: [\n GetModelUseCase,\n EventPublisher,\n UpdateModelRepository,\n AccessControl,\n TenantContext\n ]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,kBAAkB,IAAIC,kBAAkB;AACjD,SAASC,qBAAqB;AAC9B,SAASC,cAAc,QAAQ,mDAAmD;AAClF,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,aAAa;AACtB,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASC,uBAAuB,EAAEC,oBAAoB;AACtD,SAASC,cAAc,QAAQ,eAAe;AAC9C,SAASC,qBAAqB,QAAQ,eAAe;AACrD,SAASC,2BAA2B;AACpC,SAASC,aAAa;AAGtB,SAASC,eAAe;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,sBAAsB,CAAyC;EAC1DC,WAAWA,CACNC,eAA0C,EAC1CC,cAAwC,EACxCC,UAA2C,EAC3CC,aAAsC,EACtCC,aAAsC,EAChD;IAAA,KALUJ,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;IAAA,KACxCC,UAA2C,GAA3CA,UAA2C;IAAA,KAC3CC,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,aAAsC,GAAtCA,aAAsC;EAC/C;EAEH,MAAMC,OAAOA,CACTC,OAAe,EACfC,KAA0B,EACyB;IACnD;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACL,aAAa,CAACM,cAAc,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACvE,IAAI,CAACF,SAAS,EAAE;MACZ,OAAO3B,MAAM,CAAC8B,IAAI,CAAC,IAAIpB,uBAAuB,CAAC,CAAC,CAAC;IACrD;;IAEA;IACA,MAAMqB,SAAS,GAAG,MAAM,IAAI,CAACZ,eAAe,CAACK,OAAO,CAACC,OAAO,CAAC;IAC7D,IAAIM,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOD,SAAS;IACpB;IAEA,MAAME,QAAQ,GAAGC,eAAe,CAACH,SAAS,CAACI,KAAK,CAAC;;IAEjD;IACA,MAAMC,gBAAgB,GAAG,MAAMtB,2BAA2B,CAAC,CAAC,CAACuB,cAAc,CAACX,KAAK,CAAC;IAClF,IAAI,CAACU,gBAAgB,CAACE,OAAO,EAAE;MAC3B,MAAMC,QAAQ,GAAG3B,cAAc,CAACwB,gBAAgB,CAACI,KAAK,CAAC;MACvD,OAAOxC,MAAM,CAAC8B,IAAI,CACd,IAAInB,oBAAoB,CAAC;QACrB8B,OAAO,EAAEF,QAAQ,CAACE,OAAO;QACzBC,IAAI,EAAEH,QAAQ,CAACG;MACnB,CAAC,CACL,CAAC;IACL;IAEA,MAAMA,IAAI,GAAG7B,qBAAqB,CAACuB,gBAAgB,CAACM,IAAI,CAAC;;IAEzD;IACA,IAAIC,MAAM,CAACC,IAAI,CAACF,IAAI,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE;MAChC,OAAO7C,MAAM,CAAC8C,EAAE,CAACb,QAAQ,CAAC;IAC9B;;IAEA;IACA,MAAMc,MAAM,GAAG,IAAI,CAACxB,aAAa,CAACyB,SAAS,CAAC,CAAC;IAE7C,MAAMC,KAAe,GAAG;MACpB,GAAGhB,QAAQ;MACX,GAAGS,IAAI;MACPQ,IAAI,EAAER,IAAI,CAACQ,IAAI,IAAIjB,QAAQ,CAACiB,IAAI;MAChC;MACAC,YAAY,EACRT,IAAI,CAACS,YAAY,KAAKC,SAAS,GACzBnB,QAAQ,CAACkB,YAAY,GACpBT,IAAI,CAACS,YAAuB;MACvCE,kBAAkB,EACdX,IAAI,CAACW,kBAAkB,KAAKD,SAAS,GAC/BnB,QAAQ,CAACoB,kBAAkB,GAC3BX,IAAI,CAACW,kBAAkB;MACjCC,YAAY,EACRZ,IAAI,CAACY,YAAY,KAAKF,SAAS,GAAGnB,QAAQ,CAACqB,YAAY,GAAGZ,IAAI,CAACY,YAAY;MAC/EC,WAAW,EAAEb,IAAI,CAACa,WAAW,IAAItB,QAAQ,CAACsB,WAAW;MACrDR,MAAM,EAAEd,QAAQ,CAACc,MAAM,IAAIA,MAAM,CAACS,EAAE;MACpCC,OAAO,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;IACpC,CAAC;;IAED;IACA,MAAM/B,cAAc,GAAG,MAAM,IAAI,CAACN,aAAa,CAACM,cAAc,CAAC;MAAEqB,KAAK;MAAEpB,GAAG,EAAE;IAAI,CAAC,CAAC;IACnF,IAAI,CAACD,cAAc,EAAE;MACjB,OAAO5B,MAAM,CAAC8B,IAAI,CAACpB,uBAAuB,CAACkD,SAAS,CAACX,KAAK,CAAC,CAAC;IAChE;;IAEA;IACAA,KAAK,CAACY,IAAI,GAAG9C,aAAa,CAACkC,KAAK,CAAC;;IAEjC;IACA,MAAM,IAAI,CAAC7B,cAAc,CAAC0C,OAAO,CAC7B,IAAIzD,sBAAsB,CAAC;MAAE4C,KAAK;MAAEhB,QAAQ;MAAEP,KAAK,EAAEgB;IAAK,CAAC,CAC/D,CAAC;;IAED;IACA,MAAMqB,MAAM,GAAG,MAAM,IAAI,CAAC1C,UAAU,CAACG,OAAO,CAACyB,KAAK,EAAEhB,QAAQ,CAAC;IAC7D,IAAI8B,MAAM,CAAC/B,MAAM,CAAC,CAAC,EAAE;MACjB;MACA,MAAM,IAAI,CAACZ,cAAc,CAAC0C,OAAO,CAC7B,IAAIvD,qBAAqB,CAAC;QACtBmB,KAAK,EAAEgB,IAAI;QACXO,KAAK;QACLhB,QAAQ;QACRO,KAAK,EAAEuB,MAAM,CAACvB;MAClB,CAAC,CACL,CAAC;MACD,OAAOxC,MAAM,CAAC8B,IAAI,CAACiC,MAAM,CAACvB,KAAK,CAAC;IACpC;;IAEA;IACA,MAAM,IAAI,CAACpB,cAAc,CAAC0C,OAAO,CAAC,IAAIxD,qBAAqB,CAAC;MAAE2C,KAAK;MAAEhB;IAAS,CAAC,CAAC,CAAC;IAEjF,OAAOjC,MAAM,CAAC8C,EAAE,CAACG,KAAK,CAAC;EAC3B;AACJ;AAEA,OAAO,MAAMhD,kBAAkB,GAAGC,kBAAkB,CAAC8D,oBAAoB,CAAC;EACtEC,cAAc,EAAEhD,sBAAsB;EACtCiD,YAAY,EAAE,CACVlD,eAAe,EACfZ,cAAc,EACdD,qBAAqB,EACrBK,aAAa,EACbC,aAAa;AAErB,CAAC,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsModel, CmsModelUpdateInput } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads