@strapi/database 5.12.1 → 5.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.js +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- 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;;;;"}
|
package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js
ADDED
|
@@ -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
|
package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map
ADDED
|
@@ -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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"}
|
package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs
ADDED
|
@@ -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":";;;;;AA4BA,MAAMA,OAAU,GAAA;IACd,MAAMC,QAAAA,CAAAA,CAASC,IAAU,EAAEC,MAAc,EAAA;AACvC,QAAA,MAAMC,GAAM,GAAA,MAAMF,IAAKG,CAAAA,GAAG,CACxB;;;;;;;AAOJ,EAAA,CAAC,EACGF,MAAAA,CAAAA;AAGF,QAAA,OAAOC,IAAIE,IAAI;AACjB,KAAA;IACA,MAAMC,KAAAA,CAAAA,CAAML,IAAU,EAAEC,MAAc,EAAA;AACpC,QAAA,MAAM,CAACC,GAAI,CAAA,GAAG,MAAMF,IAAKG,CAAAA,GAAG,CAC1B;;;;;;;AAOJ,EAAA,CAAC,EACGF,MAAAA,CAAAA;QAGF,OAAOC,GAAAA;AACT,KAAA;IACA,MAAMI,MAAAA,CAAAA,CAAON,IAAU,EAAEC,MAAc,EAAA;QACrC,OAAOD,IAAAA,CAAKG,GAAG,CACb;;;;;;;AAOF,IAAA,CAAC,EACCF,MAAAA,CAAAA;AAEJ;AACF,CAAA;AAEA,MAAMM,4BAA+B,GAAA,OACnCC,EACAR,EAAAA,IAAAA,EACA,EACES,UAAU,EACVC,iBAAiB,EACjBC,SAAS,EACTC,aAAa,EAMd,GAAA;IAED,MAAMV,GAAAA,GAAM,MAAMJ,OAAO,CAACU,EAAAA,CAAGK,OAAO,CAACC,MAAM,CAAyB,CAACd,IAAM,EAAA;AACzES,QAAAA,UAAAA;AACAC,QAAAA,iBAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,IAAIV,GAAAA,CAAIa,MAAM,GAAG,CAAG,EAAA;QAClB,MAAMC,GAAAA,GAAMd,GAAG,CAAC,CAAE,CAAA;AAClB,QAAA,MAAMe,WAAWD,GAAIE,CAAAA,SAAS,GAC1BF,GAAAA,CAAIE,SAAS,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,GAAG,CAAC,CAACC,IAAcC,QAASD,CAAAA,CAAAA,EAAG,OACxD,EAAE;QAEN,OAAO;AAACL,YAAAA,GAAAA,CAAIO,EAAE;AAAKN,YAAAA,GAAAA;AAAS,SAAA;AAC9B;AAEA,IAAA,OAAO,EAAE;AACX,CAAA;AAEA;AACA,MAAMO,mCAAAA,GAAsC,OAAOhB,EAAAA,EAAcR,IAAYyB,EAAAA,IAAAA,GAAAA;AAC3E,IAAA,MAAMC,YAAeD,GAAAA,IAAAA,CAAKC,YAAY,CAACC,WAAW,EAAA;AAClD,IAAA,MAAMlB,aAAamB,WAAU,CAAA,CAAC,EAAEF,YAAAA,CAAa,GAAG,CAAC,CAAA;AACjD,IAAA,MAAMhB,oBAAoBkB,WAAU,CAAA,CAAC,IAAI,EAAEF,YAAAA,CAAa,GAAG,CAAC,CAAA;IAC5D,IAAIG,GAAAA;IAEJ,GAAG;QACDA,GAAM,GAAA,MAAMtB,4BAA6BC,CAAAA,EAAAA,EAAIR,IAAM,EAAA;AACjDS,YAAAA,UAAAA;AACAC,YAAAA,iBAAAA;AACAC,YAAAA,SAAAA,EAAWc,KAAKd,SAAS;AACzBC,YAAAA,aAAAA,EAAegB,YAAU,CAAC,EAAEH,KAAKd,SAAS,CAAC,oBAAoB,CAAC;AAClE,SAAA,CAAA;QAEA,IAAIkB,GAAAA,CAAId,MAAM,GAAG,CAAG,EAAA;AAClB,YAAA,MAAMf,IAAKyB,CAAAA,IAAAA,CAAKd,SAAS,CAAA,CAAEmB,MAAM,CAAC;gBAAEC,WAAaC,EAAAA,cAAAA;aAAcC,CAAAA,CAAAA,OAAO,CAAC,IAAMJ,EAAAA,GAAAA,CAAAA;AAC/E;KACOA,OAAAA,GAAAA,CAAId,MAAM,GAAG,CAAG;AAC3B,CAAA;AAEA;AACA,MAAMmB,oBAAAA,GAAuB,OAAO1B,EAAAA,EAAcR,IAAYyB,EAAAA,IAAAA,GAAAA;IAC5D,IAAIU,WAAAA;IAEJ,GAAG;AACDA,QAAAA,WAAAA,GAAc,MAAMnC,IAAKyB,CAAAA,IAAAA,CAAKd,SAAS,CAAA,CACpCmB,MAAM,CAAC;YAAEC,WAAaC,EAAAA,cAAAA;SACtBC,CAAAA,CAAAA,OAAO,CACN,IAAA,EACAjC,IAAKyB,CAAAA,IAAAA,CAAKd,SAAS,CAAA,CAChByB,MAAM,CAAC,IACPC,CAAAA,CAAAA,IAAI,CAACrC,IAAAA,CAAKyB,KAAKd,SAAS,CAAA,CAAEyB,MAAM,CAAC,IAAME,CAAAA,CAAAA,SAAS,CAAC,aAAA,CAAA,CAAeC,KAAK,CAAC,CAAGC,CAAAA,CAAAA,EAAE,CAAC,WAAA,CAAA,CAAA,CAAA;AAErF,KAAA,OAASL,cAAc,CAAG;AAC5B,CAAA;AAEA,MAAMM,sBAAAA,GAAyB,OAAOzC,IAAYW,EAAAA,SAAAA,GAAAA;AAChD,IAAA,MAAMX,KAAK0C,MAAM,CAACC,UAAU,CAAChC,WAAW,CAACiC,KAAAA,GAAAA;AACvCA,QAAAA,KAAAA,CAAMC,MAAM,CAAC,aAAA,CAAA;AACf,KAAA,CAAA;AACF,CAAA;AAEA,MAAMC,yBAAAA,GAA4B,OAAO9C,IAAYW,EAAAA,SAAAA,GAAAA;AACnD,IAAA,MAAMC,gBAAgBgB,WAAU,CAAA,CAAC,EAAEjB,SAAAA,CAAU,oBAAoB,CAAC,CAAA;AAClE,IAAA,OAAOX,IAAK0C,CAAAA,MAAM,CAACK,QAAQ,CAACnC,aAAAA,CAAAA;AAC9B,CAAA;MAEaoC,iBAA+B,GAAA;IAC1CC,IAAM,EAAA,8BAAA;IACN,MAAMC,EAAAA,CAAAA,CAAGlD,IAAI,EAAEQ,EAAE,EAAA;;AAEf,QAAA,KAAK,MAAMiB,IAAQjB,IAAAA,EAAAA,CAAG2C,QAAQ,CAACC,MAAM,EAAI,CAAA;YACvC,MAAML,QAAAA,GAAW,MAAM/C,IAAK0C,CAAAA,MAAM,CAACK,QAAQ,CAACtB,KAAKd,SAAS,CAAA;AAE1D,YAAA,IAAI,CAACoC,QAAU,EAAA;AACb,gBAAA;AACF;YAEA,IAAI,YAAA,IAAgBtB,IAAK4B,CAAAA,UAAU,EAAE;;gBAEnC,MAAMC,mBAAAA,GAAsB,MAAMtD,IAAK0C,CAAAA,MAAM,CAACa,SAAS,CAAC9B,IAAKd,CAAAA,SAAS,EAAE,aAAA,CAAA;AAExE,gBAAA,IAAI2C,mBAAqB,EAAA;AACvB,oBAAA;AACF;gBAEA,MAAMb,sBAAAA,CAAuBzC,IAAMyB,EAAAA,IAAAA,CAAKd,SAAS,CAAA;AAEjD,gBAAA,IAAI,MAAMmC,yBAAAA,CAA0B9C,IAAMyB,EAAAA,IAAAA,CAAKd,SAAS,CAAG,EAAA;oBACzD,MAAMa,mCAAAA,CAAoChB,IAAIR,IAAMyB,EAAAA,IAAAA,CAAAA;iBAC/C,MAAA;oBACL,MAAMS,oBAAAA,CAAqB1B,IAAIR,IAAMyB,EAAAA,IAAAA,CAAAA;AACvC;AACF;AACF;AACF,KAAA;IACA,MAAM+B,IAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAM,IAAIC,KAAM,CAAA,iBAAA,CAAA;AAClB;AACF;;;;"}
|