Files
pole-book/server/node_modules/@strapi/database/dist/schema/builder.mjs.map

1 line
27 KiB
Plaintext

{"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 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\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 // 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 return {\n createTable,\n alterTable,\n dropTable,\n createTableForeignKeys,\n dropTableForeignKeys,\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","updated","indexes","schemaInspector","getIndexes","foreignKeys","getForeignKeys","added","removed","dropTableForeignKeys","alterTable","endSchemaUpdate","createForeignKey","tableBuilder","foreignKey","columns","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","client","filter","includes","removedIndex","updatedIndex","removedColumn","updatedColumn","alter","addedColumn","canAddIncrements","integer","addedForeignKey","addedIndex","dropTableIfExists"],"mappings":"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"}