@strapi/database 5.7.0-beta.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,9 @@
1
1
  import type { Database } from '..';
2
- import type { Schema } from '../schema';
2
+ import type { ForeignKey, Index, Schema } from '../schema';
3
3
  export interface SchemaInspector {
4
4
  getSchema(): Promise<Schema>;
5
+ getIndexes(tableName: string): Promise<Index[]>;
6
+ getForeignKeys(tableName: string): Promise<ForeignKey[]>;
5
7
  getTables(): Promise<string[]>;
6
8
  }
7
9
  export default class Dialect {
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;CAGjB"}
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;CAGjB"}
package/dist/index.js CHANGED
@@ -1071,6 +1071,13 @@ const createSchemaBuilder = (db) => {
1071
1071
  async updateSchema(schemaDiff) {
1072
1072
  const forceMigration = db.config.settings?.forceMigration;
1073
1073
  await db.dialect.startSchemaUpdate();
1074
+ const existingMetadata = {};
1075
+ for (const table of schemaDiff.tables.updated) {
1076
+ existingMetadata[table.name] = {
1077
+ indexes: await db.dialect.schemaInspector.getIndexes(table.name),
1078
+ foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name)
1079
+ };
1080
+ }
1074
1081
  await db.connection.transaction(async (trx) => {
1075
1082
  await this.createTables(schemaDiff.tables.added, trx);
1076
1083
  if (forceMigration) {
@@ -1088,7 +1095,8 @@ const createSchemaBuilder = (db) => {
1088
1095
  for (const table of schemaDiff.tables.updated) {
1089
1096
  debug$2(`Updating table: ${table.name}`);
1090
1097
  const schemaBuilder = this.getSchemaBuilder(trx);
1091
- await helpers2.alterTable(schemaBuilder, table);
1098
+ const { indexes, foreignKeys } = existingMetadata[table.name];
1099
+ await helpers2.alterTable(schemaBuilder, table, { indexes, foreignKeys });
1092
1100
  }
1093
1101
  });
1094
1102
  await db.dialect.endSchemaUpdate();
@@ -1106,29 +1114,37 @@ const createHelpers = (db) => {
1106
1114
  constraint.onUpdate(onUpdate);
1107
1115
  }
1108
1116
  };
1109
- const dropForeignKey = (tableBuilder, foreignKey) => {
1117
+ const dropForeignKey = (tableBuilder, foreignKey, existingForeignKeys) => {
1110
1118
  const { name, columns } = foreignKey;
1119
+ if (existingForeignKeys && !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)) {
1120
+ debug$2(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);
1121
+ return;
1122
+ }
1111
1123
  tableBuilder.dropForeign(columns, name);
1112
1124
  };
1113
1125
  const createIndex = (tableBuilder, index2) => {
1114
1126
  const { type, columns, name } = index2;
1115
1127
  switch (type) {
1116
1128
  case "primary": {
1117
- return tableBuilder.primary(columns, name);
1129
+ return tableBuilder.primary(columns, { constraintName: name });
1118
1130
  }
1119
1131
  case "unique": {
1120
- return tableBuilder.unique(columns, name);
1132
+ return tableBuilder.unique(columns, { indexName: name });
1121
1133
  }
1122
1134
  default: {
1123
1135
  return tableBuilder.index(columns, name, type);
1124
1136
  }
1125
1137
  }
1126
1138
  };
1127
- const dropIndex2 = (tableBuilder, index2) => {
1139
+ const dropIndex2 = (tableBuilder, index2, existingIndexes) => {
1128
1140
  if (!db.config.settings?.forceMigration) {
1129
1141
  return;
1130
1142
  }
1131
1143
  const { type, columns, name } = index2;
1144
+ if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {
1145
+ debug$2(`Index ${index2.name} not found in existingIndexes. Skipping drop.`);
1146
+ return;
1147
+ }
1132
1148
  switch (type) {
1133
1149
  case "primary": {
1134
1150
  return tableBuilder.dropPrimary(name);
@@ -1179,32 +1195,36 @@ const createHelpers = (db) => {
1179
1195
  }
1180
1196
  });
1181
1197
  };
1182
- const alterTable = async (schemaBuilder, table) => {
1183
- await schemaBuilder.alterTable(table.name, (tableBuilder) => {
1198
+ const alterTable = async (schemaBuilder, table, existingMetadata = {
1199
+ indexes: [],
1200
+ foreignKeys: []
1201
+ }) => {
1202
+ let existingIndexes = [...existingMetadata.indexes];
1203
+ const existingForeignKeys = [...existingMetadata.foreignKeys];
1204
+ const droppedForeignKeyNames = [];
1205
+ await schemaBuilder.alterTable(table.name, async (tableBuilder) => {
1184
1206
  for (const removedForeignKey of table.foreignKeys.removed) {
1185
1207
  debug$2(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);
1186
- dropForeignKey(tableBuilder, removedForeignKey);
1208
+ dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);
1209
+ droppedForeignKeyNames.push(removedForeignKey.name);
1187
1210
  }
1188
1211
  for (const updatedForeignKey of table.foreignKeys.updated) {
1189
1212
  debug$2(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);
1190
- dropForeignKey(tableBuilder, updatedForeignKey.object);
1213
+ dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);
1214
+ droppedForeignKeyNames.push(updatedForeignKey.object.name);
1215
+ }
1216
+ if (db.config.connection.client === "mysql") {
1217
+ existingIndexes = existingIndexes.filter(
1218
+ (index2) => !droppedForeignKeyNames.includes(index2.name)
1219
+ );
1191
1220
  }
1192
- const isMySQL = db.config.connection.client === "mysql";
1193
- const ignoreForeignKeyNames = isMySQL ? [
1194
- ...table.foreignKeys.removed.map((fk) => fk.name),
1195
- ...table.foreignKeys.updated.map((fk) => fk.name)
1196
- ] : [];
1197
1221
  for (const removedIndex of table.indexes.removed) {
1198
- if (!ignoreForeignKeyNames.includes(removedIndex.name)) {
1199
- debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
1200
- dropIndex2(tableBuilder, removedIndex);
1201
- }
1222
+ debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
1223
+ dropIndex2(tableBuilder, removedIndex, existingIndexes);
1202
1224
  }
1203
1225
  for (const updatedIndex of table.indexes.updated) {
1204
- if (!ignoreForeignKeyNames.includes(updatedIndex.name)) {
1205
- debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
1206
- dropIndex2(tableBuilder, updatedIndex.object);
1207
- }
1226
+ debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
1227
+ dropIndex2(tableBuilder, updatedIndex.object, existingIndexes);
1208
1228
  }
1209
1229
  for (const removedColumn of table.columns.removed) {
1210
1230
  debug$2(`Dropping column ${removedColumn.name} on ${table.name}`);
@@ -1237,7 +1257,7 @@ const createHelpers = (db) => {
1237
1257
  createIndex(tableBuilder, updatedIndex.object);
1238
1258
  }
1239
1259
  for (const addedForeignKey of table.foreignKeys.added) {
1240
- debug$2(`Creating foreign keys ${addedForeignKey.name} on ${table.name}`);
1260
+ debug$2(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);
1241
1261
  createForeignKey(tableBuilder, addedForeignKey);
1242
1262
  }
1243
1263
  for (const addedIndex of table.indexes.added) {