@strapi/database 5.37.0 → 5.38.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.
Files changed (170) hide show
  1. package/dist/connection.js.map +1 -1
  2. package/dist/connection.mjs.map +1 -1
  3. package/dist/dialects/dialect.js.map +1 -1
  4. package/dist/dialects/dialect.mjs.map +1 -1
  5. package/dist/dialects/index.js.map +1 -1
  6. package/dist/dialects/index.mjs.map +1 -1
  7. package/dist/dialects/mysql/database-inspector.js.map +1 -1
  8. package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
  9. package/dist/dialects/mysql/index.js.map +1 -1
  10. package/dist/dialects/mysql/index.mjs.map +1 -1
  11. package/dist/dialects/mysql/schema-inspector.js.map +1 -1
  12. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -1
  13. package/dist/dialects/postgresql/index.js.map +1 -1
  14. package/dist/dialects/postgresql/index.mjs.map +1 -1
  15. package/dist/dialects/postgresql/schema-inspector.js.map +1 -1
  16. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -1
  17. package/dist/dialects/sqlite/index.js.map +1 -1
  18. package/dist/dialects/sqlite/index.mjs.map +1 -1
  19. package/dist/dialects/sqlite/schema-inspector.js.map +1 -1
  20. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -1
  21. package/dist/entity-manager/entity-repository.js.map +1 -1
  22. package/dist/entity-manager/entity-repository.mjs.map +1 -1
  23. package/dist/entity-manager/index.js.map +1 -1
  24. package/dist/entity-manager/index.mjs +4 -4
  25. package/dist/entity-manager/index.mjs.map +1 -1
  26. package/dist/entity-manager/morph-relations.js.map +1 -1
  27. package/dist/entity-manager/morph-relations.mjs.map +1 -1
  28. package/dist/entity-manager/regular-relations.js.map +1 -1
  29. package/dist/entity-manager/regular-relations.mjs +1 -1
  30. package/dist/entity-manager/regular-relations.mjs.map +1 -1
  31. package/dist/entity-manager/relations-orderer.js.map +1 -1
  32. package/dist/entity-manager/relations-orderer.mjs.map +1 -1
  33. package/dist/errors/database.js.map +1 -1
  34. package/dist/errors/database.mjs.map +1 -1
  35. package/dist/errors/invalid-date.js.map +1 -1
  36. package/dist/errors/invalid-date.mjs.map +1 -1
  37. package/dist/errors/invalid-datetime.js.map +1 -1
  38. package/dist/errors/invalid-datetime.mjs.map +1 -1
  39. package/dist/errors/invalid-relation.js.map +1 -1
  40. package/dist/errors/invalid-relation.mjs.map +1 -1
  41. package/dist/errors/invalid-time.js.map +1 -1
  42. package/dist/errors/invalid-time.mjs.map +1 -1
  43. package/dist/errors/not-null.js.map +1 -1
  44. package/dist/errors/not-null.mjs.map +1 -1
  45. package/dist/fields/biginteger.js.map +1 -1
  46. package/dist/fields/biginteger.mjs.map +1 -1
  47. package/dist/fields/boolean.js.map +1 -1
  48. package/dist/fields/boolean.mjs.map +1 -1
  49. package/dist/fields/date.js.map +1 -1
  50. package/dist/fields/date.mjs.map +1 -1
  51. package/dist/fields/datetime.js.map +1 -1
  52. package/dist/fields/datetime.mjs.map +1 -1
  53. package/dist/fields/field.js.map +1 -1
  54. package/dist/fields/field.mjs.map +1 -1
  55. package/dist/fields/index.js.map +1 -1
  56. package/dist/fields/index.mjs.map +1 -1
  57. package/dist/fields/json.js.map +1 -1
  58. package/dist/fields/json.mjs.map +1 -1
  59. package/dist/fields/number.js.map +1 -1
  60. package/dist/fields/number.mjs.map +1 -1
  61. package/dist/fields/shared/parsers.js.map +1 -1
  62. package/dist/fields/shared/parsers.mjs +1 -1
  63. package/dist/fields/shared/parsers.mjs.map +1 -1
  64. package/dist/fields/string.js.map +1 -1
  65. package/dist/fields/string.mjs.map +1 -1
  66. package/dist/fields/time.js.map +1 -1
  67. package/dist/fields/time.mjs.map +1 -1
  68. package/dist/fields/timestamp.js.map +1 -1
  69. package/dist/fields/timestamp.mjs.map +1 -1
  70. package/dist/index.js.map +1 -1
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/lifecycles/index.js.map +1 -1
  73. package/dist/lifecycles/index.mjs.map +1 -1
  74. package/dist/lifecycles/subscribers/index.js.map +1 -1
  75. package/dist/lifecycles/subscribers/index.mjs.map +1 -1
  76. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -1
  77. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -1
  78. package/dist/lifecycles/subscribers/timestamps.js.map +1 -1
  79. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -1
  80. package/dist/metadata/index.js.map +1 -1
  81. package/dist/metadata/index.mjs.map +1 -1
  82. package/dist/metadata/metadata.js.map +1 -1
  83. package/dist/metadata/metadata.mjs.map +1 -1
  84. package/dist/metadata/relations.js +2 -6
  85. package/dist/metadata/relations.js.map +1 -1
  86. package/dist/metadata/relations.mjs +2 -6
  87. package/dist/metadata/relations.mjs.map +1 -1
  88. package/dist/migrations/common.js.map +1 -1
  89. package/dist/migrations/common.mjs.map +1 -1
  90. package/dist/migrations/index.js.map +1 -1
  91. package/dist/migrations/index.mjs.map +1 -1
  92. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
  93. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -1
  94. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
  95. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
  96. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -1
  97. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -1
  98. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -1
  99. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -1
  100. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
  101. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
  102. package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.js.map +1 -1
  103. package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.mjs.map +1 -1
  104. package/dist/migrations/internal-migrations/index.js.map +1 -1
  105. package/dist/migrations/internal-migrations/index.mjs.map +1 -1
  106. package/dist/migrations/internal.js.map +1 -1
  107. package/dist/migrations/internal.mjs.map +1 -1
  108. package/dist/migrations/logger.js.map +1 -1
  109. package/dist/migrations/logger.mjs.map +1 -1
  110. package/dist/migrations/storage.js.map +1 -1
  111. package/dist/migrations/storage.mjs.map +1 -1
  112. package/dist/migrations/users.js.map +1 -1
  113. package/dist/migrations/users.mjs.map +1 -1
  114. package/dist/query/helpers/join.js.map +1 -1
  115. package/dist/query/helpers/join.mjs.map +1 -1
  116. package/dist/query/helpers/order-by.js.map +1 -1
  117. package/dist/query/helpers/order-by.mjs.map +1 -1
  118. package/dist/query/helpers/populate/apply.js +3 -9
  119. package/dist/query/helpers/populate/apply.js.map +1 -1
  120. package/dist/query/helpers/populate/apply.mjs +3 -9
  121. package/dist/query/helpers/populate/apply.mjs.map +1 -1
  122. package/dist/query/helpers/populate/process.js.map +1 -1
  123. package/dist/query/helpers/populate/process.mjs.map +1 -1
  124. package/dist/query/helpers/search.js.map +1 -1
  125. package/dist/query/helpers/search.mjs.map +1 -1
  126. package/dist/query/helpers/streams/readable.js.map +1 -1
  127. package/dist/query/helpers/streams/readable.mjs.map +1 -1
  128. package/dist/query/helpers/transform.js.map +1 -1
  129. package/dist/query/helpers/transform.mjs.map +1 -1
  130. package/dist/query/helpers/where.js.map +1 -1
  131. package/dist/query/helpers/where.mjs.map +1 -1
  132. package/dist/query/query-builder.js.map +1 -1
  133. package/dist/query/query-builder.mjs +4 -4
  134. package/dist/query/query-builder.mjs.map +1 -1
  135. package/dist/repairs/index.js.map +1 -1
  136. package/dist/repairs/index.mjs.map +1 -1
  137. package/dist/repairs/operations/process-unidirectional-join-tables.js.map +1 -1
  138. package/dist/repairs/operations/process-unidirectional-join-tables.mjs.map +1 -1
  139. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -1
  140. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -1
  141. package/dist/schema/builder.js.map +1 -1
  142. package/dist/schema/builder.mjs +1 -1
  143. package/dist/schema/builder.mjs.map +1 -1
  144. package/dist/schema/diff.js.map +1 -1
  145. package/dist/schema/diff.mjs.map +1 -1
  146. package/dist/schema/index.js.map +1 -1
  147. package/dist/schema/index.mjs.map +1 -1
  148. package/dist/schema/schema.js.map +1 -1
  149. package/dist/schema/schema.mjs.map +1 -1
  150. package/dist/schema/storage.js.map +1 -1
  151. package/dist/schema/storage.mjs.map +1 -1
  152. package/dist/transaction-context.js.map +1 -1
  153. package/dist/transaction-context.mjs.map +1 -1
  154. package/dist/utils/async-curry.js.map +1 -1
  155. package/dist/utils/async-curry.mjs.map +1 -1
  156. package/dist/utils/identifiers/hash.js.map +1 -1
  157. package/dist/utils/identifiers/hash.mjs.map +1 -1
  158. package/dist/utils/identifiers/index.js.map +1 -1
  159. package/dist/utils/identifiers/index.mjs.map +1 -1
  160. package/dist/utils/knex.js.map +1 -1
  161. package/dist/utils/knex.mjs.map +1 -1
  162. package/dist/utils/types.js.map +1 -1
  163. package/dist/utils/types.mjs.map +1 -1
  164. package/dist/validations/index.js.map +1 -1
  165. package/dist/validations/index.mjs.map +1 -1
  166. package/dist/validations/relations/bidirectional.js.map +1 -1
  167. package/dist/validations/relations/bidirectional.mjs.map +1 -1
  168. package/dist/validations/relations/index.js.map +1 -1
  169. package/dist/validations/relations/index.mjs.map +1 -1
  170. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"builder.mjs","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n const columnTypes: Record<string, Record<string, string | null>> = {};\n\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n\n // Pre-fetch column types for PostgreSQL to avoid transaction timeouts\n if (db.config.connection.client === 'postgres') {\n columnTypes[table.name] = {};\n for (const updatedColumn of table.columns.updated) {\n columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(\n table.name,\n updatedColumn.name\n );\n }\n }\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n\n // Handle special type conversions before standard alterations\n await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});\n\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Get the current column type from the database\n */\n const getCurrentColumnType = async (\n tableName: string,\n columnName: string\n ): Promise<string | null> => {\n try {\n const schemaName = db.getSchemaName();\n const result = await db.connection.raw(\n `\n SELECT data_type \n FROM information_schema.columns \n WHERE table_name = ? \n AND column_name = ?\n ${schemaName ? 'AND table_schema = ?' : ''}\n LIMIT 1\n `,\n schemaName ? [tableName, columnName, schemaName] : [tableName, columnName]\n );\n\n return result.rows?.[0]?.data_type || null;\n } catch (error) {\n // Log error but don't fail the migration\n debug(\n `Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n };\n\n /**\n * Apply column properties after type conversion\n */\n const applyColumnProperties = async (\n trx: Knex.Transaction,\n tableName: string,\n columnName: string,\n column: Column\n ) => {\n // Apply NOT NULL constraint\n if (column.notNullable) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [tableName, columnName]);\n } else {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [tableName, columnName]);\n }\n\n // Apply default value\n if (column.defaultTo !== undefined) {\n const [defaultValue, defaultOpts] = castArray(column.defaultTo);\n if (prop('isRaw', defaultOpts)) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [\n tableName,\n columnName,\n ]);\n } else {\n // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value\n const escapedDefault =\n typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, \"''\")}'` : defaultValue;\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [\n tableName,\n columnName,\n ]);\n }\n }\n };\n\n /**\n * Handle special type conversions that require custom SQL\n */\n const handleSpecialTypeConversions = async (\n trx: Knex.Transaction,\n table: TableDiff['diff'],\n preloadedColumnTypes: Record<string, string | null> = {}\n ) => {\n // Only PostgreSQL needs special handling for now\n if (db.config.connection.client !== 'postgres') {\n return;\n }\n\n const conversionsToApply = [];\n\n // Check each updated column for special type conversions\n for (const updatedColumn of table.columns.updated) {\n const { name: columnName, object: column } = updatedColumn;\n\n // Use pre-loaded column type if available, otherwise fetch it\n const currentType =\n preloadedColumnTypes[columnName] ?? (await getCurrentColumnType(table.name, columnName));\n\n if (currentType) {\n // Check if dialect has special conversion SQL\n const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);\n\n if (conversionSQL) {\n conversionsToApply.push({\n column: updatedColumn,\n sql: conversionSQL.sql,\n params: [table.name, columnName, columnName],\n currentType,\n targetType: column.type,\n warning: conversionSQL.warning,\n });\n }\n }\n }\n\n // Apply conversions\n for (const conversion of conversionsToApply) {\n const { column, sql, params, currentType, targetType, warning } = conversion;\n\n // Log warning about type conversion\n const warningMessage = warning || 'This conversion may result in data changes.';\n db.logger.warn(\n `Database type conversion: \"${table.name}.${column.name}\" from \"${currentType}\" to \"${targetType}\". ${warningMessage}`\n );\n\n debug(`Applying special type conversion for column ${column.name} on ${table.name}`);\n debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);\n\n try {\n // Execute the conversion using the transaction connection\n await trx.raw(sql, params);\n debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);\n } catch (conversionError) {\n db.logger.error(\n `Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`\n );\n throw conversionError;\n }\n\n // Apply other column properties\n await applyColumnProperties(trx, table.name, column.name, column.object);\n\n // Remove from standard updates to prevent double processing\n table.columns.updated = table.columns.updated.filter((col) => col.name !== column.name);\n }\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n handleSpecialTypeConversions,\n getCurrentColumnType,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","columnTypes","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","client","updatedColumn","columns","getCurrentColumnType","added","removed","dropTableForeignKeys","handleSpecialTypeConversions","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","filter","includes","removedIndex","updatedIndex","removedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists","tableName","columnName","schemaName","result","rows","data_type","error","Error","message","String","applyColumnProperties","undefined","defaultValue","defaultOpts","escapedDefault","replace","preloadedColumnTypes","conversionsToApply","currentType","conversionSQL","getColumnTypeConversionSQL","sql","params","targetType","warning","conversion","warningMessage","logger","warn","JSON","stringify","conversionError"],"mappings":"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"}
1
+ {"version":3,"file":"builder.mjs","sources":["../../src/schema/builder.ts"],"sourcesContent":["import { isNil, prop, omit, castArray } from 'lodash/fp';\nimport createDebug from 'debug';\n\nimport type { Knex } from 'knex';\nimport type { Database } from '..';\nimport type { Schema, Table, SchemaDiff, TableDiff, ForeignKey, Index, Column } from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport default (db: Database) => {\n const helpers = createHelpers(db);\n\n return {\n /**\n * Returns a knex schema builder instance\n * @param {string} table - table name\n */\n getSchemaBuilder(trx: Knex.Transaction) {\n return db.getSchemaConnection(trx);\n },\n\n /**\n * Creates schema in DB\n */\n async createSchema(schema: Schema) {\n await db.connection.transaction(async (trx) => {\n await this.createTables(schema.tables, trx);\n });\n },\n\n /**\n * Creates a list of tables in a schema\n * @param {KnexInstance} trx\n * @param {Table[]} tables\n */\n async createTables(tables: Table[], trx: Knex.Transaction) {\n for (const table of tables) {\n debug(`Creating table: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTable(schemaBuilder, table);\n }\n\n // create FKs once all the tables exist\n for (const table of tables) {\n debug(`Creating table foreign keys: ${table.name}`);\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.createTableForeignKeys(schemaBuilder, table);\n }\n },\n /**\n * Drops schema from DB\n */\n async dropSchema(schema: Schema, { dropDatabase = false } = {}) {\n if (dropDatabase) {\n // TODO: drop database & return as it will drop everything\n return;\n }\n\n await db.connection.transaction(async (trx) => {\n for (const table of schema.tables.reverse()) {\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n });\n },\n\n /**\n * Applies a schema diff update in the DB\n * @param {*} schemaDiff\n */\n // TODO: implement force option to disable removal in DB\n async updateSchema(schemaDiff: SchemaDiff['diff']) {\n const forceMigration = db.config.settings?.forceMigration;\n\n await db.dialect.startSchemaUpdate();\n\n // Pre-fetch metadata for all updated tables\n const existingMetadata: Record<string, { indexes: Index[]; foreignKeys: ForeignKey[] }> = {};\n const columnTypes: Record<string, Record<string, string | null>> = {};\n\n for (const table of schemaDiff.tables.updated) {\n existingMetadata[table.name] = {\n indexes: await db.dialect.schemaInspector.getIndexes(table.name),\n foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name),\n };\n\n // Pre-fetch column types for PostgreSQL to avoid transaction timeouts\n if (db.config.connection.client === 'postgres') {\n columnTypes[table.name] = {};\n for (const updatedColumn of table.columns.updated) {\n columnTypes[table.name][updatedColumn.name] = await helpers.getCurrentColumnType(\n table.name,\n updatedColumn.name\n );\n }\n }\n }\n\n await db.connection.transaction(async (trx) => {\n await this.createTables(schemaDiff.tables.added, trx);\n\n if (forceMigration) {\n // drop all delete table foreign keys then delete the tables\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table foreign keys: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTableForeignKeys(schemaBuilder, table);\n }\n\n for (const table of schemaDiff.tables.removed) {\n debug(`Removing table: ${table.name}`);\n\n const schemaBuilder = this.getSchemaBuilder(trx);\n await helpers.dropTable(schemaBuilder, table);\n }\n }\n\n for (const table of schemaDiff.tables.updated) {\n debug(`Updating table: ${table.name}`);\n\n // Handle special type conversions before standard alterations\n await helpers.handleSpecialTypeConversions(trx, table, columnTypes[table.name] || {});\n\n // alter table\n const schemaBuilder = this.getSchemaBuilder(trx);\n\n const { indexes, foreignKeys } = existingMetadata[table.name];\n await helpers.alterTable(schemaBuilder, table, { indexes, foreignKeys });\n }\n });\n\n await db.dialect.endSchemaUpdate();\n },\n };\n};\n\nconst createHelpers = (db: Database) => {\n /**\n * Creates a foreign key on a table\n */\n const createForeignKey = (tableBuilder: Knex.TableBuilder, foreignKey: ForeignKey) => {\n const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;\n\n const constraint = tableBuilder\n .foreign(columns, name)\n .references(referencedColumns)\n .inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);\n\n if (onDelete) {\n constraint.onDelete(onDelete);\n }\n\n if (onUpdate) {\n constraint.onUpdate(onUpdate);\n }\n };\n\n /**\n * Drops a foreign key from a table\n */\n const dropForeignKey = (\n tableBuilder: Knex.TableBuilder,\n foreignKey: ForeignKey,\n existingForeignKeys?: ForeignKey[]\n ) => {\n const { name, columns } = foreignKey;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (\n existingForeignKeys &&\n !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)\n ) {\n debug(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);\n return;\n }\n\n tableBuilder.dropForeign(columns, name);\n };\n\n /**\n * Creates an index on a table\n */\n const createIndex = (tableBuilder: Knex.TableBuilder, index: Index) => {\n const { type, columns, name } = index;\n\n switch (type) {\n case 'primary': {\n return tableBuilder.primary(columns, { constraintName: name });\n }\n case 'unique': {\n return tableBuilder.unique(columns, { indexName: name });\n }\n default: {\n return tableBuilder.index(columns, name, type);\n }\n }\n };\n\n /**\n * Drops an index from table\n * @param {Knex.TableBuilder} tableBuilder\n * @param {Index} index\n */\n const dropIndex = (tableBuilder: Knex.TableBuilder, index: Index, existingIndexes?: Index[]) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n const { type, columns, name } = index;\n\n // Check if the index exists in existingIndexes, and return early if it doesn't\n if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {\n debug(`Index ${index.name} not found in existingIndexes. Skipping drop.`);\n return;\n }\n\n switch (type) {\n case 'primary': {\n return tableBuilder.dropPrimary(name);\n }\n case 'unique': {\n return tableBuilder.dropUnique(columns, name);\n }\n default: {\n return tableBuilder.dropIndex(columns, name);\n }\n }\n };\n\n /**\n * Creates a column in a table\n */\n const createColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n const { type, name, args = [], defaultTo, unsigned, notNullable } = column;\n\n const col = (tableBuilder[type as keyof Knex.TableBuilder] as any)(name, ...args);\n\n if (unsigned === true) {\n col.unsigned();\n }\n\n if (!isNil(defaultTo)) {\n const [value, opts] = castArray(defaultTo);\n\n if (prop('isRaw', opts)) {\n col.defaultTo(db.connection.raw(value), omit('isRaw', opts));\n } else {\n col.defaultTo(value, opts);\n }\n }\n\n if (notNullable === true) {\n col.notNullable();\n } else {\n col.nullable();\n }\n\n return col;\n };\n\n /**\n * Drops a column from a table\n */\n const dropColumn = (tableBuilder: Knex.TableBuilder, column: Column) => {\n if (!db.config.settings?.forceMigration) {\n return;\n }\n\n return tableBuilder.dropColumn(column.name);\n };\n\n /**\n * Creates a table in a database\n */\n const createTable = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n await schemaBuilder.createTable(table.name, (tableBuilder) => {\n // columns\n (table.columns || []).forEach((column) => createColumn(tableBuilder, column));\n\n // indexes\n (table.indexes || []).forEach((index) => createIndex(tableBuilder, index));\n\n // foreign keys\n\n if (!db.dialect.canAlterConstraints()) {\n (table.foreignKeys || []).forEach((foreignKey) =>\n createForeignKey(tableBuilder, foreignKey)\n );\n }\n });\n };\n\n /**\n * Alters a database table by applying a set of schema changes including updates to columns, indexes, and foreign keys.\n * This function ensures proper ordering of operations to avoid conflicts (e.g., foreign key errors) and handles\n * MySQL-specific quirks where dropping a foreign key can implicitly drop an associated index.\n *\n * @param {Knex.SchemaBuilder} schemaBuilder - Knex SchemaBuilder instance to perform schema operations.\n * @param {TableDiff['diff']} table - A diff object representing the schema changes to be applied to the table.\n * @param {{ indexes: Index[]; foreignKeys: ForeignKey[] }} existingMetadata - Metadata about existing indexes and\n * foreign keys in the table. Used to ensure safe operations and avoid unnecessary modifications.\n * - indexes: Array of existing index definitions.\n * - foreignKeys: Array of existing foreign key definitions.\n */\n const alterTable = async (\n schemaBuilder: Knex.SchemaBuilder,\n table: TableDiff['diff'],\n existingMetadata: { indexes: Index[]; foreignKeys: ForeignKey[] } = {\n indexes: [],\n foreignKeys: [],\n }\n ) => {\n let existingIndexes = [...existingMetadata.indexes];\n const existingForeignKeys = [...existingMetadata.foreignKeys];\n\n // Track dropped foreign keys\n const droppedForeignKeyNames: string[] = [];\n\n await schemaBuilder.alterTable(table.name, async (tableBuilder) => {\n // Drop foreign keys first to avoid foreign key errors in the following steps\n for (const removedForeignKey of table.foreignKeys.removed) {\n debug(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);\n\n droppedForeignKeyNames.push(removedForeignKey.name);\n }\n\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);\n\n droppedForeignKeyNames.push(updatedForeignKey.object.name);\n }\n\n // In MySQL, dropping a foreign key can also implicitly drop an index with the same name\n // Remove dropped foreign keys from existingIndexes for MySQL\n if (db.config.connection.client === 'mysql') {\n existingIndexes = existingIndexes.filter(\n (index) => !droppedForeignKeyNames.includes(index.name)\n );\n }\n\n for (const removedIndex of table.indexes.removed) {\n debug(`Dropping index ${removedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, removedIndex, existingIndexes);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Dropping updated index ${updatedIndex.name} on ${table.name}`);\n dropIndex(tableBuilder, updatedIndex.object, existingIndexes);\n }\n\n // Drop columns after FKs have been removed to avoid FK errors\n for (const removedColumn of table.columns.removed) {\n debug(`Dropping column ${removedColumn.name} on ${table.name}`);\n dropColumn(tableBuilder, removedColumn);\n }\n\n // Update existing columns\n for (const updatedColumn of table.columns.updated) {\n debug(`Updating column ${updatedColumn.name} on ${table.name}`);\n\n const { object } = updatedColumn;\n\n if (object.type === 'increments') {\n createColumn(tableBuilder, { ...object, type: 'integer' }).alter();\n } else {\n createColumn(tableBuilder, object).alter();\n }\n }\n\n // Add any new columns\n for (const addedColumn of table.columns.added) {\n debug(`Creating column ${addedColumn.name} on ${table.name}`);\n\n if (addedColumn.type === 'increments' && !db.dialect.canAddIncrements()) {\n tableBuilder.integer(addedColumn.name).unsigned();\n tableBuilder.primary([addedColumn.name]);\n } else {\n createColumn(tableBuilder, addedColumn);\n }\n }\n\n // once the columns have all been updated, we can create indexes again\n for (const updatedForeignKey of table.foreignKeys.updated) {\n debug(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, updatedForeignKey.object);\n }\n\n for (const updatedIndex of table.indexes.updated) {\n debug(`Recreating updated index ${updatedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, updatedIndex.object);\n }\n\n for (const addedForeignKey of table.foreignKeys.added) {\n debug(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);\n createForeignKey(tableBuilder, addedForeignKey);\n }\n\n for (const addedIndex of table.indexes.added) {\n debug(`Creating index ${addedIndex.name} on ${table.name}`);\n createIndex(tableBuilder, addedIndex);\n }\n });\n };\n\n /**\n * Drops a table from a database\n */\n const dropTable = (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n return schemaBuilder.dropTableIfExists(table.name);\n };\n\n /**\n * Creates a table foreign keys constraints\n */\n const createTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => createForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Drops a table foreign keys constraints\n */\n const dropTableForeignKeys = async (schemaBuilder: Knex.SchemaBuilder, table: Table) => {\n if (!db.config.settings.forceMigration) {\n return;\n }\n\n // foreign keys\n await schemaBuilder.table(table.name, (tableBuilder) => {\n (table.foreignKeys || []).forEach((foreignKey) => dropForeignKey(tableBuilder, foreignKey));\n });\n };\n\n /**\n * Get the current column type from the database\n */\n const getCurrentColumnType = async (\n tableName: string,\n columnName: string\n ): Promise<string | null> => {\n try {\n const schemaName = db.getSchemaName();\n const result = await db.connection.raw(\n `\n SELECT data_type \n FROM information_schema.columns \n WHERE table_name = ? \n AND column_name = ?\n ${schemaName ? 'AND table_schema = ?' : ''}\n LIMIT 1\n `,\n schemaName ? [tableName, columnName, schemaName] : [tableName, columnName]\n );\n\n return result.rows?.[0]?.data_type || null;\n } catch (error) {\n // Log error but don't fail the migration\n debug(\n `Failed to get column type for ${tableName}.${columnName}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n };\n\n /**\n * Apply column properties after type conversion\n */\n const applyColumnProperties = async (\n trx: Knex.Transaction,\n tableName: string,\n columnName: string,\n column: Column\n ) => {\n // Apply NOT NULL constraint\n if (column.notNullable) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET NOT NULL`, [tableName, columnName]);\n } else {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? DROP NOT NULL`, [tableName, columnName]);\n }\n\n // Apply default value\n if (column.defaultTo !== undefined) {\n const [defaultValue, defaultOpts] = castArray(column.defaultTo);\n if (prop('isRaw', defaultOpts)) {\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${defaultValue}`, [\n tableName,\n columnName,\n ]);\n } else {\n // PostgreSQL doesn't support parameterized SET DEFAULT, so we need to escape the value\n const escapedDefault =\n typeof defaultValue === 'string' ? `'${defaultValue.replace(/'/g, \"''\")}'` : defaultValue;\n await trx.raw(`ALTER TABLE ?? ALTER COLUMN ?? SET DEFAULT ${escapedDefault}`, [\n tableName,\n columnName,\n ]);\n }\n }\n };\n\n /**\n * Handle special type conversions that require custom SQL\n */\n const handleSpecialTypeConversions = async (\n trx: Knex.Transaction,\n table: TableDiff['diff'],\n preloadedColumnTypes: Record<string, string | null> = {}\n ) => {\n // Only PostgreSQL needs special handling for now\n if (db.config.connection.client !== 'postgres') {\n return;\n }\n\n const conversionsToApply = [];\n\n // Check each updated column for special type conversions\n for (const updatedColumn of table.columns.updated) {\n const { name: columnName, object: column } = updatedColumn;\n\n // Use pre-loaded column type if available, otherwise fetch it\n const currentType =\n preloadedColumnTypes[columnName] ?? (await getCurrentColumnType(table.name, columnName));\n\n if (currentType) {\n // Check if dialect has special conversion SQL\n const conversionSQL = db.dialect.getColumnTypeConversionSQL(currentType, column.type);\n\n if (conversionSQL) {\n conversionsToApply.push({\n column: updatedColumn,\n sql: conversionSQL.sql,\n params: [table.name, columnName, columnName],\n currentType,\n targetType: column.type,\n warning: conversionSQL.warning,\n });\n }\n }\n }\n\n // Apply conversions\n for (const conversion of conversionsToApply) {\n const { column, sql, params, currentType, targetType, warning } = conversion;\n\n // Log warning about type conversion\n const warningMessage = warning || 'This conversion may result in data changes.';\n db.logger.warn(\n `Database type conversion: \"${table.name}.${column.name}\" from \"${currentType}\" to \"${targetType}\". ${warningMessage}`\n );\n\n debug(`Applying special type conversion for column ${column.name} on ${table.name}`);\n debug(`Executing SQL: ${sql} with params: ${JSON.stringify(params)}`);\n\n try {\n // Execute the conversion using the transaction connection\n await trx.raw(sql, params);\n debug(`Successfully converted ${column.name} from ${currentType} to ${targetType}`);\n } catch (conversionError) {\n db.logger.error(\n `Failed to convert column ${column.name}: ${conversionError instanceof Error ? conversionError.message : String(conversionError)}`\n );\n throw conversionError;\n }\n\n // Apply other column properties\n await applyColumnProperties(trx, table.name, column.name, column.object);\n\n // Remove from standard updates to prevent double processing\n table.columns.updated = table.columns.updated.filter((col) => col.name !== column.name);\n }\n };\n\n return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\n handleSpecialTypeConversions,\n getCurrentColumnType,\n };\n};\n"],"names":["debug","createDebug","db","helpers","createHelpers","getSchemaBuilder","trx","getSchemaConnection","createSchema","schema","connection","transaction","createTables","tables","table","name","schemaBuilder","createTable","createTableForeignKeys","dropSchema","dropDatabase","reverse","dropTable","updateSchema","schemaDiff","forceMigration","config","settings","dialect","startSchemaUpdate","existingMetadata","columnTypes","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","client","updatedColumn","columns","getCurrentColumnType","added","removed","dropTableForeignKeys","handleSpecialTypeConversions","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","referencedColumns","referencedTable","onDelete","onUpdate","constraint","foreign","references","inTable","getSchemaName","dropForeignKey","existingForeignKeys","some","existingIndex","dropForeign","createIndex","index","type","primary","constraintName","unique","indexName","dropIndex","existingIndexes","dropPrimary","dropUnique","createColumn","column","args","defaultTo","unsigned","notNullable","col","isNil","value","opts","castArray","prop","raw","omit","nullable","dropColumn","forEach","canAlterConstraints","droppedForeignKeyNames","removedForeignKey","push","updatedForeignKey","object","filter","includes","removedIndex","updatedIndex","removedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists","tableName","columnName","schemaName","result","rows","data_type","error","Error","message","String","applyColumnProperties","undefined","defaultValue","defaultOpts","escapedDefault","replace","preloadedColumnTypes","conversionsToApply","currentType","conversionSQL","getColumnTypeConversionSQL","sql","params","targetType","warning","conversion","warningMessage","logger","warn","JSON","stringify","conversionError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.mjs","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":"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"}
1
+ {"version":3,"file":"diff.mjs","sources":["../../src/schema/diff.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type {\n Schema,\n Table,\n SchemaDiff,\n Index,\n ForeignKey,\n Column,\n IndexDiff,\n IndexesDiff,\n ForeignKeyDiff,\n ForeignKeysDiff,\n ColumnDiff,\n TableDiff,\n ColumnsDiff,\n} from './types';\nimport type { Database } from '..';\n\ntype PersistedTable = {\n name: string;\n dependsOn?: Array<{ name: string }>;\n};\n\ntype TableDiffContext = {\n previousTable?: Table;\n databaseTable: Table;\n userSchemaTable: Table;\n};\n\ntype SchemaDiffContext = {\n previousSchema?: Schema;\n databaseSchema: Schema;\n userSchema: Schema;\n};\n\n// TODO: get that list dynamically instead\nconst RESERVED_TABLE_NAMES = [\n 'strapi_migrations',\n 'strapi_migrations_internal',\n 'strapi_database_schema',\n];\n\nconst statuses = {\n CHANGED: 'CHANGED',\n UNCHANGED: 'UNCHANGED',\n} as const;\n\n// NOTE:We could move the schema to use maps of tables & columns instead of arrays to make it easier to diff\n// => this will make the creation a bit more complicated (ordering, Object.values(tables | columns)) -> not a big pbl\n\nconst helpers = {\n hasTable(schema: Schema, tableName: string) {\n return schema.tables.findIndex((table) => table.name === tableName) !== -1;\n },\n findTable(schema: Schema, tableName: string) {\n return schema.tables.find((table) => table.name === tableName);\n },\n hasColumn(table: Table, columnName: string) {\n return table.columns.findIndex((column) => column.name === columnName) !== -1;\n },\n findColumn(table: Table, columnName: string) {\n return table.columns.find((column) => column.name === columnName);\n },\n\n hasIndex(table: Table, columnName: string) {\n return table.indexes.findIndex((column) => column.name === columnName) !== -1;\n },\n findIndex(table: Table, columnName: string) {\n return table.indexes.find((column) => column.name === columnName);\n },\n\n hasForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.findIndex((column) => column.name === columnName) !== -1;\n },\n findForeignKey(table: Table, columnName: string) {\n return table.foreignKeys.find((column) => column.name === columnName);\n },\n};\n\nexport default (db: Database) => {\n const hasChangedStatus = (diff: { status: 'CHANGED' | 'UNCHANGED' }) =>\n diff.status === statuses.CHANGED;\n\n /**\n * Compares two indexes info\n * @param {Object} oldIndex - index info read from DB\n * @param {Object} index - newly generate index info\n */\n const diffIndexes = (oldIndex: Index, index: Index): IndexDiff => {\n const changes: string[] = [];\n\n // use xor to avoid differences in order\n if (_.xor(oldIndex.columns, index.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && _.toLower(oldIndex.type) !== _.toLower(index.type)) {\n changes.push('type');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: index.name,\n object: index,\n },\n };\n };\n\n /**\n * Compares two foreign keys info\n * @param {Object} oldForeignKey - foreignKey info read from DB\n * @param {Object} foreignKey - newly generate foreignKey info\n */\n const diffForeignKeys = (oldForeignKey: ForeignKey, foreignKey: ForeignKey): ForeignKeyDiff => {\n const changes: string[] = [];\n\n if (_.difference(oldForeignKey.columns, foreignKey.columns).length > 0) {\n changes.push('columns');\n }\n\n if (_.difference(oldForeignKey.referencedColumns, foreignKey.referencedColumns).length > 0) {\n changes.push('referencedColumns');\n }\n\n if (oldForeignKey.referencedTable !== foreignKey.referencedTable) {\n changes.push('referencedTable');\n }\n\n if (_.isNil(oldForeignKey.onDelete) || _.toUpper(oldForeignKey.onDelete) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onDelete) &&\n _.toUpper(oldForeignKey.onDelete ?? '') !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (_.toUpper(oldForeignKey.onDelete) !== _.toUpper(foreignKey.onDelete ?? '')) {\n changes.push('onDelete');\n }\n\n if (_.isNil(oldForeignKey.onUpdate) || _.toUpper(oldForeignKey.onUpdate) === 'NO ACTION') {\n if (\n !_.isNil(foreignKey.onUpdate) &&\n _.toUpper(oldForeignKey.onUpdate ?? '') !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (_.toUpper(oldForeignKey.onUpdate) !== _.toUpper(foreignKey.onUpdate ?? '')) {\n changes.push('onUpdate');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: foreignKey.name,\n object: foreignKey,\n },\n };\n };\n\n const diffDefault = (oldColumn: Column, column: Column) => {\n const oldDefaultTo = oldColumn.defaultTo;\n const { defaultTo } = column;\n\n if (oldDefaultTo === null || _.toLower(oldDefaultTo) === 'null') {\n return _.isNil(defaultTo) || _.toLower(defaultTo) === 'null';\n }\n\n return (\n _.toLower(oldDefaultTo) === _.toLower(column.defaultTo) ||\n _.toLower(oldDefaultTo) === _.toLower(`'${column.defaultTo}'`)\n );\n };\n\n /**\n * Compares two columns info\n * @param {Object} oldColumn - column info read from DB\n * @param {Object} column - newly generate column info\n */\n const diffColumns = (oldColumn: Column, column: Column): ColumnDiff => {\n const changes: string[] = [];\n\n const isIgnoredType = ['increments'].includes(column.type);\n const oldType = oldColumn.type;\n const type = db.dialect.getSqlType(column.type);\n\n if (oldType !== type && !isIgnoredType) {\n changes.push('type');\n }\n\n // NOTE: compare args at some point and split them into specific properties instead\n\n if (oldColumn.notNullable !== column.notNullable) {\n changes.push('notNullable');\n }\n\n const hasSameDefault = diffDefault(oldColumn, column);\n if (!hasSameDefault) {\n changes.push('defaultTo');\n }\n\n if (oldColumn.unsigned !== column.unsigned && db.dialect.supportsUnsigned()) {\n changes.push('unsigned');\n }\n\n return {\n status: changes.length > 0 ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: column.name,\n object: column,\n },\n };\n };\n\n const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedColumns: Column[] = [];\n const updatedColumns: ColumnDiff['diff'][] = [];\n const unchangedColumns: Column[] = [];\n const removedColumns: Column[] = [];\n\n for (const userSchemaColumn of userSchemaTable.columns) {\n const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name);\n\n if (databaseColumn) {\n const { status, diff } = diffColumns(databaseColumn, userSchemaColumn);\n\n if (status === statuses.CHANGED) {\n updatedColumns.push(diff);\n } else {\n unchangedColumns.push(databaseColumn);\n }\n } else {\n addedColumns.push(userSchemaColumn);\n }\n }\n\n for (const databaseColumn of databaseTable.columns) {\n if (\n !helpers.hasColumn(userSchemaTable, databaseColumn.name) &&\n previousTable &&\n helpers.hasColumn(previousTable, databaseColumn.name)\n ) {\n removedColumns.push(databaseColumn);\n }\n }\n\n const hasChanged = [addedColumns, updatedColumns, removedColumns].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedColumns,\n updated: updatedColumns,\n unchanged: unchangedColumns,\n removed: removedColumns,\n },\n };\n };\n\n const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedIndexes: Index[] = [];\n const updatedIndexes: IndexDiff['diff'][] = [];\n const unchangedIndexes: Index[] = [];\n const removedIndexes: Index[] = [];\n\n for (const userSchemaIndex of userSchemaTable.indexes) {\n const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name);\n if (databaseIndex) {\n const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex);\n\n if (status === statuses.CHANGED) {\n updatedIndexes.push(diff);\n } else {\n unchangedIndexes.push(databaseIndex);\n }\n } else {\n addedIndexes.push(userSchemaIndex);\n }\n }\n\n for (const databaseIndex of databaseTable.indexes) {\n if (\n !helpers.hasIndex(userSchemaTable, databaseIndex.name) &&\n previousTable &&\n helpers.hasIndex(previousTable, databaseIndex.name)\n ) {\n removedIndexes.push(databaseIndex);\n }\n }\n\n const hasChanged = [addedIndexes, updatedIndexes, removedIndexes].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedIndexes,\n updated: updatedIndexes,\n unchanged: unchangedIndexes,\n removed: removedIndexes,\n },\n };\n };\n\n const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => {\n const { databaseTable, userSchemaTable, previousTable } = diffCtx;\n\n const addedForeignKeys: ForeignKey[] = [];\n const updatedForeignKeys: ForeignKeyDiff['diff'][] = [];\n const unchangedForeignKeys: ForeignKey[] = [];\n const removedForeignKeys: ForeignKey[] = [];\n\n if (!db.dialect.usesForeignKeys()) {\n return {\n status: statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n }\n\n for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) {\n const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name);\n if (databaseForeignKeys) {\n const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys);\n\n if (status === statuses.CHANGED) {\n updatedForeignKeys.push(diff);\n } else {\n unchangedForeignKeys.push(databaseForeignKeys);\n }\n } else {\n addedForeignKeys.push(userSchemaForeignKeys);\n }\n }\n\n for (const databaseForeignKeys of databaseTable.foreignKeys) {\n if (\n !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) &&\n previousTable &&\n helpers.hasForeignKey(previousTable, databaseForeignKeys.name)\n ) {\n removedForeignKeys.push(databaseForeignKeys);\n }\n }\n\n const hasChanged = [addedForeignKeys, updatedForeignKeys, removedForeignKeys].some(\n (arr) => arr.length > 0\n );\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n added: addedForeignKeys,\n updated: updatedForeignKeys,\n unchanged: unchangedForeignKeys,\n removed: removedForeignKeys,\n },\n };\n };\n\n const diffTables = (diffCtx: TableDiffContext): TableDiff => {\n const { databaseTable } = diffCtx;\n\n const columnsDiff = diffTableColumns(diffCtx);\n const indexesDiff = diffTableIndexes(diffCtx);\n const foreignKeysDiff = diffTableForeignKeys(diffCtx);\n\n const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n name: databaseTable.name,\n indexes: indexesDiff.diff,\n foreignKeys: foreignKeysDiff.diff,\n columns: columnsDiff.diff,\n },\n };\n };\n\n const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise<SchemaDiff> => {\n const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx;\n\n const addedTables: Table[] = [];\n const updatedTables: TableDiff['diff'][] = [];\n const unchangedTables: Table[] = [];\n const removedTables: Table[] = [];\n\n // for each table in the user schema, check if it already exists in the database schema\n for (const userSchemaTable of userSchema.tables) {\n const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name);\n const previousTable =\n previousSchema && helpers.findTable(previousSchema, userSchemaTable.name);\n\n if (databaseTable) {\n const { status, diff } = diffTables({\n previousTable,\n databaseTable,\n userSchemaTable,\n });\n\n if (status === statuses.CHANGED) {\n updatedTables.push(diff);\n } else {\n unchangedTables.push(databaseTable);\n }\n } else {\n addedTables.push(userSchemaTable);\n }\n }\n\n // maintain audit logs table from EE -> CE\n const parsePersistedTable = (persistedTable: string | Table) => {\n if (typeof persistedTable === 'string') {\n return persistedTable;\n }\n return persistedTable.name;\n };\n\n const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings')\n ? // TODO: replace with low level db query instead\n ((await strapi.store.get({\n type: 'core',\n key: 'persisted_tables',\n })) ?? [])\n : [];\n\n const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)];\n\n // for all tables in the database schema, check if they are not in the user schema\n for (const databaseTable of databaseSchema.tables) {\n const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name);\n const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name);\n const isReserved = reservedTables.includes(databaseTable.name);\n\n // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch\n if (!isInUserSchema && !wasTracked) {\n continue;\n }\n\n // if a db table is not in the user schema I want to delete it\n if (!isInUserSchema && wasTracked && !isReserved) {\n const dependencies = persistedTables\n .filter((table: PersistedTable) => {\n const dependsOn = table?.dependsOn;\n\n if (!_.isArray(dependsOn)) {\n return;\n }\n\n return dependsOn.some((table) => table.name === databaseTable.name);\n })\n .map((dependsOnTable: PersistedTable) => {\n return databaseSchema.tables.find(\n (databaseTable) => databaseTable.name === dependsOnTable.name\n );\n })\n // In case the table is not found, filter undefined values\n .filter((table: PersistedTable) => !_.isNil(table));\n\n removedTables.push(databaseTable, ...dependencies);\n }\n }\n\n const hasChanged = [addedTables, updatedTables, removedTables].some((arr) => arr.length > 0);\n\n return {\n status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED,\n diff: {\n tables: {\n added: addedTables,\n updated: updatedTables,\n unchanged: unchangedTables,\n removed: removedTables,\n },\n },\n };\n };\n\n return {\n diff: diffSchemas,\n };\n};\n"],"names":["RESERVED_TABLE_NAMES","statuses","CHANGED","UNCHANGED","helpers","hasTable","schema","tableName","tables","findIndex","table","name","findTable","find","hasColumn","columnName","columns","column","findColumn","hasIndex","indexes","hasForeignKey","foreignKeys","findForeignKey","db","hasChangedStatus","diff","status","diffIndexes","oldIndex","index","changes","_","xor","length","push","type","toLower","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","isNil","onDelete","toUpper","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","diffColumns","isIgnoredType","includes","oldType","dialect","getSqlType","notNullable","hasSameDefault","unsigned","supportsUnsigned","diffTableColumns","diffCtx","databaseTable","userSchemaTable","previousTable","addedColumns","updatedColumns","unchangedColumns","removedColumns","userSchemaColumn","databaseColumn","hasChanged","some","arr","added","updated","unchanged","removed","diffTableIndexes","addedIndexes","updatedIndexes","unchangedIndexes","removedIndexes","userSchemaIndex","databaseIndex","diffTableForeignKeys","addedForeignKeys","updatedForeignKeys","unchangedForeignKeys","removedForeignKeys","usesForeignKeys","userSchemaForeignKeys","databaseForeignKeys","diffTables","columnsDiff","indexesDiff","foreignKeysDiff","diffSchemas","schemaDiffCtx","previousSchema","databaseSchema","userSchema","addedTables","updatedTables","unchangedTables","removedTables","parsePersistedTable","persistedTable","persistedTables","strapi","store","get","key","reservedTables","map","isInUserSchema","wasTracked","isReserved","dependencies","filter","dependsOn","isArray","dependsOnTable"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}