@strapi/database 5.55.1 → 5.57.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.
- package/dist/dialects/dialect.d.ts +28 -0
- package/dist/dialects/dialect.d.ts.map +1 -1
- package/dist/dialects/dialect.js +29 -0
- package/dist/dialects/dialect.js.map +1 -1
- package/dist/dialects/dialect.mjs +29 -0
- package/dist/dialects/dialect.mjs.map +1 -1
- package/dist/dialects/mysql/index.d.ts +9 -0
- package/dist/dialects/mysql/index.d.ts.map +1 -1
- package/dist/dialects/mysql/index.js +37 -0
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs +37 -0
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/dialects/postgresql/index.d.ts +7 -0
- package/dist/dialects/postgresql/index.d.ts.map +1 -1
- package/dist/dialects/postgresql/index.js +50 -0
- package/dist/dialects/postgresql/index.js.map +1 -1
- package/dist/dialects/postgresql/index.mjs +50 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -1
- package/dist/dialects/sqlite/index.d.ts +9 -0
- package/dist/dialects/sqlite/index.d.ts.map +1 -1
- package/dist/dialects/sqlite/index.js +16 -0
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/dialects/sqlite/index.mjs +16 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -1
- package/dist/entity-manager/entity-repository.js +1 -1
- package/dist/entity-manager/entity-repository.js.map +1 -1
- package/dist/entity-manager/entity-repository.mjs +1 -1
- package/dist/entity-manager/entity-repository.mjs.map +1 -1
- package/dist/entity-manager/index.d.ts.map +1 -1
- package/dist/entity-manager/index.js +38 -36
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs +38 -36
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/morph-relations.d.ts.map +1 -1
- package/dist/entity-manager/morph-relations.js +3 -5
- package/dist/entity-manager/morph-relations.js.map +1 -1
- package/dist/entity-manager/morph-relations.mjs +3 -5
- package/dist/entity-manager/morph-relations.mjs.map +1 -1
- package/dist/entity-manager/regular-relations.js +3 -3
- package/dist/entity-manager/regular-relations.js.map +1 -1
- package/dist/entity-manager/regular-relations.mjs +3 -3
- package/dist/entity-manager/regular-relations.mjs.map +1 -1
- package/dist/entity-manager/relations-orderer.d.ts.map +1 -1
- package/dist/entity-manager/relations-orderer.js +4 -5
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/entity-manager/relations-orderer.mjs +2 -3
- package/dist/entity-manager/relations-orderer.mjs.map +1 -1
- package/dist/fields/biginteger.js +1 -1
- package/dist/fields/biginteger.js.map +1 -1
- package/dist/fields/biginteger.mjs +1 -1
- package/dist/fields/biginteger.mjs.map +1 -1
- package/dist/fields/boolean.js +1 -1
- package/dist/fields/boolean.js.map +1 -1
- package/dist/fields/boolean.mjs +1 -1
- package/dist/fields/boolean.mjs.map +1 -1
- package/dist/fields/number.js +1 -1
- package/dist/fields/number.js.map +1 -1
- package/dist/fields/number.mjs +1 -1
- package/dist/fields/number.mjs.map +1 -1
- package/dist/fields/shared/parsers.js +2 -2
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs +2 -2
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/fields/string.js +1 -1
- package/dist/fields/string.js.map +1 -1
- package/dist/fields/string.mjs +1 -1
- package/dist/fields/string.mjs.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/metadata/attribute-naming.d.ts +31 -0
- package/dist/metadata/attribute-naming.d.ts.map +1 -0
- package/dist/metadata/attribute-naming.js +39 -0
- package/dist/metadata/attribute-naming.js.map +1 -0
- package/dist/metadata/attribute-naming.mjs +37 -0
- package/dist/metadata/attribute-naming.mjs.map +1 -0
- package/dist/metadata/index.d.ts +5 -2
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/index.js +3 -0
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/index.mjs +3 -1
- package/dist/metadata/index.mjs.map +1 -1
- package/dist/metadata/metadata.d.ts +10 -0
- package/dist/metadata/metadata.d.ts.map +1 -1
- package/dist/metadata/metadata.js +10 -2
- package/dist/metadata/metadata.js.map +1 -1
- package/dist/metadata/metadata.mjs +10 -2
- package/dist/metadata/metadata.mjs.map +1 -1
- package/dist/metadata/relations.d.ts.map +1 -1
- package/dist/metadata/relations.js +6 -5
- package/dist/metadata/relations.js.map +1 -1
- package/dist/metadata/relations.mjs +6 -5
- package/dist/metadata/relations.mjs.map +1 -1
- package/dist/migrations/common.d.ts +2 -0
- package/dist/migrations/common.d.ts.map +1 -1
- package/dist/migrations/common.js.map +1 -1
- package/dist/migrations/common.mjs.map +1 -1
- package/dist/migrations/file-builder.d.ts +97 -0
- package/dist/migrations/file-builder.d.ts.map +1 -0
- package/dist/migrations/file-builder.js +251 -0
- package/dist/migrations/file-builder.js.map +1 -0
- package/dist/migrations/file-builder.mjs +240 -0
- package/dist/migrations/file-builder.mjs.map +1 -0
- package/dist/migrations/index.d.ts +3 -2
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +6 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +6 -0
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
- package/dist/migrations/resolver.d.ts.map +1 -1
- package/dist/migrations/resolver.js +4 -1
- package/dist/migrations/resolver.js.map +1 -1
- package/dist/migrations/resolver.mjs +4 -1
- package/dist/migrations/resolver.mjs.map +1 -1
- package/dist/query/helpers/order-by.d.ts.map +1 -1
- package/dist/query/helpers/order-by.js +3 -4
- package/dist/query/helpers/order-by.js.map +1 -1
- package/dist/query/helpers/order-by.mjs +3 -4
- package/dist/query/helpers/order-by.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.d.ts.map +1 -1
- package/dist/query/helpers/populate/apply.js +46 -30
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +46 -30
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/populate/process.js +3 -3
- package/dist/query/helpers/populate/process.js.map +1 -1
- package/dist/query/helpers/populate/process.mjs +3 -3
- package/dist/query/helpers/populate/process.mjs.map +1 -1
- package/dist/query/helpers/search.js +2 -2
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs +2 -2
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/streams/readable.js +3 -3
- package/dist/query/helpers/streams/readable.js.map +1 -1
- package/dist/query/helpers/streams/readable.mjs +3 -3
- package/dist/query/helpers/streams/readable.mjs.map +1 -1
- package/dist/query/helpers/transform.d.ts.map +1 -1
- package/dist/query/helpers/transform.js +6 -13
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/transform.mjs +6 -9
- package/dist/query/helpers/transform.mjs.map +1 -1
- package/dist/query/helpers/where.js +13 -9
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs +13 -9
- package/dist/query/helpers/where.mjs.map +1 -1
- package/dist/query/query-builder.d.ts.map +1 -1
- package/dist/query/query-builder.js +35 -29
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-builder.mjs +35 -29
- package/dist/query/query-builder.mjs.map +1 -1
- package/dist/schema/builder.js +5 -5
- package/dist/schema/builder.js.map +1 -1
- package/dist/schema/builder.mjs +5 -5
- package/dist/schema/builder.mjs.map +1 -1
- package/dist/schema/diff.js +12 -12
- package/dist/schema/diff.js.map +1 -1
- package/dist/schema/diff.mjs +12 -12
- package/dist/schema/diff.mjs.map +1 -1
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/index.mjs +6 -0
- package/dist/schema/index.mjs.map +1 -1
- package/dist/schema/rename-helpers.d.ts +78 -0
- package/dist/schema/rename-helpers.d.ts.map +1 -0
- package/dist/schema/rename-helpers.js +235 -0
- package/dist/schema/rename-helpers.js.map +1 -0
- package/dist/schema/rename-helpers.mjs +233 -0
- package/dist/schema/rename-helpers.mjs.map +1 -0
- package/dist/utils/async-curry.d.ts.map +1 -1
- package/dist/utils/async-curry.js +1 -2
- package/dist/utils/async-curry.js.map +1 -1
- package/dist/utils/async-curry.mjs +1 -2
- package/dist/utils/async-curry.mjs.map +1 -1
- package/dist/utils/identifiers/hash.d.ts.map +1 -1
- package/dist/utils/identifiers/hash.js +1 -2
- package/dist/utils/identifiers/hash.js.map +1 -1
- package/dist/utils/identifiers/hash.mjs +1 -2
- package/dist/utils/identifiers/hash.mjs.map +1 -1
- package/dist/utils/identifiers/index.js +8 -10
- package/dist/utils/identifiers/index.js.map +1 -1
- package/dist/utils/identifiers/index.mjs +8 -6
- package/dist/utils/identifiers/index.mjs.map +1 -1
- package/dist/validations/relations/bidirectional.js +1 -1
- package/dist/validations/relations/bidirectional.js.map +1 -1
- package/dist/validations/relations/bidirectional.mjs +1 -1
- package/dist/validations/relations/bidirectional.mjs.map +1 -1
- package/package.json +6 -5
package/dist/schema/diff.mjs.map
CHANGED
|
@@ -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';\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(index.columns, oldIndex.columns).length > 0) {\n changes.push('columns');\n }\n\n if (oldIndex.type && index.type && oldIndex.type.toLowerCase() !== index.type.toLowerCase()) {\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 (oldForeignKey.onDelete == null || oldForeignKey.onDelete.toUpperCase() === 'NO ACTION') {\n if (\n foreignKey.onDelete != null &&\n (oldForeignKey.onDelete ?? '').toUpperCase() !== 'NO ACTION'\n ) {\n changes.push('onDelete');\n }\n } else if (oldForeignKey.onDelete.toUpperCase() !== (foreignKey.onDelete ?? '').toUpperCase()) {\n changes.push('onDelete');\n }\n\n if (oldForeignKey.onUpdate == null || oldForeignKey.onUpdate.toUpperCase() === 'NO ACTION') {\n if (\n foreignKey.onUpdate != null &&\n (oldForeignKey.onUpdate ?? '').toUpperCase() !== 'NO ACTION'\n ) {\n changes.push('onUpdate');\n }\n } else if (oldForeignKey.onUpdate.toUpperCase() !== (foreignKey.onUpdate ?? '').toUpperCase()) {\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 defaultTo == null || _.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 (!Array.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) => table != null);\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","toLowerCase","object","diffForeignKeys","oldForeignKey","foreignKey","difference","referencedColumns","referencedTable","onDelete","toUpperCase","onUpdate","diffDefault","oldColumn","oldDefaultTo","defaultTo","toLower","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","Array","isArray","dependsOnTable"],"mappings":"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"}
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ import createSchemaBuilder from './builder';
|
|
|
2
2
|
import createSchemaDiff from './diff';
|
|
3
3
|
import createSchemaStorage from './storage';
|
|
4
4
|
import type { Schema, SchemaDiff } from './types';
|
|
5
|
+
import type { RenameHelpers } from './rename-helpers';
|
|
5
6
|
import type { Database } from '..';
|
|
6
7
|
export type * from './types';
|
|
7
|
-
export
|
|
8
|
+
export type { AttributeRenameHandler, AttributeRenames, RenameHelpers } from './rename-helpers';
|
|
9
|
+
export interface SchemaProvider extends RenameHelpers {
|
|
8
10
|
builder: ReturnType<typeof createSchemaBuilder>;
|
|
9
11
|
schemaDiff: ReturnType<typeof createSchemaDiff>;
|
|
10
12
|
schemaStorage: ReturnType<typeof createSchemaStorage>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAC5C,OAAO,gBAAgB,MAAM,QAAQ,CAAC;AACtC,OAAO,mBAAmB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAC5C,OAAO,gBAAgB,MAAM,QAAQ,CAAC;AACtC,OAAO,mBAAmB,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,mBAAmB,SAAS,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIhG,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IAChD,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAChD,aAAa,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,eAAO,MAAM,oBAAoB,GAAI,IAAI,QAAQ,KAAG,cA8GnD,CAAC"}
|
package/dist/schema/index.js
CHANGED
|
@@ -5,6 +5,7 @@ var builder = require('./builder.js');
|
|
|
5
5
|
var diff = require('./diff.js');
|
|
6
6
|
var storage = require('./storage.js');
|
|
7
7
|
var schema = require('./schema.js');
|
|
8
|
+
var renameHelpers = require('./rename-helpers.js');
|
|
8
9
|
|
|
9
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
11
|
|
|
@@ -24,6 +25,11 @@ const createSchemaProvider = (db)=>{
|
|
|
24
25
|
builder: builder(db),
|
|
25
26
|
schemaDiff: diff(db),
|
|
26
27
|
schemaStorage: storage(db),
|
|
28
|
+
// Guarded, logged runtime helpers for generated rename migrations
|
|
29
|
+
// (`db.schema.renameColumn(knex, …)` etc.). See rename-helpers.ts.
|
|
30
|
+
...renameHelpers.createRenameHelpers({
|
|
31
|
+
db
|
|
32
|
+
}),
|
|
27
33
|
/**
|
|
28
34
|
* Drops the database schema
|
|
29
35
|
*/ async drop () {
|
package/dist/schema/index.js.map
CHANGED
|
@@ -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":"
|
|
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';\nimport { createRenameHelpers } from './rename-helpers';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { RenameHelpers } from './rename-helpers';\nimport type { Database } from '..';\n\nexport type * from './types';\nexport type { AttributeRenameHandler, AttributeRenames, RenameHelpers } from './rename-helpers';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider extends RenameHelpers {\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 // Guarded, logged runtime helpers for generated rename migrations\n // (`db.schema.renameColumn(knex, …)` etc.). See rename-helpers.ts.\n ...createRenameHelpers({ 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","createRenameHelpers","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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"}
|
package/dist/schema/index.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import createSchemaBuilder from './builder.mjs';
|
|
|
3
3
|
import createSchemaDiff from './diff.mjs';
|
|
4
4
|
import createSchemaStorage from './storage.mjs';
|
|
5
5
|
import { metadataToSchema } from './schema.mjs';
|
|
6
|
+
import { createRenameHelpers } from './rename-helpers.mjs';
|
|
6
7
|
|
|
7
8
|
const debug = createDebug('strapi::database');
|
|
8
9
|
const createSchemaProvider = (db)=>{
|
|
@@ -18,6 +19,11 @@ const createSchemaProvider = (db)=>{
|
|
|
18
19
|
builder: createSchemaBuilder(db),
|
|
19
20
|
schemaDiff: createSchemaDiff(db),
|
|
20
21
|
schemaStorage: createSchemaStorage(db),
|
|
22
|
+
// Guarded, logged runtime helpers for generated rename migrations
|
|
23
|
+
// (`db.schema.renameColumn(knex, …)` etc.). See rename-helpers.ts.
|
|
24
|
+
...createRenameHelpers({
|
|
25
|
+
db
|
|
26
|
+
}),
|
|
21
27
|
/**
|
|
22
28
|
* Drops the database schema
|
|
23
29
|
*/ async drop () {
|
|
@@ -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":"
|
|
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';\nimport { createRenameHelpers } from './rename-helpers';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { RenameHelpers } from './rename-helpers';\nimport type { Database } from '..';\n\nexport type * from './types';\nexport type { AttributeRenameHandler, AttributeRenames, RenameHelpers } from './rename-helpers';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider extends RenameHelpers {\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 // Guarded, logged runtime helpers for generated rename migrations\n // (`db.schema.renameColumn(knex, …)` etc.). See rename-helpers.ts.\n ...createRenameHelpers({ 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","createRenameHelpers","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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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
import type { Database } from '..';
|
|
3
|
+
import type { AttributeRenamesOperation, RenameColumnOperation, RenameTableOperation, UpdateRowsOperation } from '../migrations/file-builder';
|
|
4
|
+
/**
|
|
5
|
+
* Runtime helpers used by generated rename migrations (see
|
|
6
|
+
* `migrations/file-builder.ts`). Keeping the guards, logging and dialect
|
|
7
|
+
* specifics here instead of in the generated file means a fix in the database
|
|
8
|
+
* package applies to migrations users already generated.
|
|
9
|
+
*
|
|
10
|
+
* Every helper:
|
|
11
|
+
* - runs on the transaction it is given (never on `db.connection`, which may
|
|
12
|
+
* be exhausted by that very transaction on single-connection pools);
|
|
13
|
+
* - checks the source exists and the target does not before doing anything,
|
|
14
|
+
* so it is a safe no-op on a fresh database (schema sync creates the tables
|
|
15
|
+
* afterwards) or on one that already moved on. For `updateRows` the source
|
|
16
|
+
* is the rows matching `where`: with none, nothing is deleted or updated, so
|
|
17
|
+
* re-running a partly applied migration (MySQL commits DDL implicitly)
|
|
18
|
+
* cannot mistake the rows it already renamed for orphans;
|
|
19
|
+
* - logs when it skips: `info` when the source is missing (expected on a fresh
|
|
20
|
+
* database), `warn` when the target already exists (the environment drifted
|
|
21
|
+
* and the rename could not be applied — schema sync will then drop the old
|
|
22
|
+
* artifact, so this is worth a look);
|
|
23
|
+
* - renames the indexes/constraints whose names embed the renamed identifier
|
|
24
|
+
* where the dialect supports it (Postgres), so schema sync sees no diff
|
|
25
|
+
* afterwards. On other dialects it drops them instead and schema sync
|
|
26
|
+
* re-creates them under the new name. Leaving them under the old name is not
|
|
27
|
+
* an option: sync only drops indexes it tracked on a table of the same name,
|
|
28
|
+
* so re-adding the old table/column later would collide with them.
|
|
29
|
+
*/
|
|
30
|
+
export type RenameSkipReason = 'source-missing' | 'target-exists';
|
|
31
|
+
/**
|
|
32
|
+
* Attribute renames of one save, composed per model: `uid -> { origin: final }`.
|
|
33
|
+
*/
|
|
34
|
+
export interface AttributeRenames {
|
|
35
|
+
renames: Record<string, Record<string, string>>;
|
|
36
|
+
comment?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Updates a store keyed by attribute name (e.g. admin field permissions) for
|
|
40
|
+
* the given renames. Runs inside the migration transaction `trx`.
|
|
41
|
+
*/
|
|
42
|
+
export type AttributeRenameHandler = (trx: Knex, renames: AttributeRenames['renames']) => Promise<void>;
|
|
43
|
+
interface RenameHelpersDeps {
|
|
44
|
+
db: Database;
|
|
45
|
+
}
|
|
46
|
+
export declare const createRenameHelpers: ({ db }: RenameHelpersDeps) => {
|
|
47
|
+
/**
|
|
48
|
+
* Renames a column, then the index / unique / foreign-key constraints named
|
|
49
|
+
* after it (`<table>_<column>_index|unique|fk`) where supported.
|
|
50
|
+
*/
|
|
51
|
+
renameColumn(trx: Knex, op: RenameColumnOperation): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Renames a table (typically a relation join table), then the indexes and
|
|
54
|
+
* constraints named after it where supported.
|
|
55
|
+
*/
|
|
56
|
+
renameTable(trx: Knex, op: RenameTableOperation): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Rewrites a stored value (e.g. the `field` or `component_type` column of a
|
|
59
|
+
* component link table). Guarded on the table and `guardColumn` (defaults
|
|
60
|
+
* to the first updated column) existing, and on rows matching `where`.
|
|
61
|
+
*/
|
|
62
|
+
updateRows(trx: Knex, op: UpdateRowsOperation): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Registers a handler for `applyAttributeRenames`. Plugins that keep data
|
|
65
|
+
* keyed by attribute name register one during their register phase, before
|
|
66
|
+
* user migrations run. Returns a function that unregisters it.
|
|
67
|
+
*/
|
|
68
|
+
registerAttributeRenameHandler(handler: AttributeRenameHandler): () => void;
|
|
69
|
+
/**
|
|
70
|
+
* Dispatches one save's attribute renames to every registered handler, in
|
|
71
|
+
* registration order, inside `trx`. The database package itself stores
|
|
72
|
+
* nothing keyed by attribute name, so with no handler this is a no-op.
|
|
73
|
+
*/
|
|
74
|
+
applyAttributeRenames(trx: Knex, op: AttributeRenamesOperation): Promise<boolean>;
|
|
75
|
+
};
|
|
76
|
+
export type RenameHelpers = ReturnType<typeof createRenameHelpers>;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=rename-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-helpers.d.ts","sourceRoot":"","sources":["../../src/schema/rename-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,UAAU,iBAAiB;IACzB,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,iBAAiB;IAsDzD;;;OAGG;sBACqB,IAAI,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyC1E;;;OAGG;qBACoB,IAAI,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCxE;;;;OAIG;oBACmB,IAAI,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+DtE;;;;OAIG;4CACqC,sBAAsB,GAAG,MAAM,IAAI;IAO3E;;;;OAIG;+BAC8B,IAAI,MAAM,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC;CAgB1F,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fileBuilder = require('../migrations/file-builder.js');
|
|
4
|
+
|
|
5
|
+
const createRenameHelpers = ({ db })=>{
|
|
6
|
+
const { identifiers } = db.metadata;
|
|
7
|
+
const logSkip = (comment, detail, reason)=>{
|
|
8
|
+
const message = `[rename migration] skipped: ${comment} (${detail})`;
|
|
9
|
+
if (reason === 'target-exists') {
|
|
10
|
+
db.logger.warn(message);
|
|
11
|
+
} else {
|
|
12
|
+
db.logger.info(message);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const logApplied = (comment)=>{
|
|
16
|
+
db.logger.info(`[rename migration] applied: ${comment}`);
|
|
17
|
+
};
|
|
18
|
+
// A knex SchemaBuilder accumulates statements, so build a fresh one per call.
|
|
19
|
+
const schemaOf = (trx)=>db.getSchemaConnection(trx);
|
|
20
|
+
const hasTable = (trx, table)=>schemaOf(trx).hasTable(table);
|
|
21
|
+
const hasColumn = (trx, table, column)=>schemaOf(trx).hasColumn(table, column);
|
|
22
|
+
const tableOf = (trx, table)=>{
|
|
23
|
+
const schemaName = db.getSchemaName();
|
|
24
|
+
return schemaName ? trx(table).withSchema(schemaName) : trx(table);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Brings every index / constraint from the `pairs` list that exists on
|
|
28
|
+
* `table` in line with a rename: renamed in place when the dialect can do so,
|
|
29
|
+
* dropped otherwise (schema sync then re-creates it under the new name).
|
|
30
|
+
*/ const syncSchemaObjectNames = async (trx, table, pairs)=>{
|
|
31
|
+
const canRename = db.dialect.canRenameSchemaObjects();
|
|
32
|
+
for (const { from, to } of pairs){
|
|
33
|
+
if (from === to) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (canRename) {
|
|
37
|
+
await db.dialect.renameSchemaObject(trx, {
|
|
38
|
+
table,
|
|
39
|
+
from,
|
|
40
|
+
to
|
|
41
|
+
});
|
|
42
|
+
} else {
|
|
43
|
+
await db.dialect.dropSchemaObject(trx, {
|
|
44
|
+
table,
|
|
45
|
+
name: from
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const attributeRenameHandlers = new Set();
|
|
51
|
+
return {
|
|
52
|
+
/**
|
|
53
|
+
* Renames a column, then the index / unique / foreign-key constraints named
|
|
54
|
+
* after it (`<table>_<column>_index|unique|fk`) where supported.
|
|
55
|
+
*/ async renameColumn (trx, op) {
|
|
56
|
+
const comment = fileBuilder.getOperationComment({
|
|
57
|
+
kind: 'renameColumn',
|
|
58
|
+
...op
|
|
59
|
+
});
|
|
60
|
+
if (!await hasTable(trx, op.table)) {
|
|
61
|
+
logSkip(comment, `table "${op.table}" does not exist`, 'source-missing');
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (!await hasColumn(trx, op.table, op.from)) {
|
|
65
|
+
logSkip(comment, `column "${op.table}.${op.from}" does not exist`, 'source-missing');
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (await hasColumn(trx, op.table, op.to)) {
|
|
69
|
+
logSkip(comment, `column "${op.table}.${op.to}" already exists`, 'target-exists');
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
await schemaOf(trx).alterTable(op.table, (table)=>{
|
|
73
|
+
table.renameColumn(op.from, op.to);
|
|
74
|
+
});
|
|
75
|
+
await syncSchemaObjectNames(trx, op.table, [
|
|
76
|
+
{
|
|
77
|
+
from: identifiers.getIndexName([
|
|
78
|
+
op.table,
|
|
79
|
+
op.from
|
|
80
|
+
]),
|
|
81
|
+
to: identifiers.getIndexName([
|
|
82
|
+
op.table,
|
|
83
|
+
op.to
|
|
84
|
+
])
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
from: identifiers.getUniqueIndexName([
|
|
88
|
+
op.table,
|
|
89
|
+
op.from
|
|
90
|
+
]),
|
|
91
|
+
to: identifiers.getUniqueIndexName([
|
|
92
|
+
op.table,
|
|
93
|
+
op.to
|
|
94
|
+
])
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
from: identifiers.getFkIndexName([
|
|
98
|
+
op.table,
|
|
99
|
+
op.from
|
|
100
|
+
]),
|
|
101
|
+
to: identifiers.getFkIndexName([
|
|
102
|
+
op.table,
|
|
103
|
+
op.to
|
|
104
|
+
])
|
|
105
|
+
}
|
|
106
|
+
]);
|
|
107
|
+
logApplied(comment);
|
|
108
|
+
return true;
|
|
109
|
+
},
|
|
110
|
+
/**
|
|
111
|
+
* Renames a table (typically a relation join table), then the indexes and
|
|
112
|
+
* constraints named after it where supported.
|
|
113
|
+
*/ async renameTable (trx, op) {
|
|
114
|
+
const comment = fileBuilder.getOperationComment({
|
|
115
|
+
kind: 'renameTable',
|
|
116
|
+
...op
|
|
117
|
+
});
|
|
118
|
+
if (!await hasTable(trx, op.from)) {
|
|
119
|
+
logSkip(comment, `table "${op.from}" does not exist`, 'source-missing');
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (await hasTable(trx, op.to)) {
|
|
123
|
+
logSkip(comment, `table "${op.to}" already exists`, 'target-exists');
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
await schemaOf(trx).renameTable(op.from, op.to);
|
|
127
|
+
// Every name a join table's metadata derives from the table name (see
|
|
128
|
+
// `createJoinTable` in metadata/relations.ts and the component link
|
|
129
|
+
// tables in core's transform-content-types-to-models).
|
|
130
|
+
const derived = [
|
|
131
|
+
(name)=>identifiers.getFkIndexName(name),
|
|
132
|
+
(name)=>identifiers.getInverseFkIndexName(name),
|
|
133
|
+
(name)=>identifiers.getUniqueIndexName(name),
|
|
134
|
+
(name)=>identifiers.getOrderFkIndexName(name),
|
|
135
|
+
(name)=>identifiers.getOrderInverseFkIndexName(name),
|
|
136
|
+
(name)=>identifiers.getOrderIndexName(name),
|
|
137
|
+
(name)=>identifiers.getIdColumnIndexName(name)
|
|
138
|
+
];
|
|
139
|
+
await syncSchemaObjectNames(trx, op.to, derived.map((derive)=>({
|
|
140
|
+
from: derive(op.from),
|
|
141
|
+
to: derive(op.to)
|
|
142
|
+
})));
|
|
143
|
+
logApplied(comment);
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
/**
|
|
147
|
+
* Rewrites a stored value (e.g. the `field` or `component_type` column of a
|
|
148
|
+
* component link table). Guarded on the table and `guardColumn` (defaults
|
|
149
|
+
* to the first updated column) existing, and on rows matching `where`.
|
|
150
|
+
*/ async updateRows (trx, op) {
|
|
151
|
+
const comment = fileBuilder.getOperationComment({
|
|
152
|
+
kind: 'updateRows',
|
|
153
|
+
...op
|
|
154
|
+
});
|
|
155
|
+
const [firstSetColumn] = Object.keys(op.set);
|
|
156
|
+
const guardColumn = op.guardColumn ?? firstSetColumn;
|
|
157
|
+
if (!await hasTable(trx, op.table)) {
|
|
158
|
+
logSkip(comment, `table "${op.table}" does not exist`, 'source-missing');
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
if (!await hasColumn(trx, op.table, guardColumn)) {
|
|
162
|
+
logSkip(comment, `column "${op.table}.${guardColumn}" does not exist`, 'source-missing');
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
// Scope: every `where` key except the renamed column(s).
|
|
166
|
+
const scope = Object.fromEntries(Object.entries(op.where).filter(([key])=>!(key in op.set)));
|
|
167
|
+
const countRows = async (where)=>{
|
|
168
|
+
const [row] = await tableOf(trx, op.table).where(where).count({
|
|
169
|
+
count: '*'
|
|
170
|
+
});
|
|
171
|
+
return Number(row?.count ?? 0);
|
|
172
|
+
};
|
|
173
|
+
// Without source rows there is nothing to rename. Rows carrying the
|
|
174
|
+
// target value may then be the ones a previous run already renamed, so
|
|
175
|
+
// they must not be taken for orphans.
|
|
176
|
+
if (await countRows(op.where) === 0) {
|
|
177
|
+
if (await countRows({
|
|
178
|
+
...scope,
|
|
179
|
+
...op.set
|
|
180
|
+
}) > 0) {
|
|
181
|
+
logSkip(comment, `no row matches ${JSON.stringify(op.where)} in "${op.table}"; rows already matching ${JSON.stringify(op.set)} were left untouched, the rename may already have run`, 'target-exists');
|
|
182
|
+
} else {
|
|
183
|
+
logSkip(comment, `no row matches ${JSON.stringify(op.where)} in "${op.table}"`, 'source-missing');
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
// Rows already carrying the target value are orphans (left behind when
|
|
188
|
+
// an attribute with the target name was deleted earlier). Updating would
|
|
189
|
+
// merge them into the renamed field and resurrect deleted content, so
|
|
190
|
+
// they go first.
|
|
191
|
+
const removed = await tableOf(trx, op.table).where({
|
|
192
|
+
...scope,
|
|
193
|
+
...op.set
|
|
194
|
+
}).delete();
|
|
195
|
+
if (removed > 0) {
|
|
196
|
+
db.logger.info(`[rename migration] removed ${removed} orphan row(s) already matching ${JSON.stringify(op.set)} in "${op.table}" before: ${comment}`);
|
|
197
|
+
}
|
|
198
|
+
await tableOf(trx, op.table).where(op.where).update(op.set);
|
|
199
|
+
logApplied(comment);
|
|
200
|
+
return true;
|
|
201
|
+
},
|
|
202
|
+
/**
|
|
203
|
+
* Registers a handler for `applyAttributeRenames`. Plugins that keep data
|
|
204
|
+
* keyed by attribute name register one during their register phase, before
|
|
205
|
+
* user migrations run. Returns a function that unregisters it.
|
|
206
|
+
*/ registerAttributeRenameHandler (handler) {
|
|
207
|
+
attributeRenameHandlers.add(handler);
|
|
208
|
+
return ()=>{
|
|
209
|
+
attributeRenameHandlers.delete(handler);
|
|
210
|
+
};
|
|
211
|
+
},
|
|
212
|
+
/**
|
|
213
|
+
* Dispatches one save's attribute renames to every registered handler, in
|
|
214
|
+
* registration order, inside `trx`. The database package itself stores
|
|
215
|
+
* nothing keyed by attribute name, so with no handler this is a no-op.
|
|
216
|
+
*/ async applyAttributeRenames (trx, op) {
|
|
217
|
+
const comment = fileBuilder.getOperationComment({
|
|
218
|
+
kind: 'attributeRenames',
|
|
219
|
+
...op
|
|
220
|
+
});
|
|
221
|
+
if (attributeRenameHandlers.size === 0) {
|
|
222
|
+
db.logger.debug(`[rename migration] skipped: ${comment} (no handler registered)`);
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
for (const handler of attributeRenameHandlers){
|
|
226
|
+
await handler(trx, op.renames);
|
|
227
|
+
}
|
|
228
|
+
logApplied(comment);
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
exports.createRenameHelpers = createRenameHelpers;
|
|
235
|
+
//# sourceMappingURL=rename-helpers.js.map
|