@contember/schema-migrations 2.1.0-rc.3 → 2.2.0-alpha.10

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 (598) hide show
  1. package/CLAUDE.md +16 -0
  2. package/dist/development/index.cjs +3 -0
  3. package/dist/development/index.cjs.map +1 -1
  4. package/dist/development/index.js +3 -0
  5. package/dist/development/index.js.map +1 -1
  6. package/dist/development/src/MigrationDescriber.cjs.map +1 -1
  7. package/dist/development/src/MigrationDescriber.js.map +1 -1
  8. package/dist/development/src/SchemaDiffer.cjs +27 -12
  9. package/dist/development/src/SchemaDiffer.cjs.map +1 -1
  10. package/dist/development/src/SchemaDiffer.js +27 -12
  11. package/dist/development/src/SchemaDiffer.js.map +1 -1
  12. package/dist/development/src/SchemaMigrator.cjs.map +1 -1
  13. package/dist/development/src/SchemaMigrator.js.map +1 -1
  14. package/dist/development/src/modifications/ModificationHandler.cjs.map +1 -1
  15. package/dist/development/src/modifications/ModificationHandler.js.map +1 -1
  16. package/dist/development/src/modifications/ModificationHandlerFactory.cjs +2 -0
  17. package/dist/development/src/modifications/ModificationHandlerFactory.cjs.map +1 -1
  18. package/dist/development/src/modifications/ModificationHandlerFactory.js +2 -0
  19. package/dist/development/src/modifications/ModificationHandlerFactory.js.map +1 -1
  20. package/dist/development/src/modifications/NoopModification.cjs.map +1 -1
  21. package/dist/development/src/modifications/NoopModification.js.map +1 -1
  22. package/dist/development/src/modifications/acl/PatchAclSchemaModification.cjs +4 -6
  23. package/dist/development/src/modifications/acl/PatchAclSchemaModification.cjs.map +1 -1
  24. package/dist/development/src/modifications/acl/PatchAclSchemaModification.js +4 -6
  25. package/dist/development/src/modifications/acl/PatchAclSchemaModification.js.map +1 -1
  26. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.cjs.map +1 -1
  27. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  28. package/dist/development/src/modifications/actions/CreateTargetModification.cjs.map +1 -1
  29. package/dist/development/src/modifications/actions/CreateTargetModification.js.map +1 -1
  30. package/dist/development/src/modifications/actions/CreateTriggerModification.cjs.map +1 -1
  31. package/dist/development/src/modifications/actions/CreateTriggerModification.js.map +1 -1
  32. package/dist/development/src/modifications/actions/PatchTriggerModification.cjs.map +1 -1
  33. package/dist/development/src/modifications/actions/PatchTriggerModification.js.map +1 -1
  34. package/dist/development/src/modifications/actions/RemoveTargetModification.cjs.map +1 -1
  35. package/dist/development/src/modifications/actions/RemoveTargetModification.js.map +1 -1
  36. package/dist/development/src/modifications/actions/RemoveTriggerModification.cjs.map +1 -1
  37. package/dist/development/src/modifications/actions/RemoveTriggerModification.js.map +1 -1
  38. package/dist/development/src/modifications/actions/UpdateTargetModification.cjs.map +1 -1
  39. package/dist/development/src/modifications/actions/UpdateTargetModification.js.map +1 -1
  40. package/dist/development/src/modifications/actions/UpdateTriggerModification.cjs.map +1 -1
  41. package/dist/development/src/modifications/actions/UpdateTriggerModification.js.map +1 -1
  42. package/dist/development/src/modifications/columns/CreateColumnModification.cjs +2 -1
  43. package/dist/development/src/modifications/columns/CreateColumnModification.cjs.map +1 -1
  44. package/dist/development/src/modifications/columns/CreateColumnModification.js +2 -1
  45. package/dist/development/src/modifications/columns/CreateColumnModification.js.map +1 -1
  46. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  47. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  48. package/dist/development/src/modifications/columns/UpdateColumnNameModification.cjs.map +1 -1
  49. package/dist/development/src/modifications/columns/UpdateColumnNameModification.js.map +1 -1
  50. package/dist/development/src/modifications/columns/columnUtils.cjs.map +1 -1
  51. package/dist/development/src/modifications/columns/columnUtils.js.map +1 -1
  52. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  53. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  54. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.cjs.map +1 -1
  55. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  56. package/dist/development/src/modifications/differs/RemoveChangedFieldDiffer.cjs.map +1 -1
  57. package/dist/development/src/modifications/differs/RemoveChangedFieldDiffer.js.map +1 -1
  58. package/dist/development/src/modifications/differs/RemoveViewDiffer.cjs +4 -1
  59. package/dist/development/src/modifications/differs/RemoveViewDiffer.cjs.map +1 -1
  60. package/dist/development/src/modifications/differs/RemoveViewDiffer.js +5 -2
  61. package/dist/development/src/modifications/differs/RemoveViewDiffer.js.map +1 -1
  62. package/dist/development/src/modifications/differs/UpdateViewDiffer.cjs +45 -0
  63. package/dist/development/src/modifications/differs/UpdateViewDiffer.cjs.map +1 -0
  64. package/dist/development/src/modifications/differs/UpdateViewDiffer.js +45 -0
  65. package/dist/development/src/modifications/differs/UpdateViewDiffer.js.map +1 -0
  66. package/dist/development/src/modifications/entities/CreateEntityModification.cjs.map +1 -1
  67. package/dist/development/src/modifications/entities/CreateEntityModification.js.map +1 -1
  68. package/dist/development/src/modifications/entities/CreateViewModification.cjs.map +1 -1
  69. package/dist/development/src/modifications/entities/CreateViewModification.js.map +1 -1
  70. package/dist/development/src/modifications/entities/RemoveEntityModification.cjs.map +1 -1
  71. package/dist/development/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  72. package/dist/development/src/modifications/entities/ToggleEventLogModification.cjs.map +1 -1
  73. package/dist/development/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
  74. package/dist/development/src/modifications/entities/UpdateEntityNameModification.cjs.map +1 -1
  75. package/dist/development/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  76. package/dist/development/src/modifications/entities/UpdateEntityOrderByModification.cjs.map +1 -1
  77. package/dist/development/src/modifications/entities/UpdateEntityOrderByModification.js.map +1 -1
  78. package/dist/development/src/modifications/entities/UpdateEntityTableNameModification.cjs.map +1 -1
  79. package/dist/development/src/modifications/entities/UpdateEntityTableNameModification.js.map +1 -1
  80. package/dist/development/src/modifications/entities/UpdateViewModification.cjs.map +1 -1
  81. package/dist/development/src/modifications/entities/UpdateViewModification.js.map +1 -1
  82. package/dist/development/src/modifications/enums/CreateEnumModification.cjs.map +1 -1
  83. package/dist/development/src/modifications/enums/CreateEnumModification.js.map +1 -1
  84. package/dist/development/src/modifications/enums/RemoveEnumModification.cjs.map +1 -1
  85. package/dist/development/src/modifications/enums/RemoveEnumModification.js.map +1 -1
  86. package/dist/development/src/modifications/enums/UpdateEnumModification.cjs.map +1 -1
  87. package/dist/development/src/modifications/enums/UpdateEnumModification.js.map +1 -1
  88. package/dist/development/src/modifications/enums/enumUtils.cjs.map +1 -1
  89. package/dist/development/src/modifications/enums/enumUtils.js.map +1 -1
  90. package/dist/development/src/modifications/fields/RemoveFieldModification.cjs.map +1 -1
  91. package/dist/development/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  92. package/dist/development/src/modifications/fields/UpdateFieldNameModification.cjs +10 -4
  93. package/dist/development/src/modifications/fields/UpdateFieldNameModification.cjs.map +1 -1
  94. package/dist/development/src/modifications/fields/UpdateFieldNameModification.js +10 -4
  95. package/dist/development/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  96. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs +23 -7
  97. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  98. package/dist/development/src/modifications/indexes/CreateIndexModification.js +23 -7
  99. package/dist/development/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  100. package/dist/development/src/modifications/indexes/RemoveIndexModification.cjs +52 -17
  101. package/dist/development/src/modifications/indexes/RemoveIndexModification.cjs.map +1 -1
  102. package/dist/development/src/modifications/indexes/RemoveIndexModification.js +52 -17
  103. package/dist/development/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  104. package/dist/development/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.cjs +140 -0
  105. package/dist/development/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.cjs.map +1 -0
  106. package/dist/development/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.js +140 -0
  107. package/dist/development/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.js.map +1 -0
  108. package/dist/development/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.cjs.map +1 -1
  109. package/dist/development/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  110. package/dist/development/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.cjs.map +1 -1
  111. package/dist/development/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.js.map +1 -1
  112. package/dist/development/src/modifications/relations/ConvertOneToManyRelationModification.cjs.map +1 -1
  113. package/dist/development/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  114. package/dist/development/src/modifications/relations/CreateRelationInverseSideModification.cjs.map +1 -1
  115. package/dist/development/src/modifications/relations/CreateRelationInverseSideModification.js.map +1 -1
  116. package/dist/development/src/modifications/relations/CreateRelationModification.cjs.map +1 -1
  117. package/dist/development/src/modifications/relations/CreateRelationModification.js.map +1 -1
  118. package/dist/development/src/modifications/relations/DisableOrphanRemovalModification.cjs.map +1 -1
  119. package/dist/development/src/modifications/relations/DisableOrphanRemovalModification.js.map +1 -1
  120. package/dist/development/src/modifications/relations/EnableOrphanRemovalModification.cjs.map +1 -1
  121. package/dist/development/src/modifications/relations/EnableOrphanRemovalModification.js.map +1 -1
  122. package/dist/development/src/modifications/relations/MakeRelationNotNullModification.cjs.map +1 -1
  123. package/dist/development/src/modifications/relations/MakeRelationNotNullModification.js.map +1 -1
  124. package/dist/development/src/modifications/relations/MakeRelationNullableModification.cjs.map +1 -1
  125. package/dist/development/src/modifications/relations/MakeRelationNullableModification.js.map +1 -1
  126. package/dist/development/src/modifications/relations/ToggleJunctionEventLogModification.cjs.map +1 -1
  127. package/dist/development/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -1
  128. package/dist/development/src/modifications/relations/UpdateRelationOnDeleteModification.cjs.map +1 -1
  129. package/dist/development/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
  130. package/dist/development/src/modifications/relations/UpdateRelationOrderByModification.cjs.map +1 -1
  131. package/dist/development/src/modifications/relations/UpdateRelationOrderByModification.js.map +1 -1
  132. package/dist/development/src/modifications/relations/helpers.cjs.map +1 -1
  133. package/dist/development/src/modifications/relations/helpers.js.map +1 -1
  134. package/dist/development/src/modifications/settings/UpdateSettingsModification.cjs.map +1 -1
  135. package/dist/development/src/modifications/settings/UpdateSettingsModification.js.map +1 -1
  136. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.cjs.map +1 -1
  137. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -1
  138. package/dist/development/src/modifications/utils/createJunctionTable.cjs.map +1 -1
  139. package/dist/development/src/modifications/utils/createJunctionTable.js.map +1 -1
  140. package/dist/development/src/modifications/utils/diffUtils.cjs.map +1 -1
  141. package/dist/development/src/modifications/utils/diffUtils.js.map +1 -1
  142. package/dist/development/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
  143. package/dist/development/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  144. package/dist/development/src/modifications/utils/viewDependencies.cjs +15 -1
  145. package/dist/development/src/modifications/utils/viewDependencies.cjs.map +1 -1
  146. package/dist/development/src/modifications/utils/viewDependencies.js +16 -2
  147. package/dist/development/src/modifications/utils/viewDependencies.js.map +1 -1
  148. package/dist/development/src/modifications/validation/PatchValidationSchemaModification.cjs.map +1 -1
  149. package/dist/development/src/modifications/validation/PatchValidationSchemaModification.js.map +1 -1
  150. package/dist/development/src/modifications/validation/UpdateValidationSchemaModification.cjs.map +1 -1
  151. package/dist/development/src/modifications/validation/UpdateValidationSchemaModification.js.map +1 -1
  152. package/dist/development/src/utils/applyPatchCopyOnWrite.cjs +51 -0
  153. package/dist/development/src/utils/applyPatchCopyOnWrite.cjs.map +1 -0
  154. package/dist/development/src/utils/applyPatchCopyOnWrite.js +51 -0
  155. package/dist/development/src/utils/applyPatchCopyOnWrite.js.map +1 -0
  156. package/dist/production/index.cjs +3 -0
  157. package/dist/production/index.cjs.map +1 -1
  158. package/dist/production/index.js +3 -0
  159. package/dist/production/index.js.map +1 -1
  160. package/dist/production/src/MigrationDescriber.cjs.map +1 -1
  161. package/dist/production/src/MigrationDescriber.js.map +1 -1
  162. package/dist/production/src/SchemaDiffer.cjs +27 -12
  163. package/dist/production/src/SchemaDiffer.cjs.map +1 -1
  164. package/dist/production/src/SchemaDiffer.js +27 -12
  165. package/dist/production/src/SchemaDiffer.js.map +1 -1
  166. package/dist/production/src/SchemaMigrator.cjs.map +1 -1
  167. package/dist/production/src/SchemaMigrator.js.map +1 -1
  168. package/dist/production/src/modifications/ModificationHandler.cjs.map +1 -1
  169. package/dist/production/src/modifications/ModificationHandler.js.map +1 -1
  170. package/dist/production/src/modifications/ModificationHandlerFactory.cjs +2 -0
  171. package/dist/production/src/modifications/ModificationHandlerFactory.cjs.map +1 -1
  172. package/dist/production/src/modifications/ModificationHandlerFactory.js +2 -0
  173. package/dist/production/src/modifications/ModificationHandlerFactory.js.map +1 -1
  174. package/dist/production/src/modifications/NoopModification.cjs.map +1 -1
  175. package/dist/production/src/modifications/NoopModification.js.map +1 -1
  176. package/dist/production/src/modifications/acl/PatchAclSchemaModification.cjs +4 -6
  177. package/dist/production/src/modifications/acl/PatchAclSchemaModification.cjs.map +1 -1
  178. package/dist/production/src/modifications/acl/PatchAclSchemaModification.js +4 -6
  179. package/dist/production/src/modifications/acl/PatchAclSchemaModification.js.map +1 -1
  180. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.cjs.map +1 -1
  181. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  182. package/dist/production/src/modifications/actions/CreateTargetModification.cjs.map +1 -1
  183. package/dist/production/src/modifications/actions/CreateTargetModification.js.map +1 -1
  184. package/dist/production/src/modifications/actions/CreateTriggerModification.cjs.map +1 -1
  185. package/dist/production/src/modifications/actions/CreateTriggerModification.js.map +1 -1
  186. package/dist/production/src/modifications/actions/PatchTriggerModification.cjs.map +1 -1
  187. package/dist/production/src/modifications/actions/PatchTriggerModification.js.map +1 -1
  188. package/dist/production/src/modifications/actions/RemoveTargetModification.cjs.map +1 -1
  189. package/dist/production/src/modifications/actions/RemoveTargetModification.js.map +1 -1
  190. package/dist/production/src/modifications/actions/RemoveTriggerModification.cjs.map +1 -1
  191. package/dist/production/src/modifications/actions/RemoveTriggerModification.js.map +1 -1
  192. package/dist/production/src/modifications/actions/UpdateTargetModification.cjs.map +1 -1
  193. package/dist/production/src/modifications/actions/UpdateTargetModification.js.map +1 -1
  194. package/dist/production/src/modifications/actions/UpdateTriggerModification.cjs.map +1 -1
  195. package/dist/production/src/modifications/actions/UpdateTriggerModification.js.map +1 -1
  196. package/dist/production/src/modifications/columns/CreateColumnModification.cjs +2 -1
  197. package/dist/production/src/modifications/columns/CreateColumnModification.cjs.map +1 -1
  198. package/dist/production/src/modifications/columns/CreateColumnModification.js +2 -1
  199. package/dist/production/src/modifications/columns/CreateColumnModification.js.map +1 -1
  200. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  201. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  202. package/dist/production/src/modifications/columns/UpdateColumnNameModification.cjs.map +1 -1
  203. package/dist/production/src/modifications/columns/UpdateColumnNameModification.js.map +1 -1
  204. package/dist/production/src/modifications/columns/columnUtils.cjs.map +1 -1
  205. package/dist/production/src/modifications/columns/columnUtils.js.map +1 -1
  206. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  207. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  208. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.cjs.map +1 -1
  209. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  210. package/dist/production/src/modifications/differs/RemoveChangedFieldDiffer.cjs.map +1 -1
  211. package/dist/production/src/modifications/differs/RemoveChangedFieldDiffer.js.map +1 -1
  212. package/dist/production/src/modifications/differs/RemoveViewDiffer.cjs +4 -1
  213. package/dist/production/src/modifications/differs/RemoveViewDiffer.cjs.map +1 -1
  214. package/dist/production/src/modifications/differs/RemoveViewDiffer.js +5 -2
  215. package/dist/production/src/modifications/differs/RemoveViewDiffer.js.map +1 -1
  216. package/dist/production/src/modifications/differs/UpdateViewDiffer.cjs +45 -0
  217. package/dist/production/src/modifications/differs/UpdateViewDiffer.cjs.map +1 -0
  218. package/dist/production/src/modifications/differs/UpdateViewDiffer.js +45 -0
  219. package/dist/production/src/modifications/differs/UpdateViewDiffer.js.map +1 -0
  220. package/dist/production/src/modifications/entities/CreateEntityModification.cjs.map +1 -1
  221. package/dist/production/src/modifications/entities/CreateEntityModification.js.map +1 -1
  222. package/dist/production/src/modifications/entities/CreateViewModification.cjs.map +1 -1
  223. package/dist/production/src/modifications/entities/CreateViewModification.js.map +1 -1
  224. package/dist/production/src/modifications/entities/RemoveEntityModification.cjs.map +1 -1
  225. package/dist/production/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  226. package/dist/production/src/modifications/entities/ToggleEventLogModification.cjs.map +1 -1
  227. package/dist/production/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
  228. package/dist/production/src/modifications/entities/UpdateEntityNameModification.cjs.map +1 -1
  229. package/dist/production/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  230. package/dist/production/src/modifications/entities/UpdateEntityOrderByModification.cjs.map +1 -1
  231. package/dist/production/src/modifications/entities/UpdateEntityOrderByModification.js.map +1 -1
  232. package/dist/production/src/modifications/entities/UpdateEntityTableNameModification.cjs.map +1 -1
  233. package/dist/production/src/modifications/entities/UpdateEntityTableNameModification.js.map +1 -1
  234. package/dist/production/src/modifications/entities/UpdateViewModification.cjs.map +1 -1
  235. package/dist/production/src/modifications/entities/UpdateViewModification.js.map +1 -1
  236. package/dist/production/src/modifications/enums/CreateEnumModification.cjs.map +1 -1
  237. package/dist/production/src/modifications/enums/CreateEnumModification.js.map +1 -1
  238. package/dist/production/src/modifications/enums/RemoveEnumModification.cjs.map +1 -1
  239. package/dist/production/src/modifications/enums/RemoveEnumModification.js.map +1 -1
  240. package/dist/production/src/modifications/enums/UpdateEnumModification.cjs.map +1 -1
  241. package/dist/production/src/modifications/enums/UpdateEnumModification.js.map +1 -1
  242. package/dist/production/src/modifications/enums/enumUtils.cjs.map +1 -1
  243. package/dist/production/src/modifications/enums/enumUtils.js.map +1 -1
  244. package/dist/production/src/modifications/fields/RemoveFieldModification.cjs.map +1 -1
  245. package/dist/production/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  246. package/dist/production/src/modifications/fields/UpdateFieldNameModification.cjs +10 -4
  247. package/dist/production/src/modifications/fields/UpdateFieldNameModification.cjs.map +1 -1
  248. package/dist/production/src/modifications/fields/UpdateFieldNameModification.js +10 -4
  249. package/dist/production/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  250. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs +23 -7
  251. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  252. package/dist/production/src/modifications/indexes/CreateIndexModification.js +23 -7
  253. package/dist/production/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  254. package/dist/production/src/modifications/indexes/RemoveIndexModification.cjs +52 -17
  255. package/dist/production/src/modifications/indexes/RemoveIndexModification.cjs.map +1 -1
  256. package/dist/production/src/modifications/indexes/RemoveIndexModification.js +52 -17
  257. package/dist/production/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  258. package/dist/production/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.cjs +140 -0
  259. package/dist/production/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.cjs.map +1 -0
  260. package/dist/production/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.js +140 -0
  261. package/dist/production/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.js.map +1 -0
  262. package/dist/production/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.cjs.map +1 -1
  263. package/dist/production/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  264. package/dist/production/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.cjs.map +1 -1
  265. package/dist/production/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.js.map +1 -1
  266. package/dist/production/src/modifications/relations/ConvertOneToManyRelationModification.cjs.map +1 -1
  267. package/dist/production/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  268. package/dist/production/src/modifications/relations/CreateRelationInverseSideModification.cjs.map +1 -1
  269. package/dist/production/src/modifications/relations/CreateRelationInverseSideModification.js.map +1 -1
  270. package/dist/production/src/modifications/relations/CreateRelationModification.cjs.map +1 -1
  271. package/dist/production/src/modifications/relations/CreateRelationModification.js.map +1 -1
  272. package/dist/production/src/modifications/relations/DisableOrphanRemovalModification.cjs.map +1 -1
  273. package/dist/production/src/modifications/relations/DisableOrphanRemovalModification.js.map +1 -1
  274. package/dist/production/src/modifications/relations/EnableOrphanRemovalModification.cjs.map +1 -1
  275. package/dist/production/src/modifications/relations/EnableOrphanRemovalModification.js.map +1 -1
  276. package/dist/production/src/modifications/relations/MakeRelationNotNullModification.cjs.map +1 -1
  277. package/dist/production/src/modifications/relations/MakeRelationNotNullModification.js.map +1 -1
  278. package/dist/production/src/modifications/relations/MakeRelationNullableModification.cjs.map +1 -1
  279. package/dist/production/src/modifications/relations/MakeRelationNullableModification.js.map +1 -1
  280. package/dist/production/src/modifications/relations/ToggleJunctionEventLogModification.cjs.map +1 -1
  281. package/dist/production/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -1
  282. package/dist/production/src/modifications/relations/UpdateRelationOnDeleteModification.cjs.map +1 -1
  283. package/dist/production/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
  284. package/dist/production/src/modifications/relations/UpdateRelationOrderByModification.cjs.map +1 -1
  285. package/dist/production/src/modifications/relations/UpdateRelationOrderByModification.js.map +1 -1
  286. package/dist/production/src/modifications/relations/helpers.cjs.map +1 -1
  287. package/dist/production/src/modifications/relations/helpers.js.map +1 -1
  288. package/dist/production/src/modifications/settings/UpdateSettingsModification.cjs.map +1 -1
  289. package/dist/production/src/modifications/settings/UpdateSettingsModification.js.map +1 -1
  290. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.cjs.map +1 -1
  291. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -1
  292. package/dist/production/src/modifications/utils/createJunctionTable.cjs.map +1 -1
  293. package/dist/production/src/modifications/utils/createJunctionTable.js.map +1 -1
  294. package/dist/production/src/modifications/utils/diffUtils.cjs.map +1 -1
  295. package/dist/production/src/modifications/utils/diffUtils.js.map +1 -1
  296. package/dist/production/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
  297. package/dist/production/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  298. package/dist/production/src/modifications/utils/viewDependencies.cjs +15 -1
  299. package/dist/production/src/modifications/utils/viewDependencies.cjs.map +1 -1
  300. package/dist/production/src/modifications/utils/viewDependencies.js +16 -2
  301. package/dist/production/src/modifications/utils/viewDependencies.js.map +1 -1
  302. package/dist/production/src/modifications/validation/PatchValidationSchemaModification.cjs.map +1 -1
  303. package/dist/production/src/modifications/validation/PatchValidationSchemaModification.js.map +1 -1
  304. package/dist/production/src/modifications/validation/UpdateValidationSchemaModification.cjs.map +1 -1
  305. package/dist/production/src/modifications/validation/UpdateValidationSchemaModification.js.map +1 -1
  306. package/dist/production/src/utils/applyPatchCopyOnWrite.cjs +51 -0
  307. package/dist/production/src/utils/applyPatchCopyOnWrite.cjs.map +1 -0
  308. package/dist/production/src/utils/applyPatchCopyOnWrite.js +51 -0
  309. package/dist/production/src/utils/applyPatchCopyOnWrite.js.map +1 -0
  310. package/dist/tests/cases/integration/convertManyHasManyToJoiningEntity.test.d.ts +2 -0
  311. package/dist/tests/cases/integration/convertManyHasManyToJoiningEntity.test.d.ts.map +1 -0
  312. package/dist/tests/cases/integration/skipNonModelDiffers.test.d.ts +2 -0
  313. package/dist/tests/cases/integration/skipNonModelDiffers.test.d.ts.map +1 -0
  314. package/dist/tests/cases/unit/patchAclSchemaModification.test.d.ts +2 -0
  315. package/dist/tests/cases/unit/patchAclSchemaModification.test.d.ts.map +1 -0
  316. package/dist/tests/src/tags.d.ts.map +1 -1
  317. package/dist/tests/src/tests.d.ts +4 -3
  318. package/dist/tests/src/tests.d.ts.map +1 -1
  319. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  320. package/dist/types/Migration.d.ts.map +1 -1
  321. package/dist/types/MigrationDescriber.d.ts +2 -2
  322. package/dist/types/MigrationDescriber.d.ts.map +1 -1
  323. package/dist/types/SchemaDiffer.d.ts +12 -5
  324. package/dist/types/SchemaDiffer.d.ts.map +1 -1
  325. package/dist/types/SchemaMigrator.d.ts +2 -2
  326. package/dist/types/SchemaMigrator.d.ts.map +1 -1
  327. package/dist/types/index.d.ts +6 -6
  328. package/dist/types/index.d.ts.map +1 -1
  329. package/dist/types/modifications/ModificationHandler.d.ts +2 -2
  330. package/dist/types/modifications/ModificationHandler.d.ts.map +1 -1
  331. package/dist/types/modifications/ModificationHandlerFactory.d.ts +1 -1
  332. package/dist/types/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  333. package/dist/types/modifications/NoopModification.d.ts +2 -2
  334. package/dist/types/modifications/NoopModification.d.ts.map +1 -1
  335. package/dist/types/modifications/acl/PatchAclSchemaModification.d.ts +3 -3
  336. package/dist/types/modifications/acl/PatchAclSchemaModification.d.ts.map +1 -1
  337. package/dist/types/modifications/acl/UpdateAclSchemaModification.d.ts +4 -4
  338. package/dist/types/modifications/acl/UpdateAclSchemaModification.d.ts.map +1 -1
  339. package/dist/types/modifications/acl/index.d.ts +2 -2
  340. package/dist/types/modifications/acl/index.d.ts.map +1 -1
  341. package/dist/types/modifications/actions/CreateTargetModification.d.ts +4 -4
  342. package/dist/types/modifications/actions/CreateTargetModification.d.ts.map +1 -1
  343. package/dist/types/modifications/actions/CreateTriggerModification.d.ts +4 -4
  344. package/dist/types/modifications/actions/CreateTriggerModification.d.ts.map +1 -1
  345. package/dist/types/modifications/actions/PatchTriggerModification.d.ts +3 -3
  346. package/dist/types/modifications/actions/PatchTriggerModification.d.ts.map +1 -1
  347. package/dist/types/modifications/actions/RemoveTargetModification.d.ts +4 -4
  348. package/dist/types/modifications/actions/RemoveTargetModification.d.ts.map +1 -1
  349. package/dist/types/modifications/actions/RemoveTriggerModification.d.ts +4 -4
  350. package/dist/types/modifications/actions/RemoveTriggerModification.d.ts.map +1 -1
  351. package/dist/types/modifications/actions/UpdateTargetModification.d.ts +4 -4
  352. package/dist/types/modifications/actions/UpdateTargetModification.d.ts.map +1 -1
  353. package/dist/types/modifications/actions/UpdateTriggerModification.d.ts +4 -4
  354. package/dist/types/modifications/actions/UpdateTriggerModification.d.ts.map +1 -1
  355. package/dist/types/modifications/actions/index.d.ts +4 -4
  356. package/dist/types/modifications/actions/index.d.ts.map +1 -1
  357. package/dist/types/modifications/columns/CreateColumnModification.d.ts +4 -4
  358. package/dist/types/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  359. package/dist/types/modifications/columns/UpdateColumnDefinitionModification.d.ts +4 -4
  360. package/dist/types/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  361. package/dist/types/modifications/columns/UpdateColumnNameModification.d.ts +4 -4
  362. package/dist/types/modifications/columns/UpdateColumnNameModification.d.ts.map +1 -1
  363. package/dist/types/modifications/columns/columnUtils.d.ts +1 -1
  364. package/dist/types/modifications/columns/columnUtils.d.ts.map +1 -1
  365. package/dist/types/modifications/columns/index.d.ts +3 -3
  366. package/dist/types/modifications/columns/index.d.ts.map +1 -1
  367. package/dist/types/modifications/constraints/CreateUniqueConstraintModification.d.ts +4 -4
  368. package/dist/types/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  369. package/dist/types/modifications/constraints/RemoveUniqueConstraintModification.d.ts +4 -4
  370. package/dist/types/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
  371. package/dist/types/modifications/constraints/index.d.ts +3 -3
  372. package/dist/types/modifications/constraints/index.d.ts.map +1 -1
  373. package/dist/types/modifications/constraints/utils.d.ts.map +1 -1
  374. package/dist/types/modifications/differs/RemoveChangedFieldDiffer.d.ts +2 -2
  375. package/dist/types/modifications/differs/RemoveChangedFieldDiffer.d.ts.map +1 -1
  376. package/dist/types/modifications/differs/RemoveViewDiffer.d.ts +14 -3
  377. package/dist/types/modifications/differs/RemoveViewDiffer.d.ts.map +1 -1
  378. package/dist/types/modifications/differs/UpdateViewDiffer.d.ts +19 -0
  379. package/dist/types/modifications/differs/UpdateViewDiffer.d.ts.map +1 -0
  380. package/dist/types/modifications/differs/index.d.ts +3 -2
  381. package/dist/types/modifications/differs/index.d.ts.map +1 -1
  382. package/dist/types/modifications/entities/CreateEntityModification.d.ts +4 -4
  383. package/dist/types/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  384. package/dist/types/modifications/entities/CreateViewModification.d.ts +4 -4
  385. package/dist/types/modifications/entities/CreateViewModification.d.ts.map +1 -1
  386. package/dist/types/modifications/entities/RemoveEntityModification.d.ts +4 -4
  387. package/dist/types/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  388. package/dist/types/modifications/entities/ToggleEventLogModification.d.ts +4 -4
  389. package/dist/types/modifications/entities/ToggleEventLogModification.d.ts.map +1 -1
  390. package/dist/types/modifications/entities/UpdateEntityNameModification.d.ts +3 -3
  391. package/dist/types/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
  392. package/dist/types/modifications/entities/UpdateEntityOrderByModification.d.ts +4 -4
  393. package/dist/types/modifications/entities/UpdateEntityOrderByModification.d.ts.map +1 -1
  394. package/dist/types/modifications/entities/UpdateEntityTableNameModification.d.ts +4 -4
  395. package/dist/types/modifications/entities/UpdateEntityTableNameModification.d.ts.map +1 -1
  396. package/dist/types/modifications/entities/UpdateViewModification.d.ts +3 -3
  397. package/dist/types/modifications/entities/UpdateViewModification.d.ts.map +1 -1
  398. package/dist/types/modifications/entities/index.d.ts +7 -7
  399. package/dist/types/modifications/entities/index.d.ts.map +1 -1
  400. package/dist/types/modifications/enums/CreateEnumModification.d.ts +4 -4
  401. package/dist/types/modifications/enums/CreateEnumModification.d.ts.map +1 -1
  402. package/dist/types/modifications/enums/RemoveEnumModification.d.ts +4 -4
  403. package/dist/types/modifications/enums/RemoveEnumModification.d.ts.map +1 -1
  404. package/dist/types/modifications/enums/UpdateEnumModification.d.ts +4 -4
  405. package/dist/types/modifications/enums/UpdateEnumModification.d.ts.map +1 -1
  406. package/dist/types/modifications/enums/enumUtils.d.ts.map +1 -1
  407. package/dist/types/modifications/enums/index.d.ts +3 -3
  408. package/dist/types/modifications/enums/index.d.ts.map +1 -1
  409. package/dist/types/modifications/fields/RemoveFieldModification.d.ts +4 -4
  410. package/dist/types/modifications/fields/RemoveFieldModification.d.ts.map +1 -1
  411. package/dist/types/modifications/fields/UpdateFieldNameModification.d.ts +3 -3
  412. package/dist/types/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
  413. package/dist/types/modifications/fields/index.d.ts +2 -2
  414. package/dist/types/modifications/fields/index.d.ts.map +1 -1
  415. package/dist/types/modifications/index.d.ts +13 -13
  416. package/dist/types/modifications/index.d.ts.map +1 -1
  417. package/dist/types/modifications/indexes/CreateIndexModification.d.ts +4 -4
  418. package/dist/types/modifications/indexes/CreateIndexModification.d.ts.map +1 -1
  419. package/dist/types/modifications/indexes/RemoveIndexModification.d.ts +18 -6
  420. package/dist/types/modifications/indexes/RemoveIndexModification.d.ts.map +1 -1
  421. package/dist/types/modifications/indexes/index.d.ts +2 -2
  422. package/dist/types/modifications/indexes/index.d.ts.map +1 -1
  423. package/dist/types/modifications/indexes/utils.d.ts.map +1 -1
  424. package/dist/types/modifications/relations/ConvertManyHasManyToJoiningEntityModification.d.ts +52 -0
  425. package/dist/types/modifications/relations/ConvertManyHasManyToJoiningEntityModification.d.ts.map +1 -0
  426. package/dist/types/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +5 -5
  427. package/dist/types/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
  428. package/dist/types/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.d.ts +4 -4
  429. package/dist/types/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.d.ts.map +1 -1
  430. package/dist/types/modifications/relations/ConvertOneToManyRelationModification.d.ts +4 -4
  431. package/dist/types/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  432. package/dist/types/modifications/relations/CreateRelationInverseSideModification.d.ts +4 -4
  433. package/dist/types/modifications/relations/CreateRelationInverseSideModification.d.ts.map +1 -1
  434. package/dist/types/modifications/relations/CreateRelationModification.d.ts +5 -5
  435. package/dist/types/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  436. package/dist/types/modifications/relations/DisableOrphanRemovalModification.d.ts +4 -4
  437. package/dist/types/modifications/relations/DisableOrphanRemovalModification.d.ts.map +1 -1
  438. package/dist/types/modifications/relations/EnableOrphanRemovalModification.d.ts +4 -4
  439. package/dist/types/modifications/relations/EnableOrphanRemovalModification.d.ts.map +1 -1
  440. package/dist/types/modifications/relations/MakeRelationNotNullModification.d.ts +4 -4
  441. package/dist/types/modifications/relations/MakeRelationNotNullModification.d.ts.map +1 -1
  442. package/dist/types/modifications/relations/MakeRelationNullableModification.d.ts +4 -4
  443. package/dist/types/modifications/relations/MakeRelationNullableModification.d.ts.map +1 -1
  444. package/dist/types/modifications/relations/ToggleJunctionEventLogModification.d.ts +4 -4
  445. package/dist/types/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -1
  446. package/dist/types/modifications/relations/UpdateRelationOnDeleteModification.d.ts +4 -4
  447. package/dist/types/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
  448. package/dist/types/modifications/relations/UpdateRelationOrderByModification.d.ts +4 -4
  449. package/dist/types/modifications/relations/UpdateRelationOrderByModification.d.ts.map +1 -1
  450. package/dist/types/modifications/relations/helpers.d.ts.map +1 -1
  451. package/dist/types/modifications/relations/index.d.ts +12 -11
  452. package/dist/types/modifications/relations/index.d.ts.map +1 -1
  453. package/dist/types/modifications/relations/normalization.d.ts.map +1 -1
  454. package/dist/types/modifications/settings/UpdateSettingsModification.d.ts +4 -4
  455. package/dist/types/modifications/settings/UpdateSettingsModification.d.ts.map +1 -1
  456. package/dist/types/modifications/settings/index.d.ts +1 -1
  457. package/dist/types/modifications/settings/index.d.ts.map +1 -1
  458. package/dist/types/modifications/upgrade/RemoveIndexNamesModification.d.ts +3 -3
  459. package/dist/types/modifications/upgrade/RemoveIndexNamesModification.d.ts.map +1 -1
  460. package/dist/types/modifications/utils/columnUtils.d.ts +1 -1
  461. package/dist/types/modifications/utils/columnUtils.d.ts.map +1 -1
  462. package/dist/types/modifications/utils/createJunctionTable.d.ts.map +1 -1
  463. package/dist/types/modifications/utils/diffUtils.d.ts +1 -1
  464. package/dist/types/modifications/utils/diffUtils.d.ts.map +1 -1
  465. package/dist/types/modifications/utils/getPrimaryColumnType.d.ts.map +1 -1
  466. package/dist/types/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
  467. package/dist/types/modifications/utils/sqlUpdateUtils.d.ts.map +1 -1
  468. package/dist/types/modifications/utils/stringArrayEquals.d.ts.map +1 -1
  469. package/dist/types/modifications/utils/valueUtils.d.ts.map +1 -1
  470. package/dist/types/modifications/utils/viewDependencies.d.ts +11 -1
  471. package/dist/types/modifications/utils/viewDependencies.d.ts.map +1 -1
  472. package/dist/types/modifications/validation/PatchValidationSchemaModification.d.ts +3 -3
  473. package/dist/types/modifications/validation/PatchValidationSchemaModification.d.ts.map +1 -1
  474. package/dist/types/modifications/validation/UpdateValidationSchemaModification.d.ts +4 -4
  475. package/dist/types/modifications/validation/UpdateValidationSchemaModification.d.ts.map +1 -1
  476. package/dist/types/modifications/validation/index.d.ts +2 -2
  477. package/dist/types/modifications/validation/index.d.ts.map +1 -1
  478. package/dist/types/tsconfig.tsbuildinfo +1 -1
  479. package/dist/types/utils/applyPatchCopyOnWrite.d.ts +10 -0
  480. package/dist/types/utils/applyPatchCopyOnWrite.d.ts.map +1 -0
  481. package/dist/types/utils/dbHelpers.d.ts.map +1 -1
  482. package/dist/types/utils/isDefined.d.ts.map +1 -1
  483. package/dist/types/utils/isIt.d.ts.map +1 -1
  484. package/package.json +7 -7
  485. package/src/MigrationDescriber.ts +2 -2
  486. package/src/SchemaDiffer.ts +52 -25
  487. package/src/SchemaMigrator.ts +2 -2
  488. package/src/index.ts +6 -6
  489. package/src/modifications/ModificationHandler.ts +2 -2
  490. package/src/modifications/ModificationHandlerFactory.ts +21 -19
  491. package/src/modifications/NoopModification.ts +2 -2
  492. package/src/modifications/acl/PatchAclSchemaModification.ts +7 -8
  493. package/src/modifications/acl/UpdateAclSchemaModification.ts +3 -3
  494. package/src/modifications/acl/index.ts +2 -2
  495. package/src/modifications/actions/CreateTargetModification.ts +2 -2
  496. package/src/modifications/actions/CreateTriggerModification.ts +2 -2
  497. package/src/modifications/actions/PatchTriggerModification.ts +3 -3
  498. package/src/modifications/actions/RemoveTargetModification.ts +2 -2
  499. package/src/modifications/actions/RemoveTriggerModification.ts +2 -2
  500. package/src/modifications/actions/UpdateTargetModification.ts +2 -2
  501. package/src/modifications/actions/UpdateTriggerModification.ts +3 -3
  502. package/src/modifications/actions/index.ts +4 -4
  503. package/src/modifications/columns/CreateColumnModification.ts +7 -6
  504. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +6 -6
  505. package/src/modifications/columns/UpdateColumnNameModification.ts +3 -3
  506. package/src/modifications/columns/columnUtils.ts +1 -1
  507. package/src/modifications/columns/index.ts +3 -3
  508. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +4 -4
  509. package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +4 -4
  510. package/src/modifications/constraints/index.ts +3 -3
  511. package/src/modifications/differs/RemoveChangedFieldDiffer.ts +3 -3
  512. package/src/modifications/differs/RemoveViewDiffer.ts +17 -5
  513. package/src/modifications/differs/UpdateViewDiffer.ts +58 -0
  514. package/src/modifications/differs/index.ts +3 -2
  515. package/src/modifications/entities/CreateEntityModification.ts +5 -5
  516. package/src/modifications/entities/CreateViewModification.ts +3 -3
  517. package/src/modifications/entities/RemoveEntityModification.ts +4 -4
  518. package/src/modifications/entities/ToggleEventLogModification.ts +3 -3
  519. package/src/modifications/entities/UpdateEntityNameModification.ts +12 -7
  520. package/src/modifications/entities/UpdateEntityOrderByModification.ts +2 -2
  521. package/src/modifications/entities/UpdateEntityTableNameModification.ts +2 -2
  522. package/src/modifications/entities/UpdateViewModification.ts +2 -2
  523. package/src/modifications/entities/index.ts +7 -7
  524. package/src/modifications/enums/CreateEnumModification.ts +3 -3
  525. package/src/modifications/enums/RemoveEnumModification.ts +2 -2
  526. package/src/modifications/enums/UpdateEnumModification.ts +4 -4
  527. package/src/modifications/enums/enumUtils.ts +1 -1
  528. package/src/modifications/enums/index.ts +3 -3
  529. package/src/modifications/fields/RemoveFieldModification.ts +3 -3
  530. package/src/modifications/fields/UpdateFieldNameModification.ts +26 -10
  531. package/src/modifications/fields/index.ts +2 -2
  532. package/src/modifications/index.ts +13 -13
  533. package/src/modifications/indexes/CreateIndexModification.ts +47 -11
  534. package/src/modifications/indexes/RemoveIndexModification.ts +92 -23
  535. package/src/modifications/indexes/index.ts +2 -2
  536. package/src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.ts +218 -0
  537. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +7 -7
  538. package/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.ts +6 -6
  539. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +6 -6
  540. package/src/modifications/relations/CreateRelationInverseSideModification.ts +3 -3
  541. package/src/modifications/relations/CreateRelationModification.ts +9 -9
  542. package/src/modifications/relations/DisableOrphanRemovalModification.ts +3 -3
  543. package/src/modifications/relations/EnableOrphanRemovalModification.ts +3 -3
  544. package/src/modifications/relations/MakeRelationNotNullModification.ts +4 -4
  545. package/src/modifications/relations/MakeRelationNullableModification.ts +4 -4
  546. package/src/modifications/relations/ToggleJunctionEventLogModification.ts +5 -5
  547. package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +5 -5
  548. package/src/modifications/relations/UpdateRelationOrderByModification.ts +3 -3
  549. package/src/modifications/relations/helpers.ts +1 -1
  550. package/src/modifications/relations/index.ts +12 -11
  551. package/src/modifications/settings/UpdateSettingsModification.ts +2 -2
  552. package/src/modifications/settings/index.ts +1 -1
  553. package/src/modifications/upgrade/RemoveIndexNamesModification.ts +2 -2
  554. package/src/modifications/utils/createJunctionTable.ts +3 -3
  555. package/src/modifications/utils/diffUtils.ts +2 -2
  556. package/src/modifications/utils/schemaUpdateUtils.ts +3 -3
  557. package/src/modifications/utils/viewDependencies.ts +26 -2
  558. package/src/modifications/validation/PatchValidationSchemaModification.ts +3 -3
  559. package/src/modifications/validation/UpdateValidationSchemaModification.ts +3 -3
  560. package/src/modifications/validation/index.ts +2 -2
  561. package/src/utils/applyPatchCopyOnWrite.ts +63 -0
  562. package/tests/cases/integration/convertManyHasManyToJoiningEntity.test.ts +339 -0
  563. package/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.ts +2 -2
  564. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +2 -2
  565. package/tests/cases/integration/convertOneToManyRelation.test.ts +2 -2
  566. package/tests/cases/integration/createAndDropIndex.test.ts +482 -3
  567. package/tests/cases/integration/createColumn.test.ts +57 -2
  568. package/tests/cases/integration/createEntity.test.ts +2 -2
  569. package/tests/cases/integration/createEnum.test.ts +2 -2
  570. package/tests/cases/integration/createManyHasMany.test.ts +2 -2
  571. package/tests/cases/integration/createManyHasOne.test.ts +2 -2
  572. package/tests/cases/integration/createOneHasMany.test.ts +2 -2
  573. package/tests/cases/integration/createOneHasOne.test.ts +2 -2
  574. package/tests/cases/integration/createRelationInverseSide.test.ts +2 -2
  575. package/tests/cases/integration/createUnique.test.ts +3 -3
  576. package/tests/cases/integration/disableOrphanRemoval.test.ts +2 -2
  577. package/tests/cases/integration/enableOrphanRemoval.test.ts +2 -2
  578. package/tests/cases/integration/makeColumnNotNull.test.ts +2 -2
  579. package/tests/cases/integration/makeRelationNotNull.test.ts +2 -2
  580. package/tests/cases/integration/makeRelationNullable.test.ts +2 -2
  581. package/tests/cases/integration/patchAclSchema.test.ts +2 -2
  582. package/tests/cases/integration/patchTrigger.test.ts +1 -1
  583. package/tests/cases/integration/removeEntity.test.ts +2 -2
  584. package/tests/cases/integration/removeEnum.test.ts +2 -2
  585. package/tests/cases/integration/removeField.test.ts +3 -3
  586. package/tests/cases/integration/skipNonModelDiffers.test.ts +97 -0
  587. package/tests/cases/integration/toggleEventLog.test.ts +2 -2
  588. package/tests/cases/integration/toggleJunctionEventLog.test.ts +2 -2
  589. package/tests/cases/integration/updateColumnDefinition.test.ts +3 -3
  590. package/tests/cases/integration/updateEntityName.test.ts +2 -2
  591. package/tests/cases/integration/updateEntityOrderBy.test.ts +2 -2
  592. package/tests/cases/integration/updateEnum.test.ts +2 -2
  593. package/tests/cases/integration/updateFieldName.test.ts +38 -3
  594. package/tests/cases/integration/updateRelationOnDelete.test.ts +2 -2
  595. package/tests/cases/integration/updateRelationOrderBy.test.ts +2 -2
  596. package/tests/cases/integration/updateView.test.ts +221 -233
  597. package/tests/cases/unit/patchAclSchemaModification.test.ts +144 -0
  598. package/tests/src/tests.ts +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"RemoveIndexNamesModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/upgrade/RemoveIndexNamesModification.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEveryEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\n\nexport class RemoveIndexNamesModificationHandler implements ModificationHandler<RemoveIndexNamesModificationData> {\n\tpublic createSql(): void {\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEveryEntity(({ entity }) => {\n\t\t\t\treturn {\n\t\t\t\t\t...entity,\n\t\t\t\t\tindexes: entity.indexes.map(({ name, ...other }) => other),\n\t\t\t\t\tunique: entity.unique.map(it => {\n\t\t\t\t\t\tif ('name' in it) {\n\t\t\t\t\t\t\tconst { name, ...other } = it\n\t\t\t\t\t\t\treturn other\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn it\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\treturn { message: `Schema upgrade: remove names of indexes and unique constraints` }\n\t}\n}\n\nexport const removeIndexNamesModification = createModificationType({\n\tid: 'removeIndexNames',\n\thandler: RemoveIndexNamesModificationHandler,\n})\n\nexport type RemoveIndexNamesModificationData = {}\n\nexport class RemoveIndexNamesDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema) {\n\t\tconst hasNames = !!Object.values(originalSchema.model.entities).find(it => {\n\t\t\treturn it.indexes.find(it => !!it.name) || it.unique.find(it => 'name' in it && !!it.name)\n\t\t})\n\t\tif (hasNames) {\n\t\t\treturn [removeIndexNamesModification.createModification({})]\n\t\t}\n\t\treturn []\n\t}\n}\n"],"names":["it"],"mappings":";;AAIO,MAAM,oCAAqG;AAAA,EAC1G,YAAkB;AAAA,EACzB;AAAA,EAEO,mBAAkC;AACxC,WAAO;AAAA,MACN,kBAAkB,CAAC,EAAE,aAAa;AACjC,eAAO;AAAA,UACN,GAAG;AAAA,UACH,SAAS,OAAO,QAAQ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAA,MAAY,KAAK;AAAA,UACzD,QAAQ,OAAO,OAAO,IAAI,CAAA,OAAM;AAC/B,gBAAI,UAAU,IAAI;AACjB,oBAAM,EAAE,MAAM,GAAG,MAAA,IAAU;AAC3B,qBAAO;AAAA,YACR;AACA,mBAAO;AAAA,UACR,CAAC;AAAA,QAAA;AAAA,MAEH,CAAC;AAAA,IAAA;AAAA,EAEH;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,iEAAA;AAAA,EACnB;AACD;AAEO,MAAM,+BAA+B,uBAAuB;AAAA,EAClE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAIM,MAAM,uBAAyC;AAAA,EACrD,WAAW,gBAAwB;AAClC,UAAM,WAAW,CAAC,CAAC,OAAO,OAAO,eAAe,MAAM,QAAQ,EAAE,KAAK,CAAA,OAAM;AAC1E,aAAO,GAAG,QAAQ,KAAK,CAAAA,QAAM,CAAC,CAACA,IAAG,IAAI,KAAK,GAAG,OAAO,KAAK,CAAAA,QAAM,UAAUA,OAAM,CAAC,CAACA,IAAG,IAAI;AAAA,IAC1F,CAAC;AACD,QAAI,UAAU;AACb,aAAO,CAAC,6BAA6B,mBAAmB,CAAA,CAAE,CAAC;AAAA,IAC5D;AACA,WAAO,CAAA;AAAA,EACR;AACD;"}
1
+ {"version":3,"file":"RemoveIndexNamesModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/upgrade/RemoveIndexNamesModification.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEveryEntity, updateModel } from '../utils/schemaUpdateUtils.js'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler.js'\n\nexport class RemoveIndexNamesModificationHandler implements ModificationHandler<RemoveIndexNamesModificationData> {\n\tpublic createSql(): void {\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEveryEntity(({ entity }) => {\n\t\t\t\treturn {\n\t\t\t\t\t...entity,\n\t\t\t\t\tindexes: entity.indexes.map(({ name, ...other }) => other),\n\t\t\t\t\tunique: entity.unique.map(it => {\n\t\t\t\t\t\tif ('name' in it) {\n\t\t\t\t\t\t\tconst { name, ...other } = it\n\t\t\t\t\t\t\treturn other\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn it\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\treturn { message: `Schema upgrade: remove names of indexes and unique constraints` }\n\t}\n}\n\nexport const removeIndexNamesModification = createModificationType({\n\tid: 'removeIndexNames',\n\thandler: RemoveIndexNamesModificationHandler,\n})\n\nexport type RemoveIndexNamesModificationData = {}\n\nexport class RemoveIndexNamesDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema) {\n\t\tconst hasNames = !!Object.values(originalSchema.model.entities).find(it => {\n\t\t\treturn it.indexes.find(it => !!it.name) || it.unique.find(it => 'name' in it && !!it.name)\n\t\t})\n\t\tif (hasNames) {\n\t\t\treturn [removeIndexNamesModification.createModification({})]\n\t\t}\n\t\treturn []\n\t}\n}\n"],"names":["it"],"mappings":";;AAIO,MAAM,oCAAqG;AAAA,EAC1G,YAAkB;AAAA,EACzB;AAAA,EAEO,mBAAkC;AACxC,WAAO;AAAA,MACN,kBAAkB,CAAC,EAAE,aAAa;AACjC,eAAO;AAAA,UACN,GAAG;AAAA,UACH,SAAS,OAAO,QAAQ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAA,MAAY,KAAK;AAAA,UACzD,QAAQ,OAAO,OAAO,IAAI,CAAA,OAAM;AAC/B,gBAAI,UAAU,IAAI;AACjB,oBAAM,EAAE,MAAM,GAAG,MAAA,IAAU;AAC3B,qBAAO;AAAA,YACR;AACA,mBAAO;AAAA,UACR,CAAC;AAAA,QAAA;AAAA,MAEH,CAAC;AAAA,IAAA;AAAA,EAEH;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,iEAAA;AAAA,EACnB;AACD;AAEO,MAAM,+BAA+B,uBAAuB;AAAA,EAClE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAIM,MAAM,uBAAyC;AAAA,EACrD,WAAW,gBAAwB;AAClC,UAAM,WAAW,CAAC,CAAC,OAAO,OAAO,eAAe,MAAM,QAAQ,EAAE,KAAK,CAAA,OAAM;AAC1E,aAAO,GAAG,QAAQ,KAAK,CAAAA,QAAM,CAAC,CAACA,IAAG,IAAI,KAAK,GAAG,OAAO,KAAK,CAAAA,QAAM,UAAUA,OAAM,CAAC,CAACA,IAAG,IAAI;AAAA,IAC1F,CAAC;AACD,QAAI,UAAU;AACb,aAAO,CAAC,6BAA6B,mBAAmB,CAAA,CAAE,CAAC;AAAA,IAC5D;AACA,WAAO,CAAA;AAAA,EACR;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"createJunctionTable.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/createJunctionTable.ts"],"sourcesContent":["import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils'\nimport { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { getPrimaryColumnType } from './getPrimaryColumnType'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\n\nexport const createJunctionTableSql = (\n\tbuilder: MigrationBuilder,\n\tsystemSchema: string,\n\tschema: Schema,\n\tentity: Model.Entity,\n\ttargetEntity: Model.Entity,\n\trelation: Model.ManyHasManyOwningRelation,\n) => {\n\tconst primaryColumns = [\n\t\trelation.joiningTable.joiningColumn.columnName,\n\t\trelation.joiningTable.inverseJoiningColumn.columnName,\n\t]\n\tbuilder.createTable(\n\t\trelation.joiningTable.tableName,\n\t\t{\n\t\t\t[relation.joiningTable.joiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(entity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${entity.tableName}\"(\"${entity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t\t[relation.joiningTable.inverseJoiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(targetEntity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${targetEntity.tableName}\"(\"${targetEntity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t},\n\t)\n\n\tconst tableNameId = wrapIdentifier(relation.joiningTable.tableName)\n\tconst columnNameId = primaryColumns.map(wrapIdentifier)\n\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD PRIMARY KEY (${columnNameId.join(', ')})`)\n\n\tif (relation.joiningTable.eventLog.enabled) {\n\t\tcreateEventTrigger(builder, systemSchema, relation.joiningTable.tableName, primaryColumns)\n\t\tcreateEventTrxTrigger(builder, systemSchema, relation.joiningTable.tableName)\n\t}\n}\n"],"names":["getPrimaryColumnType","wrapIdentifier","createEventTrigger","createEventTrxTrigger"],"mappings":";;;;;AAMO,MAAM,yBAAyB,CACrC,SACA,cACA,QACA,QACA,cACA,aACI;AACJ,QAAM,iBAAiB;AAAA,IACtB,SAAS,aAAa,cAAc;AAAA,IACpC,SAAS,aAAa,qBAAqB;AAAA,EAAA;AAE5C,UAAQ;AAAA,IACP,SAAS,aAAa;AAAA,IACtB;AAAA,MACC,CAAC,SAAS,aAAa,cAAc,UAAU,GAAG;AAAA,QACjD,MAAMA,qBAAAA,qBAAqB,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,YAAY,IAAI,OAAO,SAAS,MAAM,OAAO,aAAa;AAAA,QAC1D,UAAU;AAAA,MAAA;AAAA,MAEX,CAAC,SAAS,aAAa,qBAAqB,UAAU,GAAG;AAAA,QACxD,MAAMA,qBAAAA,qBAAqB,YAAY;AAAA,QACvC,SAAS;AAAA,QACT,YAAY,IAAI,aAAa,SAAS,MAAM,aAAa,aAAa;AAAA,QACtE,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACD;AAGD,QAAM,cAAcC,UAAAA,eAAe,SAAS,aAAa,SAAS;AAClE,QAAM,eAAe,eAAe,IAAIA,wBAAc;AACtD,UAAQ,IAAI,eAAe,WAAW,qBAAqB,aAAa,KAAK,IAAI,CAAC,GAAG;AAErF,MAAI,SAAS,aAAa,SAAS,SAAS;AAC3CC,mBAAAA,mBAAmB,SAAS,cAAc,SAAS,aAAa,WAAW,cAAc;AACzFC,mBAAAA,sBAAsB,SAAS,cAAc,SAAS,aAAa,SAAS;AAAA,EAC7E;AACD;;"}
1
+ {"version":3,"file":"createJunctionTable.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/createJunctionTable.ts"],"sourcesContent":["import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils.js'\nimport { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { getPrimaryColumnType } from './getPrimaryColumnType.js'\nimport { wrapIdentifier } from '../../utils/dbHelpers.js'\n\nexport const createJunctionTableSql = (\n\tbuilder: MigrationBuilder,\n\tsystemSchema: string,\n\tschema: Schema,\n\tentity: Model.Entity,\n\ttargetEntity: Model.Entity,\n\trelation: Model.ManyHasManyOwningRelation,\n) => {\n\tconst primaryColumns = [\n\t\trelation.joiningTable.joiningColumn.columnName,\n\t\trelation.joiningTable.inverseJoiningColumn.columnName,\n\t]\n\tbuilder.createTable(\n\t\trelation.joiningTable.tableName,\n\t\t{\n\t\t\t[relation.joiningTable.joiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(entity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${entity.tableName}\"(\"${entity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t\t[relation.joiningTable.inverseJoiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(targetEntity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${targetEntity.tableName}\"(\"${targetEntity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t},\n\t)\n\n\tconst tableNameId = wrapIdentifier(relation.joiningTable.tableName)\n\tconst columnNameId = primaryColumns.map(wrapIdentifier)\n\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD PRIMARY KEY (${columnNameId.join(', ')})`)\n\n\tif (relation.joiningTable.eventLog.enabled) {\n\t\tcreateEventTrigger(builder, systemSchema, relation.joiningTable.tableName, primaryColumns)\n\t\tcreateEventTrxTrigger(builder, systemSchema, relation.joiningTable.tableName)\n\t}\n}\n"],"names":["getPrimaryColumnType","wrapIdentifier","createEventTrigger","createEventTrxTrigger"],"mappings":";;;;;AAMO,MAAM,yBAAyB,CACrC,SACA,cACA,QACA,QACA,cACA,aACI;AACJ,QAAM,iBAAiB;AAAA,IACtB,SAAS,aAAa,cAAc;AAAA,IACpC,SAAS,aAAa,qBAAqB;AAAA,EAAA;AAE5C,UAAQ;AAAA,IACP,SAAS,aAAa;AAAA,IACtB;AAAA,MACC,CAAC,SAAS,aAAa,cAAc,UAAU,GAAG;AAAA,QACjD,MAAMA,qBAAAA,qBAAqB,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,YAAY,IAAI,OAAO,SAAS,MAAM,OAAO,aAAa;AAAA,QAC1D,UAAU;AAAA,MAAA;AAAA,MAEX,CAAC,SAAS,aAAa,qBAAqB,UAAU,GAAG;AAAA,QACxD,MAAMA,qBAAAA,qBAAqB,YAAY;AAAA,QACvC,SAAS;AAAA,QACT,YAAY,IAAI,aAAa,SAAS,MAAM,aAAa,aAAa;AAAA,QACtE,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACD;AAGD,QAAM,cAAcC,UAAAA,eAAe,SAAS,aAAa,SAAS;AAClE,QAAM,eAAe,eAAe,IAAIA,wBAAc;AACtD,UAAQ,IAAI,eAAe,WAAW,qBAAqB,aAAa,KAAK,IAAI,CAAC,GAAG;AAErF,MAAI,SAAS,aAAa,SAAS,SAAS;AAC3CC,mBAAAA,mBAAmB,SAAS,cAAc,SAAS,aAAa,WAAW,cAAc;AACzFC,mBAAAA,sBAAsB,SAAS,cAAc,SAAS,aAAa,SAAS;AAAA,EAC7E;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"createJunctionTable.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/createJunctionTable.ts"],"sourcesContent":["import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils'\nimport { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { getPrimaryColumnType } from './getPrimaryColumnType'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\n\nexport const createJunctionTableSql = (\n\tbuilder: MigrationBuilder,\n\tsystemSchema: string,\n\tschema: Schema,\n\tentity: Model.Entity,\n\ttargetEntity: Model.Entity,\n\trelation: Model.ManyHasManyOwningRelation,\n) => {\n\tconst primaryColumns = [\n\t\trelation.joiningTable.joiningColumn.columnName,\n\t\trelation.joiningTable.inverseJoiningColumn.columnName,\n\t]\n\tbuilder.createTable(\n\t\trelation.joiningTable.tableName,\n\t\t{\n\t\t\t[relation.joiningTable.joiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(entity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${entity.tableName}\"(\"${entity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t\t[relation.joiningTable.inverseJoiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(targetEntity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${targetEntity.tableName}\"(\"${targetEntity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t},\n\t)\n\n\tconst tableNameId = wrapIdentifier(relation.joiningTable.tableName)\n\tconst columnNameId = primaryColumns.map(wrapIdentifier)\n\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD PRIMARY KEY (${columnNameId.join(', ')})`)\n\n\tif (relation.joiningTable.eventLog.enabled) {\n\t\tcreateEventTrigger(builder, systemSchema, relation.joiningTable.tableName, primaryColumns)\n\t\tcreateEventTrxTrigger(builder, systemSchema, relation.joiningTable.tableName)\n\t}\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,yBAAyB,CACrC,SACA,cACA,QACA,QACA,cACA,aACI;AACJ,QAAM,iBAAiB;AAAA,IACtB,SAAS,aAAa,cAAc;AAAA,IACpC,SAAS,aAAa,qBAAqB;AAAA,EAAA;AAE5C,UAAQ;AAAA,IACP,SAAS,aAAa;AAAA,IACtB;AAAA,MACC,CAAC,SAAS,aAAa,cAAc,UAAU,GAAG;AAAA,QACjD,MAAM,qBAAqB,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,YAAY,IAAI,OAAO,SAAS,MAAM,OAAO,aAAa;AAAA,QAC1D,UAAU;AAAA,MAAA;AAAA,MAEX,CAAC,SAAS,aAAa,qBAAqB,UAAU,GAAG;AAAA,QACxD,MAAM,qBAAqB,YAAY;AAAA,QACvC,SAAS;AAAA,QACT,YAAY,IAAI,aAAa,SAAS,MAAM,aAAa,aAAa;AAAA,QACtE,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACD;AAGD,QAAM,cAAc,eAAe,SAAS,aAAa,SAAS;AAClE,QAAM,eAAe,eAAe,IAAI,cAAc;AACtD,UAAQ,IAAI,eAAe,WAAW,qBAAqB,aAAa,KAAK,IAAI,CAAC,GAAG;AAErF,MAAI,SAAS,aAAa,SAAS,SAAS;AAC3C,uBAAmB,SAAS,cAAc,SAAS,aAAa,WAAW,cAAc;AACzF,0BAAsB,SAAS,cAAc,SAAS,aAAa,SAAS;AAAA,EAC7E;AACD;"}
1
+ {"version":3,"file":"createJunctionTable.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/createJunctionTable.ts"],"sourcesContent":["import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils.js'\nimport { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { getPrimaryColumnType } from './getPrimaryColumnType.js'\nimport { wrapIdentifier } from '../../utils/dbHelpers.js'\n\nexport const createJunctionTableSql = (\n\tbuilder: MigrationBuilder,\n\tsystemSchema: string,\n\tschema: Schema,\n\tentity: Model.Entity,\n\ttargetEntity: Model.Entity,\n\trelation: Model.ManyHasManyOwningRelation,\n) => {\n\tconst primaryColumns = [\n\t\trelation.joiningTable.joiningColumn.columnName,\n\t\trelation.joiningTable.inverseJoiningColumn.columnName,\n\t]\n\tbuilder.createTable(\n\t\trelation.joiningTable.tableName,\n\t\t{\n\t\t\t[relation.joiningTable.joiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(entity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${entity.tableName}\"(\"${entity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t\t[relation.joiningTable.inverseJoiningColumn.columnName]: {\n\t\t\t\ttype: getPrimaryColumnType(targetEntity),\n\t\t\t\tnotNull: true,\n\t\t\t\treferences: `\"${targetEntity.tableName}\"(\"${targetEntity.primaryColumn}\")`,\n\t\t\t\tonDelete: 'CASCADE',\n\t\t\t},\n\t\t},\n\t)\n\n\tconst tableNameId = wrapIdentifier(relation.joiningTable.tableName)\n\tconst columnNameId = primaryColumns.map(wrapIdentifier)\n\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD PRIMARY KEY (${columnNameId.join(', ')})`)\n\n\tif (relation.joiningTable.eventLog.enabled) {\n\t\tcreateEventTrigger(builder, systemSchema, relation.joiningTable.tableName, primaryColumns)\n\t\tcreateEventTrxTrigger(builder, systemSchema, relation.joiningTable.tableName)\n\t}\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,yBAAyB,CACrC,SACA,cACA,QACA,QACA,cACA,aACI;AACJ,QAAM,iBAAiB;AAAA,IACtB,SAAS,aAAa,cAAc;AAAA,IACpC,SAAS,aAAa,qBAAqB;AAAA,EAAA;AAE5C,UAAQ;AAAA,IACP,SAAS,aAAa;AAAA,IACtB;AAAA,MACC,CAAC,SAAS,aAAa,cAAc,UAAU,GAAG;AAAA,QACjD,MAAM,qBAAqB,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,YAAY,IAAI,OAAO,SAAS,MAAM,OAAO,aAAa;AAAA,QAC1D,UAAU;AAAA,MAAA;AAAA,MAEX,CAAC,SAAS,aAAa,qBAAqB,UAAU,GAAG;AAAA,QACxD,MAAM,qBAAqB,YAAY;AAAA,QACvC,SAAS;AAAA,QACT,YAAY,IAAI,aAAa,SAAS,MAAM,aAAa,aAAa;AAAA,QACtE,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACD;AAGD,QAAM,cAAc,eAAe,SAAS,aAAa,SAAS;AAClE,QAAM,eAAe,eAAe,IAAI,cAAc;AACtD,UAAQ,IAAI,eAAe,WAAW,qBAAqB,aAAa,KAAK,IAAI,CAAC,GAAG;AAErF,MAAI,SAAS,aAAa,SAAS,SAAS;AAC3C,uBAAmB,SAAS,cAAc,SAAS,aAAa,WAAW,cAAc;AACzF,0BAAsB,SAAS,cAAc,SAAS,aAAa,SAAS;AAAA,EAC7E;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"diffUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/diffUtils.ts"],"sourcesContent":["import { Model, Schema } from '@contember/schema'\nimport { Migration } from '../../Migration'\nimport { isColumn, isRelation } from '@contember/schema-utils'\nimport { isDefined } from '../../utils/isDefined'\nimport deepEqual from 'fast-deep-equal'\n\nexport const updateFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\toriginalField: Model.AnyField\n\t\tupdatedField: Model.AnyField\n\t}) => Migration.Modification<Data> | Migration.Modification<Data>[] | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.flatMap(updatedField => {\n\t\t\t\t\tconst originalField = originalEntity.fields[updatedField.name]\n\t\t\t\t\tif (!originalField) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tif (deepEqual(originalField, updatedField)) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tconst result = modificationGenerator({\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalField,\n\t\t\t\t\t\tupdatedField,\n\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && !Array.isArray(result)) {\n\t\t\t\t\t\treturn [result]\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n\nexport const updateColumns = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalColumn: Model.AnyColumn\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedColumn: Model.AnyColumn\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isColumn(updatedField) || !isColumn(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalColumn: originalField,\n\t\t\t\tupdatedColumn: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const updateRelations = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalRelation: Model.AnyRelation\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedRelation: Model.AnyRelation\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isRelation(updatedField) || !isRelation(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalRelation: originalField,\n\t\t\t\tupdatedRelation: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const createFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\tnewField: Model.AnyField\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.filter(it => !originalEntity.fields[it.name])\n\t\t\t\t.map(newField => {\n\t\t\t\t\treturn modificationGenerator({\n\t\t\t\t\t\tnewField,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n"],"names":["isDefined","isColumn","isRelation"],"mappings":";;;;;AAMO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAMoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,QAAQ,CAAA,iBAAgB;AACxB,YAAM,gBAAgB,eAAe,OAAO,aAAa,IAAI;AAC7D,UAAI,CAAC,eAAe;AACnB,eAAO;AAAA,MACR;AACA,UAAI,UAAU,eAAe,YAAY,GAAG;AAC3C,eAAO;AAAA,MACR;AACA,YAAM,SAAS,sBAAsB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AACD,UAAI,WAAW,UAAa,CAAC,MAAM,QAAQ,MAAM,GAAG;AACnD,eAAO,CAAC,MAAM;AAAA,MACf;AACA,aAAO;AAAA,IACR,CAAC,EACA,OAAOA,mBAAS;AAAA,EACnB,CAAC;AACH;AAEO,MAAM,gBAAgB,CAC5B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAACC,YAAAA,SAAS,YAAY,KAAK,CAACA,YAAAA,SAAS,aAAa,GAAG;AACxD,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA,CACf;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,kBAAkB,CAC9B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAACC,YAAAA,WAAW,YAAY,KAAK,CAACA,YAAAA,WAAW,aAAa,GAAG;AAC5D,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MAAA,CACjB;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAKoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,OAAO,CAAA,OAAM,CAAC,eAAe,OAAO,GAAG,IAAI,CAAC,EAC5C,IAAI,CAAA,aAAY;AAChB,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AAAA,IACF,CAAC,EACA,OAAOF,mBAAS;AAAA,EACnB,CAAC;AACH;;;;;"}
1
+ {"version":3,"file":"diffUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/diffUtils.ts"],"sourcesContent":["import { Model, Schema } from '@contember/schema'\nimport { Migration } from '../../Migration.js'\nimport { isColumn, isRelation } from '@contember/schema-utils'\nimport { isDefined } from '../../utils/isDefined.js'\nimport deepEqual from 'fast-deep-equal'\n\nexport const updateFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\toriginalField: Model.AnyField\n\t\tupdatedField: Model.AnyField\n\t}) => Migration.Modification<Data> | Migration.Modification<Data>[] | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.flatMap(updatedField => {\n\t\t\t\t\tconst originalField = originalEntity.fields[updatedField.name]\n\t\t\t\t\tif (!originalField) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tif (deepEqual(originalField, updatedField)) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tconst result = modificationGenerator({\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalField,\n\t\t\t\t\t\tupdatedField,\n\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && !Array.isArray(result)) {\n\t\t\t\t\t\treturn [result]\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n\nexport const updateColumns = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalColumn: Model.AnyColumn\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedColumn: Model.AnyColumn\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isColumn(updatedField) || !isColumn(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalColumn: originalField,\n\t\t\t\tupdatedColumn: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const updateRelations = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalRelation: Model.AnyRelation\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedRelation: Model.AnyRelation\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isRelation(updatedField) || !isRelation(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalRelation: originalField,\n\t\t\t\tupdatedRelation: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const createFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\tnewField: Model.AnyField\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.filter(it => !originalEntity.fields[it.name])\n\t\t\t\t.map(newField => {\n\t\t\t\t\treturn modificationGenerator({\n\t\t\t\t\t\tnewField,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n"],"names":["isDefined","isColumn","isRelation"],"mappings":";;;;;AAMO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAMoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,QAAQ,CAAA,iBAAgB;AACxB,YAAM,gBAAgB,eAAe,OAAO,aAAa,IAAI;AAC7D,UAAI,CAAC,eAAe;AACnB,eAAO;AAAA,MACR;AACA,UAAI,UAAU,eAAe,YAAY,GAAG;AAC3C,eAAO;AAAA,MACR;AACA,YAAM,SAAS,sBAAsB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AACD,UAAI,WAAW,UAAa,CAAC,MAAM,QAAQ,MAAM,GAAG;AACnD,eAAO,CAAC,MAAM;AAAA,MACf;AACA,aAAO;AAAA,IACR,CAAC,EACA,OAAOA,mBAAS;AAAA,EACnB,CAAC;AACH;AAEO,MAAM,gBAAgB,CAC5B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAACC,YAAAA,SAAS,YAAY,KAAK,CAACA,YAAAA,SAAS,aAAa,GAAG;AACxD,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA,CACf;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,kBAAkB,CAC9B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAACC,YAAAA,WAAW,YAAY,KAAK,CAACA,YAAAA,WAAW,aAAa,GAAG;AAC5D,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MAAA,CACjB;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAKoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,OAAO,CAAA,OAAM,CAAC,eAAe,OAAO,GAAG,IAAI,CAAC,EAC5C,IAAI,CAAA,aAAY;AAChB,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AAAA,IACF,CAAC,EACA,OAAOF,mBAAS;AAAA,EACnB,CAAC;AACH;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"diffUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/diffUtils.ts"],"sourcesContent":["import { Model, Schema } from '@contember/schema'\nimport { Migration } from '../../Migration'\nimport { isColumn, isRelation } from '@contember/schema-utils'\nimport { isDefined } from '../../utils/isDefined'\nimport deepEqual from 'fast-deep-equal'\n\nexport const updateFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\toriginalField: Model.AnyField\n\t\tupdatedField: Model.AnyField\n\t}) => Migration.Modification<Data> | Migration.Modification<Data>[] | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.flatMap(updatedField => {\n\t\t\t\t\tconst originalField = originalEntity.fields[updatedField.name]\n\t\t\t\t\tif (!originalField) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tif (deepEqual(originalField, updatedField)) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tconst result = modificationGenerator({\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalField,\n\t\t\t\t\t\tupdatedField,\n\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && !Array.isArray(result)) {\n\t\t\t\t\t\treturn [result]\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n\nexport const updateColumns = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalColumn: Model.AnyColumn\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedColumn: Model.AnyColumn\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isColumn(updatedField) || !isColumn(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalColumn: originalField,\n\t\t\t\tupdatedColumn: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const updateRelations = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalRelation: Model.AnyRelation\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedRelation: Model.AnyRelation\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isRelation(updatedField) || !isRelation(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalRelation: originalField,\n\t\t\t\tupdatedRelation: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const createFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\tnewField: Model.AnyField\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.filter(it => !originalEntity.fields[it.name])\n\t\t\t\t.map(newField => {\n\t\t\t\t\treturn modificationGenerator({\n\t\t\t\t\t\tnewField,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAMoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,QAAQ,CAAA,iBAAgB;AACxB,YAAM,gBAAgB,eAAe,OAAO,aAAa,IAAI;AAC7D,UAAI,CAAC,eAAe;AACnB,eAAO;AAAA,MACR;AACA,UAAI,UAAU,eAAe,YAAY,GAAG;AAC3C,eAAO;AAAA,MACR;AACA,YAAM,SAAS,sBAAsB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AACD,UAAI,WAAW,UAAa,CAAC,MAAM,QAAQ,MAAM,GAAG;AACnD,eAAO,CAAC,MAAM;AAAA,MACf;AACA,aAAO;AAAA,IACR,CAAC,EACA,OAAO,SAAS;AAAA,EACnB,CAAC;AACH;AAEO,MAAM,gBAAgB,CAC5B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAAC,SAAS,YAAY,KAAK,CAAC,SAAS,aAAa,GAAG;AACxD,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA,CACf;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,kBAAkB,CAC9B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAAC,WAAW,YAAY,KAAK,CAAC,WAAW,aAAa,GAAG;AAC5D,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MAAA,CACjB;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAKoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,OAAO,CAAA,OAAM,CAAC,eAAe,OAAO,GAAG,IAAI,CAAC,EAC5C,IAAI,CAAA,aAAY;AAChB,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AAAA,IACF,CAAC,EACA,OAAO,SAAS;AAAA,EACnB,CAAC;AACH;"}
1
+ {"version":3,"file":"diffUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/diffUtils.ts"],"sourcesContent":["import { Model, Schema } from '@contember/schema'\nimport { Migration } from '../../Migration.js'\nimport { isColumn, isRelation } from '@contember/schema-utils'\nimport { isDefined } from '../../utils/isDefined.js'\nimport deepEqual from 'fast-deep-equal'\n\nexport const updateFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\toriginalField: Model.AnyField\n\t\tupdatedField: Model.AnyField\n\t}) => Migration.Modification<Data> | Migration.Modification<Data>[] | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.flatMap(updatedField => {\n\t\t\t\t\tconst originalField = originalEntity.fields[updatedField.name]\n\t\t\t\t\tif (!originalField) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tif (deepEqual(originalField, updatedField)) {\n\t\t\t\t\t\treturn undefined\n\t\t\t\t\t}\n\t\t\t\t\tconst result = modificationGenerator({\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalField,\n\t\t\t\t\t\tupdatedField,\n\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && !Array.isArray(result)) {\n\t\t\t\t\t\treturn [result]\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n\nexport const updateColumns = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalColumn: Model.AnyColumn\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedColumn: Model.AnyColumn\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isColumn(updatedField) || !isColumn(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalColumn: originalField,\n\t\t\t\tupdatedColumn: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const updateRelations = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\toriginalRelation: Model.AnyRelation\n\t\tupdatedEntity: Model.Entity\n\t\tupdatedRelation: Model.AnyRelation\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn updateFields(\n\t\toriginalSchema,\n\t\tupdatedSchema,\n\t\t({ updatedEntity, originalEntity, originalField, updatedField }) => {\n\t\t\tif (!isRelation(updatedField) || !isRelation(originalField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn modificationGenerator({\n\t\t\t\toriginalEntity,\n\t\t\t\tupdatedEntity,\n\t\t\t\toriginalRelation: originalField,\n\t\t\t\tupdatedRelation: updatedField,\n\t\t\t})\n\t\t},\n\t)\n}\n\nexport const createFields = <Data = { [field: string]: any }>(\n\toriginalSchema: Schema,\n\tupdatedSchema: Schema,\n\tmodificationGenerator: (args: {\n\t\toriginalEntity: Model.Entity\n\t\tupdatedEntity: Model.Entity\n\t\tnewField: Model.AnyField\n\t}) => Migration.Modification<Data> | undefined,\n): Migration.Modification<Data>[] => {\n\treturn Object.values(updatedSchema.model.entities)\n\t\t.filter(({ name }) => originalSchema.model.entities[name])\n\t\t.flatMap(updatedEntity => {\n\t\t\tconst originalEntity = originalSchema.model.entities[updatedEntity.name]\n\n\t\t\treturn Object.values(updatedEntity.fields)\n\t\t\t\t.filter(it => !originalEntity.fields[it.name])\n\t\t\t\t.map(newField => {\n\t\t\t\t\treturn modificationGenerator({\n\t\t\t\t\t\tnewField,\n\t\t\t\t\t\tupdatedEntity,\n\t\t\t\t\t\toriginalEntity,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.filter(isDefined)\n\t\t})\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAMoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,QAAQ,CAAA,iBAAgB;AACxB,YAAM,gBAAgB,eAAe,OAAO,aAAa,IAAI;AAC7D,UAAI,CAAC,eAAe;AACnB,eAAO;AAAA,MACR;AACA,UAAI,UAAU,eAAe,YAAY,GAAG;AAC3C,eAAO;AAAA,MACR;AACA,YAAM,SAAS,sBAAsB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AACD,UAAI,WAAW,UAAa,CAAC,MAAM,QAAQ,MAAM,GAAG;AACnD,eAAO,CAAC,MAAM;AAAA,MACf;AACA,aAAO;AAAA,IACR,CAAC,EACA,OAAO,SAAS;AAAA,EACnB,CAAC;AACH;AAEO,MAAM,gBAAgB,CAC5B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAAC,SAAS,YAAY,KAAK,CAAC,SAAS,aAAa,GAAG;AACxD,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA,CACf;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,kBAAkB,CAC9B,gBACA,eACA,0BAMoC;AACpC,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,CAAC,EAAE,eAAe,gBAAgB,eAAe,mBAAmB;AACnE,UAAI,CAAC,WAAW,YAAY,KAAK,CAAC,WAAW,aAAa,GAAG;AAC5D,eAAO;AAAA,MACR;AACA,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MAAA,CACjB;AAAA,IACF;AAAA,EAAA;AAEF;AAEO,MAAM,eAAe,CAC3B,gBACA,eACA,0BAKoC;AACpC,SAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAC/C,OAAO,CAAC,EAAE,KAAA,MAAW,eAAe,MAAM,SAAS,IAAI,CAAC,EACxD,QAAQ,CAAA,kBAAiB;AACzB,UAAM,iBAAiB,eAAe,MAAM,SAAS,cAAc,IAAI;AAEvE,WAAO,OAAO,OAAO,cAAc,MAAM,EACvC,OAAO,CAAA,OAAM,CAAC,eAAe,OAAO,GAAG,IAAI,CAAC,EAC5C,IAAI,CAAA,aAAY;AAChB,aAAO,sBAAsB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AAAA,IACF,CAAC,EACA,OAAO,SAAS;AAAA,EACnB,CAAC;AACH;"}
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tisRelation(field)\n\t\t\t\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tisRelation(field)\n\t\t\t\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tisRelation(field)\n\t\t\t\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tisRelation(field)\n\t\t\t\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const deepEqual = require("fast-deep-equal");
3
4
  require("@contember/schema");
4
5
  require("@contember/schema-utils");
5
6
  const RemoveEntityModification = require("../entities/RemoveEntityModification.cjs");
6
- require("fast-deep-equal");
7
+ const isReplaceableViewChange = (original, updated) => {
8
+ if (!original.view || !updated.view) {
9
+ return false;
10
+ }
11
+ if (original.view.materialized || updated.view.materialized) {
12
+ return false;
13
+ }
14
+ const stripView = (entity) => {
15
+ const { view, ...rest } = entity;
16
+ return rest;
17
+ };
18
+ return deepEqual(stripView(original), stripView(updated));
19
+ };
7
20
  const getEntityDependantViews = (model) => {
8
21
  const dependants = new Map(Object.values(model.entities).map((it) => [it.name, /* @__PURE__ */ new Set()]));
9
22
  for (const entity of Object.values(model.entities)) {
@@ -43,4 +56,5 @@ const cascadeRemoveDependantViews = (model, entities) => {
43
56
  };
44
57
  exports.cascadeRemoveDependantViews = cascadeRemoveDependantViews;
45
58
  exports.getEntityDependantViews = getEntityDependantViews;
59
+ exports.isReplaceableViewChange = isReplaceableViewChange;
46
60
  //# sourceMappingURL=viewDependencies.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewDependencies.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/viewDependencies.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Migration } from '../../Migration'\nimport { removeEntityModification } from '../entities'\n\ntype EntityDependantViews = Map<string, Set<Model.Entity>>\nexport const getEntityDependantViews = (model: Model.Schema): EntityDependantViews => {\n\tconst dependants: EntityDependantViews = new Map(Object.values(model.entities).map(it => [it.name, new Set()]))\n\tfor (const entity of Object.values(model.entities)) {\n\t\tif (!entity.view?.dependencies?.length) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const dependency of entity.view.dependencies) {\n\t\t\tconst entityDependants = dependants.get(dependency)\n\t\t\tif (!entityDependants) {\n\t\t\t\tthrow new Error()\n\t\t\t}\n\t\t\tentityDependants.add(entity)\n\t\t}\n\t}\n\treturn dependants\n}\n\nexport const cascadeRemoveDependantViews = (model: Model.Schema, entities: Model.Entity[]): Migration.Modification[] => {\n\tconst visited = new Set<string>()\n\tconst dependants = getEntityDependantViews(model)\n\tconst modifications: Migration.Modification[] = []\n\tconst removeCascade = (entity: Model.Entity) => {\n\t\tif (visited.has(entity.name)) {\n\t\t\treturn\n\t\t}\n\t\tvisited.add(entity.name)\n\t\tfor (const dependant of dependants.get(entity.name) ?? []) {\n\t\t\tremoveCascade(dependant)\n\t\t}\n\t\tif (entity.view) {\n\t\t\tmodifications.push(removeEntityModification.createModification({ entityName: entity.name }))\n\t\t}\n\t}\n\tfor (const entity of entities) {\n\t\tremoveCascade(entity)\n\t}\n\treturn modifications\n}\n"],"names":["removeEntityModification"],"mappings":";;;;;;AAKO,MAAM,0BAA0B,CAAC,UAA8C;AACrF,QAAM,aAAmC,IAAI,IAAI,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,OAAM,CAAC,GAAG,0BAAU,IAAA,CAAK,CAAC,CAAC;AAC9G,aAAW,UAAU,OAAO,OAAO,MAAM,QAAQ,GAAG;AACnD,QAAI,CAAC,OAAO,MAAM,cAAc,QAAQ;AACvC;AAAA,IACD;AACA,eAAW,cAAc,OAAO,KAAK,cAAc;AAClD,YAAM,mBAAmB,WAAW,IAAI,UAAU;AAClD,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI,MAAA;AAAA,MACX;AACA,uBAAiB,IAAI,MAAM;AAAA,IAC5B;AAAA,EACD;AACA,SAAO;AACR;AAEO,MAAM,8BAA8B,CAAC,OAAqB,aAAuD;AACvH,QAAM,8BAAc,IAAA;AACpB,QAAM,aAAa,wBAAwB,KAAK;AAChD,QAAM,gBAA0C,CAAA;AAChD,QAAM,gBAAgB,CAAC,WAAyB;AAC/C,QAAI,QAAQ,IAAI,OAAO,IAAI,GAAG;AAC7B;AAAA,IACD;AACA,YAAQ,IAAI,OAAO,IAAI;AACvB,eAAW,aAAa,WAAW,IAAI,OAAO,IAAI,KAAK,IAAI;AAC1D,oBAAc,SAAS;AAAA,IACxB;AACA,QAAI,OAAO,MAAM;AAChB,oBAAc,KAAKA,yBAAAA,yBAAyB,mBAAmB,EAAE,YAAY,OAAO,KAAA,CAAM,CAAC;AAAA,IAC5F;AAAA,EACD;AACA,aAAW,UAAU,UAAU;AAC9B,kBAAc,MAAM;AAAA,EACrB;AACA,SAAO;AACR;;;"}
1
+ {"version":3,"file":"viewDependencies.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/viewDependencies.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport deepEqual from 'fast-deep-equal'\nimport { Migration } from '../../Migration.js'\nimport { removeEntityModification } from '../entities/index.js'\n\n/**\n * Determines whether a view change can be applied in-place via `CREATE OR REPLACE VIEW`,\n * i.e. without dropping & recreating the view (and cascading to its dependants).\n *\n * Postgres allows `CREATE OR REPLACE VIEW` only when the output columns stay the same\n * (it may append new columns at the end). We conservatively allow it only when the\n * entity is structurally identical and just the view metadata (`sql`/`dependencies`/`idSource`)\n * differs. Materialized views are never replaceable (no `CREATE OR REPLACE MATERIALIZED VIEW`).\n */\nexport const isReplaceableViewChange = (original: Model.Entity, updated: Model.Entity): boolean => {\n\tif (!original.view || !updated.view) {\n\t\treturn false\n\t}\n\tif (original.view.materialized || updated.view.materialized) {\n\t\treturn false\n\t}\n\tconst stripView = (entity: Model.Entity): Omit<Model.Entity, 'view'> => {\n\t\tconst { view, ...rest } = entity\n\t\treturn rest\n\t}\n\treturn deepEqual(stripView(original), stripView(updated))\n}\n\ntype EntityDependantViews = Map<string, Set<Model.Entity>>\nexport const getEntityDependantViews = (model: Model.Schema): EntityDependantViews => {\n\tconst dependants: EntityDependantViews = new Map(Object.values(model.entities).map(it => [it.name, new Set()]))\n\tfor (const entity of Object.values(model.entities)) {\n\t\tif (!entity.view?.dependencies?.length) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const dependency of entity.view.dependencies) {\n\t\t\tconst entityDependants = dependants.get(dependency)\n\t\t\tif (!entityDependants) {\n\t\t\t\tthrow new Error()\n\t\t\t}\n\t\t\tentityDependants.add(entity)\n\t\t}\n\t}\n\treturn dependants\n}\n\nexport const cascadeRemoveDependantViews = (model: Model.Schema, entities: Model.Entity[]): Migration.Modification[] => {\n\tconst visited = new Set<string>()\n\tconst dependants = getEntityDependantViews(model)\n\tconst modifications: Migration.Modification[] = []\n\tconst removeCascade = (entity: Model.Entity) => {\n\t\tif (visited.has(entity.name)) {\n\t\t\treturn\n\t\t}\n\t\tvisited.add(entity.name)\n\t\tfor (const dependant of dependants.get(entity.name) ?? []) {\n\t\t\tremoveCascade(dependant)\n\t\t}\n\t\tif (entity.view) {\n\t\t\tmodifications.push(removeEntityModification.createModification({ entityName: entity.name }))\n\t\t}\n\t}\n\tfor (const entity of entities) {\n\t\tremoveCascade(entity)\n\t}\n\treturn modifications\n}\n"],"names":["removeEntityModification"],"mappings":";;;;;;AAcO,MAAM,0BAA0B,CAAC,UAAwB,YAAmC;AAClG,MAAI,CAAC,SAAS,QAAQ,CAAC,QAAQ,MAAM;AACpC,WAAO;AAAA,EACR;AACA,MAAI,SAAS,KAAK,gBAAgB,QAAQ,KAAK,cAAc;AAC5D,WAAO;AAAA,EACR;AACA,QAAM,YAAY,CAAC,WAAqD;AACvE,UAAM,EAAE,MAAM,GAAG,KAAA,IAAS;AAC1B,WAAO;AAAA,EACR;AACA,SAAO,UAAU,UAAU,QAAQ,GAAG,UAAU,OAAO,CAAC;AACzD;AAGO,MAAM,0BAA0B,CAAC,UAA8C;AACrF,QAAM,aAAmC,IAAI,IAAI,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,OAAM,CAAC,GAAG,0BAAU,IAAA,CAAK,CAAC,CAAC;AAC9G,aAAW,UAAU,OAAO,OAAO,MAAM,QAAQ,GAAG;AACnD,QAAI,CAAC,OAAO,MAAM,cAAc,QAAQ;AACvC;AAAA,IACD;AACA,eAAW,cAAc,OAAO,KAAK,cAAc;AAClD,YAAM,mBAAmB,WAAW,IAAI,UAAU;AAClD,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI,MAAA;AAAA,MACX;AACA,uBAAiB,IAAI,MAAM;AAAA,IAC5B;AAAA,EACD;AACA,SAAO;AACR;AAEO,MAAM,8BAA8B,CAAC,OAAqB,aAAuD;AACvH,QAAM,8BAAc,IAAA;AACpB,QAAM,aAAa,wBAAwB,KAAK;AAChD,QAAM,gBAA0C,CAAA;AAChD,QAAM,gBAAgB,CAAC,WAAyB;AAC/C,QAAI,QAAQ,IAAI,OAAO,IAAI,GAAG;AAC7B;AAAA,IACD;AACA,YAAQ,IAAI,OAAO,IAAI;AACvB,eAAW,aAAa,WAAW,IAAI,OAAO,IAAI,KAAK,IAAI;AAC1D,oBAAc,SAAS;AAAA,IACxB;AACA,QAAI,OAAO,MAAM;AAChB,oBAAc,KAAKA,yBAAAA,yBAAyB,mBAAmB,EAAE,YAAY,OAAO,KAAA,CAAM,CAAC;AAAA,IAC5F;AAAA,EACD;AACA,aAAW,UAAU,UAAU;AAC9B,kBAAc,MAAM;AAAA,EACrB;AACA,SAAO;AACR;;;;"}
@@ -1,7 +1,20 @@
1
+ import deepEqual from "fast-deep-equal";
1
2
  import "@contember/schema";
2
3
  import "@contember/schema-utils";
3
4
  import { removeEntityModification } from "../entities/RemoveEntityModification.js";
4
- import "fast-deep-equal";
5
+ const isReplaceableViewChange = (original, updated) => {
6
+ if (!original.view || !updated.view) {
7
+ return false;
8
+ }
9
+ if (original.view.materialized || updated.view.materialized) {
10
+ return false;
11
+ }
12
+ const stripView = (entity) => {
13
+ const { view, ...rest } = entity;
14
+ return rest;
15
+ };
16
+ return deepEqual(stripView(original), stripView(updated));
17
+ };
5
18
  const getEntityDependantViews = (model) => {
6
19
  const dependants = new Map(Object.values(model.entities).map((it) => [it.name, /* @__PURE__ */ new Set()]));
7
20
  for (const entity of Object.values(model.entities)) {
@@ -41,6 +54,7 @@ const cascadeRemoveDependantViews = (model, entities) => {
41
54
  };
42
55
  export {
43
56
  cascadeRemoveDependantViews,
44
- getEntityDependantViews
57
+ getEntityDependantViews,
58
+ isReplaceableViewChange
45
59
  };
46
60
  //# sourceMappingURL=viewDependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewDependencies.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/viewDependencies.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Migration } from '../../Migration'\nimport { removeEntityModification } from '../entities'\n\ntype EntityDependantViews = Map<string, Set<Model.Entity>>\nexport const getEntityDependantViews = (model: Model.Schema): EntityDependantViews => {\n\tconst dependants: EntityDependantViews = new Map(Object.values(model.entities).map(it => [it.name, new Set()]))\n\tfor (const entity of Object.values(model.entities)) {\n\t\tif (!entity.view?.dependencies?.length) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const dependency of entity.view.dependencies) {\n\t\t\tconst entityDependants = dependants.get(dependency)\n\t\t\tif (!entityDependants) {\n\t\t\t\tthrow new Error()\n\t\t\t}\n\t\t\tentityDependants.add(entity)\n\t\t}\n\t}\n\treturn dependants\n}\n\nexport const cascadeRemoveDependantViews = (model: Model.Schema, entities: Model.Entity[]): Migration.Modification[] => {\n\tconst visited = new Set<string>()\n\tconst dependants = getEntityDependantViews(model)\n\tconst modifications: Migration.Modification[] = []\n\tconst removeCascade = (entity: Model.Entity) => {\n\t\tif (visited.has(entity.name)) {\n\t\t\treturn\n\t\t}\n\t\tvisited.add(entity.name)\n\t\tfor (const dependant of dependants.get(entity.name) ?? []) {\n\t\t\tremoveCascade(dependant)\n\t\t}\n\t\tif (entity.view) {\n\t\t\tmodifications.push(removeEntityModification.createModification({ entityName: entity.name }))\n\t\t}\n\t}\n\tfor (const entity of entities) {\n\t\tremoveCascade(entity)\n\t}\n\treturn modifications\n}\n"],"names":[],"mappings":";;;;AAKO,MAAM,0BAA0B,CAAC,UAA8C;AACrF,QAAM,aAAmC,IAAI,IAAI,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,OAAM,CAAC,GAAG,0BAAU,IAAA,CAAK,CAAC,CAAC;AAC9G,aAAW,UAAU,OAAO,OAAO,MAAM,QAAQ,GAAG;AACnD,QAAI,CAAC,OAAO,MAAM,cAAc,QAAQ;AACvC;AAAA,IACD;AACA,eAAW,cAAc,OAAO,KAAK,cAAc;AAClD,YAAM,mBAAmB,WAAW,IAAI,UAAU;AAClD,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI,MAAA;AAAA,MACX;AACA,uBAAiB,IAAI,MAAM;AAAA,IAC5B;AAAA,EACD;AACA,SAAO;AACR;AAEO,MAAM,8BAA8B,CAAC,OAAqB,aAAuD;AACvH,QAAM,8BAAc,IAAA;AACpB,QAAM,aAAa,wBAAwB,KAAK;AAChD,QAAM,gBAA0C,CAAA;AAChD,QAAM,gBAAgB,CAAC,WAAyB;AAC/C,QAAI,QAAQ,IAAI,OAAO,IAAI,GAAG;AAC7B;AAAA,IACD;AACA,YAAQ,IAAI,OAAO,IAAI;AACvB,eAAW,aAAa,WAAW,IAAI,OAAO,IAAI,KAAK,IAAI;AAC1D,oBAAc,SAAS;AAAA,IACxB;AACA,QAAI,OAAO,MAAM;AAChB,oBAAc,KAAK,yBAAyB,mBAAmB,EAAE,YAAY,OAAO,KAAA,CAAM,CAAC;AAAA,IAC5F;AAAA,EACD;AACA,aAAW,UAAU,UAAU;AAC9B,kBAAc,MAAM;AAAA,EACrB;AACA,SAAO;AACR;"}
1
+ {"version":3,"file":"viewDependencies.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/viewDependencies.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport deepEqual from 'fast-deep-equal'\nimport { Migration } from '../../Migration.js'\nimport { removeEntityModification } from '../entities/index.js'\n\n/**\n * Determines whether a view change can be applied in-place via `CREATE OR REPLACE VIEW`,\n * i.e. without dropping & recreating the view (and cascading to its dependants).\n *\n * Postgres allows `CREATE OR REPLACE VIEW` only when the output columns stay the same\n * (it may append new columns at the end). We conservatively allow it only when the\n * entity is structurally identical and just the view metadata (`sql`/`dependencies`/`idSource`)\n * differs. Materialized views are never replaceable (no `CREATE OR REPLACE MATERIALIZED VIEW`).\n */\nexport const isReplaceableViewChange = (original: Model.Entity, updated: Model.Entity): boolean => {\n\tif (!original.view || !updated.view) {\n\t\treturn false\n\t}\n\tif (original.view.materialized || updated.view.materialized) {\n\t\treturn false\n\t}\n\tconst stripView = (entity: Model.Entity): Omit<Model.Entity, 'view'> => {\n\t\tconst { view, ...rest } = entity\n\t\treturn rest\n\t}\n\treturn deepEqual(stripView(original), stripView(updated))\n}\n\ntype EntityDependantViews = Map<string, Set<Model.Entity>>\nexport const getEntityDependantViews = (model: Model.Schema): EntityDependantViews => {\n\tconst dependants: EntityDependantViews = new Map(Object.values(model.entities).map(it => [it.name, new Set()]))\n\tfor (const entity of Object.values(model.entities)) {\n\t\tif (!entity.view?.dependencies?.length) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const dependency of entity.view.dependencies) {\n\t\t\tconst entityDependants = dependants.get(dependency)\n\t\t\tif (!entityDependants) {\n\t\t\t\tthrow new Error()\n\t\t\t}\n\t\t\tentityDependants.add(entity)\n\t\t}\n\t}\n\treturn dependants\n}\n\nexport const cascadeRemoveDependantViews = (model: Model.Schema, entities: Model.Entity[]): Migration.Modification[] => {\n\tconst visited = new Set<string>()\n\tconst dependants = getEntityDependantViews(model)\n\tconst modifications: Migration.Modification[] = []\n\tconst removeCascade = (entity: Model.Entity) => {\n\t\tif (visited.has(entity.name)) {\n\t\t\treturn\n\t\t}\n\t\tvisited.add(entity.name)\n\t\tfor (const dependant of dependants.get(entity.name) ?? []) {\n\t\t\tremoveCascade(dependant)\n\t\t}\n\t\tif (entity.view) {\n\t\t\tmodifications.push(removeEntityModification.createModification({ entityName: entity.name }))\n\t\t}\n\t}\n\tfor (const entity of entities) {\n\t\tremoveCascade(entity)\n\t}\n\treturn modifications\n}\n"],"names":[],"mappings":";;;;AAcO,MAAM,0BAA0B,CAAC,UAAwB,YAAmC;AAClG,MAAI,CAAC,SAAS,QAAQ,CAAC,QAAQ,MAAM;AACpC,WAAO;AAAA,EACR;AACA,MAAI,SAAS,KAAK,gBAAgB,QAAQ,KAAK,cAAc;AAC5D,WAAO;AAAA,EACR;AACA,QAAM,YAAY,CAAC,WAAqD;AACvE,UAAM,EAAE,MAAM,GAAG,KAAA,IAAS;AAC1B,WAAO;AAAA,EACR;AACA,SAAO,UAAU,UAAU,QAAQ,GAAG,UAAU,OAAO,CAAC;AACzD;AAGO,MAAM,0BAA0B,CAAC,UAA8C;AACrF,QAAM,aAAmC,IAAI,IAAI,OAAO,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAA,OAAM,CAAC,GAAG,0BAAU,IAAA,CAAK,CAAC,CAAC;AAC9G,aAAW,UAAU,OAAO,OAAO,MAAM,QAAQ,GAAG;AACnD,QAAI,CAAC,OAAO,MAAM,cAAc,QAAQ;AACvC;AAAA,IACD;AACA,eAAW,cAAc,OAAO,KAAK,cAAc;AAClD,YAAM,mBAAmB,WAAW,IAAI,UAAU;AAClD,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI,MAAA;AAAA,MACX;AACA,uBAAiB,IAAI,MAAM;AAAA,IAC5B;AAAA,EACD;AACA,SAAO;AACR;AAEO,MAAM,8BAA8B,CAAC,OAAqB,aAAuD;AACvH,QAAM,8BAAc,IAAA;AACpB,QAAM,aAAa,wBAAwB,KAAK;AAChD,QAAM,gBAA0C,CAAA;AAChD,QAAM,gBAAgB,CAAC,WAAyB;AAC/C,QAAI,QAAQ,IAAI,OAAO,IAAI,GAAG;AAC7B;AAAA,IACD;AACA,YAAQ,IAAI,OAAO,IAAI;AACvB,eAAW,aAAa,WAAW,IAAI,OAAO,IAAI,KAAK,IAAI;AAC1D,oBAAc,SAAS;AAAA,IACxB;AACA,QAAI,OAAO,MAAM;AAChB,oBAAc,KAAK,yBAAyB,mBAAmB,EAAE,YAAY,OAAO,KAAA,CAAM,CAAC;AAAA,IAC5F;AAAA,EACD;AACA,aAAW,UAAU,UAAU;AAC9B,kBAAc,MAAM;AAAA,EACrB;AACA,SAAO;AACR;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PatchValidationSchemaModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/PatchValidationSchemaModification.ts"],"sourcesContent":["import { SchemaUpdater } from '../utils/schemaUpdateUtils'\nimport { createModificationType, ModificationHandler } from '../ModificationHandler'\nimport { applyPatch, Operation } from 'rfc6902'\nimport deepCopy from '../../utils/deepCopy'\n\nexport class PatchValidationSchemaModificationHandler implements ModificationHandler<PatchValidationSchemaModificationData> {\n\tconstructor(private readonly data: PatchValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => {\n\t\t\tconst validation = deepCopy(schema.validation)\n\t\t\tconst result = applyPatch(validation, this.data.patch).filter(it => it !== null)\n\t\t\tif (result.length > 0) {\n\t\t\t\tthrow result[0]\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\tvalidation,\n\t\t\t}\n\t\t}\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface PatchValidationSchemaModificationData {\n\tpatch: Operation[]\n}\n\nexport const patchValidationSchemaModification = createModificationType({\n\tid: 'patchValidationSchema',\n\thandler: PatchValidationSchemaModificationHandler,\n})\n"],"names":["applyPatch","createModificationType"],"mappings":";;;;;AAKO,MAAM,yCAA+G;AAAA,EAC3H,YAA6B,MAA6C;AAA7C,SAAA,OAAA;AAAA,EAA8C;AAAA,EAEpE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,aAAa;AACtB,YAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,YAAM,SAASA,QAAAA,WAAW,YAAY,KAAK,KAAK,KAAK,EAAE,OAAO,CAAA,OAAM,OAAO,IAAI;AAC/E,UAAI,OAAO,SAAS,GAAG;AACtB,cAAM,OAAO,CAAC;AAAA,MACf;AAEA,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,oCAAoCC,oBAAAA,uBAAuB;AAAA,EACvE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;;;"}
1
+ {"version":3,"file":"PatchValidationSchemaModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/PatchValidationSchemaModification.ts"],"sourcesContent":["import { SchemaUpdater } from '../utils/schemaUpdateUtils.js'\nimport { createModificationType, ModificationHandler } from '../ModificationHandler.js'\nimport { applyPatch, Operation } from 'rfc6902'\nimport deepCopy from '../../utils/deepCopy.js'\n\nexport class PatchValidationSchemaModificationHandler implements ModificationHandler<PatchValidationSchemaModificationData> {\n\tconstructor(private readonly data: PatchValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => {\n\t\t\tconst validation = deepCopy(schema.validation)\n\t\t\tconst result = applyPatch(validation, this.data.patch).filter(it => it !== null)\n\t\t\tif (result.length > 0) {\n\t\t\t\tthrow result[0]\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\tvalidation,\n\t\t\t}\n\t\t}\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface PatchValidationSchemaModificationData {\n\tpatch: Operation[]\n}\n\nexport const patchValidationSchemaModification = createModificationType({\n\tid: 'patchValidationSchema',\n\thandler: PatchValidationSchemaModificationHandler,\n})\n"],"names":["applyPatch","createModificationType"],"mappings":";;;;;AAKO,MAAM,yCAA+G;AAAA,EAC3H,YAA6B,MAA6C;AAA7C,SAAA,OAAA;AAAA,EAA8C;AAAA,EAEpE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,aAAa;AACtB,YAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,YAAM,SAASA,QAAAA,WAAW,YAAY,KAAK,KAAK,KAAK,EAAE,OAAO,CAAA,OAAM,OAAO,IAAI;AAC/E,UAAI,OAAO,SAAS,GAAG;AACtB,cAAM,OAAO,CAAC;AAAA,MACf;AAEA,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,oCAAoCC,oBAAAA,uBAAuB;AAAA,EACvE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PatchValidationSchemaModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/PatchValidationSchemaModification.ts"],"sourcesContent":["import { SchemaUpdater } from '../utils/schemaUpdateUtils'\nimport { createModificationType, ModificationHandler } from '../ModificationHandler'\nimport { applyPatch, Operation } from 'rfc6902'\nimport deepCopy from '../../utils/deepCopy'\n\nexport class PatchValidationSchemaModificationHandler implements ModificationHandler<PatchValidationSchemaModificationData> {\n\tconstructor(private readonly data: PatchValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => {\n\t\t\tconst validation = deepCopy(schema.validation)\n\t\t\tconst result = applyPatch(validation, this.data.patch).filter(it => it !== null)\n\t\t\tif (result.length > 0) {\n\t\t\t\tthrow result[0]\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\tvalidation,\n\t\t\t}\n\t\t}\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface PatchValidationSchemaModificationData {\n\tpatch: Operation[]\n}\n\nexport const patchValidationSchemaModification = createModificationType({\n\tid: 'patchValidationSchema',\n\thandler: PatchValidationSchemaModificationHandler,\n})\n"],"names":[],"mappings":";;;AAKO,MAAM,yCAA+G;AAAA,EAC3H,YAA6B,MAA6C;AAA7C,SAAA,OAAA;AAAA,EAA8C;AAAA,EAEpE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,aAAa;AACtB,YAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,YAAM,SAAS,WAAW,YAAY,KAAK,KAAK,KAAK,EAAE,OAAO,CAAA,OAAM,OAAO,IAAI;AAC/E,UAAI,OAAO,SAAS,GAAG;AACtB,cAAM,OAAO,CAAC;AAAA,MACf;AAEA,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,oCAAoC,uBAAuB;AAAA,EACvE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;"}
1
+ {"version":3,"file":"PatchValidationSchemaModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/PatchValidationSchemaModification.ts"],"sourcesContent":["import { SchemaUpdater } from '../utils/schemaUpdateUtils.js'\nimport { createModificationType, ModificationHandler } from '../ModificationHandler.js'\nimport { applyPatch, Operation } from 'rfc6902'\nimport deepCopy from '../../utils/deepCopy.js'\n\nexport class PatchValidationSchemaModificationHandler implements ModificationHandler<PatchValidationSchemaModificationData> {\n\tconstructor(private readonly data: PatchValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => {\n\t\t\tconst validation = deepCopy(schema.validation)\n\t\t\tconst result = applyPatch(validation, this.data.patch).filter(it => it !== null)\n\t\t\tif (result.length > 0) {\n\t\t\t\tthrow result[0]\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\tvalidation,\n\t\t\t}\n\t\t}\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface PatchValidationSchemaModificationData {\n\tpatch: Operation[]\n}\n\nexport const patchValidationSchemaModification = createModificationType({\n\tid: 'patchValidationSchema',\n\thandler: PatchValidationSchemaModificationHandler,\n})\n"],"names":[],"mappings":";;;AAKO,MAAM,yCAA+G;AAAA,EAC3H,YAA6B,MAA6C;AAA7C,SAAA,OAAA;AAAA,EAA8C;AAAA,EAEpE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,aAAa;AACtB,YAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,YAAM,SAAS,WAAW,YAAY,KAAK,KAAK,KAAK,EAAE,OAAO,CAAA,OAAM,OAAO,IAAI;AAC/E,UAAI,OAAO,SAAS,GAAG;AACtB,cAAM,OAAO,CAAC;AAAA,MACf;AAEA,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,oCAAoC,uBAAuB;AAAA,EACvE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateValidationSchemaModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/UpdateValidationSchemaModification.ts"],"sourcesContent":["import { Schema, Validation } from '@contember/schema'\nimport { SchemaUpdater } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { createPatch } from 'rfc6902'\nimport { patchValidationSchemaModification } from './PatchValidationSchemaModification'\n\nexport class UpdateValidationSchemaModificationHandler implements ModificationHandler<UpdateValidationSchemaModificationData> {\n\tconstructor(private readonly data: UpdateValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => ({\n\t\t\t...schema,\n\t\t\tvalidation: this.data.schema,\n\t\t})\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface UpdateValidationSchemaModificationData {\n\tschema: Validation.Schema\n}\n\nexport const updateValidationSchemaModification = createModificationType({\n\tid: 'updateValidationSchema',\n\thandler: UpdateValidationSchemaModificationHandler,\n})\n\nexport class UpdateValidationSchemaDiffer implements Differ {\n\tconstructor(\n\t\tprivate readonly options?: {\n\t\t\tmaxPatchSize?: number\n\t\t},\n\t) {\n\t}\n\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\tif (deepEqual(originalSchema.validation, updatedSchema.validation)) {\n\t\t\treturn []\n\t\t}\n\t\tconst patch = createPatch(originalSchema.validation, updatedSchema.validation)\n\t\tif (patch.length <= (this.options?.maxPatchSize ?? 100)) {\n\t\t\treturn [patchValidationSchemaModification.createModification({ patch })]\n\t\t}\n\t\treturn [updateValidationSchemaModification.createModification({ schema: updatedSchema.validation })]\n\t}\n}\n"],"names":["createModificationType","createPatch","patchValidationSchemaModification"],"mappings":";;;;;;AAOO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA8C;AAA9C,SAAA,OAAA;AAAA,EAA+C;AAAA,EAErE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,cAAc;AAAA,MACvB,GAAG;AAAA,MACH,YAAY,KAAK,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,qCAAqCA,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,6BAA+C;AAAA,EAC3D,YACkB,SAGhB;AAHgB,SAAA,UAAA;AAAA,EAIlB;AAAA,EAEA,WAAW,gBAAwB,eAAuB;AACzD,QAAI,UAAU,eAAe,YAAY,cAAc,UAAU,GAAG;AACnE,aAAO,CAAA;AAAA,IACR;AACA,UAAM,QAAQC,QAAAA,YAAY,eAAe,YAAY,cAAc,UAAU;AAC7E,QAAI,MAAM,WAAW,KAAK,SAAS,gBAAgB,MAAM;AACxD,aAAO,CAACC,kCAAAA,kCAAkC,mBAAmB,EAAE,MAAA,CAAO,CAAC;AAAA,IACxE;AACA,WAAO,CAAC,mCAAmC,mBAAmB,EAAE,QAAQ,cAAc,WAAA,CAAY,CAAC;AAAA,EACpG;AACD;;;;"}
1
+ {"version":3,"file":"UpdateValidationSchemaModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/UpdateValidationSchemaModification.ts"],"sourcesContent":["import { Schema, Validation } from '@contember/schema'\nimport { SchemaUpdater } from '../utils/schemaUpdateUtils.js'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler.js'\nimport deepEqual from 'fast-deep-equal'\nimport { createPatch } from 'rfc6902'\nimport { patchValidationSchemaModification } from './PatchValidationSchemaModification.js'\n\nexport class UpdateValidationSchemaModificationHandler implements ModificationHandler<UpdateValidationSchemaModificationData> {\n\tconstructor(private readonly data: UpdateValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => ({\n\t\t\t...schema,\n\t\t\tvalidation: this.data.schema,\n\t\t})\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface UpdateValidationSchemaModificationData {\n\tschema: Validation.Schema\n}\n\nexport const updateValidationSchemaModification = createModificationType({\n\tid: 'updateValidationSchema',\n\thandler: UpdateValidationSchemaModificationHandler,\n})\n\nexport class UpdateValidationSchemaDiffer implements Differ {\n\tconstructor(\n\t\tprivate readonly options?: {\n\t\t\tmaxPatchSize?: number\n\t\t},\n\t) {\n\t}\n\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\tif (deepEqual(originalSchema.validation, updatedSchema.validation)) {\n\t\t\treturn []\n\t\t}\n\t\tconst patch = createPatch(originalSchema.validation, updatedSchema.validation)\n\t\tif (patch.length <= (this.options?.maxPatchSize ?? 100)) {\n\t\t\treturn [patchValidationSchemaModification.createModification({ patch })]\n\t\t}\n\t\treturn [updateValidationSchemaModification.createModification({ schema: updatedSchema.validation })]\n\t}\n}\n"],"names":["createModificationType","createPatch","patchValidationSchemaModification"],"mappings":";;;;;;AAOO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA8C;AAA9C,SAAA,OAAA;AAAA,EAA+C;AAAA,EAErE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,cAAc;AAAA,MACvB,GAAG;AAAA,MACH,YAAY,KAAK,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,qCAAqCA,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,6BAA+C;AAAA,EAC3D,YACkB,SAGhB;AAHgB,SAAA,UAAA;AAAA,EAIlB;AAAA,EAEA,WAAW,gBAAwB,eAAuB;AACzD,QAAI,UAAU,eAAe,YAAY,cAAc,UAAU,GAAG;AACnE,aAAO,CAAA;AAAA,IACR;AACA,UAAM,QAAQC,QAAAA,YAAY,eAAe,YAAY,cAAc,UAAU;AAC7E,QAAI,MAAM,WAAW,KAAK,SAAS,gBAAgB,MAAM;AACxD,aAAO,CAACC,kCAAAA,kCAAkC,mBAAmB,EAAE,MAAA,CAAO,CAAC;AAAA,IACxE;AACA,WAAO,CAAC,mCAAmC,mBAAmB,EAAE,QAAQ,cAAc,WAAA,CAAY,CAAC;AAAA,EACpG;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateValidationSchemaModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/UpdateValidationSchemaModification.ts"],"sourcesContent":["import { Schema, Validation } from '@contember/schema'\nimport { SchemaUpdater } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { createPatch } from 'rfc6902'\nimport { patchValidationSchemaModification } from './PatchValidationSchemaModification'\n\nexport class UpdateValidationSchemaModificationHandler implements ModificationHandler<UpdateValidationSchemaModificationData> {\n\tconstructor(private readonly data: UpdateValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => ({\n\t\t\t...schema,\n\t\t\tvalidation: this.data.schema,\n\t\t})\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface UpdateValidationSchemaModificationData {\n\tschema: Validation.Schema\n}\n\nexport const updateValidationSchemaModification = createModificationType({\n\tid: 'updateValidationSchema',\n\thandler: UpdateValidationSchemaModificationHandler,\n})\n\nexport class UpdateValidationSchemaDiffer implements Differ {\n\tconstructor(\n\t\tprivate readonly options?: {\n\t\t\tmaxPatchSize?: number\n\t\t},\n\t) {\n\t}\n\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\tif (deepEqual(originalSchema.validation, updatedSchema.validation)) {\n\t\t\treturn []\n\t\t}\n\t\tconst patch = createPatch(originalSchema.validation, updatedSchema.validation)\n\t\tif (patch.length <= (this.options?.maxPatchSize ?? 100)) {\n\t\t\treturn [patchValidationSchemaModification.createModification({ patch })]\n\t\t}\n\t\treturn [updateValidationSchemaModification.createModification({ schema: updatedSchema.validation })]\n\t}\n}\n"],"names":[],"mappings":";;;;AAOO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA8C;AAA9C,SAAA,OAAA;AAAA,EAA+C;AAAA,EAErE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,cAAc;AAAA,MACvB,GAAG;AAAA,MACH,YAAY,KAAK,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,qCAAqC,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,6BAA+C;AAAA,EAC3D,YACkB,SAGhB;AAHgB,SAAA,UAAA;AAAA,EAIlB;AAAA,EAEA,WAAW,gBAAwB,eAAuB;AACzD,QAAI,UAAU,eAAe,YAAY,cAAc,UAAU,GAAG;AACnE,aAAO,CAAA;AAAA,IACR;AACA,UAAM,QAAQ,YAAY,eAAe,YAAY,cAAc,UAAU;AAC7E,QAAI,MAAM,WAAW,KAAK,SAAS,gBAAgB,MAAM;AACxD,aAAO,CAAC,kCAAkC,mBAAmB,EAAE,MAAA,CAAO,CAAC;AAAA,IACxE;AACA,WAAO,CAAC,mCAAmC,mBAAmB,EAAE,QAAQ,cAAc,WAAA,CAAY,CAAC;AAAA,EACpG;AACD;"}
1
+ {"version":3,"file":"UpdateValidationSchemaModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/validation/UpdateValidationSchemaModification.ts"],"sourcesContent":["import { Schema, Validation } from '@contember/schema'\nimport { SchemaUpdater } from '../utils/schemaUpdateUtils.js'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler.js'\nimport deepEqual from 'fast-deep-equal'\nimport { createPatch } from 'rfc6902'\nimport { patchValidationSchemaModification } from './PatchValidationSchemaModification.js'\n\nexport class UpdateValidationSchemaModificationHandler implements ModificationHandler<UpdateValidationSchemaModificationData> {\n\tconstructor(private readonly data: UpdateValidationSchemaModificationData) {}\n\n\tpublic createSql(): void {}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn ({ schema }) => ({\n\t\t\t...schema,\n\t\t\tvalidation: this.data.schema,\n\t\t})\n\t}\n\n\tdescribe() {\n\t\treturn { message: 'Update validation schema' }\n\t}\n}\n\nexport interface UpdateValidationSchemaModificationData {\n\tschema: Validation.Schema\n}\n\nexport const updateValidationSchemaModification = createModificationType({\n\tid: 'updateValidationSchema',\n\thandler: UpdateValidationSchemaModificationHandler,\n})\n\nexport class UpdateValidationSchemaDiffer implements Differ {\n\tconstructor(\n\t\tprivate readonly options?: {\n\t\t\tmaxPatchSize?: number\n\t\t},\n\t) {\n\t}\n\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\tif (deepEqual(originalSchema.validation, updatedSchema.validation)) {\n\t\t\treturn []\n\t\t}\n\t\tconst patch = createPatch(originalSchema.validation, updatedSchema.validation)\n\t\tif (patch.length <= (this.options?.maxPatchSize ?? 100)) {\n\t\t\treturn [patchValidationSchemaModification.createModification({ patch })]\n\t\t}\n\t\treturn [updateValidationSchemaModification.createModification({ schema: updatedSchema.validation })]\n\t}\n}\n"],"names":[],"mappings":";;;;AAOO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA8C;AAA9C,SAAA,OAAA;AAAA,EAA+C;AAAA,EAErE,YAAkB;AAAA,EAAC;AAAA,EAEnB,mBAAkC;AACxC,WAAO,CAAC,EAAE,cAAc;AAAA,MACvB,GAAG;AAAA,MACH,YAAY,KAAK,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEA,WAAW;AACV,WAAO,EAAE,SAAS,2BAAA;AAAA,EACnB;AACD;AAMO,MAAM,qCAAqC,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,6BAA+C;AAAA,EAC3D,YACkB,SAGhB;AAHgB,SAAA,UAAA;AAAA,EAIlB;AAAA,EAEA,WAAW,gBAAwB,eAAuB;AACzD,QAAI,UAAU,eAAe,YAAY,cAAc,UAAU,GAAG;AACnE,aAAO,CAAA;AAAA,IACR;AACA,UAAM,QAAQ,YAAY,eAAe,YAAY,cAAc,UAAU;AAC7E,QAAI,MAAM,WAAW,KAAK,SAAS,gBAAgB,MAAM;AACxD,aAAO,CAAC,kCAAkC,mBAAmB,EAAE,MAAA,CAAO,CAAC;AAAA,IACxE;AACA,WAAO,CAAC,mCAAmC,mBAAmB,EAAE,QAAQ,cAAc,WAAA,CAAY,CAAC;AAAA,EACpG;AACD;"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const rfc6902 = require("rfc6902");
4
+ const skippedTokens = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
5
+ const isContainer = (value) => typeof value === "object" && value !== null;
6
+ const shallowCopy = (value) => Array.isArray(value) ? [...value] : { ...value };
7
+ const getMutatedPointers = (operation) => {
8
+ switch (operation.op) {
9
+ case "test":
10
+ return [];
11
+ case "move":
12
+ return [operation.from, operation.path];
13
+ default:
14
+ return [operation.path];
15
+ }
16
+ };
17
+ const applyPatchCopyOnWrite = (root, patch) => {
18
+ const result = { ...root };
19
+ const copies = /* @__PURE__ */ new Set([result]);
20
+ const errors = [];
21
+ for (const operation of patch) {
22
+ for (const pointer of getMutatedPointers(operation)) {
23
+ copyParents(result, pointer, copies);
24
+ }
25
+ for (const error of rfc6902.applyPatch(result, [operation])) {
26
+ if (error !== null) {
27
+ errors.push(error);
28
+ }
29
+ }
30
+ }
31
+ return { result, errors };
32
+ };
33
+ const copyParents = (root, pointer, copies) => {
34
+ const tokens = rfc6902.Pointer.fromJSON(pointer).tokens.slice(1);
35
+ const lastToken = tokens.at(-1);
36
+ const writtenTokens = lastToken !== void 0 && skippedTokens.has(lastToken) ? tokens : tokens.slice(0, -1);
37
+ const parentTokens = writtenTokens.filter((token) => !skippedTokens.has(token));
38
+ let node = root;
39
+ for (const token of parentTokens) {
40
+ const child = Reflect.get(node, token);
41
+ if (!isContainer(child)) {
42
+ return;
43
+ }
44
+ const childCopy = copies.has(child) ? child : shallowCopy(child);
45
+ copies.add(childCopy);
46
+ Reflect.set(node, token, childCopy);
47
+ node = childCopy;
48
+ }
49
+ };
50
+ exports.applyPatchCopyOnWrite = applyPatchCopyOnWrite;
51
+ //# sourceMappingURL=applyPatchCopyOnWrite.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyPatchCopyOnWrite.cjs","sources":["../../../../../packages/schema-migrations/src/utils/applyPatchCopyOnWrite.ts"],"sourcesContent":["import { applyPatch, Operation, Pointer } from 'rfc6902'\n\ntype JsonContainer = { [key: string]: unknown } | unknown[]\n\n// Pointer.evaluate in rfc6902 skips these tokens, so the copy walk must skip them too.\nconst skippedTokens = new Set(['__proto__', 'constructor', 'prototype'])\n\nconst isContainer = (value: unknown): value is JsonContainer => typeof value === 'object' && value !== null\n\nconst shallowCopy = (value: JsonContainer): JsonContainer => Array.isArray(value) ? [...value] : { ...value }\n\nconst getMutatedPointers = (operation: Operation): string[] => {\n\tswitch (operation.op) {\n\t\tcase 'test':\n\t\t\treturn []\n\t\tcase 'move':\n\t\t\treturn [operation.from, operation.path]\n\t\tdefault:\n\t\t\treturn [operation.path]\n\t}\n}\n\n/**\n * Applies the patch to a copy of `root`, leaving `root` untouched. Only the containers on the paths\n * the patch writes to are copied; everything else stays shared with `root`.\n */\nexport const applyPatchCopyOnWrite = <T extends object>(root: T, patch: Operation[]): { result: T; errors: Error[] } => {\n\tconst result = { ...root }\n\tconst copies = new Set<unknown>([result])\n\tconst errors: Error[] = []\n\tfor (const operation of patch) {\n\t\t// Each path is copied against the tree as the previous operations left it: array indices shift\n\t\t// and `move` relocates an uncopied original, so a path resolved up front can miss the target.\n\t\tfor (const pointer of getMutatedPointers(operation)) {\n\t\t\tcopyParents(result, pointer, copies)\n\t\t}\n\t\tfor (const error of applyPatch(result, [operation])) {\n\t\t\tif (error !== null) {\n\t\t\t\terrors.push(error)\n\t\t\t}\n\t\t}\n\t}\n\treturn { result, errors }\n}\n\nconst copyParents = (root: object, pointer: string, copies: Set<unknown>): void => {\n\tconst tokens = Pointer.fromJSON(pointer).tokens.slice(1)\n\t// rfc6902 writes into the node reached before the last token, unless that token is skipped.\n\tconst lastToken = tokens.at(-1)\n\tconst writtenTokens = lastToken !== undefined && skippedTokens.has(lastToken) ? tokens : tokens.slice(0, -1)\n\tconst parentTokens = writtenTokens.filter(token => !skippedTokens.has(token))\n\tlet node: object = root\n\tfor (const token of parentTokens) {\n\t\tconst child: unknown = Reflect.get(node, token)\n\t\tif (!isContainer(child)) {\n\t\t\treturn\n\t\t}\n\t\tconst childCopy = copies.has(child) ? child : shallowCopy(child)\n\t\tcopies.add(childCopy)\n\t\tReflect.set(node, token, childCopy)\n\t\tnode = childCopy\n\t}\n}\n"],"names":["applyPatch","Pointer"],"mappings":";;;AAKA,MAAM,gBAAgB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAEvE,MAAM,cAAc,CAAC,UAA2C,OAAO,UAAU,YAAY,UAAU;AAEvG,MAAM,cAAc,CAAC,UAAwC,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,MAAA;AAEtG,MAAM,qBAAqB,CAAC,cAAmC;AAC9D,UAAQ,UAAU,IAAA;AAAA,IACjB,KAAK;AACJ,aAAO,CAAA;AAAA,IACR,KAAK;AACJ,aAAO,CAAC,UAAU,MAAM,UAAU,IAAI;AAAA,IACvC;AACC,aAAO,CAAC,UAAU,IAAI;AAAA,EAAA;AAEzB;AAMO,MAAM,wBAAwB,CAAmB,MAAS,UAAuD;AACvH,QAAM,SAAS,EAAE,GAAG,KAAA;AACpB,QAAM,SAAS,oBAAI,IAAa,CAAC,MAAM,CAAC;AACxC,QAAM,SAAkB,CAAA;AACxB,aAAW,aAAa,OAAO;AAG9B,eAAW,WAAW,mBAAmB,SAAS,GAAG;AACpD,kBAAY,QAAQ,SAAS,MAAM;AAAA,IACpC;AACA,eAAW,SAASA,QAAAA,WAAW,QAAQ,CAAC,SAAS,CAAC,GAAG;AACpD,UAAI,UAAU,MAAM;AACnB,eAAO,KAAK,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AACA,SAAO,EAAE,QAAQ,OAAA;AAClB;AAEA,MAAM,cAAc,CAAC,MAAc,SAAiB,WAA+B;AAClF,QAAM,SAASC,QAAAA,QAAQ,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC;AAEvD,QAAM,YAAY,OAAO,GAAG,EAAE;AAC9B,QAAM,gBAAgB,cAAc,UAAa,cAAc,IAAI,SAAS,IAAI,SAAS,OAAO,MAAM,GAAG,EAAE;AAC3G,QAAM,eAAe,cAAc,OAAO,CAAA,UAAS,CAAC,cAAc,IAAI,KAAK,CAAC;AAC5E,MAAI,OAAe;AACnB,aAAW,SAAS,cAAc;AACjC,UAAM,QAAiB,QAAQ,IAAI,MAAM,KAAK;AAC9C,QAAI,CAAC,YAAY,KAAK,GAAG;AACxB;AAAA,IACD;AACA,UAAM,YAAY,OAAO,IAAI,KAAK,IAAI,QAAQ,YAAY,KAAK;AAC/D,WAAO,IAAI,SAAS;AACpB,YAAQ,IAAI,MAAM,OAAO,SAAS;AAClC,WAAO;AAAA,EACR;AACD;;"}
@@ -0,0 +1,51 @@
1
+ import { applyPatch, Pointer } from "rfc6902";
2
+ const skippedTokens = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
3
+ const isContainer = (value) => typeof value === "object" && value !== null;
4
+ const shallowCopy = (value) => Array.isArray(value) ? [...value] : { ...value };
5
+ const getMutatedPointers = (operation) => {
6
+ switch (operation.op) {
7
+ case "test":
8
+ return [];
9
+ case "move":
10
+ return [operation.from, operation.path];
11
+ default:
12
+ return [operation.path];
13
+ }
14
+ };
15
+ const applyPatchCopyOnWrite = (root, patch) => {
16
+ const result = { ...root };
17
+ const copies = /* @__PURE__ */ new Set([result]);
18
+ const errors = [];
19
+ for (const operation of patch) {
20
+ for (const pointer of getMutatedPointers(operation)) {
21
+ copyParents(result, pointer, copies);
22
+ }
23
+ for (const error of applyPatch(result, [operation])) {
24
+ if (error !== null) {
25
+ errors.push(error);
26
+ }
27
+ }
28
+ }
29
+ return { result, errors };
30
+ };
31
+ const copyParents = (root, pointer, copies) => {
32
+ const tokens = Pointer.fromJSON(pointer).tokens.slice(1);
33
+ const lastToken = tokens.at(-1);
34
+ const writtenTokens = lastToken !== void 0 && skippedTokens.has(lastToken) ? tokens : tokens.slice(0, -1);
35
+ const parentTokens = writtenTokens.filter((token) => !skippedTokens.has(token));
36
+ let node = root;
37
+ for (const token of parentTokens) {
38
+ const child = Reflect.get(node, token);
39
+ if (!isContainer(child)) {
40
+ return;
41
+ }
42
+ const childCopy = copies.has(child) ? child : shallowCopy(child);
43
+ copies.add(childCopy);
44
+ Reflect.set(node, token, childCopy);
45
+ node = childCopy;
46
+ }
47
+ };
48
+ export {
49
+ applyPatchCopyOnWrite
50
+ };
51
+ //# sourceMappingURL=applyPatchCopyOnWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyPatchCopyOnWrite.js","sources":["../../../../../packages/schema-migrations/src/utils/applyPatchCopyOnWrite.ts"],"sourcesContent":["import { applyPatch, Operation, Pointer } from 'rfc6902'\n\ntype JsonContainer = { [key: string]: unknown } | unknown[]\n\n// Pointer.evaluate in rfc6902 skips these tokens, so the copy walk must skip them too.\nconst skippedTokens = new Set(['__proto__', 'constructor', 'prototype'])\n\nconst isContainer = (value: unknown): value is JsonContainer => typeof value === 'object' && value !== null\n\nconst shallowCopy = (value: JsonContainer): JsonContainer => Array.isArray(value) ? [...value] : { ...value }\n\nconst getMutatedPointers = (operation: Operation): string[] => {\n\tswitch (operation.op) {\n\t\tcase 'test':\n\t\t\treturn []\n\t\tcase 'move':\n\t\t\treturn [operation.from, operation.path]\n\t\tdefault:\n\t\t\treturn [operation.path]\n\t}\n}\n\n/**\n * Applies the patch to a copy of `root`, leaving `root` untouched. Only the containers on the paths\n * the patch writes to are copied; everything else stays shared with `root`.\n */\nexport const applyPatchCopyOnWrite = <T extends object>(root: T, patch: Operation[]): { result: T; errors: Error[] } => {\n\tconst result = { ...root }\n\tconst copies = new Set<unknown>([result])\n\tconst errors: Error[] = []\n\tfor (const operation of patch) {\n\t\t// Each path is copied against the tree as the previous operations left it: array indices shift\n\t\t// and `move` relocates an uncopied original, so a path resolved up front can miss the target.\n\t\tfor (const pointer of getMutatedPointers(operation)) {\n\t\t\tcopyParents(result, pointer, copies)\n\t\t}\n\t\tfor (const error of applyPatch(result, [operation])) {\n\t\t\tif (error !== null) {\n\t\t\t\terrors.push(error)\n\t\t\t}\n\t\t}\n\t}\n\treturn { result, errors }\n}\n\nconst copyParents = (root: object, pointer: string, copies: Set<unknown>): void => {\n\tconst tokens = Pointer.fromJSON(pointer).tokens.slice(1)\n\t// rfc6902 writes into the node reached before the last token, unless that token is skipped.\n\tconst lastToken = tokens.at(-1)\n\tconst writtenTokens = lastToken !== undefined && skippedTokens.has(lastToken) ? tokens : tokens.slice(0, -1)\n\tconst parentTokens = writtenTokens.filter(token => !skippedTokens.has(token))\n\tlet node: object = root\n\tfor (const token of parentTokens) {\n\t\tconst child: unknown = Reflect.get(node, token)\n\t\tif (!isContainer(child)) {\n\t\t\treturn\n\t\t}\n\t\tconst childCopy = copies.has(child) ? child : shallowCopy(child)\n\t\tcopies.add(childCopy)\n\t\tReflect.set(node, token, childCopy)\n\t\tnode = childCopy\n\t}\n}\n"],"names":[],"mappings":";AAKA,MAAM,gBAAgB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAEvE,MAAM,cAAc,CAAC,UAA2C,OAAO,UAAU,YAAY,UAAU;AAEvG,MAAM,cAAc,CAAC,UAAwC,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,MAAA;AAEtG,MAAM,qBAAqB,CAAC,cAAmC;AAC9D,UAAQ,UAAU,IAAA;AAAA,IACjB,KAAK;AACJ,aAAO,CAAA;AAAA,IACR,KAAK;AACJ,aAAO,CAAC,UAAU,MAAM,UAAU,IAAI;AAAA,IACvC;AACC,aAAO,CAAC,UAAU,IAAI;AAAA,EAAA;AAEzB;AAMO,MAAM,wBAAwB,CAAmB,MAAS,UAAuD;AACvH,QAAM,SAAS,EAAE,GAAG,KAAA;AACpB,QAAM,SAAS,oBAAI,IAAa,CAAC,MAAM,CAAC;AACxC,QAAM,SAAkB,CAAA;AACxB,aAAW,aAAa,OAAO;AAG9B,eAAW,WAAW,mBAAmB,SAAS,GAAG;AACpD,kBAAY,QAAQ,SAAS,MAAM;AAAA,IACpC;AACA,eAAW,SAAS,WAAW,QAAQ,CAAC,SAAS,CAAC,GAAG;AACpD,UAAI,UAAU,MAAM;AACnB,eAAO,KAAK,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AACA,SAAO,EAAE,QAAQ,OAAA;AAClB;AAEA,MAAM,cAAc,CAAC,MAAc,SAAiB,WAA+B;AAClF,QAAM,SAAS,QAAQ,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC;AAEvD,QAAM,YAAY,OAAO,GAAG,EAAE;AAC9B,QAAM,gBAAgB,cAAc,UAAa,cAAc,IAAI,SAAS,IAAI,SAAS,OAAO,MAAM,GAAG,EAAE;AAC3G,QAAM,eAAe,cAAc,OAAO,CAAA,UAAS,CAAC,cAAc,IAAI,KAAK,CAAC;AAC5E,MAAI,OAAe;AACnB,aAAW,SAAS,cAAc;AACjC,UAAM,QAAiB,QAAQ,IAAI,MAAM,KAAK;AAC9C,QAAI,CAAC,YAAY,KAAK,GAAG;AACxB;AAAA,IACD;AACA,UAAM,YAAY,OAAO,IAAI,KAAK,IAAI,QAAQ,YAAY,KAAK;AAC/D,WAAO,IAAI,SAAS;AACpB,YAAQ,IAAI,MAAM,OAAO,SAAS;AAClC,WAAO;AAAA,EACR;AACD;"}
@@ -24,6 +24,7 @@ const RemoveEnumModification = require("./src/modifications/enums/RemoveEnumModi
24
24
  const UpdateEnumModification = require("./src/modifications/enums/UpdateEnumModification.cjs");
25
25
  const RemoveFieldModification = require("./src/modifications/fields/RemoveFieldModification.cjs");
26
26
  const UpdateFieldNameModification = require("./src/modifications/fields/UpdateFieldNameModification.cjs");
27
+ const ConvertManyHasManyToJoiningEntityModification = require("./src/modifications/relations/ConvertManyHasManyToJoiningEntityModification.cjs");
27
28
  const ConvertOneHasManyToManyHasManyRelationModification = require("./src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.cjs");
28
29
  const ConvertOneToManyRelationModification = require("./src/modifications/relations/ConvertOneToManyRelationModification.cjs");
29
30
  const CreateRelationInverseSideModification = require("./src/modifications/relations/CreateRelationInverseSideModification.cjs");
@@ -103,6 +104,8 @@ exports.RemoveFieldModificationHandler = RemoveFieldModification.RemoveFieldModi
103
104
  exports.removeFieldModification = RemoveFieldModification.removeFieldModification;
104
105
  exports.UpdateFieldNameModificationHandler = UpdateFieldNameModification.UpdateFieldNameModificationHandler;
105
106
  exports.updateFieldNameModification = UpdateFieldNameModification.updateFieldNameModification;
107
+ exports.ConvertManyHasManyToJoiningEntityModificationHandler = ConvertManyHasManyToJoiningEntityModification.ConvertManyHasManyToJoiningEntityModificationHandler;
108
+ exports.convertManyHasManyToJoiningEntityModification = ConvertManyHasManyToJoiningEntityModification.convertManyHasManyToJoiningEntityModification;
106
109
  exports.ConvertOneHasManyToManyHasManyRelationDiffer = ConvertOneHasManyToManyHasManyRelationModification.ConvertOneHasManyToManyHasManyRelationDiffer;
107
110
  exports.ConvertOneHasManyToManyHasManyRelationModificationHandler = ConvertOneHasManyToManyHasManyRelationModification.ConvertOneHasManyToManyHasManyRelationModificationHandler;
108
111
  exports.convertOneHasManyToManyHasManyRelationModification = ConvertOneHasManyToManyHasManyRelationModification.convertOneHasManyToManyHasManyRelationModification;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}