@strapi/database 5.12.0 → 5.12.2

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 (321) hide show
  1. package/dist/connection.js +43 -0
  2. package/dist/connection.js.map +1 -0
  3. package/dist/connection.mjs +41 -0
  4. package/dist/connection.mjs.map +1 -0
  5. package/dist/dialects/dialect.js +54 -0
  6. package/dist/dialects/dialect.js.map +1 -0
  7. package/dist/dialects/dialect.mjs +52 -0
  8. package/dist/dialects/dialect.mjs.map +1 -0
  9. package/dist/dialects/index.js +44 -0
  10. package/dist/dialects/index.js.map +1 -0
  11. package/dist/dialects/index.mjs +42 -0
  12. package/dist/dialects/index.mjs.map +1 -0
  13. package/dist/dialects/mysql/constants.js +8 -0
  14. package/dist/dialects/mysql/constants.js.map +1 -0
  15. package/dist/dialects/mysql/constants.mjs +5 -0
  16. package/dist/dialects/mysql/constants.mjs.map +1 -0
  17. package/dist/dialects/mysql/database-inspector.js +35 -0
  18. package/dist/dialects/mysql/database-inspector.js.map +1 -0
  19. package/dist/dialects/mysql/database-inspector.mjs +33 -0
  20. package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
  21. package/dist/dialects/mysql/index.js +75 -0
  22. package/dist/dialects/mysql/index.js.map +1 -0
  23. package/dist/dialects/mysql/index.mjs +73 -0
  24. package/dist/dialects/mysql/index.mjs.map +1 -0
  25. package/dist/dialects/mysql/schema-inspector.js +297 -0
  26. package/dist/dialects/mysql/schema-inspector.js.map +1 -0
  27. package/dist/dialects/mysql/schema-inspector.mjs +295 -0
  28. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
  29. package/dist/dialects/postgresql/index.js +62 -0
  30. package/dist/dialects/postgresql/index.js.map +1 -0
  31. package/dist/dialects/postgresql/index.mjs +60 -0
  32. package/dist/dialects/postgresql/index.mjs.map +1 -0
  33. package/dist/dialects/postgresql/schema-inspector.js +316 -0
  34. package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
  35. package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
  36. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
  37. package/dist/dialects/sqlite/index.js +82 -0
  38. package/dist/dialects/sqlite/index.js.map +1 -0
  39. package/dist/dialects/sqlite/index.mjs +80 -0
  40. package/dist/dialects/sqlite/index.mjs.map +1 -0
  41. package/dist/dialects/sqlite/schema-inspector.js +211 -0
  42. package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
  43. package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
  44. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
  45. package/dist/entity-manager/entity-repository.js +139 -0
  46. package/dist/entity-manager/entity-repository.js.map +1 -0
  47. package/dist/entity-manager/entity-repository.mjs +137 -0
  48. package/dist/entity-manager/entity-repository.mjs.map +1 -0
  49. package/dist/entity-manager/index.js +1186 -0
  50. package/dist/entity-manager/index.js.map +1 -0
  51. package/dist/entity-manager/index.mjs +1184 -0
  52. package/dist/entity-manager/index.mjs.map +1 -0
  53. package/dist/entity-manager/morph-relations.js +73 -0
  54. package/dist/entity-manager/morph-relations.js.map +1 -0
  55. package/dist/entity-manager/morph-relations.mjs +69 -0
  56. package/dist/entity-manager/morph-relations.mjs.map +1 -0
  57. package/dist/entity-manager/regular-relations.js +247 -0
  58. package/dist/entity-manager/regular-relations.js.map +1 -0
  59. package/dist/entity-manager/regular-relations.mjs +242 -0
  60. package/dist/entity-manager/regular-relations.mjs.map +1 -0
  61. package/dist/entity-manager/relations-orderer.js +221 -0
  62. package/dist/entity-manager/relations-orderer.js.map +1 -0
  63. package/dist/entity-manager/relations-orderer.mjs +218 -0
  64. package/dist/entity-manager/relations-orderer.mjs.map +1 -0
  65. package/dist/errors/database.js +13 -0
  66. package/dist/errors/database.js.map +1 -0
  67. package/dist/errors/database.mjs +11 -0
  68. package/dist/errors/database.mjs.map +1 -0
  69. package/dist/errors/index.js +18 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/errors/index.mjs +7 -0
  72. package/dist/errors/index.mjs.map +1 -0
  73. package/dist/errors/invalid-date.js +13 -0
  74. package/dist/errors/invalid-date.js.map +1 -0
  75. package/dist/errors/invalid-date.mjs +11 -0
  76. package/dist/errors/invalid-date.mjs.map +1 -0
  77. package/dist/errors/invalid-datetime.js +13 -0
  78. package/dist/errors/invalid-datetime.js.map +1 -0
  79. package/dist/errors/invalid-datetime.mjs +11 -0
  80. package/dist/errors/invalid-datetime.mjs.map +1 -0
  81. package/dist/errors/invalid-relation.js +13 -0
  82. package/dist/errors/invalid-relation.js.map +1 -0
  83. package/dist/errors/invalid-relation.mjs +11 -0
  84. package/dist/errors/invalid-relation.mjs.map +1 -0
  85. package/dist/errors/invalid-time.js +13 -0
  86. package/dist/errors/invalid-time.js.map +1 -0
  87. package/dist/errors/invalid-time.mjs +11 -0
  88. package/dist/errors/invalid-time.mjs.map +1 -0
  89. package/dist/errors/not-null.js +17 -0
  90. package/dist/errors/not-null.js.map +1 -0
  91. package/dist/errors/not-null.mjs +15 -0
  92. package/dist/errors/not-null.mjs.map +1 -0
  93. package/dist/fields/biginteger.js +9 -0
  94. package/dist/fields/biginteger.js.map +1 -0
  95. package/dist/fields/biginteger.mjs +7 -0
  96. package/dist/fields/biginteger.mjs.map +1 -0
  97. package/dist/fields/boolean.js +48 -0
  98. package/dist/fields/boolean.js.map +1 -0
  99. package/dist/fields/boolean.mjs +46 -0
  100. package/dist/fields/boolean.mjs.map +1 -0
  101. package/dist/fields/date.js +16 -0
  102. package/dist/fields/date.js.map +1 -0
  103. package/dist/fields/date.mjs +14 -0
  104. package/dist/fields/date.mjs.map +1 -0
  105. package/dist/fields/datetime.js +37 -0
  106. package/dist/fields/datetime.js.map +1 -0
  107. package/dist/fields/datetime.mjs +16 -0
  108. package/dist/fields/datetime.mjs.map +1 -0
  109. package/dist/fields/field.js +16 -0
  110. package/dist/fields/field.js.map +1 -0
  111. package/dist/fields/field.mjs +14 -0
  112. package/dist/fields/field.mjs.map +1 -0
  113. package/dist/fields/index.js +45 -0
  114. package/dist/fields/index.js.map +1 -0
  115. package/dist/fields/index.mjs +43 -0
  116. package/dist/fields/index.mjs.map +1 -0
  117. package/dist/fields/json.js +36 -0
  118. package/dist/fields/json.js.map +1 -0
  119. package/dist/fields/json.mjs +34 -0
  120. package/dist/fields/json.mjs.map +1 -0
  121. package/dist/fields/number.js +20 -0
  122. package/dist/fields/number.js.map +1 -0
  123. package/dist/fields/number.mjs +18 -0
  124. package/dist/fields/number.mjs.map +1 -0
  125. package/dist/fields/shared/parsers.js +91 -0
  126. package/dist/fields/shared/parsers.js.map +1 -0
  127. package/dist/fields/shared/parsers.mjs +68 -0
  128. package/dist/fields/shared/parsers.mjs.map +1 -0
  129. package/dist/fields/string.js +16 -0
  130. package/dist/fields/string.js.map +1 -0
  131. package/dist/fields/string.mjs +14 -0
  132. package/dist/fields/string.mjs.map +1 -0
  133. package/dist/fields/time.js +17 -0
  134. package/dist/fields/time.js.map +1 -0
  135. package/dist/fields/time.mjs +15 -0
  136. package/dist/fields/time.mjs.map +1 -0
  137. package/dist/fields/timestamp.js +37 -0
  138. package/dist/fields/timestamp.js.map +1 -0
  139. package/dist/fields/timestamp.mjs +16 -0
  140. package/dist/fields/timestamp.mjs.map +1 -0
  141. package/dist/index.js +33 -8569
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +16 -8532
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/lifecycles/index.js +73 -0
  146. package/dist/lifecycles/index.js.map +1 -0
  147. package/dist/lifecycles/index.mjs +71 -0
  148. package/dist/lifecycles/index.mjs.map +1 -0
  149. package/dist/lifecycles/subscribers/index.js +10 -0
  150. package/dist/lifecycles/subscribers/index.js.map +1 -0
  151. package/dist/lifecycles/subscribers/index.mjs +8 -0
  152. package/dist/lifecycles/subscribers/index.mjs.map +1 -0
  153. package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
  154. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
  155. package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
  156. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
  157. package/dist/lifecycles/subscribers/timestamps.js +55 -0
  158. package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
  159. package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
  160. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
  161. package/dist/metadata/index.js +24 -0
  162. package/dist/metadata/index.js.map +1 -0
  163. package/dist/metadata/index.mjs +16 -0
  164. package/dist/metadata/index.mjs.map +1 -0
  165. package/dist/metadata/metadata.js +100 -0
  166. package/dist/metadata/metadata.js.map +1 -0
  167. package/dist/metadata/metadata.mjs +98 -0
  168. package/dist/metadata/metadata.mjs.map +1 -0
  169. package/dist/metadata/relations.js +545 -0
  170. package/dist/metadata/relations.js.map +1 -0
  171. package/dist/metadata/relations.mjs +536 -0
  172. package/dist/metadata/relations.mjs.map +1 -0
  173. package/dist/migrations/common.js +8 -0
  174. package/dist/migrations/common.js.map +1 -0
  175. package/dist/migrations/common.mjs +6 -0
  176. package/dist/migrations/common.mjs.map +1 -0
  177. package/dist/migrations/index.js +39 -0
  178. package/dist/migrations/index.js.map +1 -0
  179. package/dist/migrations/index.mjs +37 -0
  180. package/dist/migrations/index.mjs.map +1 -0
  181. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
  182. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
  183. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
  184. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
  185. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
  186. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
  187. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
  188. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
  189. package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
  190. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
  191. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
  192. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
  193. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
  194. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
  195. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
  196. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
  197. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
  198. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
  199. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
  200. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
  201. package/dist/migrations/internal-migrations/index.js +26 -0
  202. package/dist/migrations/internal-migrations/index.js.map +1 -0
  203. package/dist/migrations/internal-migrations/index.mjs +24 -0
  204. package/dist/migrations/internal-migrations/index.mjs.map +1 -0
  205. package/dist/migrations/internal.js +63 -0
  206. package/dist/migrations/internal.js.map +1 -0
  207. package/dist/migrations/internal.mjs +61 -0
  208. package/dist/migrations/internal.mjs.map +1 -0
  209. package/dist/migrations/logger.js +24 -0
  210. package/dist/migrations/logger.js.map +1 -0
  211. package/dist/migrations/logger.mjs +22 -0
  212. package/dist/migrations/logger.mjs.map +1 -0
  213. package/dist/migrations/storage.js +39 -0
  214. package/dist/migrations/storage.js.map +1 -0
  215. package/dist/migrations/storage.mjs +37 -0
  216. package/dist/migrations/storage.mjs.map +1 -0
  217. package/dist/migrations/users.js +87 -0
  218. package/dist/migrations/users.js.map +1 -0
  219. package/dist/migrations/users.mjs +85 -0
  220. package/dist/migrations/users.mjs.map +1 -0
  221. package/dist/query/helpers/join.js +127 -0
  222. package/dist/query/helpers/join.js.map +1 -0
  223. package/dist/query/helpers/join.mjs +122 -0
  224. package/dist/query/helpers/join.mjs.map +1 -0
  225. package/dist/query/helpers/order-by.js +167 -0
  226. package/dist/query/helpers/order-by.js.map +1 -0
  227. package/dist/query/helpers/order-by.mjs +163 -0
  228. package/dist/query/helpers/order-by.mjs.map +1 -0
  229. package/dist/query/helpers/populate/apply.js +592 -0
  230. package/dist/query/helpers/populate/apply.js.map +1 -0
  231. package/dist/query/helpers/populate/apply.mjs +590 -0
  232. package/dist/query/helpers/populate/apply.mjs.map +1 -0
  233. package/dist/query/helpers/populate/process.js +92 -0
  234. package/dist/query/helpers/populate/process.js.map +1 -0
  235. package/dist/query/helpers/populate/process.mjs +90 -0
  236. package/dist/query/helpers/populate/process.mjs.map +1 -0
  237. package/dist/query/helpers/search.js +67 -0
  238. package/dist/query/helpers/search.js.map +1 -0
  239. package/dist/query/helpers/search.mjs +65 -0
  240. package/dist/query/helpers/search.mjs.map +1 -0
  241. package/dist/query/helpers/streams/readable.js +131 -0
  242. package/dist/query/helpers/streams/readable.js.map +1 -0
  243. package/dist/query/helpers/streams/readable.mjs +129 -0
  244. package/dist/query/helpers/streams/readable.mjs.map +1 -0
  245. package/dist/query/helpers/transform.js +77 -0
  246. package/dist/query/helpers/transform.js.map +1 -0
  247. package/dist/query/helpers/transform.mjs +73 -0
  248. package/dist/query/helpers/transform.mjs.map +1 -0
  249. package/dist/query/helpers/where.js +372 -0
  250. package/dist/query/helpers/where.js.map +1 -0
  251. package/dist/query/helpers/where.mjs +369 -0
  252. package/dist/query/helpers/where.mjs.map +1 -0
  253. package/dist/query/query-builder.js +507 -0
  254. package/dist/query/query-builder.js.map +1 -0
  255. package/dist/query/query-builder.mjs +505 -0
  256. package/dist/query/query-builder.mjs.map +1 -0
  257. package/dist/repairs/index.js +13 -0
  258. package/dist/repairs/index.js.map +1 -0
  259. package/dist/repairs/index.mjs +11 -0
  260. package/dist/repairs/index.mjs.map +1 -0
  261. package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
  262. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
  263. package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
  264. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
  265. package/dist/schema/builder.js +354 -0
  266. package/dist/schema/builder.js.map +1 -0
  267. package/dist/schema/builder.mjs +352 -0
  268. package/dist/schema/builder.mjs.map +1 -0
  269. package/dist/schema/diff.js +379 -0
  270. package/dist/schema/diff.js.map +1 -0
  271. package/dist/schema/diff.mjs +377 -0
  272. package/dist/schema/diff.mjs.map +1 -0
  273. package/dist/schema/index.js +93 -0
  274. package/dist/schema/index.js.map +1 -0
  275. package/dist/schema/index.mjs +91 -0
  276. package/dist/schema/index.mjs.map +1 -0
  277. package/dist/schema/schema.js +266 -0
  278. package/dist/schema/schema.js.map +1 -0
  279. package/dist/schema/schema.mjs +264 -0
  280. package/dist/schema/schema.mjs.map +1 -0
  281. package/dist/schema/storage.js +58 -0
  282. package/dist/schema/storage.js.map +1 -0
  283. package/dist/schema/storage.mjs +56 -0
  284. package/dist/schema/storage.mjs.map +1 -0
  285. package/dist/transaction-context.js +65 -0
  286. package/dist/transaction-context.js.map +1 -0
  287. package/dist/transaction-context.mjs +63 -0
  288. package/dist/transaction-context.mjs.map +1 -0
  289. package/dist/utils/async-curry.js +19 -0
  290. package/dist/utils/async-curry.js.map +1 -0
  291. package/dist/utils/async-curry.mjs +17 -0
  292. package/dist/utils/async-curry.mjs.map +1 -0
  293. package/dist/utils/identifiers/hash.js +30 -0
  294. package/dist/utils/identifiers/hash.js.map +1 -0
  295. package/dist/utils/identifiers/hash.mjs +28 -0
  296. package/dist/utils/identifiers/hash.mjs.map +1 -0
  297. package/dist/utils/identifiers/index.js +414 -0
  298. package/dist/utils/identifiers/index.js.map +1 -0
  299. package/dist/utils/identifiers/index.mjs +411 -0
  300. package/dist/utils/identifiers/index.mjs.map +1 -0
  301. package/dist/utils/knex.js +21 -0
  302. package/dist/utils/knex.js.map +1 -0
  303. package/dist/utils/knex.mjs +18 -0
  304. package/dist/utils/knex.mjs.map +1 -0
  305. package/dist/utils/types.js +51 -0
  306. package/dist/utils/types.js.map +1 -0
  307. package/dist/utils/types.mjs +44 -0
  308. package/dist/utils/types.mjs.map +1 -0
  309. package/dist/validations/index.js +12 -0
  310. package/dist/validations/index.js.map +1 -0
  311. package/dist/validations/index.mjs +10 -0
  312. package/dist/validations/index.mjs.map +1 -0
  313. package/dist/validations/relations/bidirectional.js +64 -0
  314. package/dist/validations/relations/bidirectional.js.map +1 -0
  315. package/dist/validations/relations/bidirectional.mjs +62 -0
  316. package/dist/validations/relations/bidirectional.mjs.map +1 -0
  317. package/dist/validations/relations/index.js +13 -0
  318. package/dist/validations/relations/index.js.map +1 -0
  319. package/dist/validations/relations/index.mjs +11 -0
  320. package/dist/validations/relations/index.mjs.map +1 -0
  321. package/package.json +4 -4
@@ -0,0 +1,379 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+
5
+ // TODO: get that list dynamically instead
6
+ const RESERVED_TABLE_NAMES = [
7
+ 'strapi_migrations',
8
+ 'strapi_migrations_internal',
9
+ 'strapi_database_schema'
10
+ ];
11
+ const statuses = {
12
+ CHANGED: 'CHANGED',
13
+ UNCHANGED: 'UNCHANGED'
14
+ };
15
+ // NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff
16
+ // => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl
17
+ const helpers = {
18
+ hasTable (schema, tableName) {
19
+ return schema.tables.findIndex((table)=>table.name === tableName) !== -1;
20
+ },
21
+ findTable (schema, tableName) {
22
+ return schema.tables.find((table)=>table.name === tableName);
23
+ },
24
+ hasColumn (table, columnName) {
25
+ return table.columns.findIndex((column)=>column.name === columnName) !== -1;
26
+ },
27
+ findColumn (table, columnName) {
28
+ return table.columns.find((column)=>column.name === columnName);
29
+ },
30
+ hasIndex (table, columnName) {
31
+ return table.indexes.findIndex((column)=>column.name === columnName) !== -1;
32
+ },
33
+ findIndex (table, columnName) {
34
+ return table.indexes.find((column)=>column.name === columnName);
35
+ },
36
+ hasForeignKey (table, columnName) {
37
+ return table.foreignKeys.findIndex((column)=>column.name === columnName) !== -1;
38
+ },
39
+ findForeignKey (table, columnName) {
40
+ return table.foreignKeys.find((column)=>column.name === columnName);
41
+ }
42
+ };
43
+ var createSchemaDiff = ((db)=>{
44
+ const hasChangedStatus = (diff)=>diff.status === statuses.CHANGED;
45
+ /**
46
+ * Compares two indexes info
47
+ * @param {Object} oldIndex - index info read from DB
48
+ * @param {Object} index - newly generate index info
49
+ */ const diffIndexes = (oldIndex, index)=>{
50
+ const changes = [];
51
+ // use xor to avoid differences in order
52
+ if (_.xor(oldIndex.columns, index.columns).length > 0) {
53
+ changes.push('columns');
54
+ }
55
+ if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {
56
+ changes.push('type');
57
+ }
58
+ return {
59
+ status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
60
+ diff: {
61
+ name: index.name,
62
+ object: index
63
+ }
64
+ };
65
+ };
66
+ /**
67
+ * Compares two foreign keys info
68
+ * @param {Object} oldForeignKey - foreignKey info read from DB
69
+ * @param {Object} foreignKey - newly generate foreignKey info
70
+ */ const diffForeignKeys = (oldForeignKey, foreignKey)=>{
71
+ const changes = [];
72
+ if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {
73
+ changes.push('columns');
74
+ }
75
+ if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {
76
+ changes.push('referencedColumns');
77
+ }
78
+ if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {
79
+ changes.push('referencedTable');
80
+ }
81
+ if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {
82
+ if (!_.isNil(foreignKey.onDelete) && _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION') {
83
+ changes.push('onDelete');
84
+ }
85
+ } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {
86
+ changes.push('onDelete');
87
+ }
88
+ if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {
89
+ if (!_.isNil(foreignKey.onUpdate) && _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION') {
90
+ changes.push('onUpdate');
91
+ }
92
+ } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {
93
+ changes.push('onUpdate');
94
+ }
95
+ return {
96
+ status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
97
+ diff: {
98
+ name: foreignKey.name,
99
+ object: foreignKey
100
+ }
101
+ };
102
+ };
103
+ const diffDefault = (oldColumn, column)=>{
104
+ const oldDefaultTo = oldColumn.defaultTo;
105
+ const { defaultTo } = column;
106
+ if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {
107
+ return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';
108
+ }
109
+ return _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) || _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`);
110
+ };
111
+ /**
112
+ * Compares two columns info
113
+ * @param {Object} oldColumn - column info read from DB
114
+ * @param {Object} column - newly generate column info
115
+ */ const diffColumns = (oldColumn, column)=>{
116
+ const changes = [];
117
+ const isIgnoredType = [
118
+ 'increments'
119
+ ].includes(column.type);
120
+ const oldType = oldColumn.type;
121
+ const type = db.dialect.getSqlType(column.type);
122
+ if (oldType !== type && !isIgnoredType) {
123
+ changes.push('type');
124
+ }
125
+ // NOTE: compare args at some point and split them into specific properties instead
126
+ if (oldColumn.notNullable !== column.notNullable) {
127
+ changes.push('notNullable');
128
+ }
129
+ const hasSameDefault = diffDefault(oldColumn, column);
130
+ if (!hasSameDefault) {
131
+ changes.push('defaultTo');
132
+ }
133
+ if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {
134
+ changes.push('unsigned');
135
+ }
136
+ return {
137
+ status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,
138
+ diff: {
139
+ name: column.name,
140
+ object: column
141
+ }
142
+ };
143
+ };
144
+ const diffTableColumns = (diffCtx)=>{
145
+ const { databaseTable, userSchemaTable, previousTable } = diffCtx;
146
+ const addedColumns = [];
147
+ const updatedColumns = [];
148
+ const unchangedColumns = [];
149
+ const removedColumns = [];
150
+ for (const userSchemaColumn of userSchemaTable.columns){
151
+ const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);
152
+ if (databaseColumn) {
153
+ const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);
154
+ if (status === statuses.CHANGED) {
155
+ updatedColumns.push(diff);
156
+ } else {
157
+ unchangedColumns.push(databaseColumn);
158
+ }
159
+ } else {
160
+ addedColumns.push(userSchemaColumn);
161
+ }
162
+ }
163
+ for (const databaseColumn of databaseTable.columns){
164
+ if (!helpers.hasColumn(userSchemaTable, databaseColumn.name) && previousTable && helpers.hasColumn(previousTable, databaseColumn.name)) {
165
+ removedColumns.push(databaseColumn);
166
+ }
167
+ }
168
+ const hasChanged = [
169
+ addedColumns,
170
+ updatedColumns,
171
+ removedColumns
172
+ ].some((arr)=>arr.length > 0);
173
+ return {
174
+ status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
175
+ diff: {
176
+ added: addedColumns,
177
+ updated: updatedColumns,
178
+ unchanged: unchangedColumns,
179
+ removed: removedColumns
180
+ }
181
+ };
182
+ };
183
+ const diffTableIndexes = (diffCtx)=>{
184
+ const { databaseTable, userSchemaTable, previousTable } = diffCtx;
185
+ const addedIndexes = [];
186
+ const updatedIndexes = [];
187
+ const unchangedIndexes = [];
188
+ const removedIndexes = [];
189
+ for (const userSchemaIndex of userSchemaTable.indexes){
190
+ const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);
191
+ if (databaseIndex) {
192
+ const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);
193
+ if (status === statuses.CHANGED) {
194
+ updatedIndexes.push(diff);
195
+ } else {
196
+ unchangedIndexes.push(databaseIndex);
197
+ }
198
+ } else {
199
+ addedIndexes.push(userSchemaIndex);
200
+ }
201
+ }
202
+ for (const databaseIndex of databaseTable.indexes){
203
+ if (!helpers.hasIndex(userSchemaTable, databaseIndex.name) && previousTable && helpers.hasIndex(previousTable, databaseIndex.name)) {
204
+ removedIndexes.push(databaseIndex);
205
+ }
206
+ }
207
+ const hasChanged = [
208
+ addedIndexes,
209
+ updatedIndexes,
210
+ removedIndexes
211
+ ].some((arr)=>arr.length > 0);
212
+ return {
213
+ status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
214
+ diff: {
215
+ added: addedIndexes,
216
+ updated: updatedIndexes,
217
+ unchanged: unchangedIndexes,
218
+ removed: removedIndexes
219
+ }
220
+ };
221
+ };
222
+ const diffTableForeignKeys = (diffCtx)=>{
223
+ const { databaseTable, userSchemaTable, previousTable } = diffCtx;
224
+ const addedForeignKeys = [];
225
+ const updatedForeignKeys = [];
226
+ const unchangedForeignKeys = [];
227
+ const removedForeignKeys = [];
228
+ if (!db.dialect.usesForeignKeys()) {
229
+ return {
230
+ status: statuses.UNCHANGED,
231
+ diff: {
232
+ added: addedForeignKeys,
233
+ updated: updatedForeignKeys,
234
+ unchanged: unchangedForeignKeys,
235
+ removed: removedForeignKeys
236
+ }
237
+ };
238
+ }
239
+ for (const userSchemaForeignKeys of userSchemaTable.foreignKeys){
240
+ const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);
241
+ if (databaseForeignKeys) {
242
+ const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);
243
+ if (status === statuses.CHANGED) {
244
+ updatedForeignKeys.push(diff);
245
+ } else {
246
+ unchangedForeignKeys.push(databaseForeignKeys);
247
+ }
248
+ } else {
249
+ addedForeignKeys.push(userSchemaForeignKeys);
250
+ }
251
+ }
252
+ for (const databaseForeignKeys of databaseTable.foreignKeys){
253
+ if (!helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) && previousTable && helpers.hasForeignKey(previousTable, databaseForeignKeys.name)) {
254
+ removedForeignKeys.push(databaseForeignKeys);
255
+ }
256
+ }
257
+ const hasChanged = [
258
+ addedForeignKeys,
259
+ updatedForeignKeys,
260
+ removedForeignKeys
261
+ ].some((arr)=>arr.length > 0);
262
+ return {
263
+ status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
264
+ diff: {
265
+ added: addedForeignKeys,
266
+ updated: updatedForeignKeys,
267
+ unchanged: unchangedForeignKeys,
268
+ removed: removedForeignKeys
269
+ }
270
+ };
271
+ };
272
+ const diffTables = (diffCtx)=>{
273
+ const { databaseTable } = diffCtx;
274
+ const columnsDiff = diffTableColumns(diffCtx);
275
+ const indexesDiff = diffTableIndexes(diffCtx);
276
+ const foreignKeysDiff = diffTableForeignKeys(diffCtx);
277
+ const hasChanged = [
278
+ columnsDiff,
279
+ indexesDiff,
280
+ foreignKeysDiff
281
+ ].some(hasChangedStatus);
282
+ return {
283
+ status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
284
+ diff: {
285
+ name: databaseTable.name,
286
+ indexes: indexesDiff.diff,
287
+ foreignKeys: foreignKeysDiff.diff,
288
+ columns: columnsDiff.diff
289
+ }
290
+ };
291
+ };
292
+ const diffSchemas = async (schemaDiffCtx)=>{
293
+ const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;
294
+ const addedTables = [];
295
+ const updatedTables = [];
296
+ const unchangedTables = [];
297
+ const removedTables = [];
298
+ // for each table in the user schema, check if it already exists in the database schema
299
+ for (const userSchemaTable of userSchema.tables){
300
+ const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);
301
+ const previousTable = previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);
302
+ if (databaseTable) {
303
+ const { status, diff } = diffTables({
304
+ previousTable,
305
+ databaseTable,
306
+ userSchemaTable
307
+ });
308
+ if (status === statuses.CHANGED) {
309
+ updatedTables.push(diff);
310
+ } else {
311
+ unchangedTables.push(databaseTable);
312
+ }
313
+ } else {
314
+ addedTables.push(userSchemaTable);
315
+ }
316
+ }
317
+ // maintain audit logs table from EE -> CE
318
+ const parsePersistedTable = (persistedTable)=>{
319
+ if (typeof persistedTable === 'string') {
320
+ return persistedTable;
321
+ }
322
+ return persistedTable.name;
323
+ };
324
+ const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings') ? await strapi.store.get({
325
+ type: 'core',
326
+ key: 'persisted_tables'
327
+ }) ?? [] : [];
328
+ const reservedTables = [
329
+ ...RESERVED_TABLE_NAMES,
330
+ ...persistedTables.map(parsePersistedTable)
331
+ ];
332
+ // for all tables in the database schema, check if they are not in the user schema
333
+ for (const databaseTable of databaseSchema.tables){
334
+ const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);
335
+ const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);
336
+ const isReserved = reservedTables.includes(databaseTable.name);
337
+ // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch
338
+ if (!isInUserSchema && !wasTracked) {
339
+ continue;
340
+ }
341
+ // if a db table is not in the user schema I want to delete it
342
+ if (!isInUserSchema && wasTracked && !isReserved) {
343
+ const dependencies = persistedTables.filter((table)=>{
344
+ const dependsOn = table?.dependsOn;
345
+ if (!_.isArray(dependsOn)) {
346
+ return;
347
+ }
348
+ return dependsOn.some((table)=>table.name === databaseTable.name);
349
+ }).map((dependsOnTable)=>{
350
+ return databaseSchema.tables.find((databaseTable)=>databaseTable.name === dependsOnTable.name);
351
+ })// In case the table is not found, filter undefined values
352
+ .filter((table)=>!_.isNil(table));
353
+ removedTables.push(databaseTable, ...dependencies);
354
+ }
355
+ }
356
+ const hasChanged = [
357
+ addedTables,
358
+ updatedTables,
359
+ removedTables
360
+ ].some((arr)=>arr.length > 0);
361
+ return {
362
+ status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,
363
+ diff: {
364
+ tables: {
365
+ added: addedTables,
366
+ updated: updatedTables,
367
+ unchanged: unchangedTables,
368
+ removed: removedTables
369
+ }
370
+ }
371
+ };
372
+ };
373
+ return {
374
+ diff: diffSchemas
375
+ };
376
+ });
377
+
378
+ module.exports = createSchemaDiff;
379
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":";;;;AAmCA;AACA,MAAMA,oBAAuB,GAAA;AAC3B,IAAA,mBAAA;AACA,IAAA,4BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,QAAW,GAAA;IACfC,OAAS,EAAA,SAAA;IACTC,SAAW,EAAA;AACb,CAAA;AAEA;AACA;AAEA,MAAMC,OAAU,GAAA;IACdC,QAASC,CAAAA,CAAAA,MAAc,EAAEC,SAAiB,EAAA;QACxC,OAAOD,MAAAA,CAAOE,MAAM,CAACC,SAAS,CAAC,CAACC,KAAAA,GAAUA,KAAMC,CAAAA,IAAI,KAAKJ,SAAAA,CAAAA,KAAe,CAAC,CAAA;AAC3E,KAAA;IACAK,SAAUN,CAAAA,CAAAA,MAAc,EAAEC,SAAiB,EAAA;QACzC,OAAOD,MAAAA,CAAOE,MAAM,CAACK,IAAI,CAAC,CAACH,KAAAA,GAAUA,KAAMC,CAAAA,IAAI,KAAKJ,SAAAA,CAAAA;AACtD,KAAA;IACAO,SAAUJ,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QACxC,OAAOL,KAAAA,CAAMM,OAAO,CAACP,SAAS,CAAC,CAACQ,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA,KAAgB,CAAC,CAAA;AAC9E,KAAA;IACAG,UAAWR,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QACzC,OAAOL,KAAAA,CAAMM,OAAO,CAACH,IAAI,CAAC,CAACI,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA;AACxD,KAAA;IAEAI,QAAST,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QACvC,OAAOL,KAAAA,CAAMU,OAAO,CAACX,SAAS,CAAC,CAACQ,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA,KAAgB,CAAC,CAAA;AAC9E,KAAA;IACAN,SAAUC,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QACxC,OAAOL,KAAAA,CAAMU,OAAO,CAACP,IAAI,CAAC,CAACI,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA;AACxD,KAAA;IAEAM,aAAcX,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QAC5C,OAAOL,KAAAA,CAAMY,WAAW,CAACb,SAAS,CAAC,CAACQ,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA,KAAgB,CAAC,CAAA;AAClF,KAAA;IACAQ,cAAeb,CAAAA,CAAAA,KAAY,EAAEK,UAAkB,EAAA;QAC7C,OAAOL,KAAAA,CAAMY,WAAW,CAACT,IAAI,CAAC,CAACI,MAAAA,GAAWA,MAAON,CAAAA,IAAI,KAAKI,UAAAA,CAAAA;AAC5D;AACF,CAAA;AAEA,uBAAe,CAAA,CAACS,EAAAA,GAAAA;AACd,IAAA,MAAMC,mBAAmB,CAACC,IAAAA,GACxBA,KAAKC,MAAM,KAAK1B,SAASC,OAAO;AAElC;;;;MAKA,MAAM0B,WAAc,GAAA,CAACC,QAAiBC,EAAAA,KAAAA,GAAAA;AACpC,QAAA,MAAMC,UAAoB,EAAE;;QAG5B,IAAIC,CAAAA,CAAEC,GAAG,CAACJ,QAASb,CAAAA,OAAO,EAAEc,KAAAA,CAAMd,OAAO,CAAA,CAAEkB,MAAM,GAAG,CAAG,EAAA;AACrDH,YAAAA,OAAAA,CAAQI,IAAI,CAAC,SAAA,CAAA;AACf;AAEA,QAAA,IAAIN,SAASO,IAAI,IAAIN,KAAMM,CAAAA,IAAI,IAAIJ,CAAEK,CAAAA,OAAO,CAACR,QAAAA,CAASO,IAAI,CAAMJ,KAAAA,CAAAA,CAAEK,OAAO,CAACP,KAAAA,CAAMM,IAAI,CAAG,EAAA;AACrFL,YAAAA,OAAAA,CAAQI,IAAI,CAAC,MAAA,CAAA;AACf;QAEA,OAAO;YACLR,MAAQI,EAAAA,OAAAA,CAAQG,MAAM,GAAG,CAAA,GAAIjC,SAASC,OAAO,GAAGD,SAASE,SAAS;YAClEuB,IAAM,EAAA;AACJf,gBAAAA,IAAAA,EAAMmB,MAAMnB,IAAI;gBAChB2B,MAAQR,EAAAA;AACV;AACF,SAAA;AACF,KAAA;AAEA;;;;MAKA,MAAMS,eAAkB,GAAA,CAACC,aAA2BC,EAAAA,UAAAA,GAAAA;AAClD,QAAA,MAAMV,UAAoB,EAAE;QAE5B,IAAIC,CAAAA,CAAEU,UAAU,CAACF,aAAcxB,CAAAA,OAAO,EAAEyB,UAAAA,CAAWzB,OAAO,CAAA,CAAEkB,MAAM,GAAG,CAAG,EAAA;AACtEH,YAAAA,OAAAA,CAAQI,IAAI,CAAC,SAAA,CAAA;AACf;QAEA,IAAIH,CAAAA,CAAEU,UAAU,CAACF,aAAcG,CAAAA,iBAAiB,EAAEF,UAAAA,CAAWE,iBAAiB,CAAA,CAAET,MAAM,GAAG,CAAG,EAAA;AAC1FH,YAAAA,OAAAA,CAAQI,IAAI,CAAC,mBAAA,CAAA;AACf;AAEA,QAAA,IAAIK,aAAcI,CAAAA,eAAe,KAAKH,UAAAA,CAAWG,eAAe,EAAE;AAChEb,YAAAA,OAAAA,CAAQI,IAAI,CAAC,iBAAA,CAAA;AACf;AAEA,QAAA,IAAIH,CAAEa,CAAAA,KAAK,CAACL,aAAAA,CAAcM,QAAQ,CAAA,IAAKd,CAAEe,CAAAA,OAAO,CAACP,aAAAA,CAAcM,QAAQ,CAAA,KAAM,WAAa,EAAA;AACxF,YAAA,IACE,CAACd,CAAAA,CAAEa,KAAK,CAACJ,WAAWK,QAAQ,CAAA,IAC5Bd,CAAEe,CAAAA,OAAO,CAACP,aAAAA,CAAcM,QAAQ,IAAI,QAAQ,WAC5C,EAAA;AACAf,gBAAAA,OAAAA,CAAQI,IAAI,CAAC,UAAA,CAAA;AACf;AACF,SAAA,MAAO,IAAIH,CAAAA,CAAEe,OAAO,CAACP,aAAcM,CAAAA,QAAQ,CAAMd,KAAAA,CAAAA,CAAEe,OAAO,CAACN,UAAWK,CAAAA,QAAQ,IAAI,EAAK,CAAA,EAAA;AACrFf,YAAAA,OAAAA,CAAQI,IAAI,CAAC,UAAA,CAAA;AACf;AAEA,QAAA,IAAIH,CAAEa,CAAAA,KAAK,CAACL,aAAAA,CAAcQ,QAAQ,CAAA,IAAKhB,CAAEe,CAAAA,OAAO,CAACP,aAAAA,CAAcQ,QAAQ,CAAA,KAAM,WAAa,EAAA;AACxF,YAAA,IACE,CAAChB,CAAAA,CAAEa,KAAK,CAACJ,WAAWO,QAAQ,CAAA,IAC5BhB,CAAEe,CAAAA,OAAO,CAACP,aAAAA,CAAcQ,QAAQ,IAAI,QAAQ,WAC5C,EAAA;AACAjB,gBAAAA,OAAAA,CAAQI,IAAI,CAAC,UAAA,CAAA;AACf;AACF,SAAA,MAAO,IAAIH,CAAAA,CAAEe,OAAO,CAACP,aAAcQ,CAAAA,QAAQ,CAAMhB,KAAAA,CAAAA,CAAEe,OAAO,CAACN,UAAWO,CAAAA,QAAQ,IAAI,EAAK,CAAA,EAAA;AACrFjB,YAAAA,OAAAA,CAAQI,IAAI,CAAC,UAAA,CAAA;AACf;QAEA,OAAO;YACLR,MAAQI,EAAAA,OAAAA,CAAQG,MAAM,GAAG,CAAA,GAAIjC,SAASC,OAAO,GAAGD,SAASE,SAAS;YAClEuB,IAAM,EAAA;AACJf,gBAAAA,IAAAA,EAAM8B,WAAW9B,IAAI;gBACrB2B,MAAQG,EAAAA;AACV;AACF,SAAA;AACF,KAAA;IAEA,MAAMQ,WAAAA,GAAc,CAACC,SAAmBjC,EAAAA,MAAAA,GAAAA;QACtC,MAAMkC,YAAAA,GAAeD,UAAUE,SAAS;QACxC,MAAM,EAAEA,SAAS,EAAE,GAAGnC,MAAAA;AAEtB,QAAA,IAAIkC,iBAAiB,IAAQnB,IAAAA,CAAAA,CAAEK,OAAO,CAACc,kBAAkB,MAAQ,EAAA;AAC/D,YAAA,OAAOnB,EAAEa,KAAK,CAACO,cAAcpB,CAAEK,CAAAA,OAAO,CAACe,SAAe,CAAA,KAAA,MAAA;AACxD;QAEA,OACEpB,CAAAA,CAAEK,OAAO,CAACc,YAAkBnB,CAAAA,KAAAA,CAAAA,CAAEK,OAAO,CAACpB,MAAAA,CAAOmC,SAAS,CAAA,IACtDpB,CAAEK,CAAAA,OAAO,CAACc,YAAkBnB,CAAAA,KAAAA,CAAAA,CAAEK,OAAO,CAAC,CAAC,CAAC,EAAEpB,MAAOmC,CAAAA,SAAS,CAAC,CAAC,CAAC,CAAA;AAEjE,KAAA;AAEA;;;;MAKA,MAAMC,WAAc,GAAA,CAACH,SAAmBjC,EAAAA,MAAAA,GAAAA;AACtC,QAAA,MAAMc,UAAoB,EAAE;AAE5B,QAAA,MAAMuB,aAAgB,GAAA;AAAC,YAAA;SAAa,CAACC,QAAQ,CAACtC,MAAAA,CAAOmB,IAAI,CAAA;QACzD,MAAMoB,OAAAA,GAAUN,UAAUd,IAAI;AAC9B,QAAA,MAAMA,OAAOZ,EAAGiC,CAAAA,OAAO,CAACC,UAAU,CAACzC,OAAOmB,IAAI,CAAA;QAE9C,IAAIoB,OAAAA,KAAYpB,IAAQ,IAAA,CAACkB,aAAe,EAAA;AACtCvB,YAAAA,OAAAA,CAAQI,IAAI,CAAC,MAAA,CAAA;AACf;;AAIA,QAAA,IAAIe,SAAUS,CAAAA,WAAW,KAAK1C,MAAAA,CAAO0C,WAAW,EAAE;AAChD5B,YAAAA,OAAAA,CAAQI,IAAI,CAAC,aAAA,CAAA;AACf;QAEA,MAAMyB,cAAAA,GAAiBX,YAAYC,SAAWjC,EAAAA,MAAAA,CAAAA;AAC9C,QAAA,IAAI,CAAC2C,cAAgB,EAAA;AACnB7B,YAAAA,OAAAA,CAAQI,IAAI,CAAC,WAAA,CAAA;AACf;QAEA,IAAIe,SAAAA,CAAUW,QAAQ,KAAK5C,MAAO4C,CAAAA,QAAQ,IAAIrC,EAAGiC,CAAAA,OAAO,CAACK,gBAAgB,EAAI,EAAA;AAC3E/B,YAAAA,OAAAA,CAAQI,IAAI,CAAC,UAAA,CAAA;AACf;QAEA,OAAO;YACLR,MAAQI,EAAAA,OAAAA,CAAQG,MAAM,GAAG,CAAA,GAAIjC,SAASC,OAAO,GAAGD,SAASE,SAAS;YAClEuB,IAAM,EAAA;AACJf,gBAAAA,IAAAA,EAAMM,OAAON,IAAI;gBACjB2B,MAAQrB,EAAAA;AACV;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAM8C,mBAAmB,CAACC,OAAAA,GAAAA;AACxB,QAAA,MAAM,EAAEC,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAE,GAAGH,OAAAA;AAE1D,QAAA,MAAMI,eAAyB,EAAE;AACjC,QAAA,MAAMC,iBAAuC,EAAE;AAC/C,QAAA,MAAMC,mBAA6B,EAAE;AACrC,QAAA,MAAMC,iBAA2B,EAAE;AAEnC,QAAA,KAAK,MAAMC,gBAAAA,IAAoBN,eAAgBlD,CAAAA,OAAO,CAAE;AACtD,YAAA,MAAMyD,iBAAiBrE,OAAQc,CAAAA,UAAU,CAAC+C,aAAAA,EAAeO,iBAAiB7D,IAAI,CAAA;AAE9E,YAAA,IAAI8D,cAAgB,EAAA;AAClB,gBAAA,MAAM,EAAE9C,MAAM,EAAED,IAAI,EAAE,GAAG2B,YAAYoB,cAAgBD,EAAAA,gBAAAA,CAAAA;gBAErD,IAAI7C,MAAAA,KAAW1B,QAASC,CAAAA,OAAO,EAAE;AAC/BmE,oBAAAA,cAAAA,CAAelC,IAAI,CAACT,IAAAA,CAAAA;iBACf,MAAA;AACL4C,oBAAAA,gBAAAA,CAAiBnC,IAAI,CAACsC,cAAAA,CAAAA;AACxB;aACK,MAAA;AACLL,gBAAAA,YAAAA,CAAajC,IAAI,CAACqC,gBAAAA,CAAAA;AACpB;AACF;AAEA,QAAA,KAAK,MAAMC,cAAAA,IAAkBR,aAAcjD,CAAAA,OAAO,CAAE;AAClD,YAAA,IACE,CAACZ,OAAAA,CAAQU,SAAS,CAACoD,iBAAiBO,cAAe9D,CAAAA,IAAI,CACvDwD,IAAAA,aAAAA,IACA/D,QAAQU,SAAS,CAACqD,aAAeM,EAAAA,cAAAA,CAAe9D,IAAI,CACpD,EAAA;AACA4D,gBAAAA,cAAAA,CAAepC,IAAI,CAACsC,cAAAA,CAAAA;AACtB;AACF;AAEA,QAAA,MAAMC,UAAa,GAAA;AAACN,YAAAA,YAAAA;AAAcC,YAAAA,cAAAA;AAAgBE,YAAAA;AAAe,SAAA,CAACI,IAAI,CAAC,CAACC,GAAQA,GAAAA,GAAAA,CAAI1C,MAAM,GAAG,CAAA,CAAA;QAE7F,OAAO;AACLP,YAAAA,MAAAA,EAAQ+C,UAAazE,GAAAA,QAAAA,CAASC,OAAO,GAAGD,SAASE,SAAS;YAC1DuB,IAAM,EAAA;gBACJmD,KAAOT,EAAAA,YAAAA;gBACPU,OAAST,EAAAA,cAAAA;gBACTU,SAAWT,EAAAA,gBAAAA;gBACXU,OAAST,EAAAA;AACX;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAMU,mBAAmB,CAACjB,OAAAA,GAAAA;AACxB,QAAA,MAAM,EAAEC,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAE,GAAGH,OAAAA;AAE1D,QAAA,MAAMkB,eAAwB,EAAE;AAChC,QAAA,MAAMC,iBAAsC,EAAE;AAC9C,QAAA,MAAMC,mBAA4B,EAAE;AACpC,QAAA,MAAMC,iBAA0B,EAAE;AAElC,QAAA,KAAK,MAAMC,eAAAA,IAAmBpB,eAAgB9C,CAAAA,OAAO,CAAE;AACrD,YAAA,MAAMmE,gBAAgBnF,OAAQK,CAAAA,SAAS,CAACwD,aAAAA,EAAeqB,gBAAgB3E,IAAI,CAAA;AAC3E,YAAA,IAAI4E,aAAe,EAAA;AACjB,gBAAA,MAAM,EAAE5D,MAAM,EAAED,IAAI,EAAE,GAAGE,YAAY2D,aAAeD,EAAAA,eAAAA,CAAAA;gBAEpD,IAAI3D,MAAAA,KAAW1B,QAASC,CAAAA,OAAO,EAAE;AAC/BiF,oBAAAA,cAAAA,CAAehD,IAAI,CAACT,IAAAA,CAAAA;iBACf,MAAA;AACL0D,oBAAAA,gBAAAA,CAAiBjD,IAAI,CAACoD,aAAAA,CAAAA;AACxB;aACK,MAAA;AACLL,gBAAAA,YAAAA,CAAa/C,IAAI,CAACmD,eAAAA,CAAAA;AACpB;AACF;AAEA,QAAA,KAAK,MAAMC,aAAAA,IAAiBtB,aAAc7C,CAAAA,OAAO,CAAE;AACjD,YAAA,IACE,CAAChB,OAAAA,CAAQe,QAAQ,CAAC+C,iBAAiBqB,aAAc5E,CAAAA,IAAI,CACrDwD,IAAAA,aAAAA,IACA/D,QAAQe,QAAQ,CAACgD,aAAeoB,EAAAA,aAAAA,CAAc5E,IAAI,CAClD,EAAA;AACA0E,gBAAAA,cAAAA,CAAelD,IAAI,CAACoD,aAAAA,CAAAA;AACtB;AACF;AAEA,QAAA,MAAMb,UAAa,GAAA;AAACQ,YAAAA,YAAAA;AAAcC,YAAAA,cAAAA;AAAgBE,YAAAA;AAAe,SAAA,CAACV,IAAI,CAAC,CAACC,GAAQA,GAAAA,GAAAA,CAAI1C,MAAM,GAAG,CAAA,CAAA;QAE7F,OAAO;AACLP,YAAAA,MAAAA,EAAQ+C,UAAazE,GAAAA,QAAAA,CAASC,OAAO,GAAGD,SAASE,SAAS;YAC1DuB,IAAM,EAAA;gBACJmD,KAAOK,EAAAA,YAAAA;gBACPJ,OAASK,EAAAA,cAAAA;gBACTJ,SAAWK,EAAAA,gBAAAA;gBACXJ,OAASK,EAAAA;AACX;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAMG,uBAAuB,CAACxB,OAAAA,GAAAA;AAC5B,QAAA,MAAM,EAAEC,aAAa,EAAEC,eAAe,EAAEC,aAAa,EAAE,GAAGH,OAAAA;AAE1D,QAAA,MAAMyB,mBAAiC,EAAE;AACzC,QAAA,MAAMC,qBAA+C,EAAE;AACvD,QAAA,MAAMC,uBAAqC,EAAE;AAC7C,QAAA,MAAMC,qBAAmC,EAAE;AAE3C,QAAA,IAAI,CAACpE,EAAAA,CAAGiC,OAAO,CAACoC,eAAe,EAAI,EAAA;YACjC,OAAO;AACLlE,gBAAAA,MAAAA,EAAQ1B,SAASE,SAAS;gBAC1BuB,IAAM,EAAA;oBACJmD,KAAOY,EAAAA,gBAAAA;oBACPX,OAASY,EAAAA,kBAAAA;oBACTX,SAAWY,EAAAA,oBAAAA;oBACXX,OAASY,EAAAA;AACX;AACF,aAAA;AACF;AAEA,QAAA,KAAK,MAAME,qBAAAA,IAAyB5B,eAAgB5C,CAAAA,WAAW,CAAE;AAC/D,YAAA,MAAMyE,sBAAsB3F,OAAQmB,CAAAA,cAAc,CAAC0C,aAAAA,EAAe6B,sBAAsBnF,IAAI,CAAA;AAC5F,YAAA,IAAIoF,mBAAqB,EAAA;AACvB,gBAAA,MAAM,EAAEpE,MAAM,EAAED,IAAI,EAAE,GAAGa,gBAAgBwD,mBAAqBD,EAAAA,qBAAAA,CAAAA;gBAE9D,IAAInE,MAAAA,KAAW1B,QAASC,CAAAA,OAAO,EAAE;AAC/BwF,oBAAAA,kBAAAA,CAAmBvD,IAAI,CAACT,IAAAA,CAAAA;iBACnB,MAAA;AACLiE,oBAAAA,oBAAAA,CAAqBxD,IAAI,CAAC4D,mBAAAA,CAAAA;AAC5B;aACK,MAAA;AACLN,gBAAAA,gBAAAA,CAAiBtD,IAAI,CAAC2D,qBAAAA,CAAAA;AACxB;AACF;AAEA,QAAA,KAAK,MAAMC,mBAAAA,IAAuB9B,aAAc3C,CAAAA,WAAW,CAAE;AAC3D,YAAA,IACE,CAAClB,OAAAA,CAAQiB,aAAa,CAAC6C,iBAAiB6B,mBAAoBpF,CAAAA,IAAI,CAChEwD,IAAAA,aAAAA,IACA/D,QAAQiB,aAAa,CAAC8C,aAAe4B,EAAAA,mBAAAA,CAAoBpF,IAAI,CAC7D,EAAA;AACAiF,gBAAAA,kBAAAA,CAAmBzD,IAAI,CAAC4D,mBAAAA,CAAAA;AAC1B;AACF;AAEA,QAAA,MAAMrB,UAAa,GAAA;AAACe,YAAAA,gBAAAA;AAAkBC,YAAAA,kBAAAA;AAAoBE,YAAAA;AAAmB,SAAA,CAACjB,IAAI,CAChF,CAACC,GAAQA,GAAAA,GAAAA,CAAI1C,MAAM,GAAG,CAAA,CAAA;QAGxB,OAAO;AACLP,YAAAA,MAAAA,EAAQ+C,UAAazE,GAAAA,QAAAA,CAASC,OAAO,GAAGD,SAASE,SAAS;YAC1DuB,IAAM,EAAA;gBACJmD,KAAOY,EAAAA,gBAAAA;gBACPX,OAASY,EAAAA,kBAAAA;gBACTX,SAAWY,EAAAA,oBAAAA;gBACXX,OAASY,EAAAA;AACX;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAMI,aAAa,CAAChC,OAAAA,GAAAA;QAClB,MAAM,EAAEC,aAAa,EAAE,GAAGD,OAAAA;AAE1B,QAAA,MAAMiC,cAAclC,gBAAiBC,CAAAA,OAAAA,CAAAA;AACrC,QAAA,MAAMkC,cAAcjB,gBAAiBjB,CAAAA,OAAAA,CAAAA;AACrC,QAAA,MAAMmC,kBAAkBX,oBAAqBxB,CAAAA,OAAAA,CAAAA;AAE7C,QAAA,MAAMU,UAAa,GAAA;AAACuB,YAAAA,WAAAA;AAAaC,YAAAA,WAAAA;AAAaC,YAAAA;AAAgB,SAAA,CAACxB,IAAI,CAAClD,gBAAAA,CAAAA;QAEpE,OAAO;AACLE,YAAAA,MAAAA,EAAQ+C,UAAazE,GAAAA,QAAAA,CAASC,OAAO,GAAGD,SAASE,SAAS;YAC1DuB,IAAM,EAAA;AACJf,gBAAAA,IAAAA,EAAMsD,cAActD,IAAI;AACxBS,gBAAAA,OAAAA,EAAS8E,YAAYxE,IAAI;AACzBJ,gBAAAA,WAAAA,EAAa6E,gBAAgBzE,IAAI;AACjCV,gBAAAA,OAAAA,EAASiF,YAAYvE;AACvB;AACF,SAAA;AACF,KAAA;AAEA,IAAA,MAAM0E,cAAc,OAAOC,aAAAA,GAAAA;AACzB,QAAA,MAAM,EAAEC,cAAc,EAAEC,cAAc,EAAEC,UAAU,EAAE,GAAGH,aAAAA;AAEvD,QAAA,MAAMI,cAAuB,EAAE;AAC/B,QAAA,MAAMC,gBAAqC,EAAE;AAC7C,QAAA,MAAMC,kBAA2B,EAAE;AACnC,QAAA,MAAMC,gBAAyB,EAAE;;AAGjC,QAAA,KAAK,MAAM1C,eAAAA,IAAmBsC,UAAWhG,CAAAA,MAAM,CAAE;AAC/C,YAAA,MAAMyD,gBAAgB7D,OAAQQ,CAAAA,SAAS,CAAC2F,cAAAA,EAAgBrC,gBAAgBvD,IAAI,CAAA;AAC5E,YAAA,MAAMwD,gBACJmC,cAAkBlG,IAAAA,OAAAA,CAAQQ,SAAS,CAAC0F,cAAAA,EAAgBpC,gBAAgBvD,IAAI,CAAA;AAE1E,YAAA,IAAIsD,aAAe,EAAA;AACjB,gBAAA,MAAM,EAAEtC,MAAM,EAAED,IAAI,EAAE,GAAGsE,UAAW,CAAA;AAClC7B,oBAAAA,aAAAA;AACAF,oBAAAA,aAAAA;AACAC,oBAAAA;AACF,iBAAA,CAAA;gBAEA,IAAIvC,MAAAA,KAAW1B,QAASC,CAAAA,OAAO,EAAE;AAC/BwG,oBAAAA,aAAAA,CAAcvE,IAAI,CAACT,IAAAA,CAAAA;iBACd,MAAA;AACLiF,oBAAAA,eAAAA,CAAgBxE,IAAI,CAAC8B,aAAAA,CAAAA;AACvB;aACK,MAAA;AACLwC,gBAAAA,WAAAA,CAAYtE,IAAI,CAAC+B,eAAAA,CAAAA;AACnB;AACF;;AAGA,QAAA,MAAM2C,sBAAsB,CAACC,cAAAA,GAAAA;YAC3B,IAAI,OAAOA,mBAAmB,QAAU,EAAA;gBACtC,OAAOA,cAAAA;AACT;AACA,YAAA,OAAOA,eAAenG,IAAI;AAC5B,SAAA;AAEA,QAAA,MAAMoG,eAAkB3G,GAAAA,OAAAA,CAAQC,QAAQ,CAACkG,cAAgB,EAAA,4BAAA,CAAA,GAEpD,MAAOS,MAAOC,CAAAA,KAAK,CAACC,GAAG,CAAC;YACvB9E,IAAM,EAAA,MAAA;YACN+E,GAAK,EAAA;SACA,CAAA,IAAA,EAAE,GACT,EAAE;AAEN,QAAA,MAAMC,cAAiB,GAAA;AAAIpH,YAAAA,GAAAA,oBAAAA;AAAyB+G,YAAAA,GAAAA,eAAAA,CAAgBM,GAAG,CAACR,mBAAAA;AAAqB,SAAA;;AAG7F,QAAA,KAAK,MAAM5C,aAAAA,IAAiBsC,cAAe/F,CAAAA,MAAM,CAAE;AACjD,YAAA,MAAM8G,iBAAiBlH,OAAQC,CAAAA,QAAQ,CAACmG,UAAAA,EAAYvC,cAActD,IAAI,CAAA;AACtE,YAAA,MAAM4G,aAAajB,cAAkBlG,IAAAA,OAAAA,CAAQC,QAAQ,CAACiG,cAAAA,EAAgBrC,cAActD,IAAI,CAAA;AACxF,YAAA,MAAM6G,UAAaJ,GAAAA,cAAAA,CAAe7D,QAAQ,CAACU,cAActD,IAAI,CAAA;;YAG7D,IAAI,CAAC2G,cAAkB,IAAA,CAACC,UAAY,EAAA;AAClC,gBAAA;AACF;;AAGA,YAAA,IAAI,CAACD,cAAAA,IAAkBC,UAAc,IAAA,CAACC,UAAY,EAAA;AAChD,gBAAA,MAAMC,YAAeV,GAAAA,eAAAA,CAClBW,MAAM,CAAC,CAAChH,KAAAA,GAAAA;AACP,oBAAA,MAAMiH,YAAYjH,KAAOiH,EAAAA,SAAAA;AAEzB,oBAAA,IAAI,CAAC3F,CAAAA,CAAE4F,OAAO,CAACD,SAAY,CAAA,EAAA;AACzB,wBAAA;AACF;oBAEA,OAAOA,SAAAA,CAAUhD,IAAI,CAAC,CAACjE,QAAUA,KAAMC,CAAAA,IAAI,KAAKsD,aAAAA,CAActD,IAAI,CAAA;iBAEnE0G,CAAAA,CAAAA,GAAG,CAAC,CAACQ,cAAAA,GAAAA;oBACJ,OAAOtB,cAAAA,CAAe/F,MAAM,CAACK,IAAI,CAC/B,CAACoD,aAAAA,GAAkBA,aAActD,CAAAA,IAAI,KAAKkH,cAAAA,CAAelH,IAAI,CAAA;AAEjE,iBAAA,CACA;AACC+G,iBAAAA,MAAM,CAAC,CAAChH,KAAAA,GAA0B,CAACsB,CAAAA,CAAEa,KAAK,CAACnC,KAAAA,CAAAA,CAAAA;gBAE9CkG,aAAczE,CAAAA,IAAI,CAAC8B,aAAkBwD,EAAAA,GAAAA,YAAAA,CAAAA;AACvC;AACF;AAEA,QAAA,MAAM/C,UAAa,GAAA;AAAC+B,YAAAA,WAAAA;AAAaC,YAAAA,aAAAA;AAAeE,YAAAA;AAAc,SAAA,CAACjC,IAAI,CAAC,CAACC,GAAQA,GAAAA,GAAAA,CAAI1C,MAAM,GAAG,CAAA,CAAA;QAE1F,OAAO;AACLP,YAAAA,MAAAA,EAAQ+C,UAAazE,GAAAA,QAAAA,CAASC,OAAO,GAAGD,SAASE,SAAS;YAC1DuB,IAAM,EAAA;gBACJlB,MAAQ,EAAA;oBACNqE,KAAO4B,EAAAA,WAAAA;oBACP3B,OAAS4B,EAAAA,aAAAA;oBACT3B,SAAW4B,EAAAA,eAAAA;oBACX3B,OAAS4B,EAAAA;AACX;AACF;AACF,SAAA;AACF,KAAA;IAEA,OAAO;QACLlF,IAAM0E,EAAAA;AACR,KAAA;AACF,CAAA;;;;"}