@strapi/database 5.12.1 → 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 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/migrations/index.ts"],"sourcesContent":["import { createUserMigrationProvider } from './users';\nimport { createInternalMigrationProvider } from './internal';\n\nimport type { MigrationProvider, Migration } from './common';\nimport type { Database } from '..';\n\nexport type { MigrationProvider, Migration };\n\nexport const createMigrationsProvider = (db: Database): MigrationProvider => {\n const userProvider = createUserMigrationProvider(db);\n const internalProvider = createInternalMigrationProvider(db);\n const providers = [userProvider, internalProvider];\n\n return {\n providers: {\n internal: internalProvider,\n },\n async shouldRun() {\n const shouldRunResponses = await Promise.all(\n providers.map((provider) => provider.shouldRun())\n );\n\n return shouldRunResponses.some((shouldRun) => shouldRun);\n },\n async up() {\n for (const provider of providers) {\n if (await provider.shouldRun()) {\n await provider.up();\n }\n }\n },\n async down() {\n for (const provider of providers) {\n if (await provider.shouldRun()) {\n await provider.down();\n }\n }\n },\n };\n};\n"],"names":["createMigrationsProvider","db","userProvider","createUserMigrationProvider","internalProvider","createInternalMigrationProvider","providers","internal","shouldRun","shouldRunResponses","Promise","all","map","provider","some","up","down"],"mappings":";;;;;AAQO,MAAMA,2BAA2B,CAACC,EAAAA,GAAAA;AACvC,IAAA,MAAMC,eAAeC,iCAA4BF,CAAAA,EAAAA,CAAAA;AACjD,IAAA,MAAMG,mBAAmBC,wCAAgCJ,CAAAA,EAAAA,CAAAA;AACzD,IAAA,MAAMK,SAAY,GAAA;AAACJ,QAAAA,YAAAA;AAAcE,QAAAA;AAAiB,KAAA;IAElD,OAAO;QACLE,SAAW,EAAA;YACTC,QAAUH,EAAAA;AACZ,SAAA;QACA,MAAMI,SAAAA,CAAAA,GAAAA;YACJ,MAAMC,kBAAAA,GAAqB,MAAMC,OAAAA,CAAQC,GAAG,CAC1CL,SAAUM,CAAAA,GAAG,CAAC,CAACC,QAAaA,GAAAA,QAAAA,CAASL,SAAS,EAAA,CAAA,CAAA;AAGhD,YAAA,OAAOC,kBAAmBK,CAAAA,IAAI,CAAC,CAACN,SAAcA,GAAAA,SAAAA,CAAAA;AAChD,SAAA;QACA,MAAMO,EAAAA,CAAAA,GAAAA;YACJ,KAAK,MAAMF,YAAYP,SAAW,CAAA;gBAChC,IAAI,MAAMO,QAASL,CAAAA,SAAS,EAAI,EAAA;AAC9B,oBAAA,MAAMK,SAASE,EAAE,EAAA;AACnB;AACF;AACF,SAAA;QACA,MAAMC,IAAAA,CAAAA,GAAAA;YACJ,KAAK,MAAMH,YAAYP,SAAW,CAAA;gBAChC,IAAI,MAAMO,QAASL,CAAAA,SAAS,EAAI,EAAA;AAC9B,oBAAA,MAAMK,SAASG,IAAI,EAAA;AACrB;AACF;AACF;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,37 @@
1
+ import { createUserMigrationProvider } from './users.mjs';
2
+ import { createInternalMigrationProvider } from './internal.mjs';
3
+
4
+ const createMigrationsProvider = (db)=>{
5
+ const userProvider = createUserMigrationProvider(db);
6
+ const internalProvider = createInternalMigrationProvider(db);
7
+ const providers = [
8
+ userProvider,
9
+ internalProvider
10
+ ];
11
+ return {
12
+ providers: {
13
+ internal: internalProvider
14
+ },
15
+ async shouldRun () {
16
+ const shouldRunResponses = await Promise.all(providers.map((provider)=>provider.shouldRun()));
17
+ return shouldRunResponses.some((shouldRun)=>shouldRun);
18
+ },
19
+ async up () {
20
+ for (const provider of providers){
21
+ if (await provider.shouldRun()) {
22
+ await provider.up();
23
+ }
24
+ }
25
+ },
26
+ async down () {
27
+ for (const provider of providers){
28
+ if (await provider.shouldRun()) {
29
+ await provider.down();
30
+ }
31
+ }
32
+ }
33
+ };
34
+ };
35
+
36
+ export { createMigrationsProvider };
37
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/migrations/index.ts"],"sourcesContent":["import { createUserMigrationProvider } from './users';\nimport { createInternalMigrationProvider } from './internal';\n\nimport type { MigrationProvider, Migration } from './common';\nimport type { Database } from '..';\n\nexport type { MigrationProvider, Migration };\n\nexport const createMigrationsProvider = (db: Database): MigrationProvider => {\n const userProvider = createUserMigrationProvider(db);\n const internalProvider = createInternalMigrationProvider(db);\n const providers = [userProvider, internalProvider];\n\n return {\n providers: {\n internal: internalProvider,\n },\n async shouldRun() {\n const shouldRunResponses = await Promise.all(\n providers.map((provider) => provider.shouldRun())\n );\n\n return shouldRunResponses.some((shouldRun) => shouldRun);\n },\n async up() {\n for (const provider of providers) {\n if (await provider.shouldRun()) {\n await provider.up();\n }\n }\n },\n async down() {\n for (const provider of providers) {\n if (await provider.shouldRun()) {\n await provider.down();\n }\n }\n },\n };\n};\n"],"names":["createMigrationsProvider","db","userProvider","createUserMigrationProvider","internalProvider","createInternalMigrationProvider","providers","internal","shouldRun","shouldRunResponses","Promise","all","map","provider","some","up","down"],"mappings":";;;AAQO,MAAMA,2BAA2B,CAACC,EAAAA,GAAAA;AACvC,IAAA,MAAMC,eAAeC,2BAA4BF,CAAAA,EAAAA,CAAAA;AACjD,IAAA,MAAMG,mBAAmBC,+BAAgCJ,CAAAA,EAAAA,CAAAA;AACzD,IAAA,MAAMK,SAAY,GAAA;AAACJ,QAAAA,YAAAA;AAAcE,QAAAA;AAAiB,KAAA;IAElD,OAAO;QACLE,SAAW,EAAA;YACTC,QAAUH,EAAAA;AACZ,SAAA;QACA,MAAMI,SAAAA,CAAAA,GAAAA;YACJ,MAAMC,kBAAAA,GAAqB,MAAMC,OAAAA,CAAQC,GAAG,CAC1CL,SAAUM,CAAAA,GAAG,CAAC,CAACC,QAAaA,GAAAA,QAAAA,CAASL,SAAS,EAAA,CAAA,CAAA;AAGhD,YAAA,OAAOC,kBAAmBK,CAAAA,IAAI,CAAC,CAACN,SAAcA,GAAAA,SAAAA,CAAAA;AAChD,SAAA;QACA,MAAMO,EAAAA,CAAAA,GAAAA;YACJ,KAAK,MAAMF,YAAYP,SAAW,CAAA;gBAChC,IAAI,MAAMO,QAASL,CAAAA,SAAS,EAAI,EAAA;AAC9B,oBAAA,MAAMK,SAASE,EAAE,EAAA;AACnB;AACF;AACF,SAAA;QACA,MAAMC,IAAAA,CAAAA,GAAAA;YACJ,KAAK,MAAMH,YAAYP,SAAW,CAAA;gBAChC,IAAI,MAAMO,QAASL,CAAAA,SAAS,EAAI,EAAA;AAC9B,oBAAA,MAAMK,SAASG,IAAI,EAAA;AACrB;AACF;AACF;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,179 @@
1
+ 'use strict';
2
+
3
+ var createDebug = require('debug');
4
+ var index = require('../../utils/identifiers/index.js');
5
+
6
+ const debug = createDebug('strapi::database::migration');
7
+ const renameIdentifiersLongerThanMaxLength = {
8
+ name: '5.0.0-rename-identifiers-longer-than-max-length',
9
+ async up (knex, db) {
10
+ const md = db.metadata;
11
+ const diffs = findDiffs(md);
12
+ // migrate indexes before tables so we know to target the original tableName
13
+ for (const indexDiff of diffs.indexes){
14
+ await renameIndex(knex, db, indexDiff);
15
+ }
16
+ // migrate columns before table names so we know to target the original tableName
17
+ for (const columnDiff of diffs.columns){
18
+ const { full, short } = columnDiff;
19
+ const tableName = full.tableName;
20
+ const hasTable = await knex.schema.hasTable(tableName);
21
+ if (hasTable) {
22
+ // tablebuilder methods MUST be synchronous and so you cannot use async inside it, which is why we check the column here
23
+ const hasColumn = await knex.schema.hasColumn(tableName, full.columnName);
24
+ if (hasColumn) {
25
+ await knex.schema.alterTable(tableName, async (table)=>{
26
+ debug(`renaming column ${full.columnName} to ${short.columnName}`);
27
+ table.renameColumn(full.columnName, short.columnName);
28
+ });
29
+ }
30
+ }
31
+ }
32
+ // migrate table names
33
+ for (const tableDiff of diffs.tables){
34
+ const hasTable = await knex.schema.hasTable(tableDiff.full.tableName);
35
+ if (hasTable) {
36
+ debug(`renaming table ${tableDiff.full.tableName} to ${tableDiff.short.tableName}`);
37
+ await knex.schema.renameTable(tableDiff.full.tableName, tableDiff.short.tableName);
38
+ }
39
+ }
40
+ },
41
+ async down () {
42
+ throw new Error('not implemented');
43
+ }
44
+ };
45
+ const renameIndex = async (knex, db, diff)=>{
46
+ const client = db.config.connection.client;
47
+ const short = diff.short;
48
+ const full = diff.full;
49
+ if (full.indexName === short.indexName) {
50
+ debug(`not renaming index ${full.indexName} because name hasn't changed`);
51
+ return;
52
+ }
53
+ // fk indexes can't be easily renamed, and will be recreated by db sync
54
+ // if this misses something due to the loose string matching, it's not critical, it just means index will be rebuilt in db sync
55
+ if (short.indexName.endsWith('fk') || full.indexName.endsWith('fk')) {
56
+ return;
57
+ }
58
+ debug(`renaming index from ${full.indexName} to ${short.indexName}`);
59
+ // If schema creation has never actually run before, none of these will exist, and they will throw an error
60
+ // we have no way of running an "if exists" other than a per-dialect manual check, which we won't do
61
+ // because even if it fails for some other reason, the schema sync will recreate them anyway
62
+ // Therefore, we wrap this in a nested transaction (considering we are running this migration in a transaction)
63
+ // so that we can suppress the error
64
+ try {
65
+ await knex.transaction(async (trx)=>{
66
+ if (client === 'mysql' || client === 'mariadb') {
67
+ await knex.raw('ALTER TABLE ?? RENAME INDEX ?? TO ??', [
68
+ full.tableName,
69
+ full.indexName,
70
+ short.indexName
71
+ ]).transacting(trx);
72
+ } else if (client === 'pg' || client === 'postgres') {
73
+ await knex.raw('ALTER INDEX ?? RENAME TO ??', [
74
+ full.indexName,
75
+ short.indexName
76
+ ]).transacting(trx);
77
+ } else if ([
78
+ 'sqlite',
79
+ 'sqlite3',
80
+ 'better-sqlite3'
81
+ ].includes(client)) {
82
+ // SQLite doesn't support renaming, so rather than trying to drop/recreate we'll let db sync handle it
83
+ debug(`SQLite does not support index renaming, not renaming index ${full.indexName}`);
84
+ } else {
85
+ debug(`No db client name matches, not renaming index ${full.indexName}`);
86
+ }
87
+ });
88
+ } catch (err) {
89
+ debug(`error creating index: ${JSON.stringify(err)}`);
90
+ }
91
+ };
92
+ const findDiffs = (shortMap)=>{
93
+ const diffs = {
94
+ tables: [],
95
+ columns: [],
96
+ indexes: []
97
+ };
98
+ const shortArr = Array.from(shortMap.entries());
99
+ shortArr.forEach(([, shortObj], index$1)=>{
100
+ const fullTableName = index.identifiers.getUnshortenedName(shortObj.tableName);
101
+ if (!fullTableName) {
102
+ throw new Error(`Missing full table name for ${shortObj.tableName}`);
103
+ }
104
+ // find table name diffs
105
+ if (shortObj.tableName !== fullTableName) {
106
+ diffs.tables.push({
107
+ full: {
108
+ index: index$1,
109
+ key: 'tableName',
110
+ tableName: fullTableName
111
+ },
112
+ short: {
113
+ index: index$1,
114
+ key: 'tableName',
115
+ tableName: shortObj.tableName
116
+ }
117
+ });
118
+ }
119
+ // find column name diffs
120
+ // eslint-disable-next-line guard-for-in
121
+ for(const attrKey in shortObj.attributes){
122
+ if (shortObj.attributes[attrKey].type === 'relation') {
123
+ continue;
124
+ }
125
+ // TODO: add more type checks so we don't need any
126
+ const attr = shortObj.attributes[attrKey];
127
+ const shortColumnName = attr.columnName;
128
+ const longColumnName = index.identifiers.getUnshortenedName(shortColumnName);
129
+ if (!shortColumnName || !longColumnName) {
130
+ throw new Error(`missing column name(s) for attribute ${JSON.stringify(attr, null, 2)}`);
131
+ }
132
+ if (shortColumnName && longColumnName && shortColumnName !== longColumnName) {
133
+ diffs.columns.push({
134
+ short: {
135
+ index: index$1,
136
+ tableName: fullTableName,
137
+ key: `attributes.${attrKey}`,
138
+ columnName: shortColumnName
139
+ },
140
+ full: {
141
+ index: index$1,
142
+ tableName: fullTableName,
143
+ key: `attributes.${attrKey}`,
144
+ columnName: longColumnName
145
+ }
146
+ });
147
+ }
148
+ }
149
+ // find index name diffs
150
+ // eslint-disable-next-line guard-for-in
151
+ for(const attrKey in shortObj.indexes){
152
+ const shortIndexName = shortObj.indexes[attrKey].name;
153
+ const longIndexName = index.identifiers.getUnshortenedName(shortIndexName);
154
+ if (!longIndexName) {
155
+ throw new Error(`Missing full index name for ${shortIndexName}`);
156
+ }
157
+ if (shortIndexName && longIndexName && shortIndexName !== longIndexName) {
158
+ diffs.indexes.push({
159
+ short: {
160
+ index: index$1,
161
+ tableName: fullTableName,
162
+ key: `indexes.${attrKey}`,
163
+ indexName: shortIndexName
164
+ },
165
+ full: {
166
+ index: index$1,
167
+ tableName: fullTableName,
168
+ key: `indexes.${attrKey}`,
169
+ indexName: longIndexName
170
+ }
171
+ });
172
+ }
173
+ }
174
+ });
175
+ return diffs;
176
+ };
177
+
178
+ exports.renameIdentifiersLongerThanMaxLength = renameIdentifiersLongerThanMaxLength;
179
+ //# sourceMappingURL=5.0.0-01-convert-identifiers-long-than-max-length.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"5.0.0-01-convert-identifiers-long-than-max-length.js","sources":["../../../src/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport createDebug from 'debug';\nimport type { Migration } from '../common';\nimport type { Metadata } from '../../metadata';\nimport { type Database } from '../..';\nimport { identifiers } from '../../utils/identifiers';\n\nconst debug = createDebug('strapi::database::migration');\n\ntype NameDiff<T> = {\n short: T;\n full: T;\n};\n\ntype IndexDiff = NameDiff<{ index: number; key: string; tableName: string; indexName: string }>;\n\n// key isn't really used except for debugging, but it's helpful to track down problems\ntype IdentifierDiffs = {\n indexes: IndexDiff[];\n tables: NameDiff<{ index: number; key: string; tableName: string }>[];\n columns: NameDiff<{ index: number; key: string; tableName: string; columnName: string }>[];\n};\n\nexport const renameIdentifiersLongerThanMaxLength: Migration = {\n name: '5.0.0-rename-identifiers-longer-than-max-length',\n async up(knex, db) {\n const md = db.metadata;\n\n const diffs = findDiffs(md);\n // migrate indexes before tables so we know to target the original tableName\n for (const indexDiff of diffs.indexes) {\n await renameIndex(knex, db, indexDiff);\n }\n\n // migrate columns before table names so we know to target the original tableName\n for (const columnDiff of diffs.columns) {\n const { full, short } = columnDiff;\n const tableName = full.tableName;\n\n const hasTable = await knex.schema.hasTable(tableName);\n\n if (hasTable) {\n // tablebuilder methods MUST be synchronous and so you cannot use async inside it, which is why we check the column here\n const hasColumn = await knex.schema.hasColumn(tableName, full.columnName);\n\n if (hasColumn) {\n await knex.schema.alterTable(tableName, async (table) => {\n debug(`renaming column ${full.columnName} to ${short.columnName}`);\n table.renameColumn(full.columnName, short.columnName);\n });\n }\n }\n }\n\n // migrate table names\n for (const tableDiff of diffs.tables) {\n const hasTable = await knex.schema.hasTable(tableDiff.full.tableName);\n\n if (hasTable) {\n debug(`renaming table ${tableDiff.full.tableName} to ${tableDiff.short.tableName}`);\n await knex.schema.renameTable(tableDiff.full.tableName, tableDiff.short.tableName);\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n\nconst renameIndex = async (knex: Knex, db: Database, diff: IndexDiff) => {\n const client = db.config.connection.client;\n const short = diff.short;\n const full = diff.full;\n\n if (full.indexName === short.indexName) {\n debug(`not renaming index ${full.indexName} because name hasn't changed`);\n return;\n }\n\n // fk indexes can't be easily renamed, and will be recreated by db sync\n // if this misses something due to the loose string matching, it's not critical, it just means index will be rebuilt in db sync\n if (short.indexName.endsWith('fk') || full.indexName.endsWith('fk')) {\n return;\n }\n\n debug(`renaming index from ${full.indexName} to ${short.indexName}`);\n\n // If schema creation has never actually run before, none of these will exist, and they will throw an error\n // we have no way of running an \"if exists\" other than a per-dialect manual check, which we won't do\n // because even if it fails for some other reason, the schema sync will recreate them anyway\n // Therefore, we wrap this in a nested transaction (considering we are running this migration in a transaction)\n // so that we can suppress the error\n try {\n await knex.transaction(async (trx) => {\n if (client === 'mysql' || client === 'mariadb') {\n await knex\n .raw('ALTER TABLE ?? RENAME INDEX ?? TO ??', [\n full.tableName,\n full.indexName,\n short.indexName,\n ])\n .transacting(trx);\n } else if (client === 'pg' || client === 'postgres') {\n await knex\n .raw('ALTER INDEX ?? RENAME TO ??', [full.indexName, short.indexName])\n .transacting(trx);\n } else if (['sqlite', 'sqlite3', 'better-sqlite3'].includes(client as any)) {\n // SQLite doesn't support renaming, so rather than trying to drop/recreate we'll let db sync handle it\n debug(`SQLite does not support index renaming, not renaming index ${full.indexName}`);\n } else {\n debug(`No db client name matches, not renaming index ${full.indexName}`);\n }\n });\n } catch (err) {\n debug(`error creating index: ${JSON.stringify(err)}`);\n }\n};\n\nconst findDiffs = (shortMap: Metadata) => {\n const diffs = {\n tables: [],\n columns: [],\n indexes: [],\n } as IdentifierDiffs;\n\n const shortArr = Array.from(shortMap.entries());\n\n shortArr.forEach(([, shortObj], index) => {\n const fullTableName = identifiers.getUnshortenedName(shortObj.tableName);\n if (!fullTableName) {\n throw new Error(`Missing full table name for ${shortObj.tableName}`);\n }\n\n // find table name diffs\n if (shortObj.tableName !== fullTableName) {\n diffs.tables.push({\n full: {\n index,\n key: 'tableName',\n tableName: fullTableName,\n },\n short: {\n index,\n key: 'tableName',\n tableName: shortObj.tableName,\n },\n });\n }\n\n // find column name diffs\n // eslint-disable-next-line guard-for-in\n for (const attrKey in shortObj.attributes) {\n if (shortObj.attributes[attrKey].type === 'relation') {\n continue;\n }\n\n // TODO: add more type checks so we don't need any\n const attr = shortObj.attributes[attrKey] as any;\n const shortColumnName = attr.columnName;\n const longColumnName = identifiers.getUnshortenedName(shortColumnName);\n\n if (!shortColumnName || !longColumnName) {\n throw new Error(`missing column name(s) for attribute ${JSON.stringify(attr, null, 2)}`);\n }\n if (shortColumnName && longColumnName && shortColumnName !== longColumnName) {\n diffs.columns.push({\n short: {\n index,\n tableName: fullTableName, // NOTE: this means that we must rename columns before tables\n key: `attributes.${attrKey}`,\n columnName: shortColumnName,\n },\n full: {\n index,\n tableName: fullTableName,\n key: `attributes.${attrKey}`,\n columnName: longColumnName,\n },\n });\n }\n }\n\n // find index name diffs\n // eslint-disable-next-line guard-for-in\n for (const attrKey in shortObj.indexes) {\n const shortIndexName = shortObj.indexes[attrKey].name;\n const longIndexName = identifiers.getUnshortenedName(shortIndexName);\n if (!longIndexName) {\n throw new Error(`Missing full index name for ${shortIndexName}`);\n }\n\n if (shortIndexName && longIndexName && shortIndexName !== longIndexName) {\n diffs.indexes.push({\n short: {\n index,\n tableName: fullTableName, // NOTE: this means that we must rename columns before tables\n key: `indexes.${attrKey}`,\n indexName: shortIndexName,\n },\n full: {\n index,\n tableName: fullTableName,\n key: `indexes.${attrKey}`,\n indexName: longIndexName,\n },\n });\n }\n }\n });\n\n return diffs;\n};\n"],"names":["debug","createDebug","renameIdentifiersLongerThanMaxLength","name","up","knex","db","md","metadata","diffs","findDiffs","indexDiff","indexes","renameIndex","columnDiff","columns","full","short","tableName","hasTable","schema","hasColumn","columnName","alterTable","table","renameColumn","tableDiff","tables","renameTable","down","Error","diff","client","config","connection","indexName","endsWith","transaction","trx","raw","transacting","includes","err","JSON","stringify","shortMap","shortArr","Array","from","entries","forEach","shortObj","index","fullTableName","identifiers","getUnshortenedName","push","key","attrKey","attributes","type","attr","shortColumnName","longColumnName","shortIndexName","longIndexName"],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import createDebug from 'debug';
2
+ import { identifiers } from '../../utils/identifiers/index.mjs';
3
+
4
+ const debug = createDebug('strapi::database::migration');
5
+ const renameIdentifiersLongerThanMaxLength = {
6
+ name: '5.0.0-rename-identifiers-longer-than-max-length',
7
+ async up (knex, db) {
8
+ const md = db.metadata;
9
+ const diffs = findDiffs(md);
10
+ // migrate indexes before tables so we know to target the original tableName
11
+ for (const indexDiff of diffs.indexes){
12
+ await renameIndex(knex, db, indexDiff);
13
+ }
14
+ // migrate columns before table names so we know to target the original tableName
15
+ for (const columnDiff of diffs.columns){
16
+ const { full, short } = columnDiff;
17
+ const tableName = full.tableName;
18
+ const hasTable = await knex.schema.hasTable(tableName);
19
+ if (hasTable) {
20
+ // tablebuilder methods MUST be synchronous and so you cannot use async inside it, which is why we check the column here
21
+ const hasColumn = await knex.schema.hasColumn(tableName, full.columnName);
22
+ if (hasColumn) {
23
+ await knex.schema.alterTable(tableName, async (table)=>{
24
+ debug(`renaming column ${full.columnName} to ${short.columnName}`);
25
+ table.renameColumn(full.columnName, short.columnName);
26
+ });
27
+ }
28
+ }
29
+ }
30
+ // migrate table names
31
+ for (const tableDiff of diffs.tables){
32
+ const hasTable = await knex.schema.hasTable(tableDiff.full.tableName);
33
+ if (hasTable) {
34
+ debug(`renaming table ${tableDiff.full.tableName} to ${tableDiff.short.tableName}`);
35
+ await knex.schema.renameTable(tableDiff.full.tableName, tableDiff.short.tableName);
36
+ }
37
+ }
38
+ },
39
+ async down () {
40
+ throw new Error('not implemented');
41
+ }
42
+ };
43
+ const renameIndex = async (knex, db, diff)=>{
44
+ const client = db.config.connection.client;
45
+ const short = diff.short;
46
+ const full = diff.full;
47
+ if (full.indexName === short.indexName) {
48
+ debug(`not renaming index ${full.indexName} because name hasn't changed`);
49
+ return;
50
+ }
51
+ // fk indexes can't be easily renamed, and will be recreated by db sync
52
+ // if this misses something due to the loose string matching, it's not critical, it just means index will be rebuilt in db sync
53
+ if (short.indexName.endsWith('fk') || full.indexName.endsWith('fk')) {
54
+ return;
55
+ }
56
+ debug(`renaming index from ${full.indexName} to ${short.indexName}`);
57
+ // If schema creation has never actually run before, none of these will exist, and they will throw an error
58
+ // we have no way of running an "if exists" other than a per-dialect manual check, which we won't do
59
+ // because even if it fails for some other reason, the schema sync will recreate them anyway
60
+ // Therefore, we wrap this in a nested transaction (considering we are running this migration in a transaction)
61
+ // so that we can suppress the error
62
+ try {
63
+ await knex.transaction(async (trx)=>{
64
+ if (client === 'mysql' || client === 'mariadb') {
65
+ await knex.raw('ALTER TABLE ?? RENAME INDEX ?? TO ??', [
66
+ full.tableName,
67
+ full.indexName,
68
+ short.indexName
69
+ ]).transacting(trx);
70
+ } else if (client === 'pg' || client === 'postgres') {
71
+ await knex.raw('ALTER INDEX ?? RENAME TO ??', [
72
+ full.indexName,
73
+ short.indexName
74
+ ]).transacting(trx);
75
+ } else if ([
76
+ 'sqlite',
77
+ 'sqlite3',
78
+ 'better-sqlite3'
79
+ ].includes(client)) {
80
+ // SQLite doesn't support renaming, so rather than trying to drop/recreate we'll let db sync handle it
81
+ debug(`SQLite does not support index renaming, not renaming index ${full.indexName}`);
82
+ } else {
83
+ debug(`No db client name matches, not renaming index ${full.indexName}`);
84
+ }
85
+ });
86
+ } catch (err) {
87
+ debug(`error creating index: ${JSON.stringify(err)}`);
88
+ }
89
+ };
90
+ const findDiffs = (shortMap)=>{
91
+ const diffs = {
92
+ tables: [],
93
+ columns: [],
94
+ indexes: []
95
+ };
96
+ const shortArr = Array.from(shortMap.entries());
97
+ shortArr.forEach(([, shortObj], index)=>{
98
+ const fullTableName = identifiers.getUnshortenedName(shortObj.tableName);
99
+ if (!fullTableName) {
100
+ throw new Error(`Missing full table name for ${shortObj.tableName}`);
101
+ }
102
+ // find table name diffs
103
+ if (shortObj.tableName !== fullTableName) {
104
+ diffs.tables.push({
105
+ full: {
106
+ index,
107
+ key: 'tableName',
108
+ tableName: fullTableName
109
+ },
110
+ short: {
111
+ index,
112
+ key: 'tableName',
113
+ tableName: shortObj.tableName
114
+ }
115
+ });
116
+ }
117
+ // find column name diffs
118
+ // eslint-disable-next-line guard-for-in
119
+ for(const attrKey in shortObj.attributes){
120
+ if (shortObj.attributes[attrKey].type === 'relation') {
121
+ continue;
122
+ }
123
+ // TODO: add more type checks so we don't need any
124
+ const attr = shortObj.attributes[attrKey];
125
+ const shortColumnName = attr.columnName;
126
+ const longColumnName = identifiers.getUnshortenedName(shortColumnName);
127
+ if (!shortColumnName || !longColumnName) {
128
+ throw new Error(`missing column name(s) for attribute ${JSON.stringify(attr, null, 2)}`);
129
+ }
130
+ if (shortColumnName && longColumnName && shortColumnName !== longColumnName) {
131
+ diffs.columns.push({
132
+ short: {
133
+ index,
134
+ tableName: fullTableName,
135
+ key: `attributes.${attrKey}`,
136
+ columnName: shortColumnName
137
+ },
138
+ full: {
139
+ index,
140
+ tableName: fullTableName,
141
+ key: `attributes.${attrKey}`,
142
+ columnName: longColumnName
143
+ }
144
+ });
145
+ }
146
+ }
147
+ // find index name diffs
148
+ // eslint-disable-next-line guard-for-in
149
+ for(const attrKey in shortObj.indexes){
150
+ const shortIndexName = shortObj.indexes[attrKey].name;
151
+ const longIndexName = identifiers.getUnshortenedName(shortIndexName);
152
+ if (!longIndexName) {
153
+ throw new Error(`Missing full index name for ${shortIndexName}`);
154
+ }
155
+ if (shortIndexName && longIndexName && shortIndexName !== longIndexName) {
156
+ diffs.indexes.push({
157
+ short: {
158
+ index,
159
+ tableName: fullTableName,
160
+ key: `indexes.${attrKey}`,
161
+ indexName: shortIndexName
162
+ },
163
+ full: {
164
+ index,
165
+ tableName: fullTableName,
166
+ key: `indexes.${attrKey}`,
167
+ indexName: longIndexName
168
+ }
169
+ });
170
+ }
171
+ }
172
+ });
173
+ return diffs;
174
+ };
175
+
176
+ export { renameIdentifiersLongerThanMaxLength };
177
+ //# sourceMappingURL=5.0.0-01-convert-identifiers-long-than-max-length.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"5.0.0-01-convert-identifiers-long-than-max-length.mjs","sources":["../../../src/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport createDebug from 'debug';\nimport type { Migration } from '../common';\nimport type { Metadata } from '../../metadata';\nimport { type Database } from '../..';\nimport { identifiers } from '../../utils/identifiers';\n\nconst debug = createDebug('strapi::database::migration');\n\ntype NameDiff<T> = {\n short: T;\n full: T;\n};\n\ntype IndexDiff = NameDiff<{ index: number; key: string; tableName: string; indexName: string }>;\n\n// key isn't really used except for debugging, but it's helpful to track down problems\ntype IdentifierDiffs = {\n indexes: IndexDiff[];\n tables: NameDiff<{ index: number; key: string; tableName: string }>[];\n columns: NameDiff<{ index: number; key: string; tableName: string; columnName: string }>[];\n};\n\nexport const renameIdentifiersLongerThanMaxLength: Migration = {\n name: '5.0.0-rename-identifiers-longer-than-max-length',\n async up(knex, db) {\n const md = db.metadata;\n\n const diffs = findDiffs(md);\n // migrate indexes before tables so we know to target the original tableName\n for (const indexDiff of diffs.indexes) {\n await renameIndex(knex, db, indexDiff);\n }\n\n // migrate columns before table names so we know to target the original tableName\n for (const columnDiff of diffs.columns) {\n const { full, short } = columnDiff;\n const tableName = full.tableName;\n\n const hasTable = await knex.schema.hasTable(tableName);\n\n if (hasTable) {\n // tablebuilder methods MUST be synchronous and so you cannot use async inside it, which is why we check the column here\n const hasColumn = await knex.schema.hasColumn(tableName, full.columnName);\n\n if (hasColumn) {\n await knex.schema.alterTable(tableName, async (table) => {\n debug(`renaming column ${full.columnName} to ${short.columnName}`);\n table.renameColumn(full.columnName, short.columnName);\n });\n }\n }\n }\n\n // migrate table names\n for (const tableDiff of diffs.tables) {\n const hasTable = await knex.schema.hasTable(tableDiff.full.tableName);\n\n if (hasTable) {\n debug(`renaming table ${tableDiff.full.tableName} to ${tableDiff.short.tableName}`);\n await knex.schema.renameTable(tableDiff.full.tableName, tableDiff.short.tableName);\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n\nconst renameIndex = async (knex: Knex, db: Database, diff: IndexDiff) => {\n const client = db.config.connection.client;\n const short = diff.short;\n const full = diff.full;\n\n if (full.indexName === short.indexName) {\n debug(`not renaming index ${full.indexName} because name hasn't changed`);\n return;\n }\n\n // fk indexes can't be easily renamed, and will be recreated by db sync\n // if this misses something due to the loose string matching, it's not critical, it just means index will be rebuilt in db sync\n if (short.indexName.endsWith('fk') || full.indexName.endsWith('fk')) {\n return;\n }\n\n debug(`renaming index from ${full.indexName} to ${short.indexName}`);\n\n // If schema creation has never actually run before, none of these will exist, and they will throw an error\n // we have no way of running an \"if exists\" other than a per-dialect manual check, which we won't do\n // because even if it fails for some other reason, the schema sync will recreate them anyway\n // Therefore, we wrap this in a nested transaction (considering we are running this migration in a transaction)\n // so that we can suppress the error\n try {\n await knex.transaction(async (trx) => {\n if (client === 'mysql' || client === 'mariadb') {\n await knex\n .raw('ALTER TABLE ?? RENAME INDEX ?? TO ??', [\n full.tableName,\n full.indexName,\n short.indexName,\n ])\n .transacting(trx);\n } else if (client === 'pg' || client === 'postgres') {\n await knex\n .raw('ALTER INDEX ?? RENAME TO ??', [full.indexName, short.indexName])\n .transacting(trx);\n } else if (['sqlite', 'sqlite3', 'better-sqlite3'].includes(client as any)) {\n // SQLite doesn't support renaming, so rather than trying to drop/recreate we'll let db sync handle it\n debug(`SQLite does not support index renaming, not renaming index ${full.indexName}`);\n } else {\n debug(`No db client name matches, not renaming index ${full.indexName}`);\n }\n });\n } catch (err) {\n debug(`error creating index: ${JSON.stringify(err)}`);\n }\n};\n\nconst findDiffs = (shortMap: Metadata) => {\n const diffs = {\n tables: [],\n columns: [],\n indexes: [],\n } as IdentifierDiffs;\n\n const shortArr = Array.from(shortMap.entries());\n\n shortArr.forEach(([, shortObj], index) => {\n const fullTableName = identifiers.getUnshortenedName(shortObj.tableName);\n if (!fullTableName) {\n throw new Error(`Missing full table name for ${shortObj.tableName}`);\n }\n\n // find table name diffs\n if (shortObj.tableName !== fullTableName) {\n diffs.tables.push({\n full: {\n index,\n key: 'tableName',\n tableName: fullTableName,\n },\n short: {\n index,\n key: 'tableName',\n tableName: shortObj.tableName,\n },\n });\n }\n\n // find column name diffs\n // eslint-disable-next-line guard-for-in\n for (const attrKey in shortObj.attributes) {\n if (shortObj.attributes[attrKey].type === 'relation') {\n continue;\n }\n\n // TODO: add more type checks so we don't need any\n const attr = shortObj.attributes[attrKey] as any;\n const shortColumnName = attr.columnName;\n const longColumnName = identifiers.getUnshortenedName(shortColumnName);\n\n if (!shortColumnName || !longColumnName) {\n throw new Error(`missing column name(s) for attribute ${JSON.stringify(attr, null, 2)}`);\n }\n if (shortColumnName && longColumnName && shortColumnName !== longColumnName) {\n diffs.columns.push({\n short: {\n index,\n tableName: fullTableName, // NOTE: this means that we must rename columns before tables\n key: `attributes.${attrKey}`,\n columnName: shortColumnName,\n },\n full: {\n index,\n tableName: fullTableName,\n key: `attributes.${attrKey}`,\n columnName: longColumnName,\n },\n });\n }\n }\n\n // find index name diffs\n // eslint-disable-next-line guard-for-in\n for (const attrKey in shortObj.indexes) {\n const shortIndexName = shortObj.indexes[attrKey].name;\n const longIndexName = identifiers.getUnshortenedName(shortIndexName);\n if (!longIndexName) {\n throw new Error(`Missing full index name for ${shortIndexName}`);\n }\n\n if (shortIndexName && longIndexName && shortIndexName !== longIndexName) {\n diffs.indexes.push({\n short: {\n index,\n tableName: fullTableName, // NOTE: this means that we must rename columns before tables\n key: `indexes.${attrKey}`,\n indexName: shortIndexName,\n },\n full: {\n index,\n tableName: fullTableName,\n key: `indexes.${attrKey}`,\n indexName: longIndexName,\n },\n });\n }\n }\n });\n\n return diffs;\n};\n"],"names":["debug","createDebug","renameIdentifiersLongerThanMaxLength","name","up","knex","db","md","metadata","diffs","findDiffs","indexDiff","indexes","renameIndex","columnDiff","columns","full","short","tableName","hasTable","schema","hasColumn","columnName","alterTable","table","renameColumn","tableDiff","tables","renameTable","down","Error","diff","client","config","connection","indexName","endsWith","transaction","trx","raw","transacting","includes","err","JSON","stringify","shortMap","shortArr","Array","from","entries","forEach","shortObj","index","fullTableName","identifiers","getUnshortenedName","push","key","attrKey","attributes","type","attr","shortColumnName","longColumnName","shortIndexName","longIndexName"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ var cuid2 = require('@paralleldrive/cuid2');
4
+ var _ = require('lodash/fp');
5
+
6
+ const QUERIES = {
7
+ async postgres (knex, params) {
8
+ const res = await knex.raw(`
9
+ SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids
10
+ FROM :tableName:
11
+ LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:
12
+ WHERE :tableName:.document_id IS NULL
13
+ GROUP BY :tableName:.id, :joinTableName:.:joinColumn:
14
+ LIMIT 1;
15
+ `, params);
16
+ return res.rows;
17
+ },
18
+ async mysql (knex, params) {
19
+ const [res] = await knex.raw(`
20
+ SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids
21
+ FROM :tableName:
22
+ LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:
23
+ WHERE :tableName:.document_id IS NULL
24
+ GROUP BY :tableName:.id, :joinTableName:.:joinColumn:
25
+ LIMIT 1;
26
+ `, params);
27
+ return res;
28
+ },
29
+ async sqlite (knex, params) {
30
+ return knex.raw(`
31
+ SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids
32
+ FROM :tableName:
33
+ LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:
34
+ WHERE :tableName:.document_id IS NULL
35
+ GROUP BY :joinTableName:.:joinColumn:
36
+ LIMIT 1;
37
+ `, params);
38
+ }
39
+ };
40
+ const getNextIdsToCreateDocumentId = async (db, knex, { joinColumn, inverseJoinColumn, tableName, joinTableName })=>{
41
+ const res = await QUERIES[db.dialect.client](knex, {
42
+ joinColumn,
43
+ inverseJoinColumn,
44
+ tableName,
45
+ joinTableName
46
+ });
47
+ if (res.length > 0) {
48
+ const row = res[0];
49
+ const otherIds = row.other_ids ? row.other_ids.split(',').map((v)=>parseInt(v, 10)) : [];
50
+ return [
51
+ row.id,
52
+ ...otherIds
53
+ ];
54
+ }
55
+ return [];
56
+ };
57
+ // Migrate document ids for tables that have localizations
58
+ const migrateDocumentIdsWithLocalizations = async (db, knex, meta)=>{
59
+ const singularName = meta.singularName.toLowerCase();
60
+ const joinColumn = _.snakeCase(`${singularName}_id`);
61
+ const inverseJoinColumn = _.snakeCase(`inv_${singularName}_id`);
62
+ let ids;
63
+ do {
64
+ ids = await getNextIdsToCreateDocumentId(db, knex, {
65
+ joinColumn,
66
+ inverseJoinColumn,
67
+ tableName: meta.tableName,
68
+ joinTableName: _.snakeCase(`${meta.tableName}_localizations_links`)
69
+ });
70
+ if (ids.length > 0) {
71
+ await knex(meta.tableName).update({
72
+ document_id: cuid2.createId()
73
+ }).whereIn('id', ids);
74
+ }
75
+ }while (ids.length > 0)
76
+ };
77
+ // Migrate document ids for tables that don't have localizations
78
+ const migrationDocumentIds = async (db, knex, meta)=>{
79
+ let updatedRows;
80
+ do {
81
+ updatedRows = await knex(meta.tableName).update({
82
+ document_id: cuid2.createId()
83
+ }).whereIn('id', knex(meta.tableName).select('id').from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query')));
84
+ }while (updatedRows > 0)
85
+ };
86
+ const createDocumentIdColumn = async (knex, tableName)=>{
87
+ await knex.schema.alterTable(tableName, (table)=>{
88
+ table.string('document_id');
89
+ });
90
+ };
91
+ const hasLocalizationsJoinTable = async (knex, tableName)=>{
92
+ const joinTableName = _.snakeCase(`${tableName}_localizations_links`);
93
+ return knex.schema.hasTable(joinTableName);
94
+ };
95
+ const createdDocumentId = {
96
+ name: '5.0.0-02-created-document-id',
97
+ async up (knex, db) {
98
+ // do sth
99
+ for (const meta of db.metadata.values()){
100
+ const hasTable = await knex.schema.hasTable(meta.tableName);
101
+ if (!hasTable) {
102
+ continue;
103
+ }
104
+ if ('documentId' in meta.attributes) {
105
+ // add column if doesn't exist
106
+ const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');
107
+ if (hasDocumentIdColumn) {
108
+ continue;
109
+ }
110
+ await createDocumentIdColumn(knex, meta.tableName);
111
+ if (await hasLocalizationsJoinTable(knex, meta.tableName)) {
112
+ await migrateDocumentIdsWithLocalizations(db, knex, meta);
113
+ } else {
114
+ await migrationDocumentIds(db, knex, meta);
115
+ }
116
+ }
117
+ }
118
+ },
119
+ async down () {
120
+ throw new Error('not implemented');
121
+ }
122
+ };
123
+
124
+ exports.createdDocumentId = createdDocumentId;
125
+ //# sourceMappingURL=5.0.0-02-document-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"5.0.0-02-document-id.js","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"sourcesContent":["/**\n * NOTE: This migration avoids using the `identifiers` utility.\n * As the `5.0.0-01-convert-identifiers-long-than-max-length`\n * migration does not convert the `localizations` join tables, as they are not\n * tables that exist anymore in v5 and are not in the db metadata.\n *\n * This migration therefore relies on the fact that those tables still exist, and\n * references them directly.\n *\n * Database join table name: `categories_localizations_links`\n * Actual `identifiers` returned join table name: `categories_localizations_lnk`\n *\n */\nimport { createId } from '@paralleldrive/cuid2';\nimport { snakeCase } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport type { Migration } from '../common';\nimport type { Database } from '../..';\nimport type { Meta } from '../../metadata';\n\ninterface Params {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n}\n\nconst QUERIES = {\n async postgres(knex: Knex, params: Params) {\n const res = await knex.raw(\n `\n SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res.rows;\n },\n async mysql(knex: Knex, params: Params) {\n const [res] = await knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res;\n },\n async sqlite(knex: Knex, params: Params) {\n return knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n },\n};\n\nconst getNextIdsToCreateDocumentId = async (\n db: Database,\n knex: Knex,\n {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n }: {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n }\n): Promise<number[]> => {\n const res = await QUERIES[db.dialect.client as keyof typeof QUERIES](knex, {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n });\n\n if (res.length > 0) {\n const row = res[0];\n const otherIds = row.other_ids\n ? row.other_ids.split(',').map((v: string) => parseInt(v, 10))\n : [];\n\n return [row.id, ...otherIds];\n }\n\n return [];\n};\n\n// Migrate document ids for tables that have localizations\nconst migrateDocumentIdsWithLocalizations = async (db: Database, knex: Knex, meta: Meta) => {\n const singularName = meta.singularName.toLowerCase();\n const joinColumn = snakeCase(`${singularName}_id`);\n const inverseJoinColumn = snakeCase(`inv_${singularName}_id`);\n let ids: number[];\n\n do {\n ids = await getNextIdsToCreateDocumentId(db, knex, {\n joinColumn,\n inverseJoinColumn,\n tableName: meta.tableName,\n joinTableName: snakeCase(`${meta.tableName}_localizations_links`),\n });\n\n if (ids.length > 0) {\n await knex(meta.tableName).update({ document_id: createId() }).whereIn('id', ids);\n }\n } while (ids.length > 0);\n};\n\n// Migrate document ids for tables that don't have localizations\nconst migrationDocumentIds = async (db: Database, knex: Knex, meta: Meta) => {\n let updatedRows: number;\n\n do {\n updatedRows = await knex(meta.tableName)\n .update({ document_id: createId() })\n .whereIn(\n 'id',\n knex(meta.tableName)\n .select('id')\n .from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query'))\n );\n } while (updatedRows > 0);\n};\n\nconst createDocumentIdColumn = async (knex: Knex, tableName: string) => {\n await knex.schema.alterTable(tableName, (table) => {\n table.string('document_id');\n });\n};\n\nconst hasLocalizationsJoinTable = async (knex: Knex, tableName: string) => {\n const joinTableName = snakeCase(`${tableName}_localizations_links`);\n return knex.schema.hasTable(joinTableName);\n};\n\nexport const createdDocumentId: Migration = {\n name: '5.0.0-02-created-document-id',\n async up(knex, db) {\n // do sth\n for (const meta of db.metadata.values()) {\n const hasTable = await knex.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n continue;\n }\n\n if ('documentId' in meta.attributes) {\n // add column if doesn't exist\n const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');\n\n if (hasDocumentIdColumn) {\n continue;\n }\n\n await createDocumentIdColumn(knex, meta.tableName);\n\n if (await hasLocalizationsJoinTable(knex, meta.tableName)) {\n await migrateDocumentIdsWithLocalizations(db, knex, meta);\n } else {\n await migrationDocumentIds(db, knex, meta);\n }\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["QUERIES","postgres","knex","params","res","raw","rows","mysql","sqlite","getNextIdsToCreateDocumentId","db","joinColumn","inverseJoinColumn","tableName","joinTableName","dialect","client","length","row","otherIds","other_ids","split","map","v","parseInt","id","migrateDocumentIdsWithLocalizations","meta","singularName","toLowerCase","snakeCase","ids","update","document_id","createId","whereIn","migrationDocumentIds","updatedRows","select","from","whereNull","limit","as","createDocumentIdColumn","schema","alterTable","table","string","hasLocalizationsJoinTable","hasTable","createdDocumentId","name","up","metadata","values","attributes","hasDocumentIdColumn","hasColumn","down","Error"],"mappings":"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"}