@depup/typeorm-extension 4.0.0-depup.0 → 4.1.0-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["read","read","buildColumnDefinition","process","mongoRunner"],"sources":["../src/errors/base.ts","../src/errors/driver.ts","../src/errors/entity-metadata.ts","../src/errors/entity-relation-lookup.ts","../src/errors/options.ts","../src/errors/schema.ts","../src/errors/schema-alteration.ts","../src/database/core/cockroachdb/statements.ts","../src/database/core/cockroachdb/module.ts","../src/database/core/mongodb/statements.ts","../src/database/core/mongodb/module.ts","../src/database/core/mongodb/uri.ts","../src/database/core/mssql/statements.ts","../src/database/core/mssql/module.ts","../src/database/core/mysql/statements.ts","../src/database/core/mysql/module.ts","../src/database/core/oracle/statements.ts","../src/database/core/oracle/module.ts","../src/database/core/params.ts","../src/utils/code-transformation/constants.ts","../src/utils/code-transformation/module.ts","../src/utils/separator.ts","../src/utils/slash.ts","../src/utils/file-path.ts","../src/utils/file-system.ts","../src/utils/has-property.ts","../src/utils/object.ts","../src/utils/path-resolver/constants.ts","../src/utils/tsconfig/module.ts","../src/utils/path-resolver/module.ts","../src/utils/path-resolver/helpers/adjust-file-path.ts","../src/utils/path-resolver/helpers/adjust-file-paths.ts","../src/utils/promise.ts","../src/database/core/utils.ts","../src/database/core/postgres/statements.ts","../src/database/core/postgres/module.ts","../src/database/core/sqlite/path.ts","../src/database/core/sqlite/module.ts","../src/data-source/find/module.ts","../src/env/constants.ts","../src/runtime/cache.ts","../src/runtime/module.ts","../src/env/utils.ts","../src/env/module.ts","../src/data-source/options/utils/merge.ts","../src/data-source/options/utils/env.ts","../src/data-source/options/module.ts","../src/data-source/options/singleton.ts","../src/data-source/singleton.ts","../src/database/methods/check/module.ts","../src/database/utils/context.ts","../src/database/adapters/typeorm-driver.ts","../src/database/adapters/mongodb.ts","../src/database/adapters/mssql.ts","../src/database/adapters/utils.ts","../src/database/adapters/mysql.ts","../src/database/adapters/node-fs.ts","../src/database/adapters/oracle.ts","../src/database/adapters/postgres.ts","../src/database/registry.ts","../src/database/schema/alter/dialect.ts","../src/database/schema/alter/utils.ts","../src/database/schema/alter/checks.ts","../src/database/schema/alter/statements.ts","../src/database/schema/alter/columns.ts","../src/database/schema/alter/foreign-keys.ts","../src/database/schema/alter/indices.ts","../src/database/schema/utils.ts","../src/database/schema/drift/module.ts","../src/database/schema/synchronize.ts","../src/database/methods/execute.ts","../src/database/methods/create/module.ts","../src/database/methods/drop/module.ts","../src/database/utils/migration.ts","../src/database/utils/query.ts","../src/database/driver/cockroachdb.ts","../src/database/driver/mongodb.ts","../src/database/driver/mssql.ts","../src/database/driver/mysql.ts","../src/database/driver/oracle.ts","../src/database/driver/postgres.ts","../src/database/driver/sqlite.ts","../src/helpers/entity/name.ts","../src/helpers/entity/metadata.ts","../src/helpers/entity/property-names.ts","../src/helpers/entity/join-columns.ts","../src/helpers/entity/uniqueness.ts","../src/seeder/config.ts","../src/seeder/entity.ts","../src/seeder/factory/module.ts","../src/seeder/factory/manager.ts","../src/seeder/utils/file-name.ts","../src/seeder/utils/file-path.ts","../src/seeder/utils/prepare.ts","../src/seeder/utils/template.ts","../src/seeder/factory/utils.ts","../src/seeder/executor.ts","../src/seeder/module.ts"],"sourcesContent":["export class TypeormExtensionError extends Error {\n\n}\n","import { TypeormExtensionError } from './base';\n\nexport class DriverError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'A database driver related error has occurred.');\n }\n\n static undeterminable() {\n return new DriverError('The driver could not be determined.');\n }\n\n static notSupported(driverName: string) {\n return new DriverError(`The driver ${driverName} is not supported yet.`);\n }\n\n static schemaAlterationNotSupported(driverName: string) {\n return new DriverError(`Schema alterations are not supported for the driver ${driverName}.`);\n }\n\n static columnConversionExpressionNotSupported(driverName: string) {\n return new DriverError(\n `A conversion expression (\\`using\\`) can not be expressed for the driver ${driverName}, ` +\n 'which would convert the values on its own terms instead.',\n );\n }\n\n static columnGenerationExpressionUnknown(columnName: string) {\n return new DriverError(\n `The generation expression of the column ${columnName} could not be read back, ` +\n 'and altering it would turn it into a regular column.',\n );\n }\n\n static connectionClosed() {\n return new DriverError('The database connection has already been closed.');\n }\n\n static databaseNotFound(database: string) {\n return new DriverError(`The database ${database} does not exist.`);\n }\n}\n","import { TypeormExtensionError } from './base';\n\nexport class EntityMetadataError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'An entity metadata related error has occurred');\n }\n\n static notRegistered(name: string) {\n return new EntityMetadataError(`The entity ${name} is not registered.`);\n }\n}\n","import { TypeormExtensionError } from './base';\n\ntype EntityRelationLookupErrorOptions = {\n message: string,\n relation: string,\n columns: string[]\n};\n\nexport class EntityRelationLookupError extends TypeormExtensionError {\n /**\n * The property name of the relation.\n */\n public relation: string;\n\n /**\n * The property names of the join columns.\n */\n public columns: string[];\n\n constructor(options: EntityRelationLookupErrorOptions) {\n super(options.message);\n\n this.relation = options.relation;\n this.columns = options.columns;\n }\n\n static notReferenced(relation: string, columns: string[]) {\n return new EntityRelationLookupError({\n message: `${relation} entity is not referenced by ${columns.join(', ')}`,\n relation,\n columns,\n });\n }\n\n static notFound(relation: string, columns: string[]) {\n return new EntityRelationLookupError({\n message: `Can't find ${relation} entity by ${columns.join(', ')}`,\n relation,\n columns,\n });\n }\n}\n","import { TypeormExtensionError } from './base';\n\nexport class OptionsError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'A database options related error has occurred');\n }\n\n static undeterminable() {\n return new OptionsError('The database options could not be determined.');\n }\n\n static notFound() {\n return new OptionsError('The database options could not be located/loaded.');\n }\n\n static databaseNotDefined() {\n return new OptionsError('The database name to connect to is not defined.');\n }\n}\n","import type { SchemaDriftStatement } from '../database/schema/drift/type';\nimport { TypeormExtensionError } from './base';\n\nfunction buildMessage(statements: SchemaDriftStatement[]): string {\n const lines = statements.map((statement) => (\n statement.parameters && statement.parameters.length > 0 ?\n `${statement.query} -- ${JSON.stringify(statement.parameters)}` :\n statement.query\n ));\n\n return [\n `The database schema deviates from the entity metadata (${statements.length} statement(s) required to reconcile it):`,\n ...lines,\n ].join('\\n');\n}\n\nexport class SchemaDriftError extends TypeormExtensionError {\n /**\n * The statements which would reconcile the database schema\n * with the entity metadata.\n */\n readonly statements: SchemaDriftStatement[];\n\n constructor(statements: SchemaDriftStatement[] = [], message?: string) {\n super(message || buildMessage(statements));\n\n this.statements = statements;\n }\n\n static detected(statements: SchemaDriftStatement[]) {\n return new SchemaDriftError(statements);\n }\n}\n","import { TypeormExtensionError } from './base';\n\n/**\n * The database is in neither the state the alteration expects nor the one it\n * would produce, so there is nothing it can safely do.\n *\n * Raised instead of returning quietly, because a repair migration which does\n * not repair anything is indistinguishable from a successful one — the guard\n * exists to make a run resumable, not to swallow a wrong description of the\n * database.\n */\nexport class SchemaAlterationError extends TypeormExtensionError {\n static tableNotFound(table: string) {\n return new SchemaAlterationError(\n `The table ${table} does not exist.`,\n );\n }\n\n static columnNotFound(table: string, column: string) {\n return new SchemaAlterationError(\n `The column ${column} does not exist in the table ${table}.`,\n );\n }\n\n static columnMismatch(table: string, column: string) {\n return new SchemaAlterationError(\n `The column ${column} of the table ${table} matches neither the current ` +\n 'nor the desired type description.',\n );\n }\n\n static indexNotFound(table: string, name: string) {\n return new SchemaAlterationError(\n `Neither an index named ${name} nor the renamed one exists on the table ${table}.`,\n );\n }\n\n static foreignKeyNotFound(table: string, name: string) {\n return new SchemaAlterationError(\n `Neither a foreign key named ${name} nor the renamed one exists on the table ${table}. ` +\n 'Pass `meta` to restore a constraint an interrupted run left behind.',\n );\n }\n}\n","/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/cockroachdb/CockroachQueryRunner.ts#L347\n *\n * The double space after the IF NOT EXISTS clause is preserved\n * from the previous implementation.\n */\nexport function buildCockroachDBCreateDatabaseQuery(database: string, ifNotExist: boolean): string {\n return `CREATE DATABASE ${ifNotExist ? 'IF NOT EXISTS ' : ''} \"${database}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/cockroachdb/CockroachQueryRunner.ts#L356\n */\nexport function buildCockroachDBDropDatabaseQuery(database: string, ifExist: boolean): string {\n return `DROP DATABASE ${ifExist ? 'IF EXISTS ' : ''} \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n buildCockroachDBCreateDatabaseQuery,\n buildCockroachDBDropDatabaseQuery,\n} from './statements';\n\nexport class CockroachDBDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildCockroachDBCreateDatabaseQuery(\n operation.params.database as string,\n operation.ifNotExist,\n ),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildCockroachDBDropDatabaseQuery(\n operation.params.database as string,\n operation.ifExist,\n ),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","/**\n * MongoDB statements are JSON encoded command documents,\n * executed via db.command() by the adapter.\n *\n * @link https://www.mongodb.com/docs/manual/reference/command/dropDatabase/\n */\nexport function buildMongoDBDropDatabaseCommand(): string {\n return JSON.stringify({ dropDatabase: 1 });\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { buildMongoDBDropDatabaseCommand } from './statements';\n\nexport class MongoDBDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n /**\n * Connecting to the target database creates it lazily server side.\n */\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.params.database);\n await connection.open();\n await connection.close();\n\n return undefined;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.params.database);\n await connection.open();\n\n try {\n return await connection.execute(buildMongoDBDropDatabaseCommand());\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\nexport function buildMongoDBConnectionUri(params: ConnectionParams, database?: string): string {\n let uri = 'mongodb://';\n\n if (params.user && params.password) {\n uri += `${encodeURIComponent(params.user)}:${encodeURIComponent(params.password)}@`;\n }\n\n uri += `${params.host || '127.0.0.1'}:${params.port || 27017}/${database ?? params.database}`;\n\n if (params.ssl) {\n uri += '?tls=true';\n }\n\n return uri;\n}\n","import type { ConnectionParams } from '../type';\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/sqlserver/SqlServerQueryRunner.ts#L416\n *\n * NOTE: the previous implementation appended a `CHARACTER SET` clause,\n * which is not valid T-SQL (SQL Server uses `COLLATE <collation_name>`).\n * The clause was removed; a proper collation option is future work.\n */\nexport function buildMsSQLCreateDatabaseQuery(params: ConnectionParams, ifNotExist: boolean): string {\n return ifNotExist ?\n `IF DB_ID('${params.database}') IS NULL CREATE DATABASE \"${params.database}\"` :\n `CREATE DATABASE \"${params.database}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/sqlserver/SqlServerQueryRunner.ts#L425\n */\nexport function buildMsSQLDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `IF DB_ID('${database}') IS NOT NULL DROP DATABASE \"${database}\"` :\n `DROP DATABASE \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n buildMsSQLCreateDatabaseQuery,\n buildMsSQLDropDatabaseQuery,\n} from './statements';\n\nexport class MsSQLDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMsSQLCreateDatabaseQuery(operation.params, operation.ifNotExist),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMsSQLDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_OFF = 'SET FOREIGN_KEY_CHECKS=0;';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_ON = 'SET FOREIGN_KEY_CHECKS=1;';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_SELECT = 'SELECT @@SESSION.foreign_key_checks AS `value`;';\n\n/**\n * Infer the CHARACTER SET from a collation (charset) when it is not\n * explicitly configured, e.g. utf8mb4_general_ci -> utf8mb4.\n */\nexport function deriveMySQLCharacterSet(charset: string, characterSet?: string): string | undefined {\n if (typeof characterSet === 'string') {\n return characterSet;\n }\n\n if (charset.toLowerCase().startsWith('utf8mb4')) {\n return 'utf8mb4';\n }\n\n if (charset.toLowerCase().startsWith('utf8')) {\n return 'utf8';\n }\n\n return undefined;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/mysql/MysqlQueryRunner.ts#L297\n */\nexport function buildMySQLCreateDatabaseQuery(params: ConnectionParams, ifNotExist: boolean): string {\n let query = ifNotExist ?\n `CREATE DATABASE IF NOT EXISTS \\`${params.database}\\`` :\n `CREATE DATABASE \\`${params.database}\\``;\n\n if (typeof params.charset === 'string') {\n const characterSet = deriveMySQLCharacterSet(params.charset, params.characterSet);\n\n if (typeof characterSet === 'string') {\n query += ` CHARACTER SET ${characterSet} COLLATE ${params.charset}`;\n }\n }\n\n return query;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/mysql/MysqlQueryRunner.ts#L306\n */\nexport function buildMySQLDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `DROP DATABASE IF EXISTS \\`${database}\\`` :\n `DROP DATABASE \\`${database}\\``;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n MYSQL_FOREIGN_KEY_CHECKS_OFF,\n MYSQL_FOREIGN_KEY_CHECKS_ON,\n buildMySQLCreateDatabaseQuery,\n buildMySQLDropDatabaseQuery,\n} from './statements';\n\n/**\n * Serves mysql AND mariadb.\n */\nexport class MySQLDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMySQLCreateDatabaseQuery(operation.params, operation.ifNotExist),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n await connection.execute(MYSQL_FOREIGN_KEY_CHECKS_OFF);\n\n try {\n return await connection.execute(\n buildMySQLDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.execute(MYSQL_FOREIGN_KEY_CHECKS_ON);\n }\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\n/**\n * Assemble the TNS connect descriptor when none is configured.\n */\nexport function buildOracleConnectString(params: ConnectionParams): string {\n let address = '(PROTOCOL=TCP)';\n\n if (params.host) {\n address += `(HOST=${params.host})`;\n }\n\n if (params.port) {\n address += `(PORT=${params.port})`;\n }\n\n let connectData = '(SERVER=DEDICATED)';\n\n if (params.sid) {\n connectData += `(SID=${params.sid})`;\n }\n\n if (params.serviceName) {\n connectData += `(SERVICE_NAME=${params.serviceName})`;\n }\n\n return `(DESCRIPTION=(ADDRESS=${address})(CONNECT_DATA=${connectData}))`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/oracle/OracleQueryRunner.ts#L295\n *\n * NOTE: IF NOT EXISTS is not valid Oracle SQL. The statement is preserved\n * byte-for-byte from the previous implementation for fidelity — changing\n * it is a semantic decision, not a refactor side effect.\n */\nexport function buildOracleCreateDatabaseQuery(database: string): string {\n return `CREATE DATABASE IF NOT EXISTS ${database}`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { buildOracleCreateDatabaseQuery } from './statements';\n\nexport class OracleDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildOracleCreateDatabaseQuery(operation.params.database as string),\n );\n } finally {\n await connection.close();\n }\n }\n\n /**\n * Dropping a database is not supported for oracle\n * (preserved behaviour of the previous implementation).\n */\n async drop(_operation: DatabaseDropOperation): Promise<unknown> {\n return Promise.resolve();\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverUtils } from 'typeorm/driver/DriverUtils';\nimport type { ConnectionParams } from './type';\n\nfunction readStringOption(options: DataSourceOptions, key: string): string | undefined {\n const record = options as Record<string, any>;\n\n if (typeof record[key] === 'string') {\n return record[key];\n }\n\n if (typeof record.extra?.[key] === 'string') {\n return record.extra[key];\n }\n\n return undefined;\n}\n\nexport function buildConnectionParams(options: DataSourceOptions): ConnectionParams {\n let driverOptions: Record<string, any>;\n\n switch (options.type) {\n case 'mysql':\n case 'mariadb':\n case 'postgres':\n case 'cockroachdb':\n case 'mssql':\n case 'oracle':\n driverOptions = DriverUtils.buildDriverOptions(options.replication ? options.replication.master : options);\n break;\n case 'mongodb':\n driverOptions = DriverUtils.buildMongoDBDriverOptions(options);\n break;\n default:\n driverOptions = DriverUtils.buildDriverOptions(options);\n }\n\n const charset = readStringOption(options, 'charset');\n const characterSet = readStringOption(options, 'characterSet');\n\n return {\n host: driverOptions.host,\n user: driverOptions.user || driverOptions.username,\n password: driverOptions.password,\n database: driverOptions.database,\n port: driverOptions.port,\n ...(charset ? { charset } : {}),\n ...(characterSet ? { characterSet } : {}),\n ...(driverOptions.ssl ? { ssl: driverOptions.ssl } : {}),\n ...(driverOptions.url ? { url: driverOptions.url } : {}),\n ...(driverOptions.connectString ? { connectString: driverOptions.connectString } : {}),\n ...(driverOptions.sid ? { sid: driverOptions.sid } : {}),\n ...(driverOptions.serviceName ? { serviceName: driverOptions.serviceName } : {}),\n ...(driverOptions.template ? { template: driverOptions.template } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n // typeorm hands its own driver its options.options (e.g. the tedious config\n // of the mssql driver) — create/drop must connect with the same settings\n ...(driverOptions.options ? { driverOptions: driverOptions.options } : {}),\n ...(driverOptions.domain ? { domain: driverOptions.domain } : {}),\n ...(driverOptions.schema ? { schema: driverOptions.schema } : {}),\n };\n}\n","export enum CodeTransformation {\n JUST_IN_TIME = 'jit',\n NONE = 'none',\n}\n","import { isTsNodeRuntimeEnvironment, isTsxRuntimeEnvironment } from 'locter';\nimport { CodeTransformation } from './constants';\n\nexport function detectCodeTransformation() : `${CodeTransformation}` {\n if (\n isTsNodeRuntimeEnvironment() ||\n isTsxRuntimeEnvironment()\n ) {\n return CodeTransformation.JUST_IN_TIME;\n }\n\n return CodeTransformation.NONE;\n}\n\nexport function isCodeTransformation(input: string) {\n return detectCodeTransformation() === input;\n}\n","export function canReplaceWindowsSeparator(input: string) : boolean {\n // https://superuser.com/questions/176388/why-does-windows-use-backslashes-for-paths-and-unix-forward-slashes/176395#176395\n if (input.startsWith('\\\\\\\\?\\\\')) {\n return false;\n }\n\n let characterIndex: number;\n\n const specialCharacters = ['[', '{', '(', '^', '$', '.', '|', '?', '*', '+'];\n for (const specialCharacter of specialCharacters) {\n characterIndex = input.indexOf(specialCharacter);\n if (characterIndex !== -1) {\n // special character is prefixed with \\, no transformation allowed\n if (characterIndex !== 0 && input[characterIndex - 1] === '\\\\') {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function replaceWindowSeparator(input: string) {\n return input.replace(/\\\\/g, '/');\n}\n\nexport function safeReplaceWindowsSeparator(input: string): string {\n if (!input.includes('\\\\') || !canReplaceWindowsSeparator(input)) {\n return input;\n }\n\n return replaceWindowSeparator(input);\n}\n","const TRAILING_SLASH_RE = /\\/$|\\/\\?/;\n\nexport function hasTrailingSlash(input = '', queryParams = false): boolean {\n if (!queryParams) {\n return input.endsWith('/');\n }\n\n return TRAILING_SLASH_RE.test(input);\n}\n\nexport function withoutTrailingSlash(input = '', queryParams = false): string {\n if (!queryParams) {\n return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || '/';\n }\n\n if (!hasTrailingSlash(input, true)) {\n return input || '/';\n }\n\n const [s0, ...s] = input.split('?');\n\n return (s0.slice(0, -1) || '/') + (s.length ? `?${s.join('?')}` : '');\n}\n","import path from 'node:path';\nimport { canReplaceWindowsSeparator, replaceWindowSeparator } from './separator';\nimport { withoutTrailingSlash } from './slash';\n\nconst stripLeadingModifier = (text: string) => {\n if (text.startsWith('./')) {\n text = text.substring(2);\n }\n\n return text;\n};\n\nexport function transformFilePath(\n input: string,\n dist?: string,\n src?: string,\n): string {\n let separator = path.sep;\n const windowsSeparatorReplaceable = canReplaceWindowsSeparator(input);\n if (windowsSeparatorReplaceable) {\n separator = '/';\n input = replaceWindowSeparator(input);\n }\n\n let base = input;\n let baseIndex = input.lastIndexOf(separator);\n if (baseIndex !== -1) {\n base = base.substring(baseIndex + 1);\n }\n\n if (src) {\n if (windowsSeparatorReplaceable) {\n src = replaceWindowSeparator(src);\n }\n\n src = withoutTrailingSlash(stripLeadingModifier(src));\n }\n src = src || 'src';\n\n if (dist) {\n if (windowsSeparatorReplaceable) {\n dist = replaceWindowSeparator(dist);\n }\n\n dist = withoutTrailingSlash(stripLeadingModifier(dist));\n }\n dist = dist || 'dist';\n\n if (\n input.includes(src) &&\n !input.includes(dist)\n ) {\n const lastIndex = input.lastIndexOf(src);\n const prevCharacter = input.substring(lastIndex - 1, lastIndex);\n if (!prevCharacter || prevCharacter === separator) {\n input = input.substring(0, lastIndex) +\n dist +\n input.substring(lastIndex + src.length);\n\n baseIndex = input.lastIndexOf(separator);\n }\n }\n\n const jsExtensions = ['js', 'cjs', 'mjs'];\n\n // if the path already contains a js-family file extension (as a real\n // extension at end-of-name or inside a glob brace expansion, not just\n // anywhere in the basename — `my-json.ts` must still be transformable),\n // we are done.\n const jsExtensionRegex = /(?:^|[./{,])(?:js|cjs|mjs)(?:[}.,]|$)/;\n if (jsExtensionRegex.test(base)) {\n return input;\n }\n\n const tsExtensions = ['ts', 'cts', 'mts'];\n for (const [i, tsExtension] of tsExtensions.entries()) {\n const regex = new RegExp(`(\\\\.${tsExtension}|${tsExtension})`, 'g');\n let matchesSum: number | undefined;\n const matches = base.match(regex);\n if (Array.isArray(matches)) {\n matchesSum = matches.length;\n }\n\n let matchesCounter = 0;\n\n const bracketIndex = base.lastIndexOf('{');\n base = base.replace(\n regex,\n (...args) => {\n matchesCounter++;\n\n // if the file extension name comes after the last bracket index,\n // we can be pretty sure that the extension name is not part of a filename\n if (\n (args[2] >= bracketIndex && bracketIndex !== -1) ||\n (bracketIndex === -1 && matchesCounter === matchesSum)\n ) {\n return args[0].startsWith('.') ? `.${jsExtensions[i]}` : jsExtensions[i];\n }\n\n return args[0];\n },\n );\n }\n\n if (baseIndex !== -1) {\n base = input.substring(0, baseIndex + 1) + base;\n }\n\n return stripLeadingModifier(base);\n}\n\nexport function resolveFilePath(filePath: string, root?: string) {\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n\n return filePath.startsWith('/') ?\n filePath :\n path.resolve(root || process.cwd(), filePath);\n}\n\nexport function parseFilePath(filePath: string, root?: string) {\n const fullPath = resolveFilePath(filePath, root);\n\n const directory = path.dirname(fullPath);\n const name = path.basename(fullPath);\n\n return {\n directory,\n name,\n };\n}\n","import fs from 'node:fs';\n\nexport async function isDirectory(input: string) : Promise<boolean> {\n try {\n const stat = await fs.promises.stat(input);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n","export function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function hasStringProperty<X extends Record<string, any>, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, string> {\n return hasOwnProperty(obj, prop) &&\n typeof obj[prop] === 'string';\n}\n","export function pickRecord(data: Record<string, any>, keys: string[]) {\n const output : Record<string, any> = {};\n for (const key of keys) {\n output[key] = data[key];\n }\n\n return output;\n}\n\nexport function extendObject<T extends Record<string, any>>(\n target: T,\n source: Partial<T>,\n) : T {\n const keys = Object.keys(source);\n for (const key of keys) {\n target[key as keyof T] = source[key] as T[keyof T];\n }\n\n return target;\n}\n\nexport function isObject(item: unknown) : item is Record<string, any> {\n return (\n !!item &&\n typeof item === 'object' &&\n !Array.isArray(item)\n );\n}\n","export enum PathResolverMode {\n AUTO = 'auto',\n PRESERVE = 'preserve',\n TRANSFORM = 'transform',\n}\n","import { read } from 'locter';\nimport { isObject } from '../object';\nimport path from 'node:path';\nimport type { TSConfig } from './type';\n\nexport async function readTSConfig(input?: string) : Promise<TSConfig> {\n input = input || process.cwd();\n input = path.isAbsolute(input) ?\n input :\n path.resolve(process.cwd(), input);\n\n const filePath = !input.includes('.json') ?\n path.join(input, 'tsconfig.json') :\n input;\n\n try {\n const tsConfig = await read(filePath);\n\n if (isObject(tsConfig)) {\n return tsConfig;\n }\n } catch {\n // don't do anything ;)\n }\n\n return {};\n}\n","import { isObject } from '../object';\nimport { CodeTransformation, isCodeTransformation } from '../code-transformation';\nimport { resolveFilePath, transformFilePath } from '../file-path';\nimport type { TSConfig } from '../tsconfig';\nimport { readTSConfig } from '../tsconfig';\nimport { PathResolverMode } from './constants';\nimport type { IPathResolver, PathResolverOptions } from './type';\n\nexport class PathResolver implements IPathResolver {\n protected root?: string;\n\n protected mode: `${PathResolverMode}`;\n\n protected tsconfigInput?: string | TSConfig;\n\n protected tsconfigPromise?: Promise<TSConfig>;\n\n constructor(options: PathResolverOptions = {}) {\n this.root = options.root;\n this.mode = options.mode || PathResolverMode.AUTO;\n this.tsconfigInput = options.tsconfig;\n }\n\n absolutize(input: string) : string {\n return resolveFilePath(input, this.root);\n }\n\n async resolve(input: string) : Promise<string> {\n return this.transform(this.absolutize(input));\n }\n\n async transform(input: string) : Promise<string> {\n if (!this.shouldTransform()) {\n return input;\n }\n\n const { compilerOptions } = await this.tsconfig();\n\n return transformFilePath(input, compilerOptions?.outDir);\n }\n\n async transformKeys<T extends Record<string, any>>(\n input: T,\n keys?: (keyof T)[],\n ) : Promise<T> {\n if (!this.shouldTransform()) {\n return input;\n }\n\n keys = keys || Object.keys(input);\n\n for (const key of keys) {\n const value = input[key];\n\n if (typeof value === 'string') {\n input[key] = await this.transform(value) as T[keyof T];\n continue;\n }\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] === 'string') {\n value[i] = await this.transform(value[i]);\n }\n }\n }\n }\n\n return input;\n }\n\n async tsconfig() : Promise<TSConfig> {\n if (!this.tsconfigPromise) {\n this.tsconfigPromise = this.readTsconfig();\n }\n\n return this.tsconfigPromise;\n }\n\n protected async readTsconfig() : Promise<TSConfig> {\n if (isObject(this.tsconfigInput)) {\n return this.tsconfigInput;\n }\n\n return readTSConfig(\n resolveFilePath(this.tsconfigInput || 'tsconfig.json', this.root),\n );\n }\n\n protected shouldTransform() : boolean {\n if (this.mode === PathResolverMode.PRESERVE) {\n return false;\n }\n\n if (this.mode === PathResolverMode.TRANSFORM) {\n return true;\n }\n\n return !isCodeTransformation(CodeTransformation.JUST_IN_TIME);\n }\n}\n\nexport function createPathResolver(options: PathResolverOptions = {}) : IPathResolver {\n return new PathResolver(options);\n}\n","import type { TSConfig } from '../../tsconfig';\nimport { createPathResolver } from '../module';\n\nexport async function adjustFilePath<T extends unknown | unknown[]>(\n input: T,\n tsconfig?: string | TSConfig,\n) : Promise<T> {\n const resolver = createPathResolver({ tsconfig });\n\n if (typeof input === 'string') {\n return await resolver.transform(input) as T;\n }\n\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n if (typeof input[i] === 'string') {\n input[i] = await resolver.transform(input[i]);\n }\n }\n }\n\n return input;\n}\n","import type { TSConfig } from '../../tsconfig';\nimport { createPathResolver } from '../module';\n\nexport async function adjustFilePaths<T extends Record<string, any>>(\n input: T,\n keys?: (keyof T)[],\n tsconfig?: string | TSConfig,\n) : Promise<T> {\n return createPathResolver({ tsconfig }).transformKeys(input, keys);\n}\n","import { isObject } from './object';\n\nexport function isPromise(p: unknown): p is Promise<unknown> {\n return isObject(p) &&\n (\n p instanceof Promise ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof p.then === 'function'\n );\n}\n","import { hasOwnProperty, isObject } from '../../utils';\n\nexport function hasResultRows(input: unknown): boolean {\n return isObject(input) &&\n hasOwnProperty(input, 'rows') &&\n Array.isArray(input.rows) &&\n input.rows.length > 0;\n}\n","import type { ConnectionParams } from '../type';\n\nexport function buildPostgresDatabaseExistsQuery(database: string): string {\n return `SELECT * FROM pg_database WHERE lower(datname) = lower('${database}');`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/postgres/PostgresQueryRunner.ts#L326\n */\nexport function buildPostgresCreateDatabaseQuery(params: ConnectionParams): string {\n let query = `CREATE DATABASE \"${params.database}\"`;\n\n if (typeof params.template === 'string') {\n query += ` TEMPLATE \"${params.template}\"`;\n } else if (typeof params.characterSet === 'string') {\n query += ` WITH ENCODING '${params.characterSet}'`;\n }\n\n return query;\n}\n\nexport function buildPostgresCreateSchemaQuery(schema: string): string {\n return `CREATE SCHEMA IF NOT EXISTS \"${schema}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/postgres/PostgresQueryRunner.ts#L343\n */\nexport function buildPostgresDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `DROP DATABASE IF EXISTS \"${database}\"` :\n `DROP DATABASE \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { hasResultRows } from '../utils';\nimport {\n buildPostgresCreateDatabaseQuery,\n buildPostgresCreateSchemaQuery,\n buildPostgresDatabaseExistsQuery,\n buildPostgresDropDatabaseQuery,\n} from './statements';\n\nexport class PostgresDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const { params } = operation;\n\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n let exists = false;\n let result: unknown;\n\n try {\n if (operation.ifNotExist) {\n const existsResult = await connection.execute(\n buildPostgresDatabaseExistsQuery(params.database as string),\n );\n\n exists = hasResultRows(existsResult);\n }\n\n if (!exists) {\n result = await connection.execute(buildPostgresCreateDatabaseQuery(params));\n }\n } finally {\n await connection.close();\n }\n\n if (exists) {\n return undefined;\n }\n\n /**\n * CREATE DATABASE cannot run in a transaction, and the schema lives\n * inside the new database — hence a second connection, targeted at it.\n */\n if (typeof params.schema === 'string' && params.schema !== 'public') {\n const schemaConnection = this.connectionFactory.create(params.database);\n await schemaConnection.open();\n\n try {\n await schemaConnection.execute(buildPostgresCreateSchemaQuery(params.schema));\n } finally {\n await schemaConnection.close();\n }\n }\n\n return result;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildPostgresDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","import path from 'node:path';\n\nexport function resolveSQLiteDatabasePath(database: string, cwd: string): string {\n return path.isAbsolute(database) ?\n database :\n path.join(cwd, database);\n}\n\nexport function resolveSQLiteDatabaseDirectory(database: string, cwd: string): string {\n return path.dirname(resolveSQLiteDatabasePath(database, cwd));\n}\n","import { DriverError, OptionsError } from '../../../errors';\nimport type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseDialect,\n IFileSystem,\n} from '../type';\nimport { resolveSQLiteDatabaseDirectory, resolveSQLiteDatabasePath } from './path';\n\n/**\n * better-sqlite3 never opens a server connection —\n * create/drop are filesystem effects following SQL database semantics:\n * create produces the file (or fails when it exists, unless ifNotExist),\n * drop removes it (or fails when it is missing, unless ifExist).\n */\nexport class SQLiteDialect implements IDatabaseDialect {\n constructor(\n protected fs: IFileSystem,\n protected cwd: string,\n ) {\n this.fs = fs;\n this.cwd = cwd;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n if (!operation.params.database) {\n throw OptionsError.databaseNotDefined();\n }\n\n const filePath = resolveSQLiteDatabasePath(operation.params.database, this.cwd);\n const directoryPath = resolveSQLiteDatabaseDirectory(operation.params.database, this.cwd);\n\n await this.fs.assertDirectoryWritable(directoryPath);\n\n if (operation.ifNotExist && await this.fs.isFileWritable(filePath)) {\n return undefined;\n }\n\n await this.fs.createFile(filePath);\n\n return undefined;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n if (!operation.params.database) {\n throw OptionsError.databaseNotDefined();\n }\n\n const filePath = resolveSQLiteDatabasePath(operation.params.database, this.cwd);\n\n const removed = await this.fs.removeFile(filePath);\n\n if (!removed && !operation.ifExist) {\n throw DriverError.databaseNotFound(operation.params.database);\n }\n\n return undefined;\n }\n}\n","import {\n locate,\n readAsModule,\n removeFileNameExtension,\n} from 'locter';\nimport {\n PathResolverMode,\n createPathResolver,\n isObject,\n isPromise,\n safeReplaceWindowsSeparator,\n} from '../../utils';\nimport path from 'node:path';\nimport type { DataSource } from 'typeorm';\nimport { InstanceChecker } from 'typeorm';\nimport type { DataSourceFindOptions } from './type';\n\nexport async function findDataSource(\n context: DataSourceFindOptions = {},\n) : Promise<DataSource | undefined> {\n const pathResolver = createPathResolver({\n tsconfig: context.tsconfig,\n mode: context.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n\n const files : string[] = [\n 'data-source',\n ];\n\n if (context.fileName) {\n context.fileName = removeFileNameExtension(\n context.fileName,\n ['.ts', '.mts', '.cts', '.js', '.mjs', '.cjs'],\n );\n\n if (context.fileName !== 'data-source') {\n files.unshift(context.fileName);\n }\n }\n\n let { directory } = context;\n let directoryIsPattern = false;\n if (context.directory) {\n if (path.isAbsolute(context.directory)) {\n directory = context.directory;\n } else {\n directoryIsPattern = true;\n directory = safeReplaceWindowsSeparator(context.directory);\n }\n\n directory = await pathResolver.transform(directory);\n }\n\n const lookupPaths = [];\n for (const file of files) {\n if (\n directory &&\n directoryIsPattern\n ) {\n lookupPaths.push(path.posix.join(directory, file));\n }\n\n lookupPaths.push(...[\n path.posix.join('src', file),\n path.posix.join('src/{db,database}', file),\n ]);\n }\n\n files.push(...lookupPaths);\n\n for (let j = 0; j < files.length; j++) {\n files[j] = await pathResolver.transform(files[j]);\n }\n\n for (const file of files) {\n const info = await locate(\n `${file}.{js,cjs,mjs,ts,cts,mts}`,\n {\n cwd: [\n process.cwd(),\n ...(directory && !directoryIsPattern ? [directory] : []),\n ],\n ignore: ['**/*.d.ts'],\n },\n );\n\n if (info) {\n let moduleRecord = await readAsModule(info);\n\n if (isPromise(moduleRecord)) {\n moduleRecord = await moduleRecord;\n }\n\n if (InstanceChecker.isDataSource(moduleRecord)) {\n return moduleRecord;\n }\n\n if (!isObject(moduleRecord)) {\n continue;\n }\n\n const keys = Object.keys(moduleRecord);\n for (const key of keys) {\n let value = moduleRecord[key];\n\n if (isPromise(value)) {\n value = await value;\n }\n\n if (InstanceChecker.isDataSource(value)) {\n return value;\n }\n }\n }\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum EnvironmentName {\n DEVELOPMENT = 'development',\n PRODUCTION = 'production',\n TEST = 'test',\n}\n\nexport enum EnvironmentVariableName {\n ENV = 'NODE_ENV',\n\n // Seeder\n SEEDS = 'DB_SEEDS',\n SEEDS_ALT = 'TYPEORM_SEEDING_SEEDS',\n\n FACTORIES = 'DB_FACTORIES',\n FACTORIES_ALT = 'TYPEORM_SEEDING_FACTORIES',\n\n // Database\n TYPE = 'DB_TYPE',\n TYPE_ALT = 'TYPEORM_CONNECTION',\n\n URL = 'DB_URL',\n URL_ALT = 'TYPEORM_URL',\n\n HOST = 'DB_HOST',\n HOST_ALT = 'TYPEORM_HOST',\n\n PORT = 'DB_PORT',\n PORT_ALT = 'TYPEORM_PORT',\n\n USERNAME = 'DB_USERNAME',\n USERNAME_ALT = 'TYPEORM_USERNAME',\n\n PASSWORD = 'DB_PASSWORD',\n PASSWORD_ALT = 'TYPEORM_PASSWORD',\n\n DATABASE = 'DB_DATABASE',\n DATABASE_ALT = 'TYPEORM_DATABASE',\n\n SID = 'DB_SID',\n SID_ALT = 'TYPEORM_SID',\n\n SCHEMA = 'DB_SCHEMA',\n SCHEMA_ALT = 'TYPEORM_SCHEMA',\n\n SCHEMA_DROP = 'DB_DROP_SCHEMA',\n SCHEMA_DROP_ALT = 'TYPEORM_DROP_SCHEMA',\n\n DRIVER_EXTRA = 'DB_DRIVER_EXTRA',\n DRIVER_EXTRA_ALT = 'TYPEORM_DRIVER_EXTRA',\n\n SYNCHRONIZE = 'DB_SYNCHRONIZE',\n SYNCHRONIZE_ALT = 'TYPEORM_SYNCHRONIZE',\n\n MIGRATIONS = 'DB_MIGRATIONS',\n MIGRATIONS_ALT = 'TYPEORM_MIGRATIONS',\n\n MIGRATIONS_RUN = 'DB_MIGRATIONS_RUN',\n MIGRATIONS_RUN_ALT = 'TYPEORM_MIGRATIONS_RUN',\n\n MIGRATIONS_TABLE_NAME = 'DB_MIGRATIONS_TABLE_NAME',\n MIGRATIONS_TABLE_NAME_ALT = 'TYPEORM_MIGRATIONS_TABLE_NAME',\n\n ENTITIES = 'DB_ENTITIES',\n ENTITIES_ALT = 'TYPEORM_ENTITIES',\n\n ENTITY_PREFIX = 'DB_ENTITY_PREFIX',\n ENTITY_PREFIX_ALT = 'TYPEORM_ENTITY_PREFIX',\n\n METADATA_TABLE_NAME = 'DB_METADATA_TABLE_NAME',\n METADATA_TABLE_NAME_ALT = 'TYPEORM_METADATA_TABLE_NAME',\n\n SUBSCRIBERS = 'DB_SUBSCRIBERS',\n SUBSCRIBERS_ALT = 'TYPEORM_SUBSCRIBERS',\n\n LOGGING = 'DB_LOGGING',\n LOGGING_ALT = 'TYPEORM_LOGGING',\n\n LOGGER = 'DB_LOGGER',\n LOGGER_ALT = 'TYPEORM_LOGGER',\n\n MAX_QUERY_EXECUTION_TIME = 'DB_MAX_QUERY_EXECUTION_TIME',\n MAX_QUERY_EXECUTION_TIME_ALT = 'TYPEORM_MAX_QUERY_EXECUTION_TIME',\n\n DEBUG = 'DB_DEBUG',\n DEBUG_ALT = 'TYPEORM_DEBUG',\n\n UUID_EXTENSION = 'DB_UUID_EXTENSION',\n UUID_EXTENSION_ALT = 'TYPEORM_UUID_EXTENSION',\n\n CACHE = 'DB_CACHE',\n CACHE_ALT = 'TYPEORM_CACHE',\n\n CACHE_ALWAYS_ENABLED = 'DB_CACHE_ALWAYS_ENABLED',\n CACHE_ALWAYS_ENABLED_ALT = 'TYPEORM_CACHE_ALWAYS_ENABLED',\n\n CACHE_OPTIONS = 'DB_CACHE_OPTIONS',\n CACHE_OPTIONS_ALT = 'TYPEORM_CACHE_OPTIONS',\n\n CACHE_DURATION = 'DB_CACHE_DURATION',\n CACHE_DURATION_ALT = 'TYPEORM_CACHE_DURATION',\n}\n","export class AsyncKeyedCache<V> {\n protected values : Map<string, V>;\n\n protected pending : Map<string, Promise<V>>;\n\n constructor() {\n this.values = new Map();\n this.pending = new Map();\n }\n\n has(key: string) : boolean {\n return this.values.has(key);\n }\n\n get(key: string) : V | undefined {\n return this.values.get(key);\n }\n\n set(key: string, value: V) : void {\n this.values.set(key, value);\n this.pending.delete(key);\n }\n\n unset(key: string) : void {\n this.values.delete(key);\n this.pending.delete(key);\n }\n\n clear() : void {\n this.values.clear();\n this.pending.clear();\n }\n\n /**\n * Get or build the value for a key.\n *\n * Concurrent calls for the same key share one build; a failed build is\n * evicted so the next call retries. The build callback receives the\n * currently stored value (if any) and may return it unchanged.\n */\n async resolve(key: string, build: (existing?: V) => Promise<V>) : Promise<V> {\n const existing = this.pending.get(key);\n if (existing) {\n return existing;\n }\n\n const promise : Promise<V> = build(this.values.get(key))\n .then((value) => {\n this.values.set(key, value);\n return value;\n })\n .catch((e) => {\n if (this.pending.get(key) === promise) {\n this.pending.delete(key);\n }\n\n throw e;\n });\n\n this.pending.set(key, promise);\n\n return promise;\n }\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport type { Environment } from '../env/type';\nimport type { SeederFactoryManager } from '../seeder/factory/manager';\nimport { AsyncKeyedCache } from './cache';\n\nexport class RuntimeRegistry {\n public readonly dataSources = new AsyncKeyedCache<DataSource>();\n\n public readonly dataSourceOptions = new AsyncKeyedCache<DataSourceOptions>();\n\n public env : Environment | undefined;\n\n public factories : SeederFactoryManager | undefined;\n\n reset() : void {\n this.dataSources.clear();\n this.dataSourceOptions.clear();\n this.env = undefined;\n this.factories = undefined;\n }\n}\n\nlet instance : RuntimeRegistry | undefined;\n\nexport function useRuntimeRegistry() : RuntimeRegistry {\n if (typeof instance === 'undefined') {\n instance = new RuntimeRegistry();\n }\n\n return instance;\n}\n","import {\n oneOf,\n read,\n readBool,\n readInt,\n toArray,\n toBool,\n} from 'envix';\nimport type { DataSourceCacheOption } from '../data-source';\nimport { EnvironmentVariableName } from './constants';\n\nexport function transformLogging(input?: string) : boolean | string | string[] {\n const value = toBool(input);\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (input === 'all') {\n return 'all';\n }\n\n return toArray(input) ?? [];\n}\n\nexport function transformCache(input?: string) : DataSourceCacheOption | undefined {\n const value = toBool(input);\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (\n input === 'redis' ||\n input === 'ioredis' ||\n input === 'database' ||\n input === 'ioredis/cluster'\n ) {\n let options : Record<string, any> | undefined;\n const envCacheOptions = oneOf([\n read(EnvironmentVariableName.CACHE_OPTIONS),\n read(EnvironmentVariableName.CACHE_OPTIONS_ALT),\n ]);\n if (envCacheOptions) {\n options = JSON.parse(envCacheOptions);\n }\n\n return {\n type: input,\n options,\n alwaysEnabled: oneOf([\n readBool(EnvironmentVariableName.CACHE_ALWAYS_ENABLED),\n readBool(EnvironmentVariableName.CACHE_ALWAYS_ENABLED_ALT),\n ]),\n duration: oneOf([\n readInt(EnvironmentVariableName.CACHE_DURATION),\n readInt(EnvironmentVariableName.CACHE_DURATION_ALT),\n ]),\n };\n }\n\n return undefined;\n}\n","import {\n oneOf,\n read,\n readArray,\n readBool,\n readInt,\n} from 'envix';\nimport type { DatabaseType } from 'typeorm/driver/types/DatabaseType';\nimport { useRuntimeRegistry } from '../runtime';\nimport { EnvironmentName, EnvironmentVariableName } from './constants';\nimport type { Environment } from './type';\nimport {\n transformCache,\n transformLogging,\n} from './utils';\n\nexport function useEnv() : Environment;\nexport function useEnv<K extends keyof Environment>(key: K) : Environment[K];\nexport function useEnv(key?: string) : any {\n const registry = useRuntimeRegistry();\n if (typeof registry.env !== 'undefined') {\n if (typeof key === 'string') {\n return registry.env[key as keyof Environment];\n }\n\n return registry.env;\n }\n\n const output: Environment = {\n env: read(EnvironmentVariableName.ENV, EnvironmentName.DEVELOPMENT) as `${EnvironmentName}`,\n\n // Seeder\n seeds: oneOf([\n readArray(EnvironmentVariableName.SEEDS),\n readArray(EnvironmentVariableName.SEEDS_ALT),\n ]) ?? [],\n factories: oneOf([\n readArray(EnvironmentVariableName.FACTORIES),\n readArray(EnvironmentVariableName.FACTORIES_ALT),\n ]) ?? [],\n\n // Database\n url: oneOf([\n read(EnvironmentVariableName.URL),\n read(EnvironmentVariableName.URL_ALT),\n ]),\n host: oneOf([\n read(EnvironmentVariableName.HOST),\n read(EnvironmentVariableName.HOST_ALT),\n ]),\n port: oneOf([\n readInt(EnvironmentVariableName.PORT),\n readInt(EnvironmentVariableName.PORT_ALT),\n ]),\n username: oneOf([\n read(EnvironmentVariableName.USERNAME),\n read(EnvironmentVariableName.USERNAME_ALT),\n ]),\n password: oneOf([\n read(EnvironmentVariableName.PASSWORD),\n read(EnvironmentVariableName.PASSWORD_ALT),\n ]),\n database: oneOf([\n read(EnvironmentVariableName.DATABASE),\n read(EnvironmentVariableName.DATABASE_ALT),\n ]),\n sid: oneOf([\n read(EnvironmentVariableName.SID),\n read(EnvironmentVariableName.SID_ALT),\n ]),\n schema: oneOf([\n read(EnvironmentVariableName.SCHEMA),\n read(EnvironmentVariableName.SCHEMA_ALT),\n ]),\n extra: oneOf([\n read(EnvironmentVariableName.DRIVER_EXTRA),\n read(EnvironmentVariableName.DRIVER_EXTRA_ALT),\n ]),\n synchronize: oneOf([\n readBool(EnvironmentVariableName.SYNCHRONIZE),\n readBool(EnvironmentVariableName.SYNCHRONIZE_ALT),\n ]),\n schemaDrop: oneOf([\n readBool(EnvironmentVariableName.SCHEMA_DROP),\n readBool(EnvironmentVariableName.SCHEMA_DROP_ALT),\n ]),\n migrationsRun: oneOf([\n readBool(EnvironmentVariableName.MIGRATIONS_RUN),\n readBool(EnvironmentVariableName.MIGRATIONS_RUN_ALT),\n ]),\n entities: oneOf([\n readArray(EnvironmentVariableName.ENTITIES),\n readArray(EnvironmentVariableName.ENTITIES_ALT),\n ]) ?? [],\n migrations: oneOf([\n readArray(EnvironmentVariableName.MIGRATIONS),\n readArray(EnvironmentVariableName.MIGRATIONS_ALT),\n ]) ?? [],\n migrationsTableName: oneOf([\n read(EnvironmentVariableName.MIGRATIONS_TABLE_NAME),\n read(EnvironmentVariableName.MIGRATIONS_TABLE_NAME_ALT),\n ]),\n metadataTableName: oneOf([\n read(EnvironmentVariableName.METADATA_TABLE_NAME),\n read(EnvironmentVariableName.METADATA_TABLE_NAME_ALT),\n ]),\n subscribers: oneOf([\n readArray(EnvironmentVariableName.SUBSCRIBERS),\n readArray(EnvironmentVariableName.SUBSCRIBERS_ALT),\n ]) ?? [],\n logging: transformLogging(oneOf([\n read(EnvironmentVariableName.LOGGING),\n read(EnvironmentVariableName.LOGGING_ALT),\n ])),\n logger: oneOf([\n read(EnvironmentVariableName.LOGGER),\n read(EnvironmentVariableName.LOGGER_ALT),\n ]),\n entityPrefix: oneOf([\n read(EnvironmentVariableName.ENTITY_PREFIX),\n read(EnvironmentVariableName.ENTITY_PREFIX_ALT),\n ]),\n maxQueryExecutionTime: oneOf([\n readInt(EnvironmentVariableName.MAX_QUERY_EXECUTION_TIME),\n readInt(EnvironmentVariableName.MAX_QUERY_EXECUTION_TIME_ALT),\n ]),\n debug: oneOf([\n read(EnvironmentVariableName.DEBUG),\n read(EnvironmentVariableName.DEBUG_ALT),\n ]),\n cache: transformCache(oneOf([\n read(EnvironmentVariableName.CACHE),\n read(EnvironmentVariableName.CACHE_ALT),\n ])),\n uuidExtension: oneOf([\n read(EnvironmentVariableName.UUID_EXTENSION),\n read(EnvironmentVariableName.UUID_EXTENSION_ALT),\n ]),\n\n };\n\n if (output.extra) {\n output.extra = JSON.parse(output.extra); // todo: ensure record<string,any> ??\n }\n\n let type : string | undefined;\n const envType = oneOf([\n read(EnvironmentVariableName.TYPE),\n read(EnvironmentVariableName.TYPE_ALT),\n ]);\n\n if (envType) {\n type = envType;\n } else {\n const envURL = oneOf([\n read(EnvironmentVariableName.URL),\n read(EnvironmentVariableName.URL_ALT),\n ]);\n\n if (envURL) {\n [type] = envURL.split('://');\n }\n }\n\n if (type) {\n output.type = type as DatabaseType; // todo: maybe validation here\n }\n\n registry.env = output;\n\n if (typeof key === 'string') {\n return output[key as keyof Environment];\n }\n\n return output;\n}\n\nexport function resetEnv() {\n useRuntimeRegistry().env = undefined;\n}\n","import { createMerger } from 'smob';\nimport type { DataSourceOptions } from 'typeorm';\n\nconst merge = createMerger({\n strategy: (target, key, value) => {\n if (typeof target[key] === 'undefined') {\n target[key] = value;\n\n return target;\n }\n\n return undefined;\n },\n});\n\nexport function mergeDataSourceOptions(\n target: DataSourceOptions,\n source: DataSourceOptions,\n) {\n if (target.type !== source.type) {\n return target;\n }\n\n return merge(target, source);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { BaseDataSourceOptions } from 'typeorm/data-source/BaseDataSourceOptions';\nimport type { PostgresDataSourceOptions } from 'typeorm/driver/postgres/PostgresDataSourceOptions';\nimport type { DatabaseType } from 'typeorm/driver/types/DatabaseType';\nimport type { LoggerOptions } from 'typeorm/logger/LoggerOptions';\nimport { useEnv } from '../../../env';\nimport { mergeDataSourceOptions } from './merge';\n\nexport function hasEnvDataSourceOptions() : boolean {\n return !!useEnv('type');\n}\n\n/* istanbul ignore next */\nexport function readDataSourceOptionsFromEnv() : DataSourceOptions | undefined {\n if (!hasEnvDataSourceOptions()) {\n return undefined;\n }\n\n // todo: include seeder options\n const base : Omit<BaseDataSourceOptions, 'poolSize'> = {\n type: useEnv('type') as DatabaseType,\n entities: useEnv('entities'),\n subscribers: useEnv('subscribers'),\n migrations: useEnv('migrations'),\n migrationsTableName: useEnv('migrationsTableName'),\n // migrationsTransactionMode: useEnv('migra')\n metadataTableName: useEnv('metadataTableName'),\n logging: useEnv('logging') as LoggerOptions,\n logger: useEnv('logger') as BaseDataSourceOptions['logger'],\n maxQueryExecutionTime: useEnv('maxQueryExecutionTime'),\n synchronize: useEnv('synchronize'),\n migrationsRun: useEnv('migrationsRun'),\n dropSchema: useEnv('schemaDrop'),\n entityPrefix: useEnv('entityPrefix'),\n extra: useEnv('extra'),\n cache: useEnv('cache'),\n };\n\n const credentialOptions = {\n url: useEnv('url'),\n host: useEnv('host'),\n port: useEnv('port'),\n username: useEnv('username'),\n password: useEnv('password'),\n database: useEnv('database'),\n };\n\n if (base.type === 'mysql' || base.type === 'mariadb') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n };\n }\n\n if (base.type === 'postgres') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n uuidExtension: useEnv('uuidExtension') as PostgresDataSourceOptions['uuidExtension'],\n };\n }\n\n if (base.type === 'cockroachdb') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n timeTravelQueries: true,\n };\n }\n\n if (base.type === 'better-sqlite3') {\n return {\n ...base,\n type: base.type,\n database: useEnv('database') || 'db.sqlite',\n };\n }\n\n if (base.type === 'mssql') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n };\n }\n\n if (base.type === 'oracle') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n sid: useEnv('sid'),\n };\n }\n\n return {\n ...base,\n ...credentialOptions,\n } as DataSourceOptions;\n}\n\nexport function mergeDataSourceOptionsWithEnv(options: DataSourceOptions) {\n const env = readDataSourceOptionsFromEnv();\n if (!env) {\n return options;\n }\n\n return mergeDataSourceOptions(env, options);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { OptionsError } from '../../errors';\nimport { PathResolverMode, createPathResolver } from '../../utils';\nimport { findDataSource } from '../find';\nimport type { DataSourceOptionsBuildContext } from './type';\nimport {\n mergeDataSourceOptionsWithEnv,\n readDataSourceOptionsFromEnv,\n} from './utils';\n\n/**\n * Build DataSourceOptions from DataSource or from configuration.\n *\n * @param context\n */\nexport async function buildDataSourceOptions(\n context: DataSourceOptionsBuildContext = {},\n) : Promise<DataSourceOptions> {\n const directory : string = context.directory || process.cwd();\n\n const pathResolver = createPathResolver({\n tsconfig: context.tsconfig,\n mode: context.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n\n const dataSource = await findDataSource({\n directory,\n fileName: context.dataSourceName,\n tsconfig: context.tsconfig,\n preserveFilePaths: context.preserveFilePaths,\n });\n\n if (dataSource) {\n const options = await pathResolver.transformKeys(\n dataSource.options,\n ['entities', 'migrations', 'subscribers'],\n );\n\n return mergeDataSourceOptionsWithEnv(options);\n }\n\n const options = readDataSourceOptionsFromEnv();\n if (options) {\n return pathResolver.transformKeys(\n options,\n ['entities', 'migrations', 'subscribers'],\n );\n }\n\n throw OptionsError.notFound();\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { useRuntimeRegistry } from '../../runtime';\nimport { buildDataSourceOptions } from './module';\n\nexport function setDataSourceOptions(\n options: DataSourceOptions,\n alias?: string,\n) {\n useRuntimeRegistry().dataSourceOptions.set(alias || 'default', options);\n}\n\nexport function hasDataSourceOptions(alias?: string) : boolean {\n return useRuntimeRegistry().dataSourceOptions.has(alias || 'default');\n}\n\nexport async function useDataSourceOptions(alias?: string) : Promise<DataSourceOptions> {\n return useRuntimeRegistry().dataSourceOptions.resolve(\n alias || 'default',\n async (existing) => existing || buildDataSourceOptions(),\n );\n}\n","import { DataSource } from 'typeorm';\nimport { useRuntimeRegistry } from '../runtime';\nimport { useDataSourceOptions } from './options';\n\nexport function setDataSource(\n dataSource: DataSource,\n alias?: string,\n) {\n useRuntimeRegistry().dataSources.set(alias || 'default', dataSource);\n}\n\nexport function hasDataSource(alias?: string) : boolean {\n return useRuntimeRegistry().dataSources.has(alias || 'default');\n}\n\nexport function unsetDataSource(alias?: string) {\n useRuntimeRegistry().dataSources.unset(alias || 'default');\n}\n\nexport async function useDataSource(alias?: string) : Promise<DataSource> {\n const key = alias || 'default';\n\n return useRuntimeRegistry().dataSources.resolve(key, async (existing) => {\n if (existing) {\n if (!existing.isInitialized) {\n await existing.initialize();\n }\n\n return existing;\n }\n\n const options = await useDataSourceOptions(key);\n\n const dataSource = new DataSource(options);\n await dataSource.initialize();\n\n return dataSource;\n });\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DataSource, MigrationExecutor } from 'typeorm';\nimport {\n hasDataSource,\n useDataSource,\n useDataSourceOptions,\n} from '../../../data-source';\nimport { hasStringProperty } from '../../../utils';\nimport type { DatabaseCheckContext, DatabaseCheckResult } from './types';\n\n/**\n * Check database setup progress.\n *\n * @param context\n */\nexport async function checkDatabase(context: DatabaseCheckContext = {}) : Promise<DatabaseCheckResult> {\n const result : DatabaseCheckResult = {\n exists: true,\n schema: false,\n migrationsPending: [],\n };\n\n let dataSource : DataSource;\n let dataSourceCleanup : boolean;\n\n if (\n typeof context.dataSource === 'undefined' &&\n typeof context.options === 'undefined' &&\n hasDataSource(context.alias)\n ) {\n dataSource = await useDataSource(context.alias);\n\n if (\n dataSource.options.synchronize ||\n dataSource.options.migrationsRun\n ) {\n dataSource = new DataSource({\n ...dataSource.options,\n synchronize: false,\n migrationsRun: false,\n });\n\n dataSourceCleanup = true;\n } else {\n dataSourceCleanup = false;\n }\n } else {\n let dataSourceOptions : DataSourceOptions;\n if (context.options) {\n dataSourceOptions = context.options;\n } else {\n dataSourceOptions = await useDataSourceOptions(context.alias);\n }\n\n dataSource = new DataSource({\n ...dataSourceOptions,\n synchronize: false,\n migrationsRun: false,\n });\n dataSourceCleanup = context.dataSourceCleanup ?? true;\n }\n\n try {\n if (!dataSource.isInitialized) {\n await dataSource.initialize();\n }\n } catch {\n result.exists = false;\n\n return result;\n }\n\n const queryRunner = dataSource.createQueryRunner();\n\n if (\n dataSource.migrations &&\n dataSource.migrations.length > 0\n ) {\n const migrationExecutor = new MigrationExecutor(dataSource, queryRunner);\n result.migrationsPending = await migrationExecutor.getPendingMigrations();\n\n result.schema = result.migrationsPending.length === 0;\n } else {\n let schema : string | undefined;\n if (hasStringProperty(dataSource.driver.options, 'schema')) {\n schema = dataSource.driver.options.schema;\n }\n\n const migrationsTableName = dataSource.driver.buildTableName(\n dataSource.options.migrationsTableName || 'migrations',\n schema,\n dataSource.driver.database,\n );\n const migrationsTableExists = await queryRunner.hasTable(migrationsTableName);\n if (migrationsTableExists) {\n result.schema = dataSource.entityMetadatas.length === 0;\n } else {\n const tableNames = dataSource.entityMetadatas.map(\n (entityMetadata) => entityMetadata.tablePath,\n );\n const tables = await queryRunner.getTables(tableNames);\n\n if (tables.length === dataSource.entityMetadatas.length) {\n const { upQueries } = await dataSource.driver.createSchemaBuilder()\n .log();\n\n result.schema = upQueries.length === 0;\n } else {\n result.schema = false;\n }\n }\n }\n\n await queryRunner.release();\n\n if (dataSourceCleanup) {\n await dataSource.destroy();\n }\n\n return result;\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { buildDataSourceOptions, findDataSource } from '../../data-source';\nimport type {\n DatabaseBaseContextInput,\n DatabaseCreateContext,\n DatabaseCreateContextInput,\n DatabaseDropContext,\n DatabaseDropContextInput,\n} from '../methods';\n\nasync function normalizeDataSourceOptions(context: DatabaseBaseContextInput) : Promise<DataSourceOptions> {\n let options : DataSourceOptions | undefined;\n if (context.options) {\n options = { ...context.options };\n } else {\n const dataSource = await findDataSource(context.findOptions);\n if (dataSource) {\n options = { ...dataSource.options };\n }\n\n if (!options) {\n options = { ...await buildDataSourceOptions() };\n }\n }\n\n return {\n ...options,\n\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n };\n}\n\nexport async function buildDatabaseCreateContext(\n input: DatabaseCreateContextInput = {},\n) : Promise<DatabaseCreateContext> {\n return {\n ...input,\n options: await normalizeDataSourceOptions(input),\n synchronize: input.synchronize ?? true,\n ifNotExist: input.ifNotExist ?? true,\n };\n}\n\nexport async function buildDatabaseDropContext(\n input: DatabaseDropContextInput = {},\n) : Promise<DatabaseDropContext> {\n return {\n ...input,\n options: await normalizeDataSourceOptions(input),\n ifExist: input.ifExist ?? true,\n };\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport { DriverFactory } from 'typeorm/driver/DriverFactory';\n\nconst driversRequireDatabaseOption: DataSourceOptions['type'][] = [\n 'better-sqlite3',\n];\n\n/**\n * Acquire the native client handle (driver.postgres, driver.mysql, ...)\n * via TypeORM's DriverFactory, so typeorm stays the single source of\n * client libraries. The DataSource is never initialized.\n */\nexport function useNativeDriver(options: DataSourceOptions) {\n const fakeConnection: DataSource = {\n options: {\n type: options.type,\n ...(driversRequireDatabaseOption.includes(options.type) ? { database: options.database } : {}),\n },\n } as DataSource;\n\n return new DriverFactory().create(fakeConnection);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { MongoDriver } from 'typeorm/driver/mongodb/MongoDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { buildMongoDBConnectionUri } from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class MongoDBConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const uri = buildMongoDBConnectionUri(params, database);\n\n let client: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as MongoDriver;\n const { MongoClient } = driver.mongodb;\n\n client = new MongoClient(uri, params.extra);\n await client.connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n /**\n * Statements are JSON encoded command documents,\n * e.g. '{\"dropDatabase\": 1}'.\n */\n execute: async (statement: string) => {\n await open();\n\n return client.db().command(JSON.parse(statement));\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!client) {\n return;\n }\n\n const current = client;\n client = undefined;\n await current.close();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { SqlServerDriver } from 'typeorm/driver/sqlserver/SqlServerDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class MsSQLConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const option: Record<string, any> = {\n user: params.user,\n password: params.password,\n server: params.host,\n port: params.port || 1433,\n // encrypt / trustServerCertificate / instanceName / ... — without these\n // the create/drop connection would not reach a server the DataSource can\n ...(params.driverOptions ? { options: params.driverOptions } : {}),\n ...(params.extra ? params.extra : {}),\n ...(params.domain ? { domain: params.domain } : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let pool: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as SqlServerDriver;\n\n // dedicated pool — the module level connect() would share\n // one global pool across connections\n pool = await new driver.mssql.ConnectionPool(option).connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return pool.request().query(sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!pool) {\n return;\n }\n\n const current = pool;\n pool = undefined;\n await current.close();\n },\n };\n }\n}\n","import { hasOwnProperty, isObject } from '../../utils';\n\n/**\n * Whether the (unknown) error carries the given errno code.\n */\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return isObject(error) &&\n hasOwnProperty(error, 'code') &&\n error.code === code;\n}\n\n/**\n * Normalize a callback style client (pg, mysql2) query to a promise.\n */\nexport async function promisifyCallbackQuery(connection: any, query: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n connection.query(query, (queryErr: any, queryResult: any) => {\n if (queryErr) {\n reject(queryErr);\n return;\n }\n\n resolve(queryResult);\n });\n });\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { MysqlDriver } from 'typeorm/driver/mysql/MysqlDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\nimport { promisifyCallbackQuery } from './utils';\n\n/**\n * Serves mysql AND mariadb.\n */\nexport class MySQLConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const option: Record<string, any> = {\n host: params.host,\n user: params.user,\n password: params.password,\n port: params.port,\n ssl: params.ssl,\n ...(params.extra ? params.extra : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let connection: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as MysqlDriver;\n const { createConnection } = driver.mysql;\n\n connection = await createConnection(option);\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return promisifyCallbackQuery(connection, sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!connection) {\n return;\n }\n\n const current = connection;\n connection = undefined;\n\n await new Promise<void>((resolve, reject) => {\n current.end((error?: Error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n },\n };\n }\n}\n","import fs from 'node:fs';\nimport type { IFileSystem } from '../core';\nimport { hasErrorCode } from './utils';\n\nexport class NodeFileSystem implements IFileSystem {\n async assertDirectoryWritable(path: string): Promise<void> {\n await fs.promises.access(path, fs.constants.W_OK);\n }\n\n async isFileWritable(path: string): Promise<boolean> {\n try {\n await fs.promises.access(path, fs.constants.F_OK | fs.constants.W_OK);\n return true;\n } catch (error) {\n if (hasErrorCode(error, 'ENOENT')) {\n return false;\n }\n\n throw error;\n }\n }\n\n async createFile(path: string): Promise<void> {\n await fs.promises.writeFile(path, '', { flag: 'wx' });\n }\n\n async removeFile(path: string): Promise<boolean> {\n try {\n await fs.promises.unlink(path);\n return true;\n } catch (error) {\n if (hasErrorCode(error, 'ENOENT')) {\n return false;\n }\n\n throw error;\n }\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { OracleDriver } from 'typeorm/driver/oracle/OracleDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { buildOracleConnectString } from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class OracleConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(): IDatabaseConnection {\n const { options, params } = this;\n\n const connectString = params.connectString ||\n buildOracleConnectString(params);\n\n const option: Record<string, any> = {\n user: params.user,\n password: params.password,\n connectString: connectString || params.url,\n ...(params.extra ? params.extra : {}),\n };\n\n let connection: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as OracleDriver;\n const { getConnection } = driver.oracle;\n\n connection = await getConnection(option);\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return connection.execute(sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!connection) {\n return;\n }\n\n const current = connection;\n connection = undefined;\n await current.close();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { CockroachDriver } from 'typeorm/driver/cockroachdb/CockroachDriver';\nimport type { PostgresDriver } from 'typeorm/driver/postgres/PostgresDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\nimport { promisifyCallbackQuery } from './utils';\n\n/**\n * Serves postgres AND cockroachdb — both speak the pg wire protocol.\n */\nexport class PostgresConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const data: Record<string, any> = {\n host: params.host,\n port: params.port,\n user: params.user,\n password: params.password,\n ssl: params.ssl,\n schema: params.schema,\n ...(params.extra ? params.extra : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let client: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n // native client acquisition stays lazy: DriverFactory\n // requires the client library on first use\n const driver = useNativeDriver(options) as PostgresDriver | CockroachDriver;\n const { Client } = driver.postgres;\n\n client = new Client(data);\n await client.connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return promisifyCallbackQuery(client, sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!client) {\n return;\n }\n\n const current = client;\n client = undefined;\n await current.end();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverError } from '../errors';\nimport { hasOwnProperty } from '../utils';\nimport {\n MongoDBConnectionFactory,\n MsSQLConnectionFactory,\n MySQLConnectionFactory,\n NodeFileSystem,\n OracleConnectionFactory,\n PostgresConnectionFactory,\n} from './adapters';\nimport type {\n DatabaseDialectName,\n DatabaseDialectRegistryEntry,\n} from './core';\nimport {\n CockroachDBDialect,\n MongoDBDialect,\n MsSQLDialect,\n MySQLDialect,\n OracleDialect,\n PostgresDialect,\n SQLiteDialect,\n buildConnectionParams,\n} from './core';\n\n/**\n * The single dispatch site: a closed set of dialects known at build time.\n * Each entry composes a dialect with its connection factory (overridable for tests\n * and caller supplied connections).\n * Adding a driver = one dialect folder in core/, one adapter, one row here.\n */\nconst registry: Record<DatabaseDialectName, DatabaseDialectRegistryEntry> = {\n postgres: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new PostgresDialect(\n overrides.connectionFactory || new PostgresConnectionFactory(options, params),\n ),\n },\n // cockroachdb speaks the pg wire protocol and reuses the postgres connection factory\n cockroachdb: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new CockroachDBDialect(\n overrides.connectionFactory || new PostgresConnectionFactory(options, params),\n ),\n },\n mysql: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MySQLDialect(\n overrides.connectionFactory || new MySQLConnectionFactory(options, params),\n ),\n },\n mssql: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MsSQLDialect(\n overrides.connectionFactory || new MsSQLConnectionFactory(options, params),\n ),\n },\n oracle: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new OracleDialect(\n overrides.connectionFactory || new OracleConnectionFactory(options, params),\n ),\n },\n mongodb: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MongoDBDialect(\n overrides.connectionFactory || new MongoDBConnectionFactory(options, params),\n ),\n },\n 'better-sqlite3': {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new SQLiteDialect(\n overrides.fs || new NodeFileSystem(),\n overrides.cwd || process.cwd(),\n ),\n },\n};\n\n/**\n * @throws DriverError\n */\nexport function resolveDatabaseDialectName(type: DataSourceOptions['type']): DatabaseDialectName {\n if (type === 'mariadb') {\n return 'mysql';\n }\n\n if (hasOwnProperty(registry, type)) {\n return type as DatabaseDialectName;\n }\n\n throw DriverError.notSupported(type);\n}\n\nexport function useDatabaseDialectEntry(name: DatabaseDialectName): DatabaseDialectRegistryEntry {\n return registry[name];\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverError } from '../../../errors';\nimport type { SchemaColumnDialect, SchemaDialect } from './type';\n\n/**\n * mariadb is served by the mysql statements, cockroachdb by the postgres ones.\n *\n * A Map rather than a record, so a driver name which happens to be an\n * inherited property (`toString`) is a miss instead of a function.\n */\nconst dialects = new Map<string, SchemaDialect>([\n ['postgres', 'postgres'],\n ['cockroachdb', 'postgres'],\n ['mysql', 'mysql'],\n ['mariadb', 'mysql'],\n]);\n\n/**\n * mssql and oracle can not express either rename, but they can alter a column\n * in place — which typeorm otherwise does by dropping and re-adding it.\n */\nconst columnDialects = new Map<string, SchemaColumnDialect>([\n ...dialects,\n ['mssql', 'mssql'],\n ['oracle', 'oracle'],\n]);\n\n/**\n * The dialect to build a column alteration with, or undefined for a driver\n * this module has no statements for.\n */\nexport function findSchemaColumnDialect(\n type: DataSourceOptions['type'],\n) : SchemaColumnDialect | undefined {\n return columnDialects.get(type);\n}\n\n/**\n * The dialect to build the rename statements with, or undefined for a driver\n * this module has none for.\n */\nexport function findSchemaDialect(type: DataSourceOptions['type']) : SchemaDialect | undefined {\n return dialects.get(type);\n}\n\n/**\n * @throws DriverError\n */\nexport function resolveSchemaDialect(type: DataSourceOptions['type']) : SchemaDialect {\n const dialect = findSchemaDialect(type);\n if (dialect) {\n return dialect;\n }\n\n throw DriverError.schemaAlterationNotSupported(type);\n}\n\n/**\n * mysql/mariadb are the only drivers with a session level switch\n * for the foreign key checks.\n */\nexport function hasForeignKeyChecks(type: DataSourceOptions['type']) : boolean {\n return type === 'mysql' || type === 'mariadb';\n}\n","import type { Table, TableColumn } from 'typeorm';\nimport { isObject } from '../../../utils';\nimport type { SchemaColumnType, SchemaStrictInput } from './type';\n\n/**\n * Guarded alterations raise on an unexpected database state unless told\n * otherwise.\n */\nexport function isStrict(input: SchemaStrictInput) : boolean {\n return input.strict !== false;\n}\n\nexport function findTableIndex(table: Table, name: string) {\n return table.indices.find((index) => index.name === name);\n}\n\nexport function findTableForeignKey(table: Table, name: string) {\n return table.foreignKeys.find((foreignKey) => foreignKey.name === name);\n}\n\n/**\n * Read the value of `SELECT @@SESSION.foreign_key_checks`.\n * Anything unexpected is treated as enabled, since that is the safe state\n * to restore to.\n */\nexport function isForeignKeyChecksEnabled(rows: unknown) : boolean {\n if (!Array.isArray(rows) || rows.length === 0) {\n return true;\n }\n\n const [row] = rows;\n if (!isObject(row)) {\n return true;\n }\n\n const [value] = Object.values(row);\n\n return `${value}` !== '0';\n}\n\nexport function normalizeColumnLength(length?: string | number | null) : string {\n if (\n typeof length === 'undefined' ||\n length === null ||\n length === ''\n ) {\n return '';\n }\n\n return `${length}`;\n}\n\nexport type SchemaColumnDescriber = {\n /**\n * The driver's own spelling of a type, e.g. varchar -> character varying.\n */\n normalizeType: (type: string) => string,\n /**\n * The full type the server would report, e.g. varchar + 255 ->\n * varchar(255). Resolves the default length of a type, which the driver\n * leaves empty on the loaded column: mysql reports a `varchar(255)` as\n * length `''` for a table it has no entity metadata for, and comparing the\n * raw values would call that a mismatch.\n */\n describeType: (type: string, length?: string | number) => string,\n};\n\n/**\n * Whether a column still matches a (partial) type description.\n * length & nullable are only compared if they are defined.\n */\nexport function matchesColumnType(\n column: TableColumn,\n input: SchemaColumnType,\n describer: SchemaColumnDescriber,\n) : boolean {\n const { normalizeType, describeType } = describer;\n\n if (\n normalizeType(input.type).toLowerCase() !==\n normalizeType(column.type).toLowerCase()\n ) {\n return false;\n }\n\n if (\n typeof input.length !== 'undefined' &&\n describeType(input.type, input.length).toLowerCase() !==\n describeType(column.type, column.length).toLowerCase()\n ) {\n return false;\n }\n\n return !(\n typeof input.nullable === 'boolean' &&\n input.nullable !== column.isNullable\n );\n}\n","import type { QueryRunner } from 'typeorm';\nimport {\n MYSQL_FOREIGN_KEY_CHECKS_OFF,\n MYSQL_FOREIGN_KEY_CHECKS_ON,\n MYSQL_FOREIGN_KEY_CHECKS_SELECT,\n} from '../../core';\nimport { hasForeignKeyChecks } from './dialect';\nimport { isForeignKeyChecksEnabled } from './utils';\n\n/**\n * Run a callback with the mysql/mariadb foreign key checks disabled and restore\n * the previous state afterwards (nesting safe). A no-op wrapper on every other\n * driver, so a migration using it stays portable.\n *\n * Re-adding a constraint which was already enforcing does not need to be\n * re-validated — the check only buys a full table scan, plus a failure mode for\n * rows some past import inserted with the checks off.\n */\nexport async function withForeignKeyChecksDisabled<T>(\n queryRunner: QueryRunner,\n fn: () => Promise<T>,\n) : Promise<T> {\n if (!hasForeignKeyChecks(queryRunner.dataSource.options.type)) {\n return fn();\n }\n\n const enabled = isForeignKeyChecksEnabled(\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_SELECT),\n );\n\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_OFF);\n\n try {\n return await fn();\n } finally {\n if (enabled) {\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_ON);\n }\n }\n}\n","import { DriverError } from '../../../errors';\nimport type {\n SchemaAddForeignKeyInput,\n SchemaColumnDefinition,\n SchemaColumnDialect,\n SchemaDialect,\n SchemaRenameForeignKeyInput,\n SchemaRenameIndexInput,\n} from './type';\n\n/**\n * Quote a value mysql expects as a string literal (a charset name,\n * an enum value, a comment). Single quotes rather than the double ones\n * typeorm uses, since those are identifiers under `ANSI_QUOTES`.\n */\nfunction escapeSchemaString(value: string) : string {\n return `'${value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, '\\'\\'')\n // not allowed in a comment\n .replace(/\\0/g, '')}'`;\n}\n\n/**\n * Whether the body of a quoted literal escapes its quotes, i.e. whether\n * wrapping it in quotes again yields the same value.\n */\nfunction isEscapedStringBody(value: string) : boolean {\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n\n if (char === '\\\\') {\n index += 2;\n continue;\n }\n\n if (char === '\\'') {\n if (value[index + 1] !== '\\'') {\n return false;\n }\n\n index += 2;\n continue;\n }\n\n index += 1;\n }\n\n return true;\n}\n\n/**\n * A default as the driver reports it, ready to be repeated in a definition.\n *\n * typeorm builds a mysql string default by wrapping the raw value in quotes\n * without escaping what is inside it, so a default holding a quote comes back\n * as a literal the server can not parse (`'it's'`). Repairing it is not a\n * guess: a malformed literal can only have come from that wrapping, while a\n * properly escaped one (mariadb reports those) is passed through untouched.\n */\nfunction buildDefault(value: unknown) : string {\n if (\n typeof value !== 'string' ||\n value.length < 2 ||\n !value.startsWith('\\'') ||\n !value.endsWith('\\'')\n ) {\n return `${value}`;\n }\n\n const body = value.slice(1, -1);\n\n return isEscapedStringBody(body) ? value : escapeSchemaString(body);\n}\n\nexport function escapeSchemaIdentifier(dialect: SchemaColumnDialect, name: string) : string {\n if (dialect === 'mysql') {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Escape a (potentially schema/database qualified) path, e.g. public.user.\n */\nexport function escapeSchemaPath(dialect: SchemaColumnDialect, path: string) : string {\n return path\n .split('.')\n .map((part) => escapeSchemaIdentifier(dialect, part))\n .join('.');\n}\n\n/**\n * Qualify a name with the schema/database prefix of a table path,\n * e.g. (public.user, IDX_foo) -> public.IDX_foo\n */\nfunction buildSiblingPath(table: string, name: string) : string {\n const parts = table.split('.');\n parts[parts.length - 1] = name;\n\n return parts.join('.');\n}\n\nexport function buildRenameIndexQuery(dialect: SchemaDialect, input: SchemaRenameIndexInput) : string {\n if (dialect === 'mysql') {\n return `ALTER TABLE ${escapeSchemaPath(dialect, input.table)} ` +\n `RENAME INDEX ${escapeSchemaIdentifier(dialect, input.from)} ` +\n `TO ${escapeSchemaIdentifier(dialect, input.to)}`;\n }\n\n // in postgres an index is an object of the schema its table lives in\n return `ALTER INDEX ${escapeSchemaPath(dialect, buildSiblingPath(input.table, input.from))} ` +\n `RENAME TO ${escapeSchemaIdentifier(dialect, input.to)}`;\n}\n\nexport function buildDropIndexQuery(dialect: SchemaDialect, table: string, name: string) : string {\n if (dialect === 'mysql') {\n return `ALTER TABLE ${escapeSchemaPath(dialect, table)} ` +\n `DROP INDEX ${escapeSchemaIdentifier(dialect, name)}`;\n }\n\n return `DROP INDEX ${escapeSchemaPath(dialect, buildSiblingPath(table, name))}`;\n}\n\n/**\n * postgres only — mysql has no RENAME CONSTRAINT and needs the\n * drop & re-add dance instead.\n */\nexport function buildRenameForeignKeyQuery(input: SchemaRenameForeignKeyInput) : string {\n return `ALTER TABLE ${escapeSchemaPath('postgres', input.table)} ` +\n `RENAME CONSTRAINT ${escapeSchemaIdentifier('postgres', input.from)} ` +\n `TO ${escapeSchemaIdentifier('postgres', input.to)}`;\n}\n\nexport function buildDropForeignKeyQuery(dialect: SchemaDialect, table: string, name: string) : string {\n const keyword = dialect === 'mysql' ? 'FOREIGN KEY' : 'CONSTRAINT';\n\n return `ALTER TABLE ${escapeSchemaPath(dialect, table)} ` +\n `DROP ${keyword} ${escapeSchemaIdentifier(dialect, name)}`;\n}\n\nexport function buildAddForeignKeyQuery(dialect: SchemaDialect, input: SchemaAddForeignKeyInput) : string {\n const columns = input.columns\n .map((column) => escapeSchemaIdentifier(dialect, column))\n .join(', ');\n\n const referencedColumns = input.referencedColumns\n .map((column) => escapeSchemaIdentifier(dialect, column))\n .join(', ');\n\n let query = `ALTER TABLE ${escapeSchemaPath(dialect, input.table)} ` +\n `ADD CONSTRAINT ${escapeSchemaIdentifier(dialect, input.name)} ` +\n `FOREIGN KEY (${columns}) ` +\n `REFERENCES ${escapeSchemaPath(dialect, input.referencedTable)} (${referencedColumns})`;\n\n if (input.onDelete) {\n query += ` ON DELETE ${input.onDelete}`;\n }\n\n if (input.onUpdate) {\n query += ` ON UPDATE ${input.onUpdate}`;\n }\n\n return query;\n}\n\n/**\n * mysql's `MODIFY COLUMN` replaces the previous definition in full, so the\n * rendered one has to restate the whole column, not just what changed.\n */\nfunction buildColumnDefinition(column: SchemaColumnDefinition) : string {\n let definition = `${escapeSchemaIdentifier('mysql', column.name)} ${column.type}`;\n\n if (column.enum) {\n definition += `(${column.enum.map(escapeSchemaString).join(', ')})`;\n }\n\n if (column.unsigned) {\n definition += ' UNSIGNED';\n }\n\n if (column.charset) {\n definition += ` CHARACTER SET ${escapeSchemaString(column.charset)}`;\n }\n\n if (column.collation) {\n definition += ` COLLATE ${escapeSchemaString(column.collation)}`;\n }\n\n if (column.asExpression) {\n definition += ` AS (${column.asExpression}) ${column.generatedType || 'VIRTUAL'}`;\n }\n\n if (typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n if (\n typeof column.default !== 'undefined' &&\n column.default !== null\n ) {\n definition += ` DEFAULT ${buildDefault(column.default)}`;\n }\n\n if (column.onUpdate) {\n definition += ` ON UPDATE ${column.onUpdate}`;\n }\n\n if (column.autoIncrement) {\n definition += ' AUTO_INCREMENT';\n }\n\n if (column.comment) {\n definition += ` COMMENT ${escapeSchemaString(column.comment)}`;\n }\n\n return definition;\n}\n\n/**\n * Alter a column in place, keeping the values it holds.\n *\n * typeorm builds no statement for this: its `changeColumn` drops and re-adds\n * the column \"to avoid data conversion\" as soon as the type or the length\n * differs — on every driver but sqlite, which recreates the whole table and\n * copies the values over.\n *\n * postgres names the new type and nothing else, so the rest of the definition\n * (default, comment, identity) stays as it is; mysql replaces the definition\n * in full and therefore restates it.\n */\nexport function buildChangeColumnTypeQueries(\n dialect: SchemaColumnDialect,\n table: string,\n column: SchemaColumnDefinition,\n) : string[] {\n const path = escapeSchemaPath(dialect, table);\n const name = escapeSchemaIdentifier(dialect, column.name);\n\n if (dialect === 'mysql') {\n if (column.generatedType && !column.asExpression) {\n // restating the definition without the `AS` would turn a generated\n // column into a regular one, and drop every value it computes.\n // typeorm reads the expression from its own metadata table, so it\n // is empty whenever there is no row describing this column.\n throw DriverError.columnGenerationExpressionUnknown(column.name);\n }\n\n return [`ALTER TABLE ${path} MODIFY COLUMN ${buildColumnDefinition(column)}`];\n }\n\n if (dialect === 'mssql') {\n // the default and the identity are constraints of their own here and\n // survive untouched, but leaving the nullability out makes the column\n // nullable — so it is always stated\n let definition = `${name} ${column.type}`;\n\n if (column.collation) {\n definition += ` COLLATE ${column.collation}`;\n }\n\n if (typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n return [`ALTER TABLE ${path} ALTER COLUMN ${definition}`];\n }\n\n if (dialect === 'oracle') {\n // MODIFY keeps everything it does not name, and oracle rejects a\n // clause which only restates the current nullability\n // (ORA-01442 / ORA-01451)\n let definition = `${name} ${column.type}`;\n\n if (column.nullabilityChanged && typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n return [`ALTER TABLE ${path} MODIFY ${definition}`];\n }\n\n // without a USING expression the values are converted with the assignment\n // cast between the two types, and the change is refused when there is none\n const using = column.using ? ` USING ${column.using}` : '';\n\n const queries = [`ALTER TABLE ${path} ALTER COLUMN ${name} TYPE ${column.type}${using}`];\n\n if (typeof column.nullable === 'boolean') {\n queries.push(\n `ALTER TABLE ${path} ALTER COLUMN ${name} ` +\n `${column.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n return queries;\n}\n","import type { Driver, QueryRunner, TableColumn } from 'typeorm';\nimport { DriverError, SchemaAlterationError } from '../../../errors';\nimport { findSchemaColumnDialect } from './dialect';\nimport { buildChangeColumnTypeQueries } from './statements';\nimport type { SchemaChangeColumnTypeInput, SchemaColumnDefinition } from './type';\nimport type { SchemaColumnDescriber } from './utils';\nimport { isStrict, matchesColumnType, normalizeColumnLength } from './utils';\n\n/**\n * Describe the column as the database reports it, so a dialect which replaces\n * the definition in full can restate every attribute it carries (default,\n * comment, charset, AUTO_INCREMENT, …) instead of dropping it.\n *\n * The primary key is deliberately left out: the column already carries it,\n * and repeating it would be a second one. mysql's `ZEROFILL` is missing for a\n * different reason — typeorm does not read it into `TableColumn` at all, so a\n * zerofill column loses the attribute (it is a display width mysql deprecated\n * in 8.0.17, and typeorm's own statements drop it just the same).\n */\nfunction buildColumnDefinition(driver: Driver, column: TableColumn) : SchemaColumnDefinition {\n return {\n name: column.name,\n type: driver.createFullType(column),\n // a generated column takes its nullability from its expression,\n // and mariadb rejects the clause on one outright\n nullable: column.asExpression ? undefined : column.isNullable,\n enum: column.enum,\n unsigned: column.unsigned,\n charset: column.charset,\n collation: column.collation,\n asExpression: column.asExpression,\n generatedType: column.generatedType,\n default: column.default,\n onUpdate: column.onUpdate,\n autoIncrement: column.isGenerated && column.generationStrategy === 'increment',\n comment: column.comment,\n };\n}\n\n/**\n * Change the type (and optionally the nullability) of a column, but only if it\n * still matches the `from` description.\n *\n * Returns false when the column already matches `to`, which keeps a repair\n * migration resumable and safe to run against a database which never had the\n * drift. When the column matches neither description (or is missing) the\n * database is not in a state this can act on, and `strict` (the default)\n * raises a `SchemaAlterationError` rather than reporting a repair which did\n * not happen.\n *\n * The column is altered in place, so it keeps the values it holds. That is the\n * reason the statement is built here: typeorm's `changeColumn` drops and\n * re-adds the column as soon as the type or the length differs, which empties\n * it. Drivers this module has no dialect for still go through typeorm — safe\n * on sqlite, which recreates the table and copies the values over.\n *\n * Widening a column a foreign key depends on additionally needs\n * {@see withForeignKeyChecksDisabled} on mysql, and is refused outright by\n * mariadb — there the constraint has to be dropped around the change.\n *\n * postgres converts the values with the assignment cast between the two types\n * and refuses a change which has none; pass `using` to describe the conversion\n * for those.\n *\n * @throws SchemaAlterationError if the column matches neither description and\n * `strict`.\n */\nexport async function changeColumnType(\n queryRunner: QueryRunner,\n input: SchemaChangeColumnTypeInput,\n) : Promise<boolean> {\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n const column = table.findColumnByName(input.column);\n if (!column) {\n if (isStrict(input)) {\n throw SchemaAlterationError.columnNotFound(input.table, input.column);\n }\n\n return false;\n }\n\n const { driver } = queryRunner.dataSource;\n const normalizeType = (type: string) => driver.normalizeType({ type });\n const describer : SchemaColumnDescriber = {\n normalizeType,\n describeType: (type, length) => {\n const probe = column.clone();\n probe.type = normalizeType(type);\n probe.length = normalizeColumnLength(length);\n\n return driver.createFullType(probe);\n },\n };\n\n // already applied\n if (matchesColumnType(column, input.to, describer)) {\n return false;\n }\n\n if (!matchesColumnType(column, input.from, describer)) {\n if (isStrict(input)) {\n throw SchemaAlterationError.columnMismatch(input.table, input.column);\n }\n\n return false;\n }\n\n const next = column.clone();\n next.type = normalizeType(input.to.type);\n\n if (typeof input.to.length !== 'undefined') {\n next.length = normalizeColumnLength(input.to.length);\n } else if (next.type.toLowerCase() !== normalizeType(column.type).toLowerCase()) {\n // the type changed and no length was asked for, so the current one\n // does not carry over (varchar(255) -> text, not text(255))\n next.length = '';\n }\n // same type without a length: keep the current one — a nullability-only\n // repair must not silently widen varchar(255) to varchar\n\n if (typeof input.to.nullable === 'boolean') {\n next.isNullable = input.to.nullable;\n }\n\n const { type } = queryRunner.dataSource.options;\n const dialect = findSchemaColumnDialect(type);\n\n if (input.using && dialect !== 'postgres') {\n // ignoring it would leave the server to coerce the values its own way,\n // which is exactly what the expression was passed to prevent\n throw DriverError.columnConversionExpressionNotSupported(type);\n }\n\n if (!dialect) {\n await queryRunner.changeColumn(table, column, next);\n\n return true;\n }\n\n const queries = buildChangeColumnTypeQueries(\n dialect,\n input.table,\n {\n ...buildColumnDefinition(driver, next),\n nullabilityChanged: next.isNullable !== column.isNullable,\n using: input.using,\n },\n );\n\n for (const query of queries) {\n await queryRunner.query(query);\n }\n\n return true;\n}\n","import type { QueryRunner } from 'typeorm';\nimport { SchemaAlterationError } from '../../../errors';\nimport { withForeignKeyChecksDisabled } from './checks';\nimport { resolveSchemaDialect } from './dialect';\nimport {\n buildAddForeignKeyQuery,\n buildDropForeignKeyQuery,\n buildDropIndexQuery,\n buildRenameForeignKeyQuery,\n buildRenameIndexQuery,\n} from './statements';\nimport type { SchemaDialect, SchemaRenameForeignKeyInput } from './type';\nimport { findTableForeignKey, findTableIndex, isStrict } from './utils';\n\n/**\n * mysql creates a backing index under the constraint name for a foreign key\n * column which carries no explicit index. That index survives the drop of the\n * constraint — it only becomes visible to the driver once the constraint is\n * gone, which is why the table has to be re-read here — and is dealt with\n * before the constraint is re-added, so the table can not end up with a stale\n * or duplicated index.\n *\n * Recent servers (verified on mysql 8/9 and mariadb 11) rename the index they\n * reuse for the new constraint themselves, which makes this a no-op in terms of\n * the end state. Doing it explicitly keeps the outcome independent of the\n * server version, and covers the case where the index can not be reused.\n */\nasync function alignForeignKeyBackingIndex(\n queryRunner: QueryRunner,\n input: SchemaRenameForeignKeyInput,\n) : Promise<void> {\n const table = await queryRunner.getTable(input.table);\n if (!table || !findTableIndex(table, input.from)) {\n return;\n }\n\n if (findTableIndex(table, input.to)) {\n await queryRunner.query(buildDropIndexQuery('mysql', input.table, input.from));\n\n return;\n }\n\n await queryRunner.query(buildRenameIndexQuery('mysql', input));\n}\n\n/**\n * Neither name is present. On mysql that is what a run interrupted between the\n * drop and the re-add leaves behind, and the constraint took its own\n * description with it — so it can only be restored from the passed meta.\n */\nasync function recreateForeignKey(\n queryRunner: QueryRunner,\n dialect: SchemaDialect,\n input: SchemaRenameForeignKeyInput,\n) : Promise<boolean> {\n const { meta } = input;\n if (!meta) {\n if (isStrict(input)) {\n throw SchemaAlterationError.foreignKeyNotFound(input.table, input.from);\n }\n\n return false;\n }\n\n await withForeignKeyChecksDisabled(queryRunner, async () => {\n if (dialect === 'mysql') {\n await alignForeignKeyBackingIndex(queryRunner, input);\n }\n\n await queryRunner.query(buildAddForeignKeyQuery(dialect, {\n table: input.table,\n name: input.to,\n columns: meta.columns,\n referencedTable: meta.referencedTable,\n referencedColumns: meta.referencedColumns,\n onDelete: meta.onDelete,\n onUpdate: meta.onUpdate,\n }));\n });\n\n return true;\n}\n\n/**\n * Rename a foreign key constraint, preserving its columns, its referenced\n * table/columns and its referential actions — all of which are read back from\n * the database, so the rename can not silently change the constraint.\n *\n * postgres renames the constraint in place, mysql has to drop and re-add it\n * (with the foreign key checks disabled, since the constraint was already\n * enforcing) and to take care of the backing index it may have created under\n * the constraint name.\n *\n * Returns false when a constraint is already named `to`, which keeps a repair\n * migration resumable. If neither name exists — the state an interrupted mysql\n * rename leaves behind, where the constraint took its own description with it —\n * the passed `meta` is used to restore it; without it `strict` (the default)\n * raises a `SchemaAlterationError`, since there is nothing left to rename.\n *\n * @throws DriverError for a driver which can not express the rename.\n * @throws SchemaAlterationError if neither name exists (and no `meta` describes\n * the constraint) and `strict`.\n */\nexport async function renameForeignKey(\n queryRunner: QueryRunner,\n input: SchemaRenameForeignKeyInput,\n) : Promise<boolean> {\n const dialect = resolveSchemaDialect(queryRunner.dataSource.options.type);\n\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n if (findTableForeignKey(table, input.to)) {\n return false;\n }\n\n const foreignKey = findTableForeignKey(table, input.from);\n if (!foreignKey) {\n return recreateForeignKey(queryRunner, dialect, input);\n }\n\n if (dialect === 'postgres') {\n await queryRunner.query(buildRenameForeignKeyQuery(input));\n\n return true;\n }\n\n await withForeignKeyChecksDisabled(queryRunner, async () => {\n await queryRunner.query(buildDropForeignKeyQuery(dialect, input.table, input.from));\n\n await alignForeignKeyBackingIndex(queryRunner, input);\n\n await queryRunner.query(buildAddForeignKeyQuery(dialect, {\n table: input.table,\n name: input.to,\n columns: foreignKey.columnNames,\n referencedTable: foreignKey.referencedTableName,\n referencedColumns: foreignKey.referencedColumnNames,\n onDelete: foreignKey.onDelete,\n onUpdate: foreignKey.onUpdate,\n }));\n });\n\n return true;\n}\n","import type { QueryRunner } from 'typeorm';\nimport { SchemaAlterationError } from '../../../errors';\nimport { resolveSchemaDialect } from './dialect';\nimport { buildRenameIndexQuery } from './statements';\nimport type { SchemaRenameIndexInput } from './type';\nimport { findTableIndex, isStrict } from './utils';\n\n/**\n * Rename an index.\n *\n * Returns false when an index is already named `to` — that is what keeps a\n * repair migration resumable, since mysql commits DDL regardless of the\n * surrounding transaction.\n *\n * When neither name is present (or the table is missing) the database is not\n * in a state this can act on, and `strict` (the default) raises a\n * `SchemaAlterationError` rather than reporting a repair which did not happen.\n *\n * Note that an index which backs a constraint is not reported as an index by\n * the driver: a unique constraint on postgres lives in `table.uniques`, and a\n * foreign key's backing index on mysql only becomes visible once the constraint\n * is dropped (see renameForeignKey).\n *\n * @throws DriverError for a driver which can not express the rename.\n * @throws SchemaAlterationError if neither name exists and `strict`.\n */\nexport async function renameIndex(\n queryRunner: QueryRunner,\n input: SchemaRenameIndexInput,\n) : Promise<boolean> {\n const dialect = resolveSchemaDialect(queryRunner.dataSource.options.type);\n\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n // already renamed\n if (findTableIndex(table, input.to)) {\n return false;\n }\n\n if (!findTableIndex(table, input.from)) {\n if (isStrict(input)) {\n throw SchemaAlterationError.indexNotFound(input.table, input.from);\n }\n\n return false;\n }\n\n await queryRunner.query(buildRenameIndexQuery(dialect, input));\n\n return true;\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DataSource, InstanceChecker } from 'typeorm';\n\nexport type OwnedDataSource = {\n dataSource: DataSource,\n /**\n * Whether the data source was built (and therefore must be destroyed) here.\n */\n owned: boolean\n};\n\nasync function buildOwnedDataSource(\n options: DataSourceOptions,\n override?: Partial<DataSourceOptions>,\n) : Promise<OwnedDataSource> {\n const dataSource = new DataSource({\n ...options,\n ...(override || {}),\n } as DataSourceOptions);\n\n await dataSource.initialize();\n\n return {\n dataSource,\n owned: true,\n };\n}\n\n/**\n * Whether initializing a data source with these options would do something the\n * override exists to prevent (e.g. synchronize or drop the schema).\n */\nfunction conflictsWithOverride(\n options: DataSourceOptions,\n override: Partial<DataSourceOptions>,\n) : boolean {\n const record = options as Record<string, any>;\n\n return Object.entries(override).some(\n ([key, value]) => !!record[key] && record[key] !== value,\n );\n}\n\n/**\n * Accept either an existing DataSource or the options to build one, and\n * guarantee it is initialized.\n *\n * A data source built here is owned by the caller of this function and must be\n * destroyed by it. An already initialized one is used as is and never\n * destroyed.\n *\n * An uninitialized DataSource is only initialized when doing so does not\n * conflict with the override: `DataSource.initialize()` applies the instance's\n * own `dropSchema` / `synchronize` / `migrationsRun`, and a read-only caller\n * passing the override exists precisely to prevent that. Such an instance is\n * therefore left untouched and inspected through an own one instead.\n */\nexport async function useInitializedDataSource(\n input: DataSource | DataSourceOptions,\n override?: Partial<DataSourceOptions>,\n) : Promise<OwnedDataSource> {\n if (InstanceChecker.isDataSource(input)) {\n if (input.isInitialized) {\n return {\n dataSource: input,\n owned: false,\n };\n }\n\n if (override && conflictsWithOverride(input.options, override)) {\n return buildOwnedDataSource(input.options, override);\n }\n\n await input.initialize();\n\n return {\n dataSource: input,\n owned: false,\n };\n }\n\n return buildOwnedDataSource(input, override);\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport { SchemaDriftError } from '../../../errors';\nimport { useInitializedDataSource } from '../utils';\nimport type { SchemaDrift, SchemaDriftOptions, SchemaDriftStatement } from './type';\n\nfunction toStatement(query: { query: string, parameters?: any[] }) : SchemaDriftStatement {\n if (query.parameters && query.parameters.length > 0) {\n return {\n query: query.query,\n parameters: query.parameters,\n };\n }\n\n return { query: query.query };\n}\n\nfunction buildEmptyDrift() : SchemaDrift {\n return {\n exists: false,\n up: [],\n down: [],\n };\n}\n\n/**\n * Compare the database schema against the entity metadata and return the\n * statements which would reconcile the former with the latter.\n *\n * A schema which is built by migrations in production but by synchronize()\n * in tests has no guard against the two descriptions drifting apart. Run this\n * right after the migrations to close that gap:\n *\n * ```ts\n * const drift = await getSchemaDrift(dataSource);\n * if (drift.exists) {\n * console.log(drift.up.map((statement) => statement.query));\n * }\n * ```\n *\n * The inspection itself never writes to the database. A data source built from\n * the passed options is therefore built with `synchronize`, `migrationsRun` and\n * `dropSchema` disabled, and an uninitialized DataSource which has any of them\n * enabled is left untouched and inspected through an own instance — otherwise\n * initializing it would mutate (or drop) the very schema being inspected.\n */\nexport async function getSchemaDrift(\n input: DataSource | DataSourceOptions,\n options: SchemaDriftOptions = {},\n) : Promise<SchemaDrift> {\n const { dataSource, owned } = await useInitializedDataSource(input, {\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n });\n\n try {\n if (options.skipWithoutMigrations && dataSource.migrations.length === 0) {\n return buildEmptyDrift();\n }\n\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n const up = sqlInMemory.upQueries.map(toStatement);\n const down = sqlInMemory.downQueries.map(toStatement);\n\n return {\n exists: up.length > 0,\n up,\n down,\n };\n } finally {\n if (owned) {\n await dataSource.destroy();\n }\n }\n}\n\n/**\n * Throw if the database schema deviates from the entity metadata.\n *\n * @throws SchemaDriftError\n */\nexport async function assertSchemaMatchesMetadata(\n input: DataSource | DataSourceOptions,\n options: SchemaDriftOptions = {},\n) : Promise<void> {\n const drift = await getSchemaDrift(input, options);\n\n if (drift.exists) {\n throw SchemaDriftError.detected(drift.up);\n }\n}\n","import type { DataSource, DataSourceOptions, Migration } from 'typeorm';\nimport { useInitializedDataSource } from './utils';\n\nexport async function synchronizeDatabaseSchema(\n input: DataSource | DataSourceOptions,\n) : Promise<Migration[]> {\n const { dataSource, owned } = await useInitializedDataSource(input);\n const { options } = dataSource;\n\n let migrationsCount = 0;\n if (options.migrations) {\n migrationsCount = Array.isArray(options.migrations) ?\n options.migrations.length :\n Object.keys(options.migrations).length;\n }\n\n let migrations : Migration[] = [];\n\n if (migrationsCount > 0) {\n migrations = await dataSource.runMigrations({ transaction: options.migrationsTransactionMode });\n } else {\n await dataSource.synchronize(false);\n }\n\n if (owned) {\n await dataSource.destroy();\n }\n\n return migrations;\n}\n","import type {\n DatabaseDialectName,\n DatabaseDialectOverrides,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useDatabaseDialectEntry } from '../registry';\nimport { synchronizeDatabaseSchema } from '../schema';\nimport type { DatabaseCreateContext, DatabaseDropContext } from './type';\n\n/**\n * Wraps a caller supplied connection as a connection factory.\n * The connection is treated as already open, and the caller owns the\n * lifecycle — open() and close() never touch it.\n */\nclass InjectedConnectionFactory implements IDatabaseConnectionFactory {\n constructor(protected injected: Pick<IDatabaseConnection, 'execute'>) {\n this.injected = injected;\n }\n\n create(): IDatabaseConnection {\n const { injected } = this;\n\n return {\n open: () => Promise.resolve(),\n execute: (statement: string) => injected.execute(statement),\n close: () => Promise.resolve(),\n };\n }\n}\n\nfunction buildOverrides(\n context: DatabaseCreateContext | DatabaseDropContext,\n overrides: DatabaseDialectOverrides,\n): DatabaseDialectOverrides {\n if (context.connection && !overrides.connectionFactory) {\n return {\n ...overrides,\n connectionFactory: new InjectedConnectionFactory(context.connection),\n };\n }\n\n return overrides;\n}\n\n/**\n * Composition root for the create operation: resolves the registry entry,\n * derives connection params once, builds the dialect with its connection factory\n * (honouring overrides and a caller supplied connection) and runs the\n * schema synchronization exactly once.\n */\nexport async function executeDatabaseCreate(\n name: DatabaseDialectName,\n context: DatabaseCreateContext,\n overrides: DatabaseDialectOverrides = {},\n): Promise<unknown> {\n const entry = useDatabaseDialectEntry(name);\n const params = entry.buildParams(context.options);\n\n const dialect = entry.buildDialect(context.options, params, buildOverrides(context, overrides));\n\n const output = await dialect.create({\n params,\n ifNotExist: context.ifNotExist,\n initialDatabase: context.initialDatabase,\n });\n\n if (context.synchronize) {\n await synchronizeDatabaseSchema(context.options);\n }\n\n return output;\n}\n\nexport async function executeDatabaseDrop(\n name: DatabaseDialectName,\n context: DatabaseDropContext,\n overrides: DatabaseDialectOverrides = {},\n): Promise<unknown> {\n const entry = useDatabaseDialectEntry(name);\n const params = entry.buildParams(context.options);\n\n const dialect = entry.buildDialect(context.options, params, buildOverrides(context, overrides));\n\n return dialect.drop({\n params,\n ifExist: context.ifExist ?? true,\n initialDatabase: context.initialDatabase,\n });\n}\n","import { buildDatabaseCreateContext } from '../../utils/context';\nimport { resolveDatabaseDialectName } from '../../registry';\nimport { executeDatabaseCreate } from '../execute';\nimport type {\n DatabaseCreateContextInput,\n} from '../type';\n\n/**\n * Create database for specified driver in ConnectionOptions.\n *\n * @throws DriverError\n * @throws OptionsError\n *\n * @param input\n */\nexport async function createDatabase(input: DatabaseCreateContextInput = {}) : Promise<unknown> {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate(resolveDatabaseDialectName(context.options.type), context);\n}\n","import { buildDatabaseDropContext } from '../../utils/context';\nimport { resolveDatabaseDialectName } from '../../registry';\nimport { executeDatabaseDrop } from '../execute';\nimport type {\n DatabaseDropContextInput,\n} from '../type';\n\n/**\n * Drop database for specified driver in ConnectionOptions.\n *\n * @throws DriverError\n * @throws OptionsError\n *\n * @param input\n */\nexport async function dropDatabase(input: DatabaseDropContextInput = {}) : Promise<unknown> {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop(resolveDatabaseDialectName(context.options.type), context);\n}\n","import { pascalCase } from 'pascal-case';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { MigrationGenerateCommand } from 'typeorm/commands/MigrationGenerateCommand';\nimport type { MigrationGenerateCommandContext, MigrationGenerateResult } from './type';\n\nclass GenerateCommand extends MigrationGenerateCommand {\n static prettify(query: string) {\n return this.prettifyQuery(query);\n }\n}\n\nfunction queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return '';\n }\n\n return `, ${JSON.stringify(parameters)}`;\n}\n\nfunction buildTemplate(\n name: string,\n timestamp: number,\n upStatements: string[],\n downStatements: string[],\n): string {\n const migrationName = `${pascalCase(name)}${timestamp}`;\n\n const up = upStatements.map((statement) => ` ${statement}`);\n const down = downStatements.map((statement) => ` ${statement}`);\n\n return `import type { MigrationInterface, QueryRunner } from 'typeorm';\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}';\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${up.join(`\n`)}\n }\n public async down(queryRunner: QueryRunner): Promise<void> {\n${down.join(`\n`)}\n }\n}\n`;\n}\n\nexport async function generateMigration(\n context: MigrationGenerateCommandContext,\n) : Promise<MigrationGenerateResult> {\n context.name = context.name || 'Default';\n\n const timestamp = context.timestamp || new Date().getTime();\n const fileName = `${timestamp}-${context.name}.ts`;\n\n const { dataSource } = context;\n\n const up: string[] = []; const\n down: string[] = [];\n\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n if (context.prettify) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = GenerateCommand.prettify(\n upQuery.query,\n );\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query = GenerateCommand.prettify(\n downQuery.query,\n );\n });\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n up.push(`await queryRunner.query(\\`${upQuery.query.replace(/`/g, '\\\\`')}\\`${queryParams(upQuery.parameters)});`);\n });\n\n sqlInMemory.downQueries.forEach((downQuery) => {\n down.push(`await queryRunner.query(\\`${downQuery.query.replace(/`/g, '\\\\`')}\\`${queryParams(downQuery.parameters)});`);\n });\n\n if (\n up.length === 0 &&\n down.length === 0\n ) {\n return { up, down };\n }\n\n const content = buildTemplate(context.name, timestamp, up, down.reverse());\n\n if (!context.preview) {\n let directoryPath : string;\n if (context.directoryPath) {\n if (!path.isAbsolute(context.directoryPath)) {\n directoryPath = path.join(process.cwd(), context.directoryPath);\n } else {\n directoryPath = context.directoryPath;\n }\n } else {\n directoryPath = path.join(process.cwd(), 'migrations');\n }\n\n try {\n await fs.promises.access(directoryPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch {\n await fs.promises.mkdir(directoryPath, { recursive: true });\n }\n\n await fs.promises.writeFile(\n path.join(directoryPath, fileName),\n content,\n { encoding: 'utf-8' },\n );\n }\n\n return {\n up,\n down,\n content,\n };\n}\n","/* istanbul ignore next */\nimport type { ObjectLiteral, SelectQueryBuilder } from 'typeorm';\n\nexport function existsQuery<T extends ObjectLiteral = ObjectLiteral>(builder: SelectQueryBuilder<T>, inverse = false) {\n return `${inverse ? 'not ' : ''}exists (${builder.getQuery()})`;\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createCockroachDBDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('cockroachdb', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropCockroachDBDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('cockroachdb', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMongoDBDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mongodb', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMongoDBDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mongodb', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMsSQLDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mssql', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMsSQLDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mssql', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMySQLDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mysql', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMySQLDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mysql', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createOracleDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('oracle', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropOracleDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('oracle', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createPostgresDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('postgres', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropPostgresDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('postgres', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createSQLiteDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('better-sqlite3', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropSQLiteDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('better-sqlite3', context);\n}\n","import type { EntitySchema, ObjectType } from 'typeorm';\nimport { InstanceChecker } from 'typeorm';\n\nexport function getEntityName<O>(entity: ObjectType<O> | EntitySchema<O> | string) : string {\n if (typeof entity === 'string') {\n return entity;\n }\n\n if (typeof entity === 'function') {\n return entity.name;\n }\n\n if (InstanceChecker.isEntitySchema(entity)) {\n return entity.options.name;\n }\n\n return new (entity as any)().constructor.name;\n}\n","import { InstanceChecker, Repository } from 'typeorm';\nimport type {\n DataSource,\n EntityMetadata,\n EntityTarget,\n ObjectLiteral,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { EntityMetadataError } from '../../errors';\n\n/**\n * Describe an entity target for an error message.\n *\n * Every representation typeorm accepts has to be covered, and none of them may\n * be constructed to find out: the target of a failed lookup can be anything.\n */\nfunction describeEntityTarget(input: unknown) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n if (typeof input === 'function') {\n return input.name;\n }\n\n if (InstanceChecker.isEntitySchema(input)) {\n return input.options.name;\n }\n\n if (\n typeof input === 'object' &&\n input !== null &&\n typeof (input as { name?: unknown }).name === 'string'\n ) {\n return (input as { name: string }).name;\n }\n\n return String(input);\n}\n\n/**\n * Receive metadata for a given repository or entity-target.\n *\n * @experimental\n * @param input\n * @param dataSource\n */\nexport async function getEntityMetadata<T extends ObjectLiteral>(\n input: Repository<T> | EntityTarget<T>,\n dataSource?: DataSource,\n): Promise<EntityMetadata> {\n if (input instanceof Repository) {\n return input.metadata;\n }\n\n dataSource = dataSource || await useDataSource();\n\n // The lookup is delegated to typeorm, so every entity-target\n // representation (class, entity schema, name, ...) is resolved alike.\n if (!dataSource.hasMetadata(input)) {\n throw EntityMetadataError.notRegistered(describeEntityTarget(input));\n }\n\n return dataSource.getMetadata(input);\n}\n","import type { \n DataSource, \n EntityMetadata, \n EntityTarget, \n ObjectLiteral, \n Repository, \n} from 'typeorm';\nimport { getEntityMetadata } from './metadata';\n\n/**\n * Get (relation-) property names of a given entity.\n *\n * @experimental\n * @param input\n * @param dataSource\n */\nexport async function getEntityPropertyNames<T extends ObjectLiteral>(\n input: EntityTarget<T> | Repository<T>,\n dataSource?: DataSource,\n) : Promise<string[]> {\n const entityMetadata : EntityMetadata = await getEntityMetadata(input, dataSource);\n\n const items : string[] = [];\n\n for (let i = 0; i < entityMetadata.columns.length; i++) {\n items.push(entityMetadata.columns[i].propertyName);\n }\n\n for (let i = 0; i < entityMetadata.relations.length; i++) {\n items.push(entityMetadata.relations[i].propertyName);\n }\n\n return items;\n}\n","import type {\n DataSource, \n EntityTarget, \n FindOptionsWhere, \n ObjectLiteral,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { EntityRelationLookupError } from '../../errors';\nimport { getEntityMetadata } from './metadata';\n\ntype EntityRelationColumnsValidateOptions<T> = {\n dataSource?: DataSource,\n entityTarget: EntityTarget<T>,\n};\n\n/**\n * Validate join columns of a given entity.\n * It will look up and append the referenced entities to the input entity.\n *\n * @experimental\n * @param entity\n * @param options\n */\nexport async function validateEntityJoinColumns<T extends ObjectLiteral>(\n entity: Partial<T>,\n options: EntityRelationColumnsValidateOptions<T>,\n) {\n const dataSource = options.dataSource || await useDataSource();\n const entityMetadata = await getEntityMetadata(options.entityTarget, dataSource);\n\n const relations : Partial<T> = {};\n for (let i = 0; i < entityMetadata.relations.length; i++) {\n const relation = entityMetadata.relations[i];\n\n let skipRelation : boolean = false;\n\n const where : FindOptionsWhere<ObjectLiteral> = {};\n const columns : string[] = [];\n for (let j = 0; j < relation.joinColumns.length; j++) {\n const joinColumn = relation.joinColumns[j];\n if (typeof entity[joinColumn.propertyName] === 'undefined') {\n continue;\n }\n\n if (\n joinColumn.isNullable &&\n entity[joinColumn.propertyName] === null\n ) {\n skipRelation = true;\n break;\n }\n\n if (joinColumn.referencedColumn) {\n where[joinColumn.referencedColumn.propertyName] = entity[joinColumn.propertyName];\n\n columns.push(joinColumn.propertyName);\n } else {\n throw EntityRelationLookupError.notReferenced(\n relation.propertyName,\n [joinColumn.propertyName],\n );\n }\n }\n\n // Nothing to look the relation up by. A relation which does not own the\n // foreign key (one-to-many, ...) never has join columns, and querying\n // without a condition would match an arbitrary row.\n if (skipRelation || columns.length === 0) {\n continue;\n }\n\n // A composite foreign key can only be looked up if every join column is\n // provided. Querying by a subset of them could match an unrelated row.\n if (columns.length !== relation.joinColumns.length) {\n continue;\n }\n\n const repository = dataSource.getRepository(relation.type);\n const item = await repository.findOne({ where });\n\n if (!item) {\n throw EntityRelationLookupError.notFound(relation.propertyName, columns);\n }\n\n relations[relation.propertyName as keyof T] = item as T[keyof T];\n }\n\n const relationKeys = Object.keys(relations);\n for (const relationKey of relationKeys) {\n entity[relationKey as keyof T] = relations[relationKey] as T[keyof T];\n }\n\n return entity;\n}\n","import { Brackets } from 'typeorm';\nimport type {\n DataSource,\n EntityTarget,\n ObjectLiteral,\n WhereExpressionBuilder,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { isObject } from '../../utils';\nimport { getEntityMetadata } from './metadata';\n\ntype EntityUniquenessCheckOptions<T> = {\n /**\n * Repository entity class.\n */\n entityTarget: EntityTarget<T>,\n\n /**\n * Entity to insert/update.\n */\n entity: Partial<T>,\n\n /**\n * Entity found.\n */\n entityExisting?: Partial<T> | null,\n\n /**\n * DataSource to use\n */\n dataSource?: DataSource\n};\n\nfunction transformUndefinedToNull<T>(input: undefined | T) : T {\n if (typeof input === 'undefined') {\n return null as T;\n }\n\n return input;\n}\n\n/**\n * Read the value of a column property path.\n *\n * The path of a column of an embedded entity is nested (profile.email), so it\n * can not be used as a plain key. A path which is not reachable counts as\n * absent, like a column the input does not define at all.\n */\nfunction readPropertyPath(data: Record<string, any>, path: string) : unknown {\n const parts = path.split('.');\n\n let current : any = data;\n for (const part of parts) {\n if (!isObject(current)) {\n return undefined;\n }\n\n current = current[part];\n }\n\n return current;\n}\n\nfunction pickPropertyPaths(data: Record<string, any>, paths: string[]) : Record<string, any> {\n const output : Record<string, any> = {};\n for (const path of paths) {\n output[path] = readPropertyPath(data, path);\n }\n\n return output;\n}\n\n/**\n * Prefixing the property with the query alias is what lets the query builder\n * translate it to the column name of the database.\n */\nfunction buildPropertyPath(alias: string, key: string) : string {\n return `${alias}.${key}`;\n}\n\n/**\n * Match the row which the write would produce: every column has to hold the\n * given value, so the conditions are combined with AND.\n */\nfunction applyMatchExpression(\n qb: WhereExpressionBuilder,\n alias: string,\n data: Record<string, any>,\n) {\n const keys = Object.keys(data);\n for (const [index, key] of keys.entries()) {\n const value = transformUndefinedToNull(data[key]);\n const propertyPath = buildPropertyPath(alias, key);\n\n if (value === null) {\n qb.andWhere(`${propertyPath} IS NULL`);\n\n continue;\n }\n\n const bindingKey = `match_${index}`;\n\n qb.andWhere(`${propertyPath} = :${bindingKey}`, { [bindingKey]: value });\n }\n}\n\n/**\n * Exclude one specific row, identified by the given columns.\n *\n * This is the negation of a match, and the negation of a conjunction is a\n * disjunction: a row is a different one as soon as a single column differs.\n * Combining the conditions with AND instead would only exclude a row which\n * differs in every column, so a row sharing one column of a composite primary\n * key with the excluded one would be dropped from the result as well.\n */\nfunction applyExclusionExpression(\n qb: WhereExpressionBuilder,\n alias: string,\n data: Record<string, any>,\n) {\n const keys = Object.keys(data);\n for (const [index, key] of keys.entries()) {\n const value = transformUndefinedToNull(data[key]);\n const propertyPath = buildPropertyPath(alias, key);\n\n if (value === null) {\n qb.orWhere(`${propertyPath} IS NOT NULL`);\n\n continue;\n }\n\n const bindingKey = `exclude_${index}`;\n\n qb.orWhere(`${propertyPath} != :${bindingKey}`, { [bindingKey]: value });\n }\n}\n\n/**\n * Resolve the values a unique column group will hold after the write.\n *\n * A value provided by the input entity wins. If the input does not define the\n * column and an existing entity is given, the persisted value is kept, because\n * an update leaves that column untouched. Otherwise the column will be null.\n */\nfunction resolveColumnGroupValues<T extends ObjectLiteral>(\n columnGroup: string[],\n entity: Partial<T>,\n entityExisting?: Partial<T> | null,\n) : Record<string, any> {\n const output : Record<string, any> = {};\n\n for (const path of columnGroup) {\n const value = readPropertyPath(entity, path);\n if (typeof value !== 'undefined') {\n output[path] = value;\n\n continue;\n }\n\n const valueExisting = entityExisting ?\n readPropertyPath(entityExisting, path) :\n undefined;\n if (typeof valueExisting !== 'undefined') {\n output[path] = valueExisting;\n\n continue;\n }\n\n output[path] = null;\n }\n\n return output;\n}\n\n/**\n * Check if a given entity does not already exist.\n * Composite unique keys on a null column can only be present once.\n *\n * @experimental\n * @param options\n */\nexport async function isEntityUnique<T extends ObjectLiteral>(\n options: EntityUniquenessCheckOptions<T>,\n) : Promise<boolean> {\n const dataSource = options.dataSource || await useDataSource();\n\n const metadata = await getEntityMetadata(options.entityTarget, dataSource);\n\n const repository = dataSource.getRepository(metadata.target);\n\n const primaryColumnPaths = metadata.primaryColumns.map((c) => c.propertyPath);\n\n const columnGroups : string[][] = [];\n if (\n metadata.ownUniques &&\n metadata.ownUniques.length > 0\n ) {\n for (let i = 0; i < metadata.ownUniques.length; i++) {\n columnGroups.push(metadata.ownUniques[i].columns.map(\n (column) => column.propertyPath,\n ));\n }\n } else {\n for (let i = 0; i < metadata.indices.length; i++) {\n const index = metadata.indices[i];\n if (!index.isUnique || index.entityMetadata.target !== metadata.target) {\n continue;\n }\n\n columnGroups.push(index.columns.map(\n (column) => column.propertyPath,\n ));\n }\n }\n\n for (const columnGroup of columnGroups) {\n const alias = 'entity';\n const queryBuilder = repository.createQueryBuilder(alias);\n queryBuilder.where(new Brackets((qb) => {\n applyMatchExpression(\n qb,\n alias,\n resolveColumnGroupValues(columnGroup, options.entity, options.entityExisting),\n );\n }));\n\n if (options.entityExisting) {\n queryBuilder.andWhere(new Brackets((qb) => {\n applyExclusionExpression(qb, alias, pickPropertyPaths(options.entityExisting!, primaryColumnPaths));\n }));\n }\n\n const entity = await queryBuilder.getOne();\n if (entity) {\n return false;\n }\n }\n\n return true;\n}\n","import type { Environment } from '../env';\nimport type { SeederConfig, SeederOptions } from './type';\n\nconst SEEDS_DEFAULT = ['src/database/seeds/**/*{.ts,.js}'];\nconst FACTORIES_DEFAULT = ['src/database/factories/**/*{.ts,.js}'];\n\nfunction firstNonEmpty<T extends unknown[]>(\n ...candidates: (T | undefined)[]\n) : T | undefined {\n return candidates.find(\n (candidate) => typeof candidate !== 'undefined' && candidate.length > 0,\n );\n}\n\nexport function resolveSeederConfig(\n input: SeederOptions = {},\n dataSourceOptions: SeederOptions = {},\n env: Pick<Environment, 'seeds' | 'factories'> = { seeds: [], factories: [] },\n) : SeederConfig {\n return {\n seeds: firstNonEmpty(input.seeds, dataSourceOptions.seeds, env.seeds) ??\n SEEDS_DEFAULT,\n seedName: input.seedName,\n seedTableName: input.seedTableName ||\n dataSourceOptions.seedTableName ||\n 'seeds',\n seedTracking: input.seedTracking ??\n dataSourceOptions.seedTracking ??\n false,\n factories: firstNonEmpty(input.factories, dataSourceOptions.factories, env.factories) ??\n FACTORIES_DEFAULT,\n };\n}\n","import type { Seeder, SeederConstructor } from './type';\n\nexport class SeederEntity {\n /**\n * ID of the seeder.\n *\n * Indicates order of the executed seeders.\n */\n id?: number;\n\n /**\n * Timestamp of the seeder.\n */\n timestamp: number;\n\n /**\n * Name of the seeder (class name).\n */\n name: string;\n\n /**\n * Instance of seeder constructor.\n */\n instance?: Seeder;\n\n /**\n * File name of the seeder.\n */\n fileName?: string;\n\n /**\n * File path of the seeder.\n */\n filePath?: string;\n\n /**\n * Result of the executed seeder.\n */\n result?: unknown;\n\n constructor(ctx: {\n id?: number,\n timestamp: number,\n name: string,\n constructor?: SeederConstructor,\n fileName?: string,\n filePath?: string\n }) {\n this.id = ctx.id;\n this.timestamp = ctx.timestamp;\n this.name = ctx.name;\n\n if (ctx.constructor) {\n this.instance = new ctx.constructor();\n }\n\n this.fileName = ctx.fileName;\n this.filePath = ctx.filePath;\n }\n\n get trackExecution() : boolean | undefined {\n if (typeof this.instance === 'undefined') {\n return undefined;\n }\n\n return this.instance.track;\n }\n\n /**\n * Decide whether this seeder's execution should be tracked.\n * The per-seed track property wins over the executor-level default.\n */\n effectiveTracking(fallback: boolean) : boolean {\n return this.trackExecution ?? fallback;\n }\n\n /**\n * Execution-order comparator:\n * by file name when both entities are file-backed, by timestamp otherwise.\n */\n static compare(a: SeederEntity, b: SeederEntity) : number {\n if (\n typeof a.fileName !== 'undefined' &&\n typeof b.fileName !== 'undefined' &&\n a.fileName !== b.fileName\n ) {\n return a.fileName > b.fileName ? 1 : -1;\n }\n\n return a.timestamp - b.timestamp;\n }\n}\n","import { hasOwnProperty, isPromise } from '../../utils';\nimport type { SaveOptions } from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport type { SeederFactoryContext } from './type';\n\nexport class SeederFactory<O extends Record<string, any>, Meta = unknown> {\n public readonly context: SeederFactoryContext<O, Meta>;\n\n public meta: Meta | undefined;\n\n // --------------------------------------------------------------\n\n constructor(context: SeederFactoryContext<O, Meta>) {\n this.context = context;\n }\n\n // --------------------------------------------------------------\n\n public setMeta(value: Meta) {\n this.meta = value;\n\n return this;\n }\n\n // --------------------------------------------------------------\n\n public async make(params?: Partial<O>, save?: boolean) {\n const factoryFn = this.context.factoryFn(this.meta);\n let entity : O;\n if (isPromise(factoryFn)) {\n entity = await this.resolve(await factoryFn, save);\n } else {\n entity = await this.resolve(factoryFn, save);\n }\n\n if (params) {\n const keys : (keyof O)[] = Object.keys(params);\n for (const key of keys) {\n entity[key] = (params as O)[key];\n }\n }\n\n return entity;\n }\n\n // --------------------------------------------------------------\n\n public async save(\n params?: Partial<O>,\n options?: SaveOptions,\n ) : Promise<O> {\n const dataSource = this.context.dataSource || await useDataSource();\n\n const entity = await this.make(params, true);\n const entityManager = dataSource.getRepository(this.context.entity);\n\n return entityManager.save(entity, options);\n }\n\n public async saveMany(\n amount: number,\n params?: Partial<O>,\n options?: SaveOptions,\n ) : Promise<O[]> {\n const promises : Promise<O>[] = [];\n for (let i = 0; i < amount; i++) {\n const item = this.save(params, options);\n promises.push(item);\n }\n\n return Promise.all(promises);\n }\n\n // --------------------------------------------------------------\n\n private async resolve(entity: O, save?: boolean) : Promise<O> {\n const keys = Object.keys(entity);\n for (const key of keys as (keyof O)[]) {\n const value : O[keyof O] = entity[key];\n\n if (!hasOwnProperty(entity, key)) {\n continue;\n }\n\n if (\n typeof value === 'object' &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n value instanceof SeederFactory\n ) {\n const factory = value as SeederFactory<any>;\n if (this.context.dataSource && !factory.context.dataSource) {\n factory.context.dataSource = this.context.dataSource;\n }\n\n if (save) {\n entity[key] = await factory.save();\n } else {\n entity[key] = await factory.make();\n }\n }\n\n if (\n value &&\n hasOwnProperty(value, 'then') &&\n typeof value.then === 'function'\n ) {\n entity[key] = await value;\n }\n }\n\n return entity;\n }\n}\n","import type { DataSource, EntitySchema, ObjectType } from 'typeorm';\nimport type { FactoryCallback, SeederFactoryItem, SeederFactoryManagerContext } from './type';\nimport { getEntityName } from '../../helpers';\nimport { hasOwnProperty } from '../../utils';\nimport { SeederFactory } from './module';\n\nexport class SeederFactoryManager {\n public readonly items : Record<string, SeederFactoryItem>;\n\n public readonly dataSource : DataSource | undefined;\n\n constructor(context: SeederFactoryManagerContext = {}) {\n this.items = context.items || {};\n this.dataSource = context.dataSource;\n }\n\n set<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n factoryFn: FactoryCallback<O, Meta>,\n ) : SeederFactoryItem {\n const name = getEntityName(entity);\n\n this.items[name] = {\n factoryFn,\n entity,\n };\n\n return this.items[name];\n }\n\n get<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n ) : SeederFactory<O, Meta> {\n const name = getEntityName(entity);\n\n if (!hasOwnProperty(this.items, name)) {\n throw new Error(`No seeder factory is registered for the entity: ${name}`);\n }\n\n return new SeederFactory({\n factoryFn: this.items[name].factoryFn,\n entity,\n name,\n dataSource: this.dataSource,\n });\n }\n}\n","import { getFileNameExtension } from 'locter';\n\nexport function buildSeederFileName(\n name: string,\n timestamp: number,\n options: { javascript?: boolean } = {},\n): string {\n if (getFileNameExtension(name)) {\n return `${timestamp}-${name}`;\n }\n\n return `${timestamp}-${name}${options.javascript ? '.js' : '.ts'}`;\n}\n","import type { LocatorInfo } from 'locter';\nimport { buildFilePath, locateMany } from 'locter';\nimport { resolveFilePath } from '../../utils';\n\nexport async function resolveFilePatterns(\n filesPattern: string[],\n root?: string,\n) : Promise<string[]> {\n return locateMany(\n filesPattern,\n {\n ...(root ? { cwd: root } : {}),\n ignore: ['**/*.d.ts'],\n },\n ).then(buildFilePathname);\n}\n\nexport function resolveFilePaths(\n filePaths: string[],\n root?: string,\n) {\n return filePaths.map((filePath) => resolveFilePath(filePath, root));\n}\n\nfunction buildFilePathname(files: LocatorInfo[]) {\n return (\n // sorting by name so that we can define the order of execution using file names\n files.sort((a, b) => (a.name > b.name ? 1 : -1)).map((el) => buildFilePath(el))\n );\n}\n","import { readAsModule } from 'locter';\nimport path from 'node:path';\nimport type { SeederConstructor, SeederPrepareElement } from '../type';\nimport { resolveFilePaths, resolveFilePatterns } from './file-path';\n\nexport async function prepareSeederSeeds(\n input: SeederConstructor[] | string[],\n root?: string,\n): Promise<SeederPrepareElement[]> {\n const items: SeederPrepareElement[] = [];\n\n let seedFiles: string[] = [];\n const seedConstructors: SeederConstructor[] = [];\n\n for (const value of input) {\n if (typeof value === 'string') {\n seedFiles.push(value);\n } else {\n seedConstructors.push(value);\n }\n }\n\n if (seedFiles.length > 0) {\n seedFiles = await resolveFilePatterns(seedFiles, root);\n seedFiles = resolveFilePaths(seedFiles, root);\n\n for (const filePath of seedFiles) {\n const moduleExports = await readAsModule(filePath);\n\n let clazzConstructor : SeederConstructor | undefined;\n\n const exportKeys = Object.keys(moduleExports);\n for (const exportKey of exportKeys) {\n const moduleExport = moduleExports[exportKey];\n if (\n typeof moduleExport === 'function' &&\n moduleExport.prototype\n ) {\n clazzConstructor = moduleExport;\n }\n }\n\n if (clazzConstructor) {\n const fileName = path.basename(filePath);\n const match = fileName.match(/^([0-9]{13,})-(.*)$/);\n\n let timestamp : number | undefined;\n if (match) {\n timestamp = Number.parseInt(match[1], 10);\n }\n\n items.push({\n constructor: clazzConstructor,\n fileName,\n filePath,\n ...(timestamp ? { timestamp } : {}),\n });\n }\n }\n }\n\n if (seedConstructors.length > 0) {\n for (const seedConstructor of seedConstructors) {\n items.push({ constructor: seedConstructor });\n }\n }\n\n return items;\n}\n","import { pascalCase } from 'pascal-case';\n\nexport function buildSeederFileTemplate(\n name: string,\n timestamp: number,\n): string {\n const className = `${pascalCase(name)}${timestamp}`;\n\n return `import { DataSource } from 'typeorm';\nimport { Seeder, SeederFactoryManager } from 'typeorm-extension';\n\nexport class ${className} implements Seeder {\n track = false;\n\n public async run(\n dataSource: DataSource,\n factoryManager: SeederFactoryManager\n ): Promise<any> {\n\n }\n}\n`;\n}\n","import { readAsModule } from 'locter';\nimport type { EntitySchema, ObjectType } from 'typeorm';\nimport { useRuntimeRegistry } from '../../runtime';\nimport { resolveFilePaths, resolveFilePatterns } from '../utils';\nimport { SeederFactoryManager } from './manager';\nimport type { FactoryCallback, SeederFactoryItem } from './type';\n\nexport function useSeederFactoryManager() {\n const registry = useRuntimeRegistry();\n if (typeof registry.factories === 'undefined') {\n registry.factories = new SeederFactoryManager();\n }\n\n return registry.factories;\n}\n\nexport function resetSeederFactoryManager() {\n useRuntimeRegistry().factories = undefined;\n}\n\nexport function setSeederFactory<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n factoryFn: FactoryCallback<O, Meta>,\n) : SeederFactoryItem {\n const manager = useSeederFactoryManager();\n return manager.set(entity, factoryFn);\n}\n\nexport function useSeederFactory<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n) {\n const manager = useSeederFactoryManager();\n return manager.get<O, Meta>(entity);\n}\n\nexport async function prepareSeederFactories(\n items: SeederFactoryItem[] | string[],\n root?: string,\n) {\n let factoryFiles: string[] = [];\n const factoryConfigs: SeederFactoryItem[] = [];\n\n for (const value of items) {\n if (typeof value === 'string') {\n factoryFiles.push(value);\n } else {\n factoryConfigs.push(value);\n }\n }\n\n if (factoryFiles.length > 0) {\n factoryFiles = await resolveFilePatterns(factoryFiles, root);\n factoryFiles = resolveFilePaths(factoryFiles, root);\n\n for (const factoryFile of factoryFiles) {\n await readAsModule(factoryFile);\n }\n }\n\n if (factoryConfigs.length > 0) {\n const factoryManager = useSeederFactoryManager();\n\n for (const factoryConfig of factoryConfigs) {\n factoryManager.set(\n factoryConfig.entity,\n factoryConfig.factoryFn,\n );\n }\n }\n}\n","import { MssqlParameter, Table } from 'typeorm';\nimport type {\n DataSource, \n DataSourceOptions, \n ObjectLiteral, \n QueryRunner,\n} from 'typeorm';\nimport type { MongoQueryRunner } from 'typeorm/driver/mongodb/MongoQueryRunner';\nimport { useEnv } from '../env';\nimport { PathResolverMode, createPathResolver } from '../utils';\nimport type { IPathResolver } from '../utils';\nimport { resolveSeederConfig } from './config';\nimport { SeederEntity } from './entity';\nimport { SeederFactoryManager, prepareSeederFactories, useSeederFactoryManager } from './factory';\nimport type {\n SeederConfig,\n SeederExecutorOptions,\n SeederOptions,\n SeederPrepareElement,\n} from './type';\nimport { prepareSeederSeeds } from './utils';\n\nexport class SeederExecutor {\n protected dataSource : DataSource;\n\n protected options : SeederExecutorOptions;\n\n protected pathResolver : IPathResolver;\n\n constructor(dataSource: DataSource, options?: SeederExecutorOptions) {\n this.dataSource = dataSource;\n this.options = options || {};\n this.pathResolver = createPathResolver({\n root: this.options.root,\n tsconfig: this.options.tsconfig,\n mode: this.options.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n }\n\n async execute(input: SeederOptions = {}) : Promise<SeederEntity[]> {\n const config = await this.resolveConfig(input);\n\n await prepareSeederFactories(config.factories, this.options.root);\n\n const all = await this.loadEntities(config);\n\n const tracking = config.seedTracking ||\n all.some((seed) => seed.effectiveTracking(config.seedTracking));\n\n let queryRunner : QueryRunner | undefined;\n let existing : SeederEntity[] = [];\n\n try {\n if (tracking) {\n queryRunner = this.dataSource.createQueryRunner();\n await this.createTableIfNotExist(queryRunner, config.seedTableName);\n existing = await this.loadExisting(queryRunner, config.seedTableName);\n }\n\n const pending = this.filterPending(all, existing, config);\n if (pending.length === 0) {\n return [];\n }\n\n this.dataSource.logger.logSchemaBuild(\n `${existing.length} seeds are already present in the database.`,\n );\n this.dataSource.logger.logSchemaBuild(\n `${all.length} seeds were found in the source code.`,\n );\n\n return await this.runPending(pending, config, queryRunner);\n } finally {\n if (queryRunner) {\n await queryRunner.release();\n }\n }\n }\n\n protected async resolveConfig(input: SeederOptions = {}) : Promise<SeederConfig> {\n const config = resolveSeederConfig(input, this.dataSourceOptions, useEnv());\n\n await this.pathResolver.transformKeys(\n config,\n ['seeds', 'seedName', 'factories'],\n );\n\n return config;\n }\n\n protected async loadEntities(config: SeederConfig) : Promise<SeederEntity[]> {\n const elements = await prepareSeederSeeds(\n config.seeds,\n this.options.root,\n );\n\n return this.buildEntities(elements);\n }\n\n protected filterPending(\n all: SeederEntity[],\n existing: SeederEntity[],\n config: SeederConfig,\n ) : SeederEntity[] {\n return all.filter((seed) => {\n if (!this.isMatch(seed, config)) {\n return false;\n }\n\n const index = existing.findIndex(\n (el) => el.name === seed.name,\n );\n\n if (index === -1) {\n return true;\n }\n\n return !seed.effectiveTracking(config.seedTracking);\n });\n }\n\n protected isMatch(seed: SeederEntity, config: SeederConfig) : boolean {\n if (!config.seedName) {\n return true;\n }\n\n if (\n seed.name === config.seedName ||\n seed.fileName === config.seedName\n ) {\n return true;\n }\n\n if (!seed.filePath) {\n return false;\n }\n\n if (seed.filePath === config.seedName) {\n return true;\n }\n\n return this.pathResolver.absolutize(config.seedName) === seed.filePath;\n }\n\n protected async runPending(\n pending: SeederEntity[],\n config: SeederConfig,\n queryRunner?: QueryRunner,\n ) : Promise<SeederEntity[]> {\n const factoryManager = new SeederFactoryManager({\n items: useSeederFactoryManager().items,\n dataSource: this.dataSource,\n });\n\n const executed : SeederEntity[] = [];\n\n for (const element of pending) {\n const seeder = element.instance;\n if (!seeder) {\n continue;\n }\n\n element.result = await seeder.run(this.dataSource, factoryManager);\n\n if (queryRunner && element.effectiveTracking(config.seedTracking)) {\n await this.track(queryRunner, element, config.seedTableName);\n }\n\n this.dataSource.logger.logSchemaBuild(\n `Seed ${element.name} has been executed successfully.`,\n );\n\n executed.push(element);\n }\n\n return executed;\n }\n\n protected async loadExisting(\n queryRunner: QueryRunner,\n tableName: string,\n ) : Promise<SeederEntity[]> {\n if (this.dataSource.driver.options.type === 'mongodb') {\n const mongoRunner = queryRunner as MongoQueryRunner;\n\n return mongoRunner\n .cursor(tableName, {})\n .sort({ _id: -1 })\n .toArray();\n }\n\n const raw: ObjectLiteral[] = await this.dataSource.manager\n .createQueryBuilder(queryRunner)\n .select()\n .orderBy(this.dataSource.driver.escape('id'), 'DESC')\n .from(this.buildTableName(tableName), tableName)\n .getRawMany();\n\n return raw.map((migrationRaw) => new SeederEntity({\n id: Number.parseInt(migrationRaw.id, 10),\n timestamp: Number.parseInt(migrationRaw.timestamp, 10),\n name: migrationRaw.name,\n constructor: undefined,\n }));\n }\n\n protected async buildEntities(seeds?: SeederPrepareElement[]): Promise<SeederEntity[]> {\n if (!seeds) {\n return [];\n }\n\n let timestampCounter = 0;\n const entities = seeds.map((element) => {\n const {\n constructor: seed,\n fileName,\n filePath,\n } = element;\n\n let { timestamp } = element;\n\n const className = seed.name || (seed.constructor as any).name;\n\n if (!timestamp) {\n timestamp = this.classNameToTimestamp(className);\n }\n\n const entity = new SeederEntity({\n fileName,\n filePath,\n timestamp: timestamp || timestampCounter,\n name: className,\n constructor: seed,\n });\n\n timestampCounter++;\n\n return entity;\n });\n\n this.checkForDuplicates(entities);\n\n return entities.sort(SeederEntity.compare);\n }\n\n protected checkForDuplicates(entities: SeederEntity[]) {\n const names = entities.map((migration) => migration.name);\n const duplicates = Array.from(\n new Set(\n names.filter(\n (migrationName, index) => names.indexOf(migrationName) < index,\n ),\n ),\n );\n if (duplicates.length > 0) {\n throw Error(`Duplicate seeds: ${duplicates.join(', ')}`);\n }\n }\n\n protected async createTableIfNotExist(\n queryRunner: QueryRunner,\n tableName: string,\n ) {\n // If driver is mongo no need to create\n if (this.dataSource.driver.options.type === 'mongodb') {\n return;\n }\n const tableExist = await queryRunner.hasTable(this.buildTableName(tableName));\n if (!tableExist) {\n await queryRunner.createTable(\n new Table({\n database: this.database,\n schema: this.schema,\n name: this.buildTableName(tableName),\n columns: [\n {\n name: 'id',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationId,\n }),\n isGenerated: true,\n generationStrategy: 'increment',\n isPrimary: true,\n isNullable: false,\n },\n {\n name: 'timestamp',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationTimestamp,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: 'name',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationName,\n }),\n isNullable: false,\n },\n ],\n }),\n );\n }\n }\n\n protected async track(\n queryRunner: QueryRunner,\n seederEntity: SeederEntity,\n tableName: string,\n ): Promise<void> {\n const values: ObjectLiteral = {};\n if (this.dataSource.driver.options.type === 'mssql') {\n values.timestamp = new MssqlParameter(\n seederEntity.timestamp,\n this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationTimestamp,\n }) as any,\n );\n values.name = new MssqlParameter(\n seederEntity.name,\n this.dataSource.driver.normalizeType({ type: this.dataSource.driver.mappedDataTypes.migrationName }) as any,\n );\n } else {\n values.timestamp = seederEntity.timestamp;\n values.name = seederEntity.name;\n }\n\n if (this.dataSource.driver.options.type === 'mongodb') {\n const mongoRunner = queryRunner as MongoQueryRunner;\n await mongoRunner.databaseConnection\n .db(this.dataSource.driver.database)\n .collection(tableName)\n .insertOne(values);\n } else {\n const qb = queryRunner.manager.createQueryBuilder();\n await qb\n .insert()\n .into(this.buildTableName(tableName))\n .values(values)\n .execute();\n }\n }\n\n protected get dataSourceOptions() : DataSourceOptions & SeederOptions {\n return this.dataSource.options;\n }\n\n protected get database() {\n return this.dataSource.driver.database;\n }\n\n protected get schema() {\n return this.dataSource.driver.schema;\n }\n\n protected buildTableName(tableName: string) : string {\n return this.dataSource.driver.buildTableName(\n tableName,\n this.schema,\n this.database,\n );\n }\n\n protected classNameToTimestamp(className: string) {\n const match = className.match(/^(.*)([0-9]{13,})$/);\n if (match) {\n return Number.parseInt(match[2], 10);\n }\n\n return undefined;\n }\n}\n","import type { DataSource } from 'typeorm';\nimport type { SeederEntity } from './entity';\nimport { SeederExecutor } from './executor';\nimport type { SeederConstructor, SeederOptions } from './type';\n\nexport async function runSeeder(\n dataSource: DataSource,\n seeder: SeederConstructor | string,\n options: SeederOptions = {},\n) : Promise<SeederEntity | undefined> {\n if (typeof seeder === 'string') {\n options.seedName = seeder;\n } else {\n options.seeds = [seeder];\n }\n\n const executor = new SeederExecutor(dataSource);\n const output = await executor.execute(options);\n\n return output.pop();\n}\n\nexport async function runSeeders(\n dataSource: DataSource,\n options?: SeederOptions,\n) : Promise<SeederEntity[]> {\n const executor = new SeederExecutor(dataSource);\n return executor.execute(options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["read","read","buildColumnDefinition","mongoRunner"],"sources":["../src/errors/base.ts","../src/errors/driver.ts","../src/errors/entity-metadata.ts","../src/errors/entity-relation-lookup.ts","../src/errors/options.ts","../src/errors/schema.ts","../src/errors/schema-alteration.ts","../src/database/core/cockroachdb/statements.ts","../src/database/core/cockroachdb/module.ts","../src/database/core/mongodb/statements.ts","../src/database/core/mongodb/module.ts","../src/database/core/mongodb/uri.ts","../src/database/core/mssql/statements.ts","../src/database/core/mssql/module.ts","../src/database/core/mysql/statements.ts","../src/database/core/mysql/module.ts","../src/database/core/oracle/statements.ts","../src/database/core/oracle/module.ts","../src/database/core/params.ts","../src/utils/code-transformation/constants.ts","../src/utils/code-transformation/module.ts","../src/utils/separator.ts","../src/utils/slash.ts","../src/utils/file-path.ts","../src/utils/file-system.ts","../src/utils/has-property.ts","../src/utils/object.ts","../src/utils/path-resolver/constants.ts","../src/utils/tsconfig/module.ts","../src/utils/path-resolver/module.ts","../src/utils/path-resolver/helpers/adjust-file-path.ts","../src/utils/path-resolver/helpers/adjust-file-paths.ts","../src/utils/promise.ts","../src/database/core/utils.ts","../src/database/core/postgres/statements.ts","../src/database/core/postgres/module.ts","../src/database/core/sqlite/path.ts","../src/database/core/sqlite/module.ts","../src/data-source/find/module.ts","../src/env/constants.ts","../src/runtime/cache.ts","../src/runtime/module.ts","../src/env/utils.ts","../src/env/module.ts","../src/data-source/options/utils/merge.ts","../src/data-source/options/utils/env.ts","../src/data-source/options/module.ts","../src/data-source/options/singleton.ts","../src/data-source/singleton.ts","../src/database/methods/check/module.ts","../src/database/utils/context.ts","../src/database/adapters/typeorm-driver.ts","../src/database/adapters/mongodb.ts","../src/database/adapters/mssql.ts","../src/database/adapters/utils.ts","../src/database/adapters/mysql.ts","../src/database/adapters/node-fs.ts","../src/database/adapters/oracle.ts","../src/database/adapters/postgres.ts","../src/database/registry.ts","../src/database/schema/alter/dialect.ts","../src/database/schema/alter/utils.ts","../src/database/schema/alter/checks.ts","../src/database/schema/alter/statements.ts","../src/database/schema/alter/columns.ts","../src/database/schema/alter/foreign-keys.ts","../src/database/schema/alter/indices.ts","../src/database/schema/utils.ts","../src/database/schema/drift/module.ts","../src/database/schema/synchronize.ts","../src/database/methods/execute.ts","../src/database/methods/create/module.ts","../src/database/methods/drop/module.ts","../src/database/utils/migration.ts","../src/database/utils/query.ts","../src/database/driver/cockroachdb.ts","../src/database/driver/mongodb.ts","../src/database/driver/mssql.ts","../src/database/driver/mysql.ts","../src/database/driver/oracle.ts","../src/database/driver/postgres.ts","../src/database/driver/sqlite.ts","../src/helpers/entity/name.ts","../src/helpers/entity/metadata.ts","../src/helpers/entity/property-names.ts","../src/helpers/entity/join-columns.ts","../src/helpers/entity/uniqueness.ts","../src/seeder/config.ts","../src/seeder/entity.ts","../src/seeder/factory/module.ts","../src/seeder/factory/manager.ts","../src/seeder/utils/file-name.ts","../src/seeder/utils/file-path.ts","../src/seeder/utils/prepare.ts","../src/seeder/utils/template.ts","../src/seeder/factory/utils.ts","../src/seeder/executor.ts","../src/seeder/module.ts"],"sourcesContent":["export class TypeormExtensionError extends Error {\n\n}\n","import { TypeormExtensionError } from './base';\n\nexport class DriverError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'A database driver related error has occurred.');\n }\n\n static undeterminable() {\n return new DriverError('The driver could not be determined.');\n }\n\n static notSupported(driverName: string) {\n return new DriverError(`The driver ${driverName} is not supported yet.`);\n }\n\n static schemaAlterationNotSupported(driverName: string) {\n return new DriverError(`Schema alterations are not supported for the driver ${driverName}.`);\n }\n\n static columnConversionExpressionNotSupported(driverName: string) {\n return new DriverError(\n `A conversion expression (\\`using\\`) can not be expressed for the driver ${driverName}, ` +\n 'which would convert the values on its own terms instead.',\n );\n }\n\n static columnGenerationExpressionUnknown(columnName: string) {\n return new DriverError(\n `The generation expression of the column ${columnName} could not be read back, ` +\n 'and altering it would turn it into a regular column.',\n );\n }\n\n static connectionClosed() {\n return new DriverError('The database connection has already been closed.');\n }\n\n static databaseNotFound(database: string) {\n return new DriverError(`The database ${database} does not exist.`);\n }\n}\n","import { TypeormExtensionError } from './base';\n\nexport class EntityMetadataError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'An entity metadata related error has occurred');\n }\n\n static notRegistered(name: string) {\n return new EntityMetadataError(`The entity ${name} is not registered.`);\n }\n}\n","import { TypeormExtensionError } from './base';\n\ntype EntityRelationLookupErrorOptions = {\n message: string,\n relation: string,\n columns: string[]\n};\n\nexport class EntityRelationLookupError extends TypeormExtensionError {\n /**\n * The property name of the relation.\n */\n public relation: string;\n\n /**\n * The property names of the join columns.\n */\n public columns: string[];\n\n constructor(options: EntityRelationLookupErrorOptions) {\n super(options.message);\n\n this.relation = options.relation;\n this.columns = options.columns;\n }\n\n static notReferenced(relation: string, columns: string[]) {\n return new EntityRelationLookupError({\n message: `${relation} entity is not referenced by ${columns.join(', ')}`,\n relation,\n columns,\n });\n }\n\n static notFound(relation: string, columns: string[]) {\n return new EntityRelationLookupError({\n message: `Can't find ${relation} entity by ${columns.join(', ')}`,\n relation,\n columns,\n });\n }\n}\n","import { TypeormExtensionError } from './base';\n\nexport class OptionsError extends TypeormExtensionError {\n constructor(message?: string) {\n super(message || 'A database options related error has occurred');\n }\n\n static undeterminable() {\n return new OptionsError('The database options could not be determined.');\n }\n\n static notFound() {\n return new OptionsError('The database options could not be located/loaded.');\n }\n\n static databaseNotDefined() {\n return new OptionsError('The database name to connect to is not defined.');\n }\n}\n","import type { SchemaDriftStatement } from '../database/schema/drift/type';\nimport { TypeormExtensionError } from './base';\n\nfunction buildMessage(statements: SchemaDriftStatement[]): string {\n const lines = statements.map((statement) => (\n statement.parameters && statement.parameters.length > 0 ?\n `${statement.query} -- ${JSON.stringify(statement.parameters)}` :\n statement.query\n ));\n\n return [\n `The database schema deviates from the entity metadata (${statements.length} statement(s) required to reconcile it):`,\n ...lines,\n ].join('\\n');\n}\n\nexport class SchemaDriftError extends TypeormExtensionError {\n /**\n * The statements which would reconcile the database schema\n * with the entity metadata.\n */\n readonly statements: SchemaDriftStatement[];\n\n constructor(statements: SchemaDriftStatement[] = [], message?: string) {\n super(message || buildMessage(statements));\n\n this.statements = statements;\n }\n\n static detected(statements: SchemaDriftStatement[]) {\n return new SchemaDriftError(statements);\n }\n}\n","import { TypeormExtensionError } from './base';\n\n/**\n * The database is in neither the state the alteration expects nor the one it\n * would produce, so there is nothing it can safely do.\n *\n * Raised instead of returning quietly, because a repair migration which does\n * not repair anything is indistinguishable from a successful one — the guard\n * exists to make a run resumable, not to swallow a wrong description of the\n * database.\n */\nexport class SchemaAlterationError extends TypeormExtensionError {\n static tableNotFound(table: string) {\n return new SchemaAlterationError(\n `The table ${table} does not exist.`,\n );\n }\n\n static columnNotFound(table: string, column: string) {\n return new SchemaAlterationError(\n `The column ${column} does not exist in the table ${table}.`,\n );\n }\n\n static columnMismatch(table: string, column: string) {\n return new SchemaAlterationError(\n `The column ${column} of the table ${table} matches neither the current ` +\n 'nor the desired type description.',\n );\n }\n\n static indexNotFound(table: string, name: string) {\n return new SchemaAlterationError(\n `Neither an index named ${name} nor the renamed one exists on the table ${table}.`,\n );\n }\n\n static foreignKeyNotFound(table: string, name: string) {\n return new SchemaAlterationError(\n `Neither a foreign key named ${name} nor the renamed one exists on the table ${table}. ` +\n 'Pass `meta` to restore a constraint an interrupted run left behind.',\n );\n }\n}\n","/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/cockroachdb/CockroachQueryRunner.ts#L347\n *\n * The double space after the IF NOT EXISTS clause is preserved\n * from the previous implementation.\n */\nexport function buildCockroachDBCreateDatabaseQuery(database: string, ifNotExist: boolean): string {\n return `CREATE DATABASE ${ifNotExist ? 'IF NOT EXISTS ' : ''} \"${database}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/cockroachdb/CockroachQueryRunner.ts#L356\n */\nexport function buildCockroachDBDropDatabaseQuery(database: string, ifExist: boolean): string {\n return `DROP DATABASE ${ifExist ? 'IF EXISTS ' : ''} \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n buildCockroachDBCreateDatabaseQuery,\n buildCockroachDBDropDatabaseQuery,\n} from './statements';\n\nexport class CockroachDBDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildCockroachDBCreateDatabaseQuery(\n operation.params.database as string,\n operation.ifNotExist,\n ),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildCockroachDBDropDatabaseQuery(\n operation.params.database as string,\n operation.ifExist,\n ),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","/**\n * MongoDB statements are JSON encoded command documents,\n * executed via db.command() by the adapter.\n *\n * @link https://www.mongodb.com/docs/manual/reference/command/dropDatabase/\n */\nexport function buildMongoDBDropDatabaseCommand(): string {\n return JSON.stringify({ dropDatabase: 1 });\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { buildMongoDBDropDatabaseCommand } from './statements';\n\nexport class MongoDBDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n /**\n * Connecting to the target database creates it lazily server side.\n */\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.params.database);\n await connection.open();\n await connection.close();\n\n return undefined;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.params.database);\n await connection.open();\n\n try {\n return await connection.execute(buildMongoDBDropDatabaseCommand());\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\nexport function buildMongoDBConnectionUri(params: ConnectionParams, database?: string): string {\n let uri = 'mongodb://';\n\n if (params.user && params.password) {\n uri += `${encodeURIComponent(params.user)}:${encodeURIComponent(params.password)}@`;\n }\n\n uri += `${params.host || '127.0.0.1'}:${params.port || 27017}/${database ?? params.database}`;\n\n if (params.ssl) {\n uri += '?tls=true';\n }\n\n return uri;\n}\n","import type { ConnectionParams } from '../type';\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/sqlserver/SqlServerQueryRunner.ts#L416\n *\n * NOTE: the previous implementation appended a `CHARACTER SET` clause,\n * which is not valid T-SQL (SQL Server uses `COLLATE <collation_name>`).\n * The clause was removed; a proper collation option is future work.\n */\nexport function buildMsSQLCreateDatabaseQuery(params: ConnectionParams, ifNotExist: boolean): string {\n return ifNotExist ?\n `IF DB_ID('${params.database}') IS NULL CREATE DATABASE \"${params.database}\"` :\n `CREATE DATABASE \"${params.database}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/sqlserver/SqlServerQueryRunner.ts#L425\n */\nexport function buildMsSQLDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `IF DB_ID('${database}') IS NOT NULL DROP DATABASE \"${database}\"` :\n `DROP DATABASE \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n buildMsSQLCreateDatabaseQuery,\n buildMsSQLDropDatabaseQuery,\n} from './statements';\n\nexport class MsSQLDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMsSQLCreateDatabaseQuery(operation.params, operation.ifNotExist),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMsSQLDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_OFF = 'SET FOREIGN_KEY_CHECKS=0;';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_ON = 'SET FOREIGN_KEY_CHECKS=1;';\n\nexport const MYSQL_FOREIGN_KEY_CHECKS_SELECT = 'SELECT @@SESSION.foreign_key_checks AS `value`;';\n\n/**\n * Infer the CHARACTER SET from a collation (charset) when it is not\n * explicitly configured, e.g. utf8mb4_general_ci -> utf8mb4.\n */\nexport function deriveMySQLCharacterSet(charset: string, characterSet?: string): string | undefined {\n if (typeof characterSet === 'string') {\n return characterSet;\n }\n\n if (charset.toLowerCase().startsWith('utf8mb4')) {\n return 'utf8mb4';\n }\n\n if (charset.toLowerCase().startsWith('utf8')) {\n return 'utf8';\n }\n\n return undefined;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/mysql/MysqlQueryRunner.ts#L297\n */\nexport function buildMySQLCreateDatabaseQuery(params: ConnectionParams, ifNotExist: boolean): string {\n let query = ifNotExist ?\n `CREATE DATABASE IF NOT EXISTS \\`${params.database}\\`` :\n `CREATE DATABASE \\`${params.database}\\``;\n\n if (typeof params.charset === 'string') {\n const characterSet = deriveMySQLCharacterSet(params.charset, params.characterSet);\n\n if (typeof characterSet === 'string') {\n query += ` CHARACTER SET ${characterSet} COLLATE ${params.charset}`;\n }\n }\n\n return query;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/mysql/MysqlQueryRunner.ts#L306\n */\nexport function buildMySQLDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `DROP DATABASE IF EXISTS \\`${database}\\`` :\n `DROP DATABASE \\`${database}\\``;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport {\n MYSQL_FOREIGN_KEY_CHECKS_OFF,\n MYSQL_FOREIGN_KEY_CHECKS_ON,\n buildMySQLCreateDatabaseQuery,\n buildMySQLDropDatabaseQuery,\n} from './statements';\n\n/**\n * Serves mysql AND mariadb.\n */\nexport class MySQLDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildMySQLCreateDatabaseQuery(operation.params, operation.ifNotExist),\n );\n } finally {\n await connection.close();\n }\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n await connection.execute(MYSQL_FOREIGN_KEY_CHECKS_OFF);\n\n try {\n return await connection.execute(\n buildMySQLDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.execute(MYSQL_FOREIGN_KEY_CHECKS_ON);\n }\n } finally {\n await connection.close();\n }\n }\n}\n","import type { ConnectionParams } from '../type';\n\n/**\n * Assemble the TNS connect descriptor when none is configured.\n */\nexport function buildOracleConnectString(params: ConnectionParams): string {\n let address = '(PROTOCOL=TCP)';\n\n if (params.host) {\n address += `(HOST=${params.host})`;\n }\n\n if (params.port) {\n address += `(PORT=${params.port})`;\n }\n\n let connectData = '(SERVER=DEDICATED)';\n\n if (params.sid) {\n connectData += `(SID=${params.sid})`;\n }\n\n if (params.serviceName) {\n connectData += `(SERVICE_NAME=${params.serviceName})`;\n }\n\n return `(DESCRIPTION=(ADDRESS=${address})(CONNECT_DATA=${connectData}))`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/oracle/OracleQueryRunner.ts#L295\n *\n * NOTE: IF NOT EXISTS is not valid Oracle SQL. The statement is preserved\n * byte-for-byte from the previous implementation for fidelity — changing\n * it is a semantic decision, not a refactor side effect.\n */\nexport function buildOracleCreateDatabaseQuery(database: string): string {\n return `CREATE DATABASE IF NOT EXISTS ${database}`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { buildOracleCreateDatabaseQuery } from './statements';\n\nexport class OracleDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildOracleCreateDatabaseQuery(operation.params.database as string),\n );\n } finally {\n await connection.close();\n }\n }\n\n /**\n * Dropping a database is not supported for oracle\n * (preserved behaviour of the previous implementation).\n */\n async drop(_operation: DatabaseDropOperation): Promise<unknown> {\n return Promise.resolve();\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverUtils } from 'typeorm/driver/DriverUtils';\nimport type { ConnectionParams } from './type';\n\nfunction readStringOption(options: DataSourceOptions, key: string): string | undefined {\n const record = options as Record<string, any>;\n\n if (typeof record[key] === 'string') {\n return record[key];\n }\n\n if (typeof record.extra?.[key] === 'string') {\n return record.extra[key];\n }\n\n return undefined;\n}\n\nexport function buildConnectionParams(options: DataSourceOptions): ConnectionParams {\n let driverOptions: Record<string, any>;\n\n switch (options.type) {\n case 'mysql':\n case 'mariadb':\n case 'postgres':\n case 'cockroachdb':\n case 'mssql':\n case 'oracle':\n driverOptions = DriverUtils.buildDriverOptions(options.replication ? options.replication.master : options);\n break;\n case 'mongodb':\n driverOptions = DriverUtils.buildMongoDBDriverOptions(options);\n break;\n default:\n driverOptions = DriverUtils.buildDriverOptions(options);\n }\n\n const charset = readStringOption(options, 'charset');\n const characterSet = readStringOption(options, 'characterSet');\n\n return {\n host: driverOptions.host,\n user: driverOptions.user || driverOptions.username,\n password: driverOptions.password,\n database: driverOptions.database,\n port: driverOptions.port,\n ...(charset ? { charset } : {}),\n ...(characterSet ? { characterSet } : {}),\n ...(driverOptions.ssl ? { ssl: driverOptions.ssl } : {}),\n ...(driverOptions.url ? { url: driverOptions.url } : {}),\n ...(driverOptions.connectString ? { connectString: driverOptions.connectString } : {}),\n ...(driverOptions.sid ? { sid: driverOptions.sid } : {}),\n ...(driverOptions.serviceName ? { serviceName: driverOptions.serviceName } : {}),\n ...(driverOptions.template ? { template: driverOptions.template } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n // typeorm hands its own driver its options.options (e.g. the tedious config\n // of the mssql driver) — create/drop must connect with the same settings\n ...(driverOptions.options ? { driverOptions: driverOptions.options } : {}),\n ...(driverOptions.domain ? { domain: driverOptions.domain } : {}),\n ...(driverOptions.schema ? { schema: driverOptions.schema } : {}),\n };\n}\n","export enum CodeTransformation {\n JUST_IN_TIME = 'jit',\n NONE = 'none',\n}\n","import { isTsNodeRuntimeEnvironment, isTsxRuntimeEnvironment } from 'locter';\nimport { CodeTransformation } from './constants';\n\nexport function detectCodeTransformation() : `${CodeTransformation}` {\n if (\n isTsNodeRuntimeEnvironment() ||\n isTsxRuntimeEnvironment()\n ) {\n return CodeTransformation.JUST_IN_TIME;\n }\n\n return CodeTransformation.NONE;\n}\n\nexport function isCodeTransformation(input: string) {\n return detectCodeTransformation() === input;\n}\n","export function canReplaceWindowsSeparator(input: string) : boolean {\n // https://superuser.com/questions/176388/why-does-windows-use-backslashes-for-paths-and-unix-forward-slashes/176395#176395\n if (input.startsWith('\\\\\\\\?\\\\')) {\n return false;\n }\n\n let characterIndex: number;\n\n const specialCharacters = ['[', '{', '(', '^', '$', '.', '|', '?', '*', '+'];\n for (const specialCharacter of specialCharacters) {\n characterIndex = input.indexOf(specialCharacter);\n if (characterIndex !== -1) {\n // special character is prefixed with \\, no transformation allowed\n if (characterIndex !== 0 && input[characterIndex - 1] === '\\\\') {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function replaceWindowSeparator(input: string) {\n return input.replace(/\\\\/g, '/');\n}\n\nexport function safeReplaceWindowsSeparator(input: string): string {\n if (!input.includes('\\\\') || !canReplaceWindowsSeparator(input)) {\n return input;\n }\n\n return replaceWindowSeparator(input);\n}\n","const TRAILING_SLASH_RE = /\\/$|\\/\\?/;\n\nexport function hasTrailingSlash(input = '', queryParams = false): boolean {\n if (!queryParams) {\n return input.endsWith('/');\n }\n\n return TRAILING_SLASH_RE.test(input);\n}\n\nexport function withoutTrailingSlash(input = '', queryParams = false): string {\n if (!queryParams) {\n return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || '/';\n }\n\n if (!hasTrailingSlash(input, true)) {\n return input || '/';\n }\n\n const [s0, ...s] = input.split('?');\n\n return (s0.slice(0, -1) || '/') + (s.length ? `?${s.join('?')}` : '');\n}\n","import path from 'node:path';\nimport { canReplaceWindowsSeparator, replaceWindowSeparator } from './separator';\nimport { withoutTrailingSlash } from './slash';\n\nconst stripLeadingModifier = (text: string) => {\n if (text.startsWith('./')) {\n text = text.substring(2);\n }\n\n return text;\n};\n\nexport function transformFilePath(\n input: string,\n dist?: string,\n src?: string,\n): string {\n let separator = path.sep;\n const windowsSeparatorReplaceable = canReplaceWindowsSeparator(input);\n if (windowsSeparatorReplaceable) {\n separator = '/';\n input = replaceWindowSeparator(input);\n }\n\n let base = input;\n let baseIndex = input.lastIndexOf(separator);\n if (baseIndex !== -1) {\n base = base.substring(baseIndex + 1);\n }\n\n if (src) {\n if (windowsSeparatorReplaceable) {\n src = replaceWindowSeparator(src);\n }\n\n src = withoutTrailingSlash(stripLeadingModifier(src));\n }\n src = src || 'src';\n\n if (dist) {\n if (windowsSeparatorReplaceable) {\n dist = replaceWindowSeparator(dist);\n }\n\n dist = withoutTrailingSlash(stripLeadingModifier(dist));\n }\n dist = dist || 'dist';\n\n if (\n input.includes(src) &&\n !input.includes(dist)\n ) {\n const lastIndex = input.lastIndexOf(src);\n const prevCharacter = input.substring(lastIndex - 1, lastIndex);\n if (!prevCharacter || prevCharacter === separator) {\n input = input.substring(0, lastIndex) +\n dist +\n input.substring(lastIndex + src.length);\n\n baseIndex = input.lastIndexOf(separator);\n }\n }\n\n const jsExtensions = ['js', 'cjs', 'mjs'];\n\n // if the path already contains a js-family file extension (as a real\n // extension at end-of-name or inside a glob brace expansion, not just\n // anywhere in the basename — `my-json.ts` must still be transformable),\n // we are done.\n const jsExtensionRegex = /(?:^|[./{,])(?:js|cjs|mjs)(?:[}.,]|$)/;\n if (jsExtensionRegex.test(base)) {\n return input;\n }\n\n const tsExtensions = ['ts', 'cts', 'mts'];\n for (const [i, tsExtension] of tsExtensions.entries()) {\n const regex = new RegExp(`(\\\\.${tsExtension}|${tsExtension})`, 'g');\n let matchesSum: number | undefined;\n const matches = base.match(regex);\n if (Array.isArray(matches)) {\n matchesSum = matches.length;\n }\n\n let matchesCounter = 0;\n\n const bracketIndex = base.lastIndexOf('{');\n base = base.replace(\n regex,\n (...args) => {\n matchesCounter++;\n\n // if the file extension name comes after the last bracket index,\n // we can be pretty sure that the extension name is not part of a filename\n if (\n (args[2] >= bracketIndex && bracketIndex !== -1) ||\n (bracketIndex === -1 && matchesCounter === matchesSum)\n ) {\n return args[0].startsWith('.') ? `.${jsExtensions[i]}` : jsExtensions[i];\n }\n\n return args[0];\n },\n );\n }\n\n if (baseIndex !== -1) {\n base = input.substring(0, baseIndex + 1) + base;\n }\n\n return stripLeadingModifier(base);\n}\n\nexport function resolveFilePath(filePath: string, root?: string) {\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n\n return filePath.startsWith('/') ?\n filePath :\n path.resolve(root || process.cwd(), filePath);\n}\n\nexport function parseFilePath(filePath: string, root?: string) {\n const fullPath = resolveFilePath(filePath, root);\n\n const directory = path.dirname(fullPath);\n const name = path.basename(fullPath);\n\n return {\n directory,\n name,\n };\n}\n","import fs from 'node:fs';\n\nexport async function isDirectory(input: string) : Promise<boolean> {\n try {\n const stat = await fs.promises.stat(input);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n","export function hasOwnProperty<X extends Record<string, any>, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function hasStringProperty<X extends Record<string, any>, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, string> {\n return hasOwnProperty(obj, prop) &&\n typeof obj[prop] === 'string';\n}\n","export function pickRecord(data: Record<string, any>, keys: string[]) {\n const output : Record<string, any> = {};\n for (const key of keys) {\n output[key] = data[key];\n }\n\n return output;\n}\n\nexport function extendObject<T extends Record<string, any>>(\n target: T,\n source: Partial<T>,\n) : T {\n const keys = Object.keys(source);\n for (const key of keys) {\n target[key as keyof T] = source[key] as T[keyof T];\n }\n\n return target;\n}\n\nexport function isObject(item: unknown) : item is Record<string, any> {\n return (\n !!item &&\n typeof item === 'object' &&\n !Array.isArray(item)\n );\n}\n","export enum PathResolverMode {\n AUTO = 'auto',\n PRESERVE = 'preserve',\n TRANSFORM = 'transform',\n}\n","import { read } from 'locter';\nimport { isObject } from '../object';\nimport path from 'node:path';\nimport type { TSConfig } from './type';\n\nexport async function readTSConfig(input?: string) : Promise<TSConfig> {\n input = input || process.cwd();\n input = path.isAbsolute(input) ?\n input :\n path.resolve(process.cwd(), input);\n\n const filePath = !input.includes('.json') ?\n path.join(input, 'tsconfig.json') :\n input;\n\n try {\n const tsConfig = await read(filePath);\n\n if (isObject(tsConfig)) {\n return tsConfig;\n }\n } catch {\n // don't do anything ;)\n }\n\n return {};\n}\n","import { isObject } from '../object';\nimport { CodeTransformation, isCodeTransformation } from '../code-transformation';\nimport { resolveFilePath, transformFilePath } from '../file-path';\nimport type { TSConfig } from '../tsconfig';\nimport { readTSConfig } from '../tsconfig';\nimport { PathResolverMode } from './constants';\nimport type { IPathResolver, PathResolverOptions } from './type';\n\nexport class PathResolver implements IPathResolver {\n protected root?: string;\n\n protected mode: `${PathResolverMode}`;\n\n protected tsconfigInput?: string | TSConfig;\n\n protected tsconfigPromise?: Promise<TSConfig>;\n\n constructor(options: PathResolverOptions = {}) {\n this.root = options.root;\n this.mode = options.mode || PathResolverMode.AUTO;\n this.tsconfigInput = options.tsconfig;\n }\n\n absolutize(input: string) : string {\n return resolveFilePath(input, this.root);\n }\n\n async resolve(input: string) : Promise<string> {\n return this.transform(this.absolutize(input));\n }\n\n async transform(input: string) : Promise<string> {\n if (!this.shouldTransform()) {\n return input;\n }\n\n const { compilerOptions } = await this.tsconfig();\n\n return transformFilePath(input, compilerOptions?.outDir);\n }\n\n async transformKeys<T extends Record<string, any>>(\n input: T,\n keys?: (keyof T)[],\n ) : Promise<T> {\n if (!this.shouldTransform()) {\n return input;\n }\n\n keys = keys || Object.keys(input);\n\n for (const key of keys) {\n const value = input[key];\n\n if (typeof value === 'string') {\n input[key] = await this.transform(value) as T[keyof T];\n continue;\n }\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] === 'string') {\n value[i] = await this.transform(value[i]);\n }\n }\n }\n }\n\n return input;\n }\n\n async tsconfig() : Promise<TSConfig> {\n if (!this.tsconfigPromise) {\n this.tsconfigPromise = this.readTsconfig();\n }\n\n return this.tsconfigPromise;\n }\n\n protected async readTsconfig() : Promise<TSConfig> {\n if (isObject(this.tsconfigInput)) {\n return this.tsconfigInput;\n }\n\n return readTSConfig(\n resolveFilePath(this.tsconfigInput || 'tsconfig.json', this.root),\n );\n }\n\n protected shouldTransform() : boolean {\n if (this.mode === PathResolverMode.PRESERVE) {\n return false;\n }\n\n if (this.mode === PathResolverMode.TRANSFORM) {\n return true;\n }\n\n return !isCodeTransformation(CodeTransformation.JUST_IN_TIME);\n }\n}\n\nexport function createPathResolver(options: PathResolverOptions = {}) : IPathResolver {\n return new PathResolver(options);\n}\n","import type { TSConfig } from '../../tsconfig';\nimport { createPathResolver } from '../module';\n\nexport async function adjustFilePath<T extends unknown | unknown[]>(\n input: T,\n tsconfig?: string | TSConfig,\n) : Promise<T> {\n const resolver = createPathResolver({ tsconfig });\n\n if (typeof input === 'string') {\n return await resolver.transform(input) as T;\n }\n\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n if (typeof input[i] === 'string') {\n input[i] = await resolver.transform(input[i]);\n }\n }\n }\n\n return input;\n}\n","import type { TSConfig } from '../../tsconfig';\nimport { createPathResolver } from '../module';\n\nexport async function adjustFilePaths<T extends Record<string, any>>(\n input: T,\n keys?: (keyof T)[],\n tsconfig?: string | TSConfig,\n) : Promise<T> {\n return createPathResolver({ tsconfig }).transformKeys(input, keys);\n}\n","import { isObject } from './object';\n\nexport function isPromise(p: unknown): p is Promise<unknown> {\n return isObject(p) &&\n (\n p instanceof Promise ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof p.then === 'function'\n );\n}\n","import { hasOwnProperty, isObject } from '../../utils';\n\nexport function hasResultRows(input: unknown): boolean {\n return isObject(input) &&\n hasOwnProperty(input, 'rows') &&\n Array.isArray(input.rows) &&\n input.rows.length > 0;\n}\n","import type { ConnectionParams } from '../type';\n\nexport function buildPostgresDatabaseExistsQuery(database: string): string {\n return `SELECT * FROM pg_database WHERE lower(datname) = lower('${database}');`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/postgres/PostgresQueryRunner.ts#L326\n */\nexport function buildPostgresCreateDatabaseQuery(params: ConnectionParams): string {\n let query = `CREATE DATABASE \"${params.database}\"`;\n\n if (typeof params.template === 'string') {\n query += ` TEMPLATE \"${params.template}\"`;\n } else if (typeof params.characterSet === 'string') {\n query += ` WITH ENCODING '${params.characterSet}'`;\n }\n\n return query;\n}\n\nexport function buildPostgresCreateSchemaQuery(schema: string): string {\n return `CREATE SCHEMA IF NOT EXISTS \"${schema}\"`;\n}\n\n/**\n * @link https://github.com/typeorm/typeorm/blob/master/src/driver/postgres/PostgresQueryRunner.ts#L343\n */\nexport function buildPostgresDropDatabaseQuery(database: string, ifExist: boolean): string {\n return ifExist ?\n `DROP DATABASE IF EXISTS \"${database}\"` :\n `DROP DATABASE \"${database}\"`;\n}\n","import type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseConnectionFactory,\n IDatabaseDialect,\n} from '../type';\nimport { hasResultRows } from '../utils';\nimport {\n buildPostgresCreateDatabaseQuery,\n buildPostgresCreateSchemaQuery,\n buildPostgresDatabaseExistsQuery,\n buildPostgresDropDatabaseQuery,\n} from './statements';\n\nexport class PostgresDialect implements IDatabaseDialect {\n constructor(protected connectionFactory: IDatabaseConnectionFactory) {\n this.connectionFactory = connectionFactory;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n const { params } = operation;\n\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n let exists = false;\n let result: unknown;\n\n try {\n if (operation.ifNotExist) {\n const existsResult = await connection.execute(\n buildPostgresDatabaseExistsQuery(params.database as string),\n );\n\n exists = hasResultRows(existsResult);\n }\n\n if (!exists) {\n result = await connection.execute(buildPostgresCreateDatabaseQuery(params));\n }\n } finally {\n await connection.close();\n }\n\n if (exists) {\n return undefined;\n }\n\n /**\n * CREATE DATABASE cannot run in a transaction, and the schema lives\n * inside the new database — hence a second connection, targeted at it.\n */\n if (typeof params.schema === 'string' && params.schema !== 'public') {\n const schemaConnection = this.connectionFactory.create(params.database);\n await schemaConnection.open();\n\n try {\n await schemaConnection.execute(buildPostgresCreateSchemaQuery(params.schema));\n } finally {\n await schemaConnection.close();\n }\n }\n\n return result;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n const connection = this.connectionFactory.create(operation.initialDatabase);\n await connection.open();\n\n try {\n return await connection.execute(\n buildPostgresDropDatabaseQuery(operation.params.database as string, operation.ifExist),\n );\n } finally {\n await connection.close();\n }\n }\n}\n","import path from 'node:path';\n\nexport function resolveSQLiteDatabasePath(database: string, cwd: string): string {\n return path.isAbsolute(database) ?\n database :\n path.join(cwd, database);\n}\n\nexport function resolveSQLiteDatabaseDirectory(database: string, cwd: string): string {\n return path.dirname(resolveSQLiteDatabasePath(database, cwd));\n}\n","import { DriverError, OptionsError } from '../../../errors';\nimport type {\n DatabaseCreateOperation,\n DatabaseDropOperation,\n IDatabaseDialect,\n IFileSystem,\n} from '../type';\nimport { resolveSQLiteDatabaseDirectory, resolveSQLiteDatabasePath } from './path';\n\n/**\n * better-sqlite3 never opens a server connection —\n * create/drop are filesystem effects following SQL database semantics:\n * create produces the file (or fails when it exists, unless ifNotExist),\n * drop removes it (or fails when it is missing, unless ifExist).\n */\nexport class SQLiteDialect implements IDatabaseDialect {\n constructor(\n protected fs: IFileSystem,\n protected cwd: string,\n ) {\n this.fs = fs;\n this.cwd = cwd;\n }\n\n async create(operation: DatabaseCreateOperation): Promise<unknown> {\n if (!operation.params.database) {\n throw OptionsError.databaseNotDefined();\n }\n\n const filePath = resolveSQLiteDatabasePath(operation.params.database, this.cwd);\n const directoryPath = resolveSQLiteDatabaseDirectory(operation.params.database, this.cwd);\n\n await this.fs.assertDirectoryWritable(directoryPath);\n\n if (operation.ifNotExist && await this.fs.isFileWritable(filePath)) {\n return undefined;\n }\n\n await this.fs.createFile(filePath);\n\n return undefined;\n }\n\n async drop(operation: DatabaseDropOperation): Promise<unknown> {\n if (!operation.params.database) {\n throw OptionsError.databaseNotDefined();\n }\n\n const filePath = resolveSQLiteDatabasePath(operation.params.database, this.cwd);\n\n const removed = await this.fs.removeFile(filePath);\n\n if (!removed && !operation.ifExist) {\n throw DriverError.databaseNotFound(operation.params.database);\n }\n\n return undefined;\n }\n}\n","import {\n locate,\n readAsModule,\n removeFileNameExtension,\n} from 'locter';\nimport {\n PathResolverMode,\n createPathResolver,\n isObject,\n isPromise,\n safeReplaceWindowsSeparator,\n} from '../../utils';\nimport path from 'node:path';\nimport type { DataSource } from 'typeorm';\nimport { InstanceChecker } from 'typeorm';\nimport type { DataSourceFindOptions } from './type';\n\nexport async function findDataSource(\n context: DataSourceFindOptions = {},\n) : Promise<DataSource | undefined> {\n const pathResolver = createPathResolver({\n tsconfig: context.tsconfig,\n mode: context.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n\n const files : string[] = [\n 'data-source',\n ];\n\n if (context.fileName) {\n context.fileName = removeFileNameExtension(\n context.fileName,\n ['.ts', '.mts', '.cts', '.js', '.mjs', '.cjs'],\n );\n\n if (context.fileName !== 'data-source') {\n files.unshift(context.fileName);\n }\n }\n\n let { directory } = context;\n let directoryIsPattern = false;\n if (context.directory) {\n if (path.isAbsolute(context.directory)) {\n directory = context.directory;\n } else {\n directoryIsPattern = true;\n directory = safeReplaceWindowsSeparator(context.directory);\n }\n\n directory = await pathResolver.transform(directory);\n }\n\n const lookupPaths = [];\n for (const file of files) {\n if (\n directory &&\n directoryIsPattern\n ) {\n lookupPaths.push(path.posix.join(directory, file));\n }\n\n lookupPaths.push(...[\n path.posix.join('src', file),\n path.posix.join('src/{db,database}', file),\n ]);\n }\n\n files.push(...lookupPaths);\n\n for (let j = 0; j < files.length; j++) {\n files[j] = await pathResolver.transform(files[j]);\n }\n\n for (const file of files) {\n const info = await locate(\n `${file}.{js,cjs,mjs,ts,cts,mts}`,\n {\n cwd: [\n process.cwd(),\n ...(directory && !directoryIsPattern ? [directory] : []),\n ],\n ignore: ['**/*.d.ts'],\n },\n );\n\n if (info) {\n let moduleRecord = await readAsModule(info);\n\n if (isPromise(moduleRecord)) {\n moduleRecord = await moduleRecord;\n }\n\n if (InstanceChecker.isDataSource(moduleRecord)) {\n return moduleRecord;\n }\n\n if (!isObject(moduleRecord)) {\n continue;\n }\n\n const keys = Object.keys(moduleRecord);\n for (const key of keys) {\n let value = moduleRecord[key];\n\n if (isPromise(value)) {\n value = await value;\n }\n\n if (InstanceChecker.isDataSource(value)) {\n return value;\n }\n }\n }\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum EnvironmentName {\n DEVELOPMENT = 'development',\n PRODUCTION = 'production',\n TEST = 'test',\n}\n\nexport enum EnvironmentVariableName {\n ENV = 'NODE_ENV',\n\n // Seeder\n SEEDS = 'DB_SEEDS',\n SEEDS_ALT = 'TYPEORM_SEEDING_SEEDS',\n\n FACTORIES = 'DB_FACTORIES',\n FACTORIES_ALT = 'TYPEORM_SEEDING_FACTORIES',\n\n // Database\n TYPE = 'DB_TYPE',\n TYPE_ALT = 'TYPEORM_CONNECTION',\n\n URL = 'DB_URL',\n URL_ALT = 'TYPEORM_URL',\n\n HOST = 'DB_HOST',\n HOST_ALT = 'TYPEORM_HOST',\n\n PORT = 'DB_PORT',\n PORT_ALT = 'TYPEORM_PORT',\n\n USERNAME = 'DB_USERNAME',\n USERNAME_ALT = 'TYPEORM_USERNAME',\n\n PASSWORD = 'DB_PASSWORD',\n PASSWORD_ALT = 'TYPEORM_PASSWORD',\n\n DATABASE = 'DB_DATABASE',\n DATABASE_ALT = 'TYPEORM_DATABASE',\n\n SID = 'DB_SID',\n SID_ALT = 'TYPEORM_SID',\n\n SCHEMA = 'DB_SCHEMA',\n SCHEMA_ALT = 'TYPEORM_SCHEMA',\n\n SCHEMA_DROP = 'DB_DROP_SCHEMA',\n SCHEMA_DROP_ALT = 'TYPEORM_DROP_SCHEMA',\n\n DRIVER_EXTRA = 'DB_DRIVER_EXTRA',\n DRIVER_EXTRA_ALT = 'TYPEORM_DRIVER_EXTRA',\n\n SYNCHRONIZE = 'DB_SYNCHRONIZE',\n SYNCHRONIZE_ALT = 'TYPEORM_SYNCHRONIZE',\n\n MIGRATIONS = 'DB_MIGRATIONS',\n MIGRATIONS_ALT = 'TYPEORM_MIGRATIONS',\n\n MIGRATIONS_RUN = 'DB_MIGRATIONS_RUN',\n MIGRATIONS_RUN_ALT = 'TYPEORM_MIGRATIONS_RUN',\n\n MIGRATIONS_TABLE_NAME = 'DB_MIGRATIONS_TABLE_NAME',\n MIGRATIONS_TABLE_NAME_ALT = 'TYPEORM_MIGRATIONS_TABLE_NAME',\n\n ENTITIES = 'DB_ENTITIES',\n ENTITIES_ALT = 'TYPEORM_ENTITIES',\n\n ENTITY_PREFIX = 'DB_ENTITY_PREFIX',\n ENTITY_PREFIX_ALT = 'TYPEORM_ENTITY_PREFIX',\n\n METADATA_TABLE_NAME = 'DB_METADATA_TABLE_NAME',\n METADATA_TABLE_NAME_ALT = 'TYPEORM_METADATA_TABLE_NAME',\n\n SUBSCRIBERS = 'DB_SUBSCRIBERS',\n SUBSCRIBERS_ALT = 'TYPEORM_SUBSCRIBERS',\n\n LOGGING = 'DB_LOGGING',\n LOGGING_ALT = 'TYPEORM_LOGGING',\n\n LOGGER = 'DB_LOGGER',\n LOGGER_ALT = 'TYPEORM_LOGGER',\n\n MAX_QUERY_EXECUTION_TIME = 'DB_MAX_QUERY_EXECUTION_TIME',\n MAX_QUERY_EXECUTION_TIME_ALT = 'TYPEORM_MAX_QUERY_EXECUTION_TIME',\n\n DEBUG = 'DB_DEBUG',\n DEBUG_ALT = 'TYPEORM_DEBUG',\n\n UUID_EXTENSION = 'DB_UUID_EXTENSION',\n UUID_EXTENSION_ALT = 'TYPEORM_UUID_EXTENSION',\n\n CACHE = 'DB_CACHE',\n CACHE_ALT = 'TYPEORM_CACHE',\n\n CACHE_ALWAYS_ENABLED = 'DB_CACHE_ALWAYS_ENABLED',\n CACHE_ALWAYS_ENABLED_ALT = 'TYPEORM_CACHE_ALWAYS_ENABLED',\n\n CACHE_OPTIONS = 'DB_CACHE_OPTIONS',\n CACHE_OPTIONS_ALT = 'TYPEORM_CACHE_OPTIONS',\n\n CACHE_DURATION = 'DB_CACHE_DURATION',\n CACHE_DURATION_ALT = 'TYPEORM_CACHE_DURATION',\n}\n","export class AsyncKeyedCache<V> {\n protected values : Map<string, V>;\n\n protected pending : Map<string, Promise<V>>;\n\n constructor() {\n this.values = new Map();\n this.pending = new Map();\n }\n\n has(key: string) : boolean {\n return this.values.has(key);\n }\n\n get(key: string) : V | undefined {\n return this.values.get(key);\n }\n\n set(key: string, value: V) : void {\n this.values.set(key, value);\n this.pending.delete(key);\n }\n\n unset(key: string) : void {\n this.values.delete(key);\n this.pending.delete(key);\n }\n\n clear() : void {\n this.values.clear();\n this.pending.clear();\n }\n\n /**\n * Get or build the value for a key.\n *\n * Concurrent calls for the same key share one build; a failed build is\n * evicted so the next call retries. The build callback receives the\n * currently stored value (if any) and may return it unchanged.\n */\n async resolve(key: string, build: (existing?: V) => Promise<V>) : Promise<V> {\n const existing = this.pending.get(key);\n if (existing) {\n return existing;\n }\n\n const promise : Promise<V> = build(this.values.get(key))\n .then((value) => {\n this.values.set(key, value);\n return value;\n })\n .catch((e) => {\n if (this.pending.get(key) === promise) {\n this.pending.delete(key);\n }\n\n throw e;\n });\n\n this.pending.set(key, promise);\n\n return promise;\n }\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport type { Environment } from '../env/type';\nimport type { SeederFactoryManager } from '../seeder/factory/manager';\nimport { AsyncKeyedCache } from './cache';\n\nexport class RuntimeRegistry {\n public readonly dataSources = new AsyncKeyedCache<DataSource>();\n\n public readonly dataSourceOptions = new AsyncKeyedCache<DataSourceOptions>();\n\n public env : Environment | undefined;\n\n public factories : SeederFactoryManager | undefined;\n\n reset() : void {\n this.dataSources.clear();\n this.dataSourceOptions.clear();\n this.env = undefined;\n this.factories = undefined;\n }\n}\n\nlet instance : RuntimeRegistry | undefined;\n\nexport function useRuntimeRegistry() : RuntimeRegistry {\n if (typeof instance === 'undefined') {\n instance = new RuntimeRegistry();\n }\n\n return instance;\n}\n","import {\n oneOf,\n read,\n readBool,\n readInt,\n toArray,\n toBool,\n} from 'envix';\nimport type { DataSourceCacheOption } from '../data-source';\nimport { EnvironmentVariableName } from './constants';\n\nexport function transformLogging(input?: string) : boolean | string | string[] {\n const value = toBool(input);\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (input === 'all') {\n return 'all';\n }\n\n return toArray(input) ?? [];\n}\n\nexport function transformCache(input?: string) : DataSourceCacheOption | undefined {\n const value = toBool(input);\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (\n input === 'redis' ||\n input === 'ioredis' ||\n input === 'database' ||\n input === 'ioredis/cluster'\n ) {\n let options : Record<string, any> | undefined;\n const envCacheOptions = oneOf([\n read(EnvironmentVariableName.CACHE_OPTIONS),\n read(EnvironmentVariableName.CACHE_OPTIONS_ALT),\n ]);\n if (envCacheOptions) {\n options = JSON.parse(envCacheOptions);\n }\n\n return {\n type: input,\n options,\n alwaysEnabled: oneOf([\n readBool(EnvironmentVariableName.CACHE_ALWAYS_ENABLED),\n readBool(EnvironmentVariableName.CACHE_ALWAYS_ENABLED_ALT),\n ]),\n duration: oneOf([\n readInt(EnvironmentVariableName.CACHE_DURATION),\n readInt(EnvironmentVariableName.CACHE_DURATION_ALT),\n ]),\n };\n }\n\n return undefined;\n}\n","import {\n oneOf,\n read,\n readArray,\n readBool,\n readInt,\n} from 'envix';\nimport type { DatabaseType } from 'typeorm/driver/types/DatabaseType';\nimport { useRuntimeRegistry } from '../runtime';\nimport { EnvironmentName, EnvironmentVariableName } from './constants';\nimport type { Environment } from './type';\nimport {\n transformCache,\n transformLogging,\n} from './utils';\n\nexport function useEnv() : Environment;\nexport function useEnv<K extends keyof Environment>(key: K) : Environment[K];\nexport function useEnv(key?: string) : any {\n const registry = useRuntimeRegistry();\n if (typeof registry.env !== 'undefined') {\n if (typeof key === 'string') {\n return registry.env[key as keyof Environment];\n }\n\n return registry.env;\n }\n\n const output: Environment = {\n env: read(EnvironmentVariableName.ENV, EnvironmentName.DEVELOPMENT) as `${EnvironmentName}`,\n\n // Seeder\n seeds: oneOf([\n readArray(EnvironmentVariableName.SEEDS),\n readArray(EnvironmentVariableName.SEEDS_ALT),\n ]) ?? [],\n factories: oneOf([\n readArray(EnvironmentVariableName.FACTORIES),\n readArray(EnvironmentVariableName.FACTORIES_ALT),\n ]) ?? [],\n\n // Database\n url: oneOf([\n read(EnvironmentVariableName.URL),\n read(EnvironmentVariableName.URL_ALT),\n ]),\n host: oneOf([\n read(EnvironmentVariableName.HOST),\n read(EnvironmentVariableName.HOST_ALT),\n ]),\n port: oneOf([\n readInt(EnvironmentVariableName.PORT),\n readInt(EnvironmentVariableName.PORT_ALT),\n ]),\n username: oneOf([\n read(EnvironmentVariableName.USERNAME),\n read(EnvironmentVariableName.USERNAME_ALT),\n ]),\n password: oneOf([\n read(EnvironmentVariableName.PASSWORD),\n read(EnvironmentVariableName.PASSWORD_ALT),\n ]),\n database: oneOf([\n read(EnvironmentVariableName.DATABASE),\n read(EnvironmentVariableName.DATABASE_ALT),\n ]),\n sid: oneOf([\n read(EnvironmentVariableName.SID),\n read(EnvironmentVariableName.SID_ALT),\n ]),\n schema: oneOf([\n read(EnvironmentVariableName.SCHEMA),\n read(EnvironmentVariableName.SCHEMA_ALT),\n ]),\n extra: oneOf([\n read(EnvironmentVariableName.DRIVER_EXTRA),\n read(EnvironmentVariableName.DRIVER_EXTRA_ALT),\n ]),\n synchronize: oneOf([\n readBool(EnvironmentVariableName.SYNCHRONIZE),\n readBool(EnvironmentVariableName.SYNCHRONIZE_ALT),\n ]),\n schemaDrop: oneOf([\n readBool(EnvironmentVariableName.SCHEMA_DROP),\n readBool(EnvironmentVariableName.SCHEMA_DROP_ALT),\n ]),\n migrationsRun: oneOf([\n readBool(EnvironmentVariableName.MIGRATIONS_RUN),\n readBool(EnvironmentVariableName.MIGRATIONS_RUN_ALT),\n ]),\n entities: oneOf([\n readArray(EnvironmentVariableName.ENTITIES),\n readArray(EnvironmentVariableName.ENTITIES_ALT),\n ]) ?? [],\n migrations: oneOf([\n readArray(EnvironmentVariableName.MIGRATIONS),\n readArray(EnvironmentVariableName.MIGRATIONS_ALT),\n ]) ?? [],\n migrationsTableName: oneOf([\n read(EnvironmentVariableName.MIGRATIONS_TABLE_NAME),\n read(EnvironmentVariableName.MIGRATIONS_TABLE_NAME_ALT),\n ]),\n metadataTableName: oneOf([\n read(EnvironmentVariableName.METADATA_TABLE_NAME),\n read(EnvironmentVariableName.METADATA_TABLE_NAME_ALT),\n ]),\n subscribers: oneOf([\n readArray(EnvironmentVariableName.SUBSCRIBERS),\n readArray(EnvironmentVariableName.SUBSCRIBERS_ALT),\n ]) ?? [],\n logging: transformLogging(oneOf([\n read(EnvironmentVariableName.LOGGING),\n read(EnvironmentVariableName.LOGGING_ALT),\n ])),\n logger: oneOf([\n read(EnvironmentVariableName.LOGGER),\n read(EnvironmentVariableName.LOGGER_ALT),\n ]),\n entityPrefix: oneOf([\n read(EnvironmentVariableName.ENTITY_PREFIX),\n read(EnvironmentVariableName.ENTITY_PREFIX_ALT),\n ]),\n maxQueryExecutionTime: oneOf([\n readInt(EnvironmentVariableName.MAX_QUERY_EXECUTION_TIME),\n readInt(EnvironmentVariableName.MAX_QUERY_EXECUTION_TIME_ALT),\n ]),\n debug: oneOf([\n read(EnvironmentVariableName.DEBUG),\n read(EnvironmentVariableName.DEBUG_ALT),\n ]),\n cache: transformCache(oneOf([\n read(EnvironmentVariableName.CACHE),\n read(EnvironmentVariableName.CACHE_ALT),\n ])),\n uuidExtension: oneOf([\n read(EnvironmentVariableName.UUID_EXTENSION),\n read(EnvironmentVariableName.UUID_EXTENSION_ALT),\n ]),\n\n };\n\n if (output.extra) {\n output.extra = JSON.parse(output.extra); // todo: ensure record<string,any> ??\n }\n\n let type : string | undefined;\n const envType = oneOf([\n read(EnvironmentVariableName.TYPE),\n read(EnvironmentVariableName.TYPE_ALT),\n ]);\n\n if (envType) {\n type = envType;\n } else {\n const envURL = oneOf([\n read(EnvironmentVariableName.URL),\n read(EnvironmentVariableName.URL_ALT),\n ]);\n\n if (envURL) {\n [type] = envURL.split('://');\n }\n }\n\n if (type) {\n output.type = type as DatabaseType; // todo: maybe validation here\n }\n\n registry.env = output;\n\n if (typeof key === 'string') {\n return output[key as keyof Environment];\n }\n\n return output;\n}\n\nexport function resetEnv() {\n useRuntimeRegistry().env = undefined;\n}\n","import { createMerger } from 'smob';\nimport type { DataSourceOptions } from 'typeorm';\n\nconst merge = createMerger({\n strategy: (target, key, value) => {\n if (typeof target[key] === 'undefined') {\n target[key] = value;\n\n return target;\n }\n\n return undefined;\n },\n});\n\nexport function mergeDataSourceOptions(\n target: DataSourceOptions,\n source: DataSourceOptions,\n) {\n if (target.type !== source.type) {\n return target;\n }\n\n return merge(target, source);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { BaseDataSourceOptions } from 'typeorm/data-source/BaseDataSourceOptions';\nimport type { PostgresDataSourceOptions } from 'typeorm/driver/postgres/PostgresDataSourceOptions';\nimport type { DatabaseType } from 'typeorm/driver/types/DatabaseType';\nimport type { LoggerOptions } from 'typeorm/logger/LoggerOptions';\nimport { useEnv } from '../../../env';\nimport { mergeDataSourceOptions } from './merge';\n\nexport function hasEnvDataSourceOptions() : boolean {\n return !!useEnv('type');\n}\n\n/* istanbul ignore next */\nexport function readDataSourceOptionsFromEnv() : DataSourceOptions | undefined {\n if (!hasEnvDataSourceOptions()) {\n return undefined;\n }\n\n // todo: include seeder options\n const base : Omit<BaseDataSourceOptions, 'poolSize'> = {\n type: useEnv('type') as DatabaseType,\n entities: useEnv('entities'),\n subscribers: useEnv('subscribers'),\n migrations: useEnv('migrations'),\n migrationsTableName: useEnv('migrationsTableName'),\n // migrationsTransactionMode: useEnv('migra')\n metadataTableName: useEnv('metadataTableName'),\n logging: useEnv('logging') as LoggerOptions,\n logger: useEnv('logger') as BaseDataSourceOptions['logger'],\n maxQueryExecutionTime: useEnv('maxQueryExecutionTime'),\n synchronize: useEnv('synchronize'),\n migrationsRun: useEnv('migrationsRun'),\n dropSchema: useEnv('schemaDrop'),\n entityPrefix: useEnv('entityPrefix'),\n extra: useEnv('extra'),\n cache: useEnv('cache'),\n };\n\n const credentialOptions = {\n url: useEnv('url'),\n host: useEnv('host'),\n port: useEnv('port'),\n username: useEnv('username'),\n password: useEnv('password'),\n database: useEnv('database'),\n };\n\n if (base.type === 'mysql' || base.type === 'mariadb') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n };\n }\n\n if (base.type === 'postgres') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n uuidExtension: useEnv('uuidExtension') as PostgresDataSourceOptions['uuidExtension'],\n };\n }\n\n if (base.type === 'cockroachdb') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n timeTravelQueries: true,\n };\n }\n\n if (base.type === 'better-sqlite3') {\n return {\n ...base,\n type: base.type,\n database: useEnv('database') || 'db.sqlite',\n };\n }\n\n if (base.type === 'mssql') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n schema: useEnv('schema'),\n };\n }\n\n if (base.type === 'oracle') {\n return {\n ...base,\n ...credentialOptions,\n type: base.type,\n sid: useEnv('sid'),\n };\n }\n\n return {\n ...base,\n ...credentialOptions,\n } as DataSourceOptions;\n}\n\nexport function mergeDataSourceOptionsWithEnv(options: DataSourceOptions) {\n const env = readDataSourceOptionsFromEnv();\n if (!env) {\n return options;\n }\n\n return mergeDataSourceOptions(env, options);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { OptionsError } from '../../errors';\nimport { PathResolverMode, createPathResolver } from '../../utils';\nimport { findDataSource } from '../find';\nimport type { DataSourceOptionsBuildContext } from './type';\nimport {\n mergeDataSourceOptionsWithEnv,\n readDataSourceOptionsFromEnv,\n} from './utils';\n\n/**\n * Build DataSourceOptions from DataSource or from configuration.\n *\n * @param context\n */\nexport async function buildDataSourceOptions(\n context: DataSourceOptionsBuildContext = {},\n) : Promise<DataSourceOptions> {\n const directory : string = context.directory || process.cwd();\n\n const pathResolver = createPathResolver({\n tsconfig: context.tsconfig,\n mode: context.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n\n const dataSource = await findDataSource({\n directory,\n fileName: context.dataSourceName,\n tsconfig: context.tsconfig,\n preserveFilePaths: context.preserveFilePaths,\n });\n\n if (dataSource) {\n const options = await pathResolver.transformKeys(\n dataSource.options,\n ['entities', 'migrations', 'subscribers'],\n );\n\n return mergeDataSourceOptionsWithEnv(options);\n }\n\n const options = readDataSourceOptionsFromEnv();\n if (options) {\n return pathResolver.transformKeys(\n options,\n ['entities', 'migrations', 'subscribers'],\n );\n }\n\n throw OptionsError.notFound();\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { useRuntimeRegistry } from '../../runtime';\nimport { buildDataSourceOptions } from './module';\n\nexport function setDataSourceOptions(\n options: DataSourceOptions,\n alias?: string,\n) {\n useRuntimeRegistry().dataSourceOptions.set(alias || 'default', options);\n}\n\nexport function hasDataSourceOptions(alias?: string) : boolean {\n return useRuntimeRegistry().dataSourceOptions.has(alias || 'default');\n}\n\nexport async function useDataSourceOptions(alias?: string) : Promise<DataSourceOptions> {\n return useRuntimeRegistry().dataSourceOptions.resolve(\n alias || 'default',\n async (existing) => existing || buildDataSourceOptions(),\n );\n}\n","import { DataSource } from 'typeorm';\nimport { useRuntimeRegistry } from '../runtime';\nimport { useDataSourceOptions } from './options';\n\nexport function setDataSource(\n dataSource: DataSource,\n alias?: string,\n) {\n useRuntimeRegistry().dataSources.set(alias || 'default', dataSource);\n}\n\nexport function hasDataSource(alias?: string) : boolean {\n return useRuntimeRegistry().dataSources.has(alias || 'default');\n}\n\nexport function unsetDataSource(alias?: string) {\n useRuntimeRegistry().dataSources.unset(alias || 'default');\n}\n\nexport async function useDataSource(alias?: string) : Promise<DataSource> {\n const key = alias || 'default';\n\n return useRuntimeRegistry().dataSources.resolve(key, async (existing) => {\n if (existing) {\n if (!existing.isInitialized) {\n await existing.initialize();\n }\n\n return existing;\n }\n\n const options = await useDataSourceOptions(key);\n\n const dataSource = new DataSource(options);\n await dataSource.initialize();\n\n return dataSource;\n });\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DataSource, MigrationExecutor } from 'typeorm';\nimport {\n hasDataSource,\n useDataSource,\n useDataSourceOptions,\n} from '../../../data-source';\nimport { hasStringProperty } from '../../../utils';\nimport type { DatabaseCheckContext, DatabaseCheckResult } from './types';\n\n/**\n * Check database setup progress.\n *\n * @param context\n */\nexport async function checkDatabase(context: DatabaseCheckContext = {}) : Promise<DatabaseCheckResult> {\n const result : DatabaseCheckResult = {\n exists: true,\n schema: false,\n migrationsPending: [],\n };\n\n let dataSource : DataSource;\n let dataSourceCleanup : boolean;\n\n if (\n typeof context.dataSource === 'undefined' &&\n typeof context.options === 'undefined' &&\n hasDataSource(context.alias)\n ) {\n dataSource = await useDataSource(context.alias);\n\n if (\n dataSource.options.synchronize ||\n dataSource.options.migrationsRun\n ) {\n dataSource = new DataSource({\n ...dataSource.options,\n synchronize: false,\n migrationsRun: false,\n });\n\n dataSourceCleanup = true;\n } else {\n dataSourceCleanup = false;\n }\n } else {\n let dataSourceOptions : DataSourceOptions;\n if (context.options) {\n dataSourceOptions = context.options;\n } else {\n dataSourceOptions = await useDataSourceOptions(context.alias);\n }\n\n dataSource = new DataSource({\n ...dataSourceOptions,\n synchronize: false,\n migrationsRun: false,\n });\n dataSourceCleanup = context.dataSourceCleanup ?? true;\n }\n\n try {\n if (!dataSource.isInitialized) {\n await dataSource.initialize();\n }\n } catch {\n result.exists = false;\n\n return result;\n }\n\n const queryRunner = dataSource.createQueryRunner();\n\n if (\n dataSource.migrations &&\n dataSource.migrations.length > 0\n ) {\n const migrationExecutor = new MigrationExecutor(dataSource, queryRunner);\n result.migrationsPending = await migrationExecutor.getPendingMigrations();\n\n result.schema = result.migrationsPending.length === 0;\n } else {\n let schema : string | undefined;\n if (hasStringProperty(dataSource.driver.options, 'schema')) {\n schema = dataSource.driver.options.schema;\n }\n\n const migrationsTableName = dataSource.driver.buildTableName(\n dataSource.options.migrationsTableName || 'migrations',\n schema,\n dataSource.driver.database,\n );\n const migrationsTableExists = await queryRunner.hasTable(migrationsTableName);\n if (migrationsTableExists) {\n result.schema = dataSource.entityMetadatas.length === 0;\n } else {\n const tableNames = dataSource.entityMetadatas.map(\n (entityMetadata) => entityMetadata.tablePath,\n );\n const tables = await queryRunner.getTables(tableNames);\n\n if (tables.length === dataSource.entityMetadatas.length) {\n const { upQueries } = await dataSource.driver.createSchemaBuilder()\n .log();\n\n result.schema = upQueries.length === 0;\n } else {\n result.schema = false;\n }\n }\n }\n\n await queryRunner.release();\n\n if (dataSourceCleanup) {\n await dataSource.destroy();\n }\n\n return result;\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { buildDataSourceOptions, findDataSource } from '../../data-source';\nimport type {\n DatabaseBaseContextInput,\n DatabaseCreateContext,\n DatabaseCreateContextInput,\n DatabaseDropContext,\n DatabaseDropContextInput,\n} from '../methods';\n\nasync function normalizeDataSourceOptions(context: DatabaseBaseContextInput) : Promise<DataSourceOptions> {\n let options : DataSourceOptions | undefined;\n if (context.options) {\n options = { ...context.options };\n } else {\n const dataSource = await findDataSource(context.findOptions);\n if (dataSource) {\n options = { ...dataSource.options };\n }\n\n if (!options) {\n options = { ...await buildDataSourceOptions() };\n }\n }\n\n return {\n ...options,\n\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n };\n}\n\nexport async function buildDatabaseCreateContext(\n input: DatabaseCreateContextInput = {},\n) : Promise<DatabaseCreateContext> {\n return {\n ...input,\n options: await normalizeDataSourceOptions(input),\n synchronize: input.synchronize ?? true,\n ifNotExist: input.ifNotExist ?? true,\n };\n}\n\nexport async function buildDatabaseDropContext(\n input: DatabaseDropContextInput = {},\n) : Promise<DatabaseDropContext> {\n return {\n ...input,\n options: await normalizeDataSourceOptions(input),\n ifExist: input.ifExist ?? true,\n };\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport { DriverFactory } from 'typeorm/driver/DriverFactory';\n\nconst driversRequireDatabaseOption: DataSourceOptions['type'][] = [\n 'better-sqlite3',\n];\n\n/**\n * Acquire the native client handle (driver.postgres, driver.mysql, ...)\n * via TypeORM's DriverFactory, so typeorm stays the single source of\n * client libraries. The DataSource is never initialized.\n */\nexport function useNativeDriver(options: DataSourceOptions) {\n const fakeConnection: DataSource = {\n options: {\n type: options.type,\n ...(driversRequireDatabaseOption.includes(options.type) ? { database: options.database } : {}),\n },\n } as DataSource;\n\n return new DriverFactory().create(fakeConnection);\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { MongoDriver } from 'typeorm/driver/mongodb/MongoDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { buildMongoDBConnectionUri } from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class MongoDBConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const uri = buildMongoDBConnectionUri(params, database);\n\n let client: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as MongoDriver;\n const { MongoClient } = driver.mongodb;\n\n client = new MongoClient(uri, params.extra);\n await client.connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n /**\n * Statements are JSON encoded command documents,\n * e.g. '{\"dropDatabase\": 1}'.\n */\n execute: async (statement: string) => {\n await open();\n\n return client.db().command(JSON.parse(statement));\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!client) {\n return;\n }\n\n const current = client;\n client = undefined;\n await current.close();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { SqlServerDriver } from 'typeorm/driver/sqlserver/SqlServerDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class MsSQLConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const option: Record<string, any> = {\n user: params.user,\n password: params.password,\n server: params.host,\n port: params.port || 1433,\n // encrypt / trustServerCertificate / instanceName / ... — without these\n // the create/drop connection would not reach a server the DataSource can\n ...(params.driverOptions ? { options: params.driverOptions } : {}),\n ...(params.extra ? params.extra : {}),\n ...(params.domain ? { domain: params.domain } : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let pool: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as SqlServerDriver;\n\n // dedicated pool — the module level connect() would share\n // one global pool across connections\n pool = await new driver.mssql.ConnectionPool(option).connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return pool.request().query(sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!pool) {\n return;\n }\n\n const current = pool;\n pool = undefined;\n await current.close();\n },\n };\n }\n}\n","import { hasOwnProperty, isObject } from '../../utils';\n\n/**\n * Whether the (unknown) error carries the given errno code.\n */\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return isObject(error) &&\n hasOwnProperty(error, 'code') &&\n error.code === code;\n}\n\n/**\n * Normalize a callback style client (pg, mysql2) query to a promise.\n */\nexport async function promisifyCallbackQuery(connection: any, query: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n connection.query(query, (queryErr: any, queryResult: any) => {\n if (queryErr) {\n reject(queryErr);\n return;\n }\n\n resolve(queryResult);\n });\n });\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { MysqlDriver } from 'typeorm/driver/mysql/MysqlDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\nimport { promisifyCallbackQuery } from './utils';\n\n/**\n * Serves mysql AND mariadb.\n */\nexport class MySQLConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const option: Record<string, any> = {\n host: params.host,\n user: params.user,\n password: params.password,\n port: params.port,\n ssl: params.ssl,\n ...(params.extra ? params.extra : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let connection: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as MysqlDriver;\n const { createConnection } = driver.mysql;\n\n connection = await createConnection(option);\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return promisifyCallbackQuery(connection, sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!connection) {\n return;\n }\n\n const current = connection;\n connection = undefined;\n\n await new Promise<void>((resolve, reject) => {\n current.end((error?: Error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n },\n };\n }\n}\n","import fs from 'node:fs';\nimport type { IFileSystem } from '../core';\nimport { hasErrorCode } from './utils';\n\nexport class NodeFileSystem implements IFileSystem {\n async assertDirectoryWritable(path: string): Promise<void> {\n await fs.promises.access(path, fs.constants.W_OK);\n }\n\n async isFileWritable(path: string): Promise<boolean> {\n try {\n await fs.promises.access(path, fs.constants.F_OK | fs.constants.W_OK);\n return true;\n } catch (error) {\n if (hasErrorCode(error, 'ENOENT')) {\n return false;\n }\n\n throw error;\n }\n }\n\n async createFile(path: string): Promise<void> {\n await fs.promises.writeFile(path, '', { flag: 'wx' });\n }\n\n async removeFile(path: string): Promise<boolean> {\n try {\n await fs.promises.unlink(path);\n return true;\n } catch (error) {\n if (hasErrorCode(error, 'ENOENT')) {\n return false;\n }\n\n throw error;\n }\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { OracleDriver } from 'typeorm/driver/oracle/OracleDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { buildOracleConnectString } from '../core';\nimport { useNativeDriver } from './typeorm-driver';\n\nexport class OracleConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(): IDatabaseConnection {\n const { options, params } = this;\n\n const connectString = params.connectString ||\n buildOracleConnectString(params);\n\n const option: Record<string, any> = {\n user: params.user,\n password: params.password,\n connectString: connectString || params.url,\n ...(params.extra ? params.extra : {}),\n };\n\n let connection: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n const driver = useNativeDriver(options) as OracleDriver;\n const { getConnection } = driver.oracle;\n\n connection = await getConnection(option);\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return connection.execute(sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!connection) {\n return;\n }\n\n const current = connection;\n connection = undefined;\n await current.close();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport type { CockroachDriver } from 'typeorm/driver/cockroachdb/CockroachDriver';\nimport type { PostgresDriver } from 'typeorm/driver/postgres/PostgresDriver';\nimport { DriverError } from '../../errors';\nimport type {\n ConnectionParams,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useNativeDriver } from './typeorm-driver';\nimport { promisifyCallbackQuery } from './utils';\n\n/**\n * Serves postgres AND cockroachdb — both speak the pg wire protocol.\n */\nexport class PostgresConnectionFactory implements IDatabaseConnectionFactory {\n constructor(\n protected options: DataSourceOptions,\n protected params: ConnectionParams,\n ) {\n this.options = options;\n this.params = params;\n }\n\n create(database?: string): IDatabaseConnection {\n const { options, params } = this;\n\n const data: Record<string, any> = {\n host: params.host,\n port: params.port,\n user: params.user,\n password: params.password,\n ssl: params.ssl,\n schema: params.schema,\n ...(params.extra ? params.extra : {}),\n ...(typeof database === 'string' ? { database } : {}),\n };\n\n let client: any;\n let openPromise: Promise<void> | undefined;\n let closed = false;\n\n const open = () => {\n if (closed) {\n return Promise.reject(DriverError.connectionClosed());\n }\n\n if (!openPromise) {\n openPromise = (async () => {\n // native client acquisition stays lazy: DriverFactory\n // requires the client library on first use\n const driver = useNativeDriver(options) as PostgresDriver | CockroachDriver;\n const { Client } = driver.postgres;\n\n client = new Client(data);\n await client.connect();\n })();\n }\n\n return openPromise;\n };\n\n return {\n open,\n execute: async (sql: string) => {\n await open();\n\n return promisifyCallbackQuery(client, sql);\n },\n close: async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (openPromise) {\n try {\n await openPromise;\n } catch {\n // opening failed — nothing to close\n }\n }\n\n if (!client) {\n return;\n }\n\n const current = client;\n client = undefined;\n await current.end();\n },\n };\n }\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverError } from '../errors';\nimport { hasOwnProperty } from '../utils';\nimport {\n MongoDBConnectionFactory,\n MsSQLConnectionFactory,\n MySQLConnectionFactory,\n NodeFileSystem,\n OracleConnectionFactory,\n PostgresConnectionFactory,\n} from './adapters';\nimport type {\n DatabaseDialectName,\n DatabaseDialectRegistryEntry,\n} from './core';\nimport {\n CockroachDBDialect,\n MongoDBDialect,\n MsSQLDialect,\n MySQLDialect,\n OracleDialect,\n PostgresDialect,\n SQLiteDialect,\n buildConnectionParams,\n} from './core';\n\n/**\n * The single dispatch site: a closed set of dialects known at build time.\n * Each entry composes a dialect with its connection factory (overridable for tests\n * and caller supplied connections).\n * Adding a driver = one dialect folder in core/, one adapter, one row here.\n */\nconst registry: Record<DatabaseDialectName, DatabaseDialectRegistryEntry> = {\n postgres: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new PostgresDialect(\n overrides.connectionFactory || new PostgresConnectionFactory(options, params),\n ),\n },\n // cockroachdb speaks the pg wire protocol and reuses the postgres connection factory\n cockroachdb: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new CockroachDBDialect(\n overrides.connectionFactory || new PostgresConnectionFactory(options, params),\n ),\n },\n mysql: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MySQLDialect(\n overrides.connectionFactory || new MySQLConnectionFactory(options, params),\n ),\n },\n mssql: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MsSQLDialect(\n overrides.connectionFactory || new MsSQLConnectionFactory(options, params),\n ),\n },\n oracle: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new OracleDialect(\n overrides.connectionFactory || new OracleConnectionFactory(options, params),\n ),\n },\n mongodb: {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new MongoDBDialect(\n overrides.connectionFactory || new MongoDBConnectionFactory(options, params),\n ),\n },\n 'better-sqlite3': {\n buildParams: buildConnectionParams,\n buildDialect: (options, params, overrides) => new SQLiteDialect(\n overrides.fs || new NodeFileSystem(),\n overrides.cwd || process.cwd(),\n ),\n },\n};\n\n/**\n * @throws DriverError\n */\nexport function resolveDatabaseDialectName(type: DataSourceOptions['type']): DatabaseDialectName {\n if (type === 'mariadb') {\n return 'mysql';\n }\n\n if (hasOwnProperty(registry, type)) {\n return type as DatabaseDialectName;\n }\n\n throw DriverError.notSupported(type);\n}\n\nexport function useDatabaseDialectEntry(name: DatabaseDialectName): DatabaseDialectRegistryEntry {\n return registry[name];\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DriverError } from '../../../errors';\nimport type { SchemaColumnDialect, SchemaDialect } from './type';\n\n/**\n * mariadb is served by the mysql statements, cockroachdb by the postgres ones.\n *\n * A Map rather than a record, so a driver name which happens to be an\n * inherited property (`toString`) is a miss instead of a function.\n */\nconst dialects = new Map<string, SchemaDialect>([\n ['postgres', 'postgres'],\n ['cockroachdb', 'postgres'],\n ['mysql', 'mysql'],\n ['mariadb', 'mysql'],\n]);\n\n/**\n * mssql and oracle can not express either rename, but they can alter a column\n * in place — which typeorm otherwise does by dropping and re-adding it.\n */\nconst columnDialects = new Map<string, SchemaColumnDialect>([\n ...dialects,\n ['mssql', 'mssql'],\n ['oracle', 'oracle'],\n]);\n\n/**\n * The dialect to build a column alteration with, or undefined for a driver\n * this module has no statements for.\n */\nexport function findSchemaColumnDialect(\n type: DataSourceOptions['type'],\n) : SchemaColumnDialect | undefined {\n return columnDialects.get(type);\n}\n\n/**\n * The dialect to build the rename statements with, or undefined for a driver\n * this module has none for.\n */\nexport function findSchemaDialect(type: DataSourceOptions['type']) : SchemaDialect | undefined {\n return dialects.get(type);\n}\n\n/**\n * @throws DriverError\n */\nexport function resolveSchemaDialect(type: DataSourceOptions['type']) : SchemaDialect {\n const dialect = findSchemaDialect(type);\n if (dialect) {\n return dialect;\n }\n\n throw DriverError.schemaAlterationNotSupported(type);\n}\n\n/**\n * mysql/mariadb are the only drivers with a session level switch\n * for the foreign key checks.\n */\nexport function hasForeignKeyChecks(type: DataSourceOptions['type']) : boolean {\n return type === 'mysql' || type === 'mariadb';\n}\n","import type { Table, TableColumn } from 'typeorm';\nimport { isObject } from '../../../utils';\nimport type { SchemaColumnType, SchemaStrictInput } from './type';\n\n/**\n * Guarded alterations raise on an unexpected database state unless told\n * otherwise.\n */\nexport function isStrict(input: SchemaStrictInput) : boolean {\n return input.strict !== false;\n}\n\nexport function findTableIndex(table: Table, name: string) {\n return table.indices.find((index) => index.name === name);\n}\n\nexport function findTableForeignKey(table: Table, name: string) {\n return table.foreignKeys.find((foreignKey) => foreignKey.name === name);\n}\n\n/**\n * Read the value of `SELECT @@SESSION.foreign_key_checks`.\n * Anything unexpected is treated as enabled, since that is the safe state\n * to restore to.\n */\nexport function isForeignKeyChecksEnabled(rows: unknown) : boolean {\n if (!Array.isArray(rows) || rows.length === 0) {\n return true;\n }\n\n const [row] = rows;\n if (!isObject(row)) {\n return true;\n }\n\n const [value] = Object.values(row);\n\n return `${value}` !== '0';\n}\n\nexport function normalizeColumnLength(length?: string | number | null) : string {\n if (\n typeof length === 'undefined' ||\n length === null ||\n length === ''\n ) {\n return '';\n }\n\n return `${length}`;\n}\n\nexport type SchemaColumnDescriber = {\n /**\n * The driver's own spelling of a type, e.g. varchar -> character varying.\n */\n normalizeType: (type: string) => string,\n /**\n * The full type the server would report, e.g. varchar + 255 ->\n * varchar(255). Resolves the default length of a type, which the driver\n * leaves empty on the loaded column: mysql reports a `varchar(255)` as\n * length `''` for a table it has no entity metadata for, and comparing the\n * raw values would call that a mismatch.\n */\n describeType: (type: string, length?: string | number) => string,\n};\n\n/**\n * Whether a column still matches a (partial) type description.\n * length & nullable are only compared if they are defined.\n */\nexport function matchesColumnType(\n column: TableColumn,\n input: SchemaColumnType,\n describer: SchemaColumnDescriber,\n) : boolean {\n const { normalizeType, describeType } = describer;\n\n if (\n normalizeType(input.type).toLowerCase() !==\n normalizeType(column.type).toLowerCase()\n ) {\n return false;\n }\n\n if (\n typeof input.length !== 'undefined' &&\n describeType(input.type, input.length).toLowerCase() !==\n describeType(column.type, column.length).toLowerCase()\n ) {\n return false;\n }\n\n return !(\n typeof input.nullable === 'boolean' &&\n input.nullable !== column.isNullable\n );\n}\n","import type { QueryRunner } from 'typeorm';\nimport {\n MYSQL_FOREIGN_KEY_CHECKS_OFF,\n MYSQL_FOREIGN_KEY_CHECKS_ON,\n MYSQL_FOREIGN_KEY_CHECKS_SELECT,\n} from '../../core';\nimport { hasForeignKeyChecks } from './dialect';\nimport { isForeignKeyChecksEnabled } from './utils';\n\n/**\n * Run a callback with the mysql/mariadb foreign key checks disabled and restore\n * the previous state afterwards (nesting safe). A no-op wrapper on every other\n * driver, so a migration using it stays portable.\n *\n * Re-adding a constraint which was already enforcing does not need to be\n * re-validated — the check only buys a full table scan, plus a failure mode for\n * rows some past import inserted with the checks off.\n */\nexport async function withForeignKeyChecksDisabled<T>(\n queryRunner: QueryRunner,\n fn: () => Promise<T>,\n) : Promise<T> {\n if (!hasForeignKeyChecks(queryRunner.dataSource.options.type)) {\n return fn();\n }\n\n const enabled = isForeignKeyChecksEnabled(\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_SELECT),\n );\n\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_OFF);\n\n try {\n return await fn();\n } finally {\n if (enabled) {\n await queryRunner.query(MYSQL_FOREIGN_KEY_CHECKS_ON);\n }\n }\n}\n","import { DriverError } from '../../../errors';\nimport type {\n SchemaAddForeignKeyInput,\n SchemaColumnDefinition,\n SchemaColumnDialect,\n SchemaDialect,\n SchemaRenameForeignKeyInput,\n SchemaRenameIndexInput,\n} from './type';\n\n/**\n * Quote a value mysql expects as a string literal (a charset name,\n * an enum value, a comment). Single quotes rather than the double ones\n * typeorm uses, since those are identifiers under `ANSI_QUOTES`.\n */\nfunction escapeSchemaString(value: string) : string {\n return `'${value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, '\\'\\'')\n // not allowed in a comment\n .replace(/\\0/g, '')}'`;\n}\n\n/**\n * Whether the body of a quoted literal escapes its quotes, i.e. whether\n * wrapping it in quotes again yields the same value.\n */\nfunction isEscapedStringBody(value: string) : boolean {\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n\n if (char === '\\\\') {\n index += 2;\n continue;\n }\n\n if (char === '\\'') {\n if (value[index + 1] !== '\\'') {\n return false;\n }\n\n index += 2;\n continue;\n }\n\n index += 1;\n }\n\n return true;\n}\n\n/**\n * A default as the driver reports it, ready to be repeated in a definition.\n *\n * typeorm builds a mysql string default by wrapping the raw value in quotes\n * without escaping what is inside it, so a default holding a quote comes back\n * as a literal the server can not parse (`'it's'`). Repairing it is not a\n * guess: a malformed literal can only have come from that wrapping, while a\n * properly escaped one (mariadb reports those) is passed through untouched.\n */\nfunction buildDefault(value: unknown) : string {\n if (\n typeof value !== 'string' ||\n value.length < 2 ||\n !value.startsWith('\\'') ||\n !value.endsWith('\\'')\n ) {\n return `${value}`;\n }\n\n const body = value.slice(1, -1);\n\n return isEscapedStringBody(body) ? value : escapeSchemaString(body);\n}\n\nexport function escapeSchemaIdentifier(dialect: SchemaColumnDialect, name: string) : string {\n if (dialect === 'mysql') {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Escape a (potentially schema/database qualified) path, e.g. public.user.\n */\nexport function escapeSchemaPath(dialect: SchemaColumnDialect, path: string) : string {\n return path\n .split('.')\n .map((part) => escapeSchemaIdentifier(dialect, part))\n .join('.');\n}\n\n/**\n * Qualify a name with the schema/database prefix of a table path,\n * e.g. (public.user, IDX_foo) -> public.IDX_foo\n */\nfunction buildSiblingPath(table: string, name: string) : string {\n const parts = table.split('.');\n parts[parts.length - 1] = name;\n\n return parts.join('.');\n}\n\nexport function buildRenameIndexQuery(dialect: SchemaDialect, input: SchemaRenameIndexInput) : string {\n if (dialect === 'mysql') {\n return `ALTER TABLE ${escapeSchemaPath(dialect, input.table)} ` +\n `RENAME INDEX ${escapeSchemaIdentifier(dialect, input.from)} ` +\n `TO ${escapeSchemaIdentifier(dialect, input.to)}`;\n }\n\n // in postgres an index is an object of the schema its table lives in\n return `ALTER INDEX ${escapeSchemaPath(dialect, buildSiblingPath(input.table, input.from))} ` +\n `RENAME TO ${escapeSchemaIdentifier(dialect, input.to)}`;\n}\n\nexport function buildDropIndexQuery(dialect: SchemaDialect, table: string, name: string) : string {\n if (dialect === 'mysql') {\n return `ALTER TABLE ${escapeSchemaPath(dialect, table)} ` +\n `DROP INDEX ${escapeSchemaIdentifier(dialect, name)}`;\n }\n\n return `DROP INDEX ${escapeSchemaPath(dialect, buildSiblingPath(table, name))}`;\n}\n\n/**\n * postgres only — mysql has no RENAME CONSTRAINT and needs the\n * drop & re-add dance instead.\n */\nexport function buildRenameForeignKeyQuery(input: SchemaRenameForeignKeyInput) : string {\n return `ALTER TABLE ${escapeSchemaPath('postgres', input.table)} ` +\n `RENAME CONSTRAINT ${escapeSchemaIdentifier('postgres', input.from)} ` +\n `TO ${escapeSchemaIdentifier('postgres', input.to)}`;\n}\n\nexport function buildDropForeignKeyQuery(dialect: SchemaDialect, table: string, name: string) : string {\n const keyword = dialect === 'mysql' ? 'FOREIGN KEY' : 'CONSTRAINT';\n\n return `ALTER TABLE ${escapeSchemaPath(dialect, table)} ` +\n `DROP ${keyword} ${escapeSchemaIdentifier(dialect, name)}`;\n}\n\nexport function buildAddForeignKeyQuery(dialect: SchemaDialect, input: SchemaAddForeignKeyInput) : string {\n const columns = input.columns\n .map((column) => escapeSchemaIdentifier(dialect, column))\n .join(', ');\n\n const referencedColumns = input.referencedColumns\n .map((column) => escapeSchemaIdentifier(dialect, column))\n .join(', ');\n\n let query = `ALTER TABLE ${escapeSchemaPath(dialect, input.table)} ` +\n `ADD CONSTRAINT ${escapeSchemaIdentifier(dialect, input.name)} ` +\n `FOREIGN KEY (${columns}) ` +\n `REFERENCES ${escapeSchemaPath(dialect, input.referencedTable)} (${referencedColumns})`;\n\n if (input.onDelete) {\n query += ` ON DELETE ${input.onDelete}`;\n }\n\n if (input.onUpdate) {\n query += ` ON UPDATE ${input.onUpdate}`;\n }\n\n return query;\n}\n\n/**\n * mysql's `MODIFY COLUMN` replaces the previous definition in full, so the\n * rendered one has to restate the whole column, not just what changed.\n */\nfunction buildColumnDefinition(column: SchemaColumnDefinition) : string {\n let definition = `${escapeSchemaIdentifier('mysql', column.name)} ${column.type}`;\n\n if (column.enum) {\n definition += `(${column.enum.map(escapeSchemaString).join(', ')})`;\n }\n\n if (column.unsigned) {\n definition += ' UNSIGNED';\n }\n\n if (column.charset) {\n definition += ` CHARACTER SET ${escapeSchemaString(column.charset)}`;\n }\n\n if (column.collation) {\n definition += ` COLLATE ${escapeSchemaString(column.collation)}`;\n }\n\n if (column.asExpression) {\n definition += ` AS (${column.asExpression}) ${column.generatedType || 'VIRTUAL'}`;\n }\n\n if (typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n if (\n typeof column.default !== 'undefined' &&\n column.default !== null\n ) {\n definition += ` DEFAULT ${buildDefault(column.default)}`;\n }\n\n if (column.onUpdate) {\n definition += ` ON UPDATE ${column.onUpdate}`;\n }\n\n if (column.autoIncrement) {\n definition += ' AUTO_INCREMENT';\n }\n\n if (column.comment) {\n definition += ` COMMENT ${escapeSchemaString(column.comment)}`;\n }\n\n return definition;\n}\n\n/**\n * Alter a column in place, keeping the values it holds.\n *\n * typeorm builds no statement for this: its `changeColumn` drops and re-adds\n * the column \"to avoid data conversion\" as soon as the type or the length\n * differs — on every driver but sqlite, which recreates the whole table and\n * copies the values over.\n *\n * postgres names the new type and nothing else, so the rest of the definition\n * (default, comment, identity) stays as it is; mysql replaces the definition\n * in full and therefore restates it.\n */\nexport function buildChangeColumnTypeQueries(\n dialect: SchemaColumnDialect,\n table: string,\n column: SchemaColumnDefinition,\n) : string[] {\n const path = escapeSchemaPath(dialect, table);\n const name = escapeSchemaIdentifier(dialect, column.name);\n\n if (dialect === 'mysql') {\n if (column.generatedType && !column.asExpression) {\n // restating the definition without the `AS` would turn a generated\n // column into a regular one, and drop every value it computes.\n // typeorm reads the expression from its own metadata table, so it\n // is empty whenever there is no row describing this column.\n throw DriverError.columnGenerationExpressionUnknown(column.name);\n }\n\n return [`ALTER TABLE ${path} MODIFY COLUMN ${buildColumnDefinition(column)}`];\n }\n\n if (dialect === 'mssql') {\n // the default and the identity are constraints of their own here and\n // survive untouched, but leaving the nullability out makes the column\n // nullable — so it is always stated\n let definition = `${name} ${column.type}`;\n\n if (column.collation) {\n definition += ` COLLATE ${column.collation}`;\n }\n\n if (typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n return [`ALTER TABLE ${path} ALTER COLUMN ${definition}`];\n }\n\n if (dialect === 'oracle') {\n // MODIFY keeps everything it does not name, and oracle rejects a\n // clause which only restates the current nullability\n // (ORA-01442 / ORA-01451)\n let definition = `${name} ${column.type}`;\n\n if (column.nullabilityChanged && typeof column.nullable === 'boolean') {\n definition += column.nullable ? ' NULL' : ' NOT NULL';\n }\n\n return [`ALTER TABLE ${path} MODIFY ${definition}`];\n }\n\n // without a USING expression the values are converted with the assignment\n // cast between the two types, and the change is refused when there is none\n const using = column.using ? ` USING ${column.using}` : '';\n\n const queries = [`ALTER TABLE ${path} ALTER COLUMN ${name} TYPE ${column.type}${using}`];\n\n if (typeof column.nullable === 'boolean') {\n queries.push(\n `ALTER TABLE ${path} ALTER COLUMN ${name} ` +\n `${column.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n return queries;\n}\n","import type { Driver, QueryRunner, TableColumn } from 'typeorm';\nimport { DriverError, SchemaAlterationError } from '../../../errors';\nimport { findSchemaColumnDialect } from './dialect';\nimport { buildChangeColumnTypeQueries } from './statements';\nimport type { SchemaChangeColumnTypeInput, SchemaColumnDefinition } from './type';\nimport type { SchemaColumnDescriber } from './utils';\nimport { isStrict, matchesColumnType, normalizeColumnLength } from './utils';\n\n/**\n * Describe the column as the database reports it, so a dialect which replaces\n * the definition in full can restate every attribute it carries (default,\n * comment, charset, AUTO_INCREMENT, …) instead of dropping it.\n *\n * The primary key is deliberately left out: the column already carries it,\n * and repeating it would be a second one. mysql's `ZEROFILL` is missing for a\n * different reason — typeorm does not read it into `TableColumn` at all, so a\n * zerofill column loses the attribute (it is a display width mysql deprecated\n * in 8.0.17, and typeorm's own statements drop it just the same).\n */\nfunction buildColumnDefinition(driver: Driver, column: TableColumn) : SchemaColumnDefinition {\n return {\n name: column.name,\n type: driver.createFullType(column),\n // a generated column takes its nullability from its expression,\n // and mariadb rejects the clause on one outright\n nullable: column.asExpression ? undefined : column.isNullable,\n enum: column.enum,\n unsigned: column.unsigned,\n charset: column.charset,\n collation: column.collation,\n asExpression: column.asExpression,\n generatedType: column.generatedType,\n default: column.default,\n onUpdate: column.onUpdate,\n autoIncrement: column.isGenerated && column.generationStrategy === 'increment',\n comment: column.comment,\n };\n}\n\n/**\n * Change the type (and optionally the nullability) of a column, but only if it\n * still matches the `from` description.\n *\n * Returns false when the column already matches `to`, which keeps a repair\n * migration resumable and safe to run against a database which never had the\n * drift. When the column matches neither description (or is missing) the\n * database is not in a state this can act on, and `strict` (the default)\n * raises a `SchemaAlterationError` rather than reporting a repair which did\n * not happen.\n *\n * The column is altered in place, so it keeps the values it holds. That is the\n * reason the statement is built here: typeorm's `changeColumn` drops and\n * re-adds the column as soon as the type or the length differs, which empties\n * it. Drivers this module has no dialect for still go through typeorm — safe\n * on sqlite, which recreates the table and copies the values over.\n *\n * Widening a column a foreign key depends on additionally needs\n * {@see withForeignKeyChecksDisabled} on mysql, and is refused outright by\n * mariadb — there the constraint has to be dropped around the change.\n *\n * postgres converts the values with the assignment cast between the two types\n * and refuses a change which has none; pass `using` to describe the conversion\n * for those.\n *\n * @throws SchemaAlterationError if the column matches neither description and\n * `strict`.\n */\nexport async function changeColumnType(\n queryRunner: QueryRunner,\n input: SchemaChangeColumnTypeInput,\n) : Promise<boolean> {\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n const column = table.findColumnByName(input.column);\n if (!column) {\n if (isStrict(input)) {\n throw SchemaAlterationError.columnNotFound(input.table, input.column);\n }\n\n return false;\n }\n\n const { driver } = queryRunner.dataSource;\n const normalizeType = (type: string) => driver.normalizeType({ type });\n const describer : SchemaColumnDescriber = {\n normalizeType,\n describeType: (type, length) => {\n const probe = column.clone();\n probe.type = normalizeType(type);\n probe.length = normalizeColumnLength(length);\n\n return driver.createFullType(probe);\n },\n };\n\n // already applied\n if (matchesColumnType(column, input.to, describer)) {\n return false;\n }\n\n if (!matchesColumnType(column, input.from, describer)) {\n if (isStrict(input)) {\n throw SchemaAlterationError.columnMismatch(input.table, input.column);\n }\n\n return false;\n }\n\n const next = column.clone();\n next.type = normalizeType(input.to.type);\n\n if (typeof input.to.length !== 'undefined') {\n next.length = normalizeColumnLength(input.to.length);\n } else if (next.type.toLowerCase() !== normalizeType(column.type).toLowerCase()) {\n // the type changed and no length was asked for, so the current one\n // does not carry over (varchar(255) -> text, not text(255))\n next.length = '';\n }\n // same type without a length: keep the current one — a nullability-only\n // repair must not silently widen varchar(255) to varchar\n\n if (typeof input.to.nullable === 'boolean') {\n next.isNullable = input.to.nullable;\n }\n\n const { type } = queryRunner.dataSource.options;\n const dialect = findSchemaColumnDialect(type);\n\n if (input.using && dialect !== 'postgres') {\n // ignoring it would leave the server to coerce the values its own way,\n // which is exactly what the expression was passed to prevent\n throw DriverError.columnConversionExpressionNotSupported(type);\n }\n\n if (!dialect) {\n await queryRunner.changeColumn(table, column, next);\n\n return true;\n }\n\n const queries = buildChangeColumnTypeQueries(\n dialect,\n input.table,\n {\n ...buildColumnDefinition(driver, next),\n nullabilityChanged: next.isNullable !== column.isNullable,\n using: input.using,\n },\n );\n\n for (const query of queries) {\n await queryRunner.query(query);\n }\n\n return true;\n}\n","import type { QueryRunner } from 'typeorm';\nimport { SchemaAlterationError } from '../../../errors';\nimport { withForeignKeyChecksDisabled } from './checks';\nimport { resolveSchemaDialect } from './dialect';\nimport {\n buildAddForeignKeyQuery,\n buildDropForeignKeyQuery,\n buildDropIndexQuery,\n buildRenameForeignKeyQuery,\n buildRenameIndexQuery,\n} from './statements';\nimport type { SchemaDialect, SchemaRenameForeignKeyInput } from './type';\nimport { findTableForeignKey, findTableIndex, isStrict } from './utils';\n\n/**\n * mysql creates a backing index under the constraint name for a foreign key\n * column which carries no explicit index. That index survives the drop of the\n * constraint — it only becomes visible to the driver once the constraint is\n * gone, which is why the table has to be re-read here — and is dealt with\n * before the constraint is re-added, so the table can not end up with a stale\n * or duplicated index.\n *\n * Recent servers (verified on mysql 8/9 and mariadb 11) rename the index they\n * reuse for the new constraint themselves, which makes this a no-op in terms of\n * the end state. Doing it explicitly keeps the outcome independent of the\n * server version, and covers the case where the index can not be reused.\n */\nasync function alignForeignKeyBackingIndex(\n queryRunner: QueryRunner,\n input: SchemaRenameForeignKeyInput,\n) : Promise<void> {\n const table = await queryRunner.getTable(input.table);\n if (!table || !findTableIndex(table, input.from)) {\n return;\n }\n\n if (findTableIndex(table, input.to)) {\n await queryRunner.query(buildDropIndexQuery('mysql', input.table, input.from));\n\n return;\n }\n\n await queryRunner.query(buildRenameIndexQuery('mysql', input));\n}\n\n/**\n * Neither name is present. On mysql that is what a run interrupted between the\n * drop and the re-add leaves behind, and the constraint took its own\n * description with it — so it can only be restored from the passed meta.\n */\nasync function recreateForeignKey(\n queryRunner: QueryRunner,\n dialect: SchemaDialect,\n input: SchemaRenameForeignKeyInput,\n) : Promise<boolean> {\n const { meta } = input;\n if (!meta) {\n if (isStrict(input)) {\n throw SchemaAlterationError.foreignKeyNotFound(input.table, input.from);\n }\n\n return false;\n }\n\n await withForeignKeyChecksDisabled(queryRunner, async () => {\n if (dialect === 'mysql') {\n await alignForeignKeyBackingIndex(queryRunner, input);\n }\n\n await queryRunner.query(buildAddForeignKeyQuery(dialect, {\n table: input.table,\n name: input.to,\n columns: meta.columns,\n referencedTable: meta.referencedTable,\n referencedColumns: meta.referencedColumns,\n onDelete: meta.onDelete,\n onUpdate: meta.onUpdate,\n }));\n });\n\n return true;\n}\n\n/**\n * Rename a foreign key constraint, preserving its columns, its referenced\n * table/columns and its referential actions — all of which are read back from\n * the database, so the rename can not silently change the constraint.\n *\n * postgres renames the constraint in place, mysql has to drop and re-add it\n * (with the foreign key checks disabled, since the constraint was already\n * enforcing) and to take care of the backing index it may have created under\n * the constraint name.\n *\n * Returns false when a constraint is already named `to`, which keeps a repair\n * migration resumable. If neither name exists — the state an interrupted mysql\n * rename leaves behind, where the constraint took its own description with it —\n * the passed `meta` is used to restore it; without it `strict` (the default)\n * raises a `SchemaAlterationError`, since there is nothing left to rename.\n *\n * @throws DriverError for a driver which can not express the rename.\n * @throws SchemaAlterationError if neither name exists (and no `meta` describes\n * the constraint) and `strict`.\n */\nexport async function renameForeignKey(\n queryRunner: QueryRunner,\n input: SchemaRenameForeignKeyInput,\n) : Promise<boolean> {\n const dialect = resolveSchemaDialect(queryRunner.dataSource.options.type);\n\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n if (findTableForeignKey(table, input.to)) {\n return false;\n }\n\n const foreignKey = findTableForeignKey(table, input.from);\n if (!foreignKey) {\n return recreateForeignKey(queryRunner, dialect, input);\n }\n\n if (dialect === 'postgres') {\n await queryRunner.query(buildRenameForeignKeyQuery(input));\n\n return true;\n }\n\n await withForeignKeyChecksDisabled(queryRunner, async () => {\n await queryRunner.query(buildDropForeignKeyQuery(dialect, input.table, input.from));\n\n await alignForeignKeyBackingIndex(queryRunner, input);\n\n await queryRunner.query(buildAddForeignKeyQuery(dialect, {\n table: input.table,\n name: input.to,\n columns: foreignKey.columnNames,\n referencedTable: foreignKey.referencedTableName,\n referencedColumns: foreignKey.referencedColumnNames,\n onDelete: foreignKey.onDelete,\n onUpdate: foreignKey.onUpdate,\n }));\n });\n\n return true;\n}\n","import type { QueryRunner } from 'typeorm';\nimport { SchemaAlterationError } from '../../../errors';\nimport { resolveSchemaDialect } from './dialect';\nimport { buildRenameIndexQuery } from './statements';\nimport type { SchemaRenameIndexInput } from './type';\nimport { findTableIndex, isStrict } from './utils';\n\n/**\n * Rename an index.\n *\n * Returns false when an index is already named `to` — that is what keeps a\n * repair migration resumable, since mysql commits DDL regardless of the\n * surrounding transaction.\n *\n * When neither name is present (or the table is missing) the database is not\n * in a state this can act on, and `strict` (the default) raises a\n * `SchemaAlterationError` rather than reporting a repair which did not happen.\n *\n * Note that an index which backs a constraint is not reported as an index by\n * the driver: a unique constraint on postgres lives in `table.uniques`, and a\n * foreign key's backing index on mysql only becomes visible once the constraint\n * is dropped (see renameForeignKey).\n *\n * @throws DriverError for a driver which can not express the rename.\n * @throws SchemaAlterationError if neither name exists and `strict`.\n */\nexport async function renameIndex(\n queryRunner: QueryRunner,\n input: SchemaRenameIndexInput,\n) : Promise<boolean> {\n const dialect = resolveSchemaDialect(queryRunner.dataSource.options.type);\n\n const table = await queryRunner.getTable(input.table);\n if (!table) {\n if (isStrict(input)) {\n throw SchemaAlterationError.tableNotFound(input.table);\n }\n\n return false;\n }\n\n // already renamed\n if (findTableIndex(table, input.to)) {\n return false;\n }\n\n if (!findTableIndex(table, input.from)) {\n if (isStrict(input)) {\n throw SchemaAlterationError.indexNotFound(input.table, input.from);\n }\n\n return false;\n }\n\n await queryRunner.query(buildRenameIndexQuery(dialect, input));\n\n return true;\n}\n","import type { DataSourceOptions } from 'typeorm';\nimport { DataSource, InstanceChecker } from 'typeorm';\n\nexport type OwnedDataSource = {\n dataSource: DataSource,\n /**\n * Whether the data source was built (and therefore must be destroyed) here.\n */\n owned: boolean\n};\n\nasync function buildOwnedDataSource(\n options: DataSourceOptions,\n override?: Partial<DataSourceOptions>,\n) : Promise<OwnedDataSource> {\n const dataSource = new DataSource({\n ...options,\n ...(override || {}),\n } as DataSourceOptions);\n\n await dataSource.initialize();\n\n return {\n dataSource,\n owned: true,\n };\n}\n\n/**\n * Whether initializing a data source with these options would do something the\n * override exists to prevent (e.g. synchronize or drop the schema).\n */\nfunction conflictsWithOverride(\n options: DataSourceOptions,\n override: Partial<DataSourceOptions>,\n) : boolean {\n const record = options as Record<string, any>;\n\n return Object.entries(override).some(\n ([key, value]) => !!record[key] && record[key] !== value,\n );\n}\n\n/**\n * Accept either an existing DataSource or the options to build one, and\n * guarantee it is initialized.\n *\n * A data source built here is owned by the caller of this function and must be\n * destroyed by it. An already initialized one is used as is and never\n * destroyed.\n *\n * An uninitialized DataSource is only initialized when doing so does not\n * conflict with the override: `DataSource.initialize()` applies the instance's\n * own `dropSchema` / `synchronize` / `migrationsRun`, and a read-only caller\n * passing the override exists precisely to prevent that. Such an instance is\n * therefore left untouched and inspected through an own one instead.\n */\nexport async function useInitializedDataSource(\n input: DataSource | DataSourceOptions,\n override?: Partial<DataSourceOptions>,\n) : Promise<OwnedDataSource> {\n if (InstanceChecker.isDataSource(input)) {\n if (input.isInitialized) {\n return {\n dataSource: input,\n owned: false,\n };\n }\n\n if (override && conflictsWithOverride(input.options, override)) {\n return buildOwnedDataSource(input.options, override);\n }\n\n await input.initialize();\n\n return {\n dataSource: input,\n owned: false,\n };\n }\n\n return buildOwnedDataSource(input, override);\n}\n","import type { DataSource, DataSourceOptions } from 'typeorm';\nimport { SchemaDriftError } from '../../../errors';\nimport { useInitializedDataSource } from '../utils';\nimport type { SchemaDrift, SchemaDriftOptions, SchemaDriftStatement } from './type';\n\nfunction toStatement(query: { query: string, parameters?: any[] }) : SchemaDriftStatement {\n if (query.parameters && query.parameters.length > 0) {\n return {\n query: query.query,\n parameters: query.parameters,\n };\n }\n\n return { query: query.query };\n}\n\nfunction buildEmptyDrift() : SchemaDrift {\n return {\n exists: false,\n up: [],\n down: [],\n };\n}\n\n/**\n * Compare the database schema against the entity metadata and return the\n * statements which would reconcile the former with the latter.\n *\n * A schema which is built by migrations in production but by synchronize()\n * in tests has no guard against the two descriptions drifting apart. Run this\n * right after the migrations to close that gap:\n *\n * ```ts\n * const drift = await getSchemaDrift(dataSource);\n * if (drift.exists) {\n * console.log(drift.up.map((statement) => statement.query));\n * }\n * ```\n *\n * The inspection itself never writes to the database. A data source built from\n * the passed options is therefore built with `synchronize`, `migrationsRun` and\n * `dropSchema` disabled, and an uninitialized DataSource which has any of them\n * enabled is left untouched and inspected through an own instance — otherwise\n * initializing it would mutate (or drop) the very schema being inspected.\n */\nexport async function getSchemaDrift(\n input: DataSource | DataSourceOptions,\n options: SchemaDriftOptions = {},\n) : Promise<SchemaDrift> {\n const { dataSource, owned } = await useInitializedDataSource(input, {\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n });\n\n try {\n if (options.skipWithoutMigrations && dataSource.migrations.length === 0) {\n return buildEmptyDrift();\n }\n\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n const up = sqlInMemory.upQueries.map(toStatement);\n const down = sqlInMemory.downQueries.map(toStatement);\n\n return {\n exists: up.length > 0,\n up,\n down,\n };\n } finally {\n if (owned) {\n await dataSource.destroy();\n }\n }\n}\n\n/**\n * Throw if the database schema deviates from the entity metadata.\n *\n * @throws SchemaDriftError\n */\nexport async function assertSchemaMatchesMetadata(\n input: DataSource | DataSourceOptions,\n options: SchemaDriftOptions = {},\n) : Promise<void> {\n const drift = await getSchemaDrift(input, options);\n\n if (drift.exists) {\n throw SchemaDriftError.detected(drift.up);\n }\n}\n","import type { DataSource, DataSourceOptions, Migration } from 'typeorm';\nimport { useInitializedDataSource } from './utils';\n\nexport async function synchronizeDatabaseSchema(\n input: DataSource | DataSourceOptions,\n) : Promise<Migration[]> {\n const { dataSource, owned } = await useInitializedDataSource(input);\n const { options } = dataSource;\n\n let migrationsCount = 0;\n if (options.migrations) {\n migrationsCount = Array.isArray(options.migrations) ?\n options.migrations.length :\n Object.keys(options.migrations).length;\n }\n\n let migrations : Migration[] = [];\n\n if (migrationsCount > 0) {\n migrations = await dataSource.runMigrations({ transaction: options.migrationsTransactionMode });\n } else {\n await dataSource.synchronize(false);\n }\n\n if (owned) {\n await dataSource.destroy();\n }\n\n return migrations;\n}\n","import type {\n DatabaseDialectName,\n DatabaseDialectOverrides,\n IDatabaseConnection,\n IDatabaseConnectionFactory,\n} from '../core';\nimport { useDatabaseDialectEntry } from '../registry';\nimport { synchronizeDatabaseSchema } from '../schema';\nimport type { DatabaseCreateContext, DatabaseDropContext } from './type';\n\n/**\n * Wraps a caller supplied connection as a connection factory.\n * The connection is treated as already open, and the caller owns the\n * lifecycle — open() and close() never touch it.\n */\nclass InjectedConnectionFactory implements IDatabaseConnectionFactory {\n constructor(protected injected: Pick<IDatabaseConnection, 'execute'>) {\n this.injected = injected;\n }\n\n create(): IDatabaseConnection {\n const { injected } = this;\n\n return {\n open: () => Promise.resolve(),\n execute: (statement: string) => injected.execute(statement),\n close: () => Promise.resolve(),\n };\n }\n}\n\nfunction buildOverrides(\n context: DatabaseCreateContext | DatabaseDropContext,\n overrides: DatabaseDialectOverrides,\n): DatabaseDialectOverrides {\n if (context.connection && !overrides.connectionFactory) {\n return {\n ...overrides,\n connectionFactory: new InjectedConnectionFactory(context.connection),\n };\n }\n\n return overrides;\n}\n\n/**\n * Composition root for the create operation: resolves the registry entry,\n * derives connection params once, builds the dialect with its connection factory\n * (honouring overrides and a caller supplied connection) and runs the\n * schema synchronization exactly once.\n */\nexport async function executeDatabaseCreate(\n name: DatabaseDialectName,\n context: DatabaseCreateContext,\n overrides: DatabaseDialectOverrides = {},\n): Promise<unknown> {\n const entry = useDatabaseDialectEntry(name);\n const params = entry.buildParams(context.options);\n\n const dialect = entry.buildDialect(context.options, params, buildOverrides(context, overrides));\n\n const output = await dialect.create({\n params,\n ifNotExist: context.ifNotExist,\n initialDatabase: context.initialDatabase,\n });\n\n if (context.synchronize) {\n await synchronizeDatabaseSchema(context.options);\n }\n\n return output;\n}\n\nexport async function executeDatabaseDrop(\n name: DatabaseDialectName,\n context: DatabaseDropContext,\n overrides: DatabaseDialectOverrides = {},\n): Promise<unknown> {\n const entry = useDatabaseDialectEntry(name);\n const params = entry.buildParams(context.options);\n\n const dialect = entry.buildDialect(context.options, params, buildOverrides(context, overrides));\n\n return dialect.drop({\n params,\n ifExist: context.ifExist ?? true,\n initialDatabase: context.initialDatabase,\n });\n}\n","import { buildDatabaseCreateContext } from '../../utils/context';\nimport { resolveDatabaseDialectName } from '../../registry';\nimport { executeDatabaseCreate } from '../execute';\nimport type {\n DatabaseCreateContextInput,\n} from '../type';\n\n/**\n * Create database for specified driver in ConnectionOptions.\n *\n * @throws DriverError\n * @throws OptionsError\n *\n * @param input\n */\nexport async function createDatabase(input: DatabaseCreateContextInput = {}) : Promise<unknown> {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate(resolveDatabaseDialectName(context.options.type), context);\n}\n","import { buildDatabaseDropContext } from '../../utils/context';\nimport { resolveDatabaseDialectName } from '../../registry';\nimport { executeDatabaseDrop } from '../execute';\nimport type {\n DatabaseDropContextInput,\n} from '../type';\n\n/**\n * Drop database for specified driver in ConnectionOptions.\n *\n * @throws DriverError\n * @throws OptionsError\n *\n * @param input\n */\nexport async function dropDatabase(input: DatabaseDropContextInput = {}) : Promise<unknown> {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop(resolveDatabaseDialectName(context.options.type), context);\n}\n","import path from 'node:path';\nimport { CommandUtils } from 'typeorm/commands/CommandUtils';\nimport { MigrationGenerateCommand } from 'typeorm/commands/MigrationGenerateCommand';\nimport { resolveFilePath } from '../../utils';\nimport type { MigrationGenerateCommandContext, MigrationGenerateResult } from './type';\n\n/**\n * typeorm keeps the statement escaping, the query-parameter formatting and both file\n * templates as protected statics on its migration:generate command. Subclassing is the\n * only way to reach them, and reusing them keeps the generated file byte-identical to\n * the output of `typeorm migration:generate`.\n */\nclass GenerateCommand extends MigrationGenerateCommand {\n static buildStatement(query: string, parameters: any[] | undefined, prettify?: boolean) : string {\n const statement = prettify ? this.prettifyQuery(query) : query;\n\n return `await queryRunner.query(\\`${this.escapeTemplateLiteral(statement)}\\`${this.queryParams(parameters)});`;\n }\n\n static buildContent(\n context: Required<Pick<MigrationGenerateCommandContext, 'name' | 'timestamp' | 'language' | 'esm'>>,\n up: string[],\n down: string[],\n ) : string {\n // the templates expect the statements already indented to their place in the class body.\n const upStatements = up.map((statement) => ` ${statement}`);\n const downStatements = down.map((statement) => ` ${statement}`);\n\n if (context.language === 'js') {\n return this.getJavascriptTemplate(\n context.name,\n context.timestamp,\n upStatements,\n downStatements,\n context.esm,\n );\n }\n\n return this.getTemplate(\n context.name,\n context.timestamp,\n upStatements,\n downStatements,\n );\n }\n}\n\nexport async function generateMigration(\n context: MigrationGenerateCommandContext,\n) : Promise<MigrationGenerateResult> {\n const name = context.name || 'Default';\n const timestamp = context.timestamp ?? Date.now();\n const language = context.language || 'ts';\n\n const sqlInMemory = await context.dataSource.driver.createSchemaBuilder().log();\n\n const up = sqlInMemory.upQueries.map(\n (query) => GenerateCommand.buildStatement(query.query, query.parameters, context.prettify),\n );\n\n // the down statements undo the up statements and therefore run in reverse order.\n const down = sqlInMemory.downQueries.map(\n (query) => GenerateCommand.buildStatement(query.query, query.parameters, context.prettify),\n ).reverse();\n\n if (\n up.length === 0 &&\n down.length === 0\n ) {\n return { up, down };\n }\n\n const content = GenerateCommand.buildContent({\n name,\n timestamp,\n language,\n esm: context.esm || false,\n }, up, down);\n\n if (!context.preview) {\n const directoryPath = resolveFilePath(context.directoryPath || 'migrations');\n\n await CommandUtils.createFile(\n path.join(directoryPath, `${timestamp}-${name}.${language}`),\n content,\n );\n }\n\n return {\n up,\n down,\n content,\n };\n}\n","/* istanbul ignore next */\nimport type { ObjectLiteral, SelectQueryBuilder } from 'typeorm';\n\nexport function existsQuery<T extends ObjectLiteral = ObjectLiteral>(builder: SelectQueryBuilder<T>, inverse = false) {\n return `${inverse ? 'not ' : ''}exists (${builder.getQuery()})`;\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createCockroachDBDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('cockroachdb', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropCockroachDBDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('cockroachdb', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMongoDBDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mongodb', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMongoDBDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mongodb', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMsSQLDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mssql', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMsSQLDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mssql', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createMySQLDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('mysql', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropMySQLDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('mysql', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createOracleDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('oracle', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropOracleDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('oracle', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createPostgresDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('postgres', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropPostgresDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('postgres', context);\n}\n","import type {\n DatabaseCreateContextInput,\n DatabaseDropContextInput,\n} from '../methods';\nimport { executeDatabaseCreate, executeDatabaseDrop } from '../methods/execute';\nimport { buildDatabaseCreateContext, buildDatabaseDropContext } from '../utils';\n\n/**\n * @deprecated Use createDatabase() instead — dialect dispatch is automatic.\n */\nexport async function createSQLiteDatabase(\n input: DatabaseCreateContextInput = {},\n) {\n const context = await buildDatabaseCreateContext(input);\n\n return executeDatabaseCreate('better-sqlite3', context);\n}\n\n/**\n * @deprecated Use dropDatabase() instead — dialect dispatch is automatic.\n */\nexport async function dropSQLiteDatabase(\n input: DatabaseDropContextInput = {},\n) {\n const context = await buildDatabaseDropContext(input);\n\n return executeDatabaseDrop('better-sqlite3', context);\n}\n","import type { EntitySchema, ObjectType } from 'typeorm';\nimport { InstanceChecker } from 'typeorm';\n\nexport function getEntityName<O>(entity: ObjectType<O> | EntitySchema<O> | string) : string {\n if (typeof entity === 'string') {\n return entity;\n }\n\n if (typeof entity === 'function') {\n return entity.name;\n }\n\n if (InstanceChecker.isEntitySchema(entity)) {\n return entity.options.name;\n }\n\n return new (entity as any)().constructor.name;\n}\n","import { InstanceChecker, Repository } from 'typeorm';\nimport type {\n DataSource,\n EntityMetadata,\n EntityTarget,\n ObjectLiteral,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { EntityMetadataError } from '../../errors';\n\n/**\n * Describe an entity target for an error message.\n *\n * Every representation typeorm accepts has to be covered, and none of them may\n * be constructed to find out: the target of a failed lookup can be anything.\n */\nfunction describeEntityTarget(input: unknown) : string {\n if (typeof input === 'string') {\n return input;\n }\n\n if (typeof input === 'function') {\n return input.name;\n }\n\n if (InstanceChecker.isEntitySchema(input)) {\n return input.options.name;\n }\n\n if (\n typeof input === 'object' &&\n input !== null &&\n typeof (input as { name?: unknown }).name === 'string'\n ) {\n return (input as { name: string }).name;\n }\n\n return String(input);\n}\n\n/**\n * Receive metadata for a given repository or entity-target.\n *\n * @experimental\n * @param input\n * @param dataSource\n */\nexport async function getEntityMetadata<T extends ObjectLiteral>(\n input: Repository<T> | EntityTarget<T>,\n dataSource?: DataSource,\n): Promise<EntityMetadata> {\n if (input instanceof Repository) {\n return input.metadata;\n }\n\n dataSource = dataSource || await useDataSource();\n\n // The lookup is delegated to typeorm, so every entity-target\n // representation (class, entity schema, name, ...) is resolved alike.\n if (!dataSource.hasMetadata(input)) {\n throw EntityMetadataError.notRegistered(describeEntityTarget(input));\n }\n\n return dataSource.getMetadata(input);\n}\n","import type { \n DataSource, \n EntityMetadata, \n EntityTarget, \n ObjectLiteral, \n Repository, \n} from 'typeorm';\nimport { getEntityMetadata } from './metadata';\n\n/**\n * Get (relation-) property names of a given entity.\n *\n * @experimental\n * @param input\n * @param dataSource\n */\nexport async function getEntityPropertyNames<T extends ObjectLiteral>(\n input: EntityTarget<T> | Repository<T>,\n dataSource?: DataSource,\n) : Promise<string[]> {\n const entityMetadata : EntityMetadata = await getEntityMetadata(input, dataSource);\n\n const items : string[] = [];\n\n for (let i = 0; i < entityMetadata.columns.length; i++) {\n items.push(entityMetadata.columns[i].propertyName);\n }\n\n for (let i = 0; i < entityMetadata.relations.length; i++) {\n items.push(entityMetadata.relations[i].propertyName);\n }\n\n return items;\n}\n","import type {\n DataSource, \n EntityTarget, \n FindOptionsWhere, \n ObjectLiteral,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { EntityRelationLookupError } from '../../errors';\nimport { getEntityMetadata } from './metadata';\n\ntype EntityRelationColumnsValidateOptions<T> = {\n dataSource?: DataSource,\n entityTarget: EntityTarget<T>,\n};\n\n/**\n * Validate join columns of a given entity.\n * It will look up and append the referenced entities to the input entity.\n *\n * @experimental\n * @param entity\n * @param options\n */\nexport async function validateEntityJoinColumns<T extends ObjectLiteral>(\n entity: Partial<T>,\n options: EntityRelationColumnsValidateOptions<T>,\n) {\n const dataSource = options.dataSource || await useDataSource();\n const entityMetadata = await getEntityMetadata(options.entityTarget, dataSource);\n\n const relations : Partial<T> = {};\n for (let i = 0; i < entityMetadata.relations.length; i++) {\n const relation = entityMetadata.relations[i];\n\n let skipRelation : boolean = false;\n\n const where : FindOptionsWhere<ObjectLiteral> = {};\n const columns : string[] = [];\n for (let j = 0; j < relation.joinColumns.length; j++) {\n const joinColumn = relation.joinColumns[j];\n if (typeof entity[joinColumn.propertyName] === 'undefined') {\n continue;\n }\n\n if (\n joinColumn.isNullable &&\n entity[joinColumn.propertyName] === null\n ) {\n skipRelation = true;\n break;\n }\n\n if (joinColumn.referencedColumn) {\n where[joinColumn.referencedColumn.propertyName] = entity[joinColumn.propertyName];\n\n columns.push(joinColumn.propertyName);\n } else {\n throw EntityRelationLookupError.notReferenced(\n relation.propertyName,\n [joinColumn.propertyName],\n );\n }\n }\n\n // Nothing to look the relation up by. A relation which does not own the\n // foreign key (one-to-many, ...) never has join columns, and querying\n // without a condition would match an arbitrary row.\n if (skipRelation || columns.length === 0) {\n continue;\n }\n\n // A composite foreign key can only be looked up if every join column is\n // provided. Querying by a subset of them could match an unrelated row.\n if (columns.length !== relation.joinColumns.length) {\n continue;\n }\n\n const repository = dataSource.getRepository(relation.type);\n const item = await repository.findOne({ where });\n\n if (!item) {\n throw EntityRelationLookupError.notFound(relation.propertyName, columns);\n }\n\n relations[relation.propertyName as keyof T] = item as T[keyof T];\n }\n\n const relationKeys = Object.keys(relations);\n for (const relationKey of relationKeys) {\n entity[relationKey as keyof T] = relations[relationKey] as T[keyof T];\n }\n\n return entity;\n}\n","import { Brackets } from 'typeorm';\nimport type {\n DataSource,\n EntityTarget,\n ObjectLiteral,\n WhereExpressionBuilder,\n} from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport { isObject } from '../../utils';\nimport { getEntityMetadata } from './metadata';\n\ntype EntityUniquenessCheckOptions<T> = {\n /**\n * Repository entity class.\n */\n entityTarget: EntityTarget<T>,\n\n /**\n * Entity to insert/update.\n */\n entity: Partial<T>,\n\n /**\n * Entity found.\n */\n entityExisting?: Partial<T> | null,\n\n /**\n * DataSource to use\n */\n dataSource?: DataSource\n};\n\nfunction transformUndefinedToNull<T>(input: undefined | T) : T {\n if (typeof input === 'undefined') {\n return null as T;\n }\n\n return input;\n}\n\n/**\n * Read the value of a column property path.\n *\n * The path of a column of an embedded entity is nested (profile.email), so it\n * can not be used as a plain key. A path which is not reachable counts as\n * absent, like a column the input does not define at all.\n */\nfunction readPropertyPath(data: Record<string, any>, path: string) : unknown {\n const parts = path.split('.');\n\n let current : any = data;\n for (const part of parts) {\n if (!isObject(current)) {\n return undefined;\n }\n\n current = current[part];\n }\n\n return current;\n}\n\nfunction pickPropertyPaths(data: Record<string, any>, paths: string[]) : Record<string, any> {\n const output : Record<string, any> = {};\n for (const path of paths) {\n output[path] = readPropertyPath(data, path);\n }\n\n return output;\n}\n\n/**\n * Prefixing the property with the query alias is what lets the query builder\n * translate it to the column name of the database.\n */\nfunction buildPropertyPath(alias: string, key: string) : string {\n return `${alias}.${key}`;\n}\n\n/**\n * Match the row which the write would produce: every column has to hold the\n * given value, so the conditions are combined with AND.\n */\nfunction applyMatchExpression(\n qb: WhereExpressionBuilder,\n alias: string,\n data: Record<string, any>,\n) {\n const keys = Object.keys(data);\n for (const [index, key] of keys.entries()) {\n const value = transformUndefinedToNull(data[key]);\n const propertyPath = buildPropertyPath(alias, key);\n\n if (value === null) {\n qb.andWhere(`${propertyPath} IS NULL`);\n\n continue;\n }\n\n const bindingKey = `match_${index}`;\n\n qb.andWhere(`${propertyPath} = :${bindingKey}`, { [bindingKey]: value });\n }\n}\n\n/**\n * Exclude one specific row, identified by the given columns.\n *\n * This is the negation of a match, and the negation of a conjunction is a\n * disjunction: a row is a different one as soon as a single column differs.\n * Combining the conditions with AND instead would only exclude a row which\n * differs in every column, so a row sharing one column of a composite primary\n * key with the excluded one would be dropped from the result as well.\n */\nfunction applyExclusionExpression(\n qb: WhereExpressionBuilder,\n alias: string,\n data: Record<string, any>,\n) {\n const keys = Object.keys(data);\n for (const [index, key] of keys.entries()) {\n const value = transformUndefinedToNull(data[key]);\n const propertyPath = buildPropertyPath(alias, key);\n\n if (value === null) {\n qb.orWhere(`${propertyPath} IS NOT NULL`);\n\n continue;\n }\n\n const bindingKey = `exclude_${index}`;\n\n qb.orWhere(`${propertyPath} != :${bindingKey}`, { [bindingKey]: value });\n }\n}\n\n/**\n * Resolve the values a unique column group will hold after the write.\n *\n * A value provided by the input entity wins. If the input does not define the\n * column and an existing entity is given, the persisted value is kept, because\n * an update leaves that column untouched. Otherwise the column will be null.\n */\nfunction resolveColumnGroupValues<T extends ObjectLiteral>(\n columnGroup: string[],\n entity: Partial<T>,\n entityExisting?: Partial<T> | null,\n) : Record<string, any> {\n const output : Record<string, any> = {};\n\n for (const path of columnGroup) {\n const value = readPropertyPath(entity, path);\n if (typeof value !== 'undefined') {\n output[path] = value;\n\n continue;\n }\n\n const valueExisting = entityExisting ?\n readPropertyPath(entityExisting, path) :\n undefined;\n if (typeof valueExisting !== 'undefined') {\n output[path] = valueExisting;\n\n continue;\n }\n\n output[path] = null;\n }\n\n return output;\n}\n\n/**\n * Check if a given entity does not already exist.\n * Composite unique keys on a null column can only be present once.\n *\n * @experimental\n * @param options\n */\nexport async function isEntityUnique<T extends ObjectLiteral>(\n options: EntityUniquenessCheckOptions<T>,\n) : Promise<boolean> {\n const dataSource = options.dataSource || await useDataSource();\n\n const metadata = await getEntityMetadata(options.entityTarget, dataSource);\n\n const repository = dataSource.getRepository(metadata.target);\n\n const primaryColumnPaths = metadata.primaryColumns.map((c) => c.propertyPath);\n\n const columnGroups : string[][] = [];\n if (\n metadata.ownUniques &&\n metadata.ownUniques.length > 0\n ) {\n for (let i = 0; i < metadata.ownUniques.length; i++) {\n columnGroups.push(metadata.ownUniques[i].columns.map(\n (column) => column.propertyPath,\n ));\n }\n } else {\n for (let i = 0; i < metadata.indices.length; i++) {\n const index = metadata.indices[i];\n if (!index.isUnique || index.entityMetadata.target !== metadata.target) {\n continue;\n }\n\n columnGroups.push(index.columns.map(\n (column) => column.propertyPath,\n ));\n }\n }\n\n for (const columnGroup of columnGroups) {\n const alias = 'entity';\n const queryBuilder = repository.createQueryBuilder(alias);\n queryBuilder.where(new Brackets((qb) => {\n applyMatchExpression(\n qb,\n alias,\n resolveColumnGroupValues(columnGroup, options.entity, options.entityExisting),\n );\n }));\n\n if (options.entityExisting) {\n queryBuilder.andWhere(new Brackets((qb) => {\n applyExclusionExpression(qb, alias, pickPropertyPaths(options.entityExisting!, primaryColumnPaths));\n }));\n }\n\n const entity = await queryBuilder.getOne();\n if (entity) {\n return false;\n }\n }\n\n return true;\n}\n","import type { Environment } from '../env';\nimport type { SeederConfig, SeederOptions } from './type';\n\nconst SEEDS_DEFAULT = ['src/database/seeds/**/*{.ts,.js}'];\nconst FACTORIES_DEFAULT = ['src/database/factories/**/*{.ts,.js}'];\n\nfunction firstNonEmpty<T extends unknown[]>(\n ...candidates: (T | undefined)[]\n) : T | undefined {\n return candidates.find(\n (candidate) => typeof candidate !== 'undefined' && candidate.length > 0,\n );\n}\n\nexport function resolveSeederConfig(\n input: SeederOptions = {},\n dataSourceOptions: SeederOptions = {},\n env: Pick<Environment, 'seeds' | 'factories'> = { seeds: [], factories: [] },\n) : SeederConfig {\n return {\n seeds: firstNonEmpty(input.seeds, dataSourceOptions.seeds, env.seeds) ??\n SEEDS_DEFAULT,\n seedName: input.seedName,\n seedTableName: input.seedTableName ||\n dataSourceOptions.seedTableName ||\n 'seeds',\n seedTracking: input.seedTracking ??\n dataSourceOptions.seedTracking ??\n false,\n factories: firstNonEmpty(input.factories, dataSourceOptions.factories, env.factories) ??\n FACTORIES_DEFAULT,\n };\n}\n","import type { Seeder, SeederConstructor } from './type';\n\nexport class SeederEntity {\n /**\n * ID of the seeder.\n *\n * Indicates order of the executed seeders.\n */\n id?: number;\n\n /**\n * Timestamp of the seeder.\n */\n timestamp: number;\n\n /**\n * Name of the seeder (class name).\n */\n name: string;\n\n /**\n * Instance of seeder constructor.\n */\n instance?: Seeder;\n\n /**\n * File name of the seeder.\n */\n fileName?: string;\n\n /**\n * File path of the seeder.\n */\n filePath?: string;\n\n /**\n * Result of the executed seeder.\n */\n result?: unknown;\n\n constructor(ctx: {\n id?: number,\n timestamp: number,\n name: string,\n constructor?: SeederConstructor,\n fileName?: string,\n filePath?: string\n }) {\n this.id = ctx.id;\n this.timestamp = ctx.timestamp;\n this.name = ctx.name;\n\n if (ctx.constructor) {\n this.instance = new ctx.constructor();\n }\n\n this.fileName = ctx.fileName;\n this.filePath = ctx.filePath;\n }\n\n get trackExecution() : boolean | undefined {\n if (typeof this.instance === 'undefined') {\n return undefined;\n }\n\n return this.instance.track;\n }\n\n /**\n * Decide whether this seeder's execution should be tracked.\n * The per-seed track property wins over the executor-level default.\n */\n effectiveTracking(fallback: boolean) : boolean {\n return this.trackExecution ?? fallback;\n }\n\n /**\n * Execution-order comparator:\n * by file name when both entities are file-backed, by timestamp otherwise.\n */\n static compare(a: SeederEntity, b: SeederEntity) : number {\n if (\n typeof a.fileName !== 'undefined' &&\n typeof b.fileName !== 'undefined' &&\n a.fileName !== b.fileName\n ) {\n return a.fileName > b.fileName ? 1 : -1;\n }\n\n return a.timestamp - b.timestamp;\n }\n}\n","import { hasOwnProperty, isPromise } from '../../utils';\nimport type { SaveOptions } from 'typeorm';\nimport { useDataSource } from '../../data-source';\nimport type { SeederFactoryContext } from './type';\n\nexport class SeederFactory<O extends Record<string, any>, Meta = unknown> {\n public readonly context: SeederFactoryContext<O, Meta>;\n\n public meta: Meta | undefined;\n\n // --------------------------------------------------------------\n\n constructor(context: SeederFactoryContext<O, Meta>) {\n this.context = context;\n }\n\n // --------------------------------------------------------------\n\n public setMeta(value: Meta) {\n this.meta = value;\n\n return this;\n }\n\n // --------------------------------------------------------------\n\n public async make(params?: Partial<O>, save?: boolean) {\n const factoryFn = this.context.factoryFn(this.meta);\n let entity : O;\n if (isPromise(factoryFn)) {\n entity = await this.resolve(await factoryFn, save);\n } else {\n entity = await this.resolve(factoryFn, save);\n }\n\n if (params) {\n const keys : (keyof O)[] = Object.keys(params);\n for (const key of keys) {\n entity[key] = (params as O)[key];\n }\n }\n\n return entity;\n }\n\n // --------------------------------------------------------------\n\n public async save(\n params?: Partial<O>,\n options?: SaveOptions,\n ) : Promise<O> {\n const dataSource = this.context.dataSource || await useDataSource();\n\n const entity = await this.make(params, true);\n const entityManager = dataSource.getRepository(this.context.entity);\n\n return entityManager.save(entity, options);\n }\n\n public async saveMany(\n amount: number,\n params?: Partial<O>,\n options?: SaveOptions,\n ) : Promise<O[]> {\n const promises : Promise<O>[] = [];\n for (let i = 0; i < amount; i++) {\n const item = this.save(params, options);\n promises.push(item);\n }\n\n return Promise.all(promises);\n }\n\n // --------------------------------------------------------------\n\n private async resolve(entity: O, save?: boolean) : Promise<O> {\n const keys = Object.keys(entity);\n for (const key of keys as (keyof O)[]) {\n const value : O[keyof O] = entity[key];\n\n if (!hasOwnProperty(entity, key)) {\n continue;\n }\n\n if (\n typeof value === 'object' &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n value instanceof SeederFactory\n ) {\n const factory = value as SeederFactory<any>;\n if (this.context.dataSource && !factory.context.dataSource) {\n factory.context.dataSource = this.context.dataSource;\n }\n\n if (save) {\n entity[key] = await factory.save();\n } else {\n entity[key] = await factory.make();\n }\n }\n\n if (\n value &&\n hasOwnProperty(value, 'then') &&\n typeof value.then === 'function'\n ) {\n entity[key] = await value;\n }\n }\n\n return entity;\n }\n}\n","import type { DataSource, EntitySchema, ObjectType } from 'typeorm';\nimport type { FactoryCallback, SeederFactoryItem, SeederFactoryManagerContext } from './type';\nimport { getEntityName } from '../../helpers';\nimport { hasOwnProperty } from '../../utils';\nimport { SeederFactory } from './module';\n\nexport class SeederFactoryManager {\n public readonly items : Record<string, SeederFactoryItem>;\n\n public readonly dataSource : DataSource | undefined;\n\n constructor(context: SeederFactoryManagerContext = {}) {\n this.items = context.items || {};\n this.dataSource = context.dataSource;\n }\n\n set<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n factoryFn: FactoryCallback<O, Meta>,\n ) : SeederFactoryItem {\n const name = getEntityName(entity);\n\n this.items[name] = {\n factoryFn,\n entity,\n };\n\n return this.items[name];\n }\n\n get<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n ) : SeederFactory<O, Meta> {\n const name = getEntityName(entity);\n\n if (!hasOwnProperty(this.items, name)) {\n throw new Error(`No seeder factory is registered for the entity: ${name}`);\n }\n\n return new SeederFactory({\n factoryFn: this.items[name].factoryFn,\n entity,\n name,\n dataSource: this.dataSource,\n });\n }\n}\n","import { getFileNameExtension } from 'locter';\n\nexport function buildSeederFileName(\n name: string,\n timestamp: number,\n options: { javascript?: boolean } = {},\n): string {\n if (getFileNameExtension(name)) {\n return `${timestamp}-${name}`;\n }\n\n return `${timestamp}-${name}${options.javascript ? '.js' : '.ts'}`;\n}\n","import type { LocatorInfo } from 'locter';\nimport { buildFilePath, locateMany } from 'locter';\nimport { resolveFilePath } from '../../utils';\n\nexport async function resolveFilePatterns(\n filesPattern: string[],\n root?: string,\n) : Promise<string[]> {\n return locateMany(\n filesPattern,\n {\n ...(root ? { cwd: root } : {}),\n ignore: ['**/*.d.ts'],\n },\n ).then(buildFilePathname);\n}\n\nexport function resolveFilePaths(\n filePaths: string[],\n root?: string,\n) {\n return filePaths.map((filePath) => resolveFilePath(filePath, root));\n}\n\nfunction buildFilePathname(files: LocatorInfo[]) {\n return (\n // sorting by name so that we can define the order of execution using file names\n files.sort((a, b) => (a.name > b.name ? 1 : -1)).map((el) => buildFilePath(el))\n );\n}\n","import { readAsModule } from 'locter';\nimport path from 'node:path';\nimport type { SeederConstructor, SeederPrepareElement } from '../type';\nimport { resolveFilePaths, resolveFilePatterns } from './file-path';\n\nexport async function prepareSeederSeeds(\n input: SeederConstructor[] | string[],\n root?: string,\n): Promise<SeederPrepareElement[]> {\n const items: SeederPrepareElement[] = [];\n\n let seedFiles: string[] = [];\n const seedConstructors: SeederConstructor[] = [];\n\n for (const value of input) {\n if (typeof value === 'string') {\n seedFiles.push(value);\n } else {\n seedConstructors.push(value);\n }\n }\n\n if (seedFiles.length > 0) {\n seedFiles = await resolveFilePatterns(seedFiles, root);\n seedFiles = resolveFilePaths(seedFiles, root);\n\n for (const filePath of seedFiles) {\n const moduleExports = await readAsModule(filePath);\n\n let clazzConstructor : SeederConstructor | undefined;\n\n const exportKeys = Object.keys(moduleExports);\n for (const exportKey of exportKeys) {\n const moduleExport = moduleExports[exportKey];\n if (\n typeof moduleExport === 'function' &&\n moduleExport.prototype\n ) {\n clazzConstructor = moduleExport;\n }\n }\n\n if (clazzConstructor) {\n const fileName = path.basename(filePath);\n const match = fileName.match(/^([0-9]{13,})-(.*)$/);\n\n let timestamp : number | undefined;\n if (match) {\n timestamp = Number.parseInt(match[1], 10);\n }\n\n items.push({\n constructor: clazzConstructor,\n fileName,\n filePath,\n ...(timestamp ? { timestamp } : {}),\n });\n }\n }\n }\n\n if (seedConstructors.length > 0) {\n for (const seedConstructor of seedConstructors) {\n items.push({ constructor: seedConstructor });\n }\n }\n\n return items;\n}\n","import { pascalCase } from 'pascal-case';\n\nexport function buildSeederFileTemplate(\n name: string,\n timestamp: number,\n): string {\n const className = `${pascalCase(name)}${timestamp}`;\n\n return `import { DataSource } from 'typeorm';\nimport { Seeder, SeederFactoryManager } from 'typeorm-extension';\n\nexport class ${className} implements Seeder {\n track = false;\n\n public async run(\n dataSource: DataSource,\n factoryManager: SeederFactoryManager\n ): Promise<any> {\n\n }\n}\n`;\n}\n","import { readAsModule } from 'locter';\nimport type { EntitySchema, ObjectType } from 'typeorm';\nimport { useRuntimeRegistry } from '../../runtime';\nimport { resolveFilePaths, resolveFilePatterns } from '../utils';\nimport { SeederFactoryManager } from './manager';\nimport type { FactoryCallback, SeederFactoryItem } from './type';\n\nexport function useSeederFactoryManager() {\n const registry = useRuntimeRegistry();\n if (typeof registry.factories === 'undefined') {\n registry.factories = new SeederFactoryManager();\n }\n\n return registry.factories;\n}\n\nexport function resetSeederFactoryManager() {\n useRuntimeRegistry().factories = undefined;\n}\n\nexport function setSeederFactory<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n factoryFn: FactoryCallback<O, Meta>,\n) : SeederFactoryItem {\n const manager = useSeederFactoryManager();\n return manager.set(entity, factoryFn);\n}\n\nexport function useSeederFactory<O extends Record<string, any>, Meta = unknown>(\n entity: ObjectType<O> | EntitySchema<O>,\n) {\n const manager = useSeederFactoryManager();\n return manager.get<O, Meta>(entity);\n}\n\nexport async function prepareSeederFactories(\n items: SeederFactoryItem[] | string[],\n root?: string,\n) {\n let factoryFiles: string[] = [];\n const factoryConfigs: SeederFactoryItem[] = [];\n\n for (const value of items) {\n if (typeof value === 'string') {\n factoryFiles.push(value);\n } else {\n factoryConfigs.push(value);\n }\n }\n\n if (factoryFiles.length > 0) {\n factoryFiles = await resolveFilePatterns(factoryFiles, root);\n factoryFiles = resolveFilePaths(factoryFiles, root);\n\n for (const factoryFile of factoryFiles) {\n await readAsModule(factoryFile);\n }\n }\n\n if (factoryConfigs.length > 0) {\n const factoryManager = useSeederFactoryManager();\n\n for (const factoryConfig of factoryConfigs) {\n factoryManager.set(\n factoryConfig.entity,\n factoryConfig.factoryFn,\n );\n }\n }\n}\n","import { MssqlParameter, Table } from 'typeorm';\nimport type {\n DataSource, \n DataSourceOptions, \n ObjectLiteral, \n QueryRunner,\n} from 'typeorm';\nimport type { MongoQueryRunner } from 'typeorm/driver/mongodb/MongoQueryRunner';\nimport { useEnv } from '../env';\nimport { PathResolverMode, createPathResolver } from '../utils';\nimport type { IPathResolver } from '../utils';\nimport { resolveSeederConfig } from './config';\nimport { SeederEntity } from './entity';\nimport { SeederFactoryManager, prepareSeederFactories, useSeederFactoryManager } from './factory';\nimport type {\n SeederConfig,\n SeederExecutorOptions,\n SeederOptions,\n SeederPrepareElement,\n} from './type';\nimport { prepareSeederSeeds } from './utils';\n\nexport class SeederExecutor {\n protected dataSource : DataSource;\n\n protected options : SeederExecutorOptions;\n\n protected pathResolver : IPathResolver;\n\n constructor(dataSource: DataSource, options?: SeederExecutorOptions) {\n this.dataSource = dataSource;\n this.options = options || {};\n this.pathResolver = createPathResolver({\n root: this.options.root,\n tsconfig: this.options.tsconfig,\n mode: this.options.preserveFilePaths ?\n PathResolverMode.PRESERVE :\n PathResolverMode.AUTO,\n });\n }\n\n async execute(input: SeederOptions = {}) : Promise<SeederEntity[]> {\n const config = await this.resolveConfig(input);\n\n await prepareSeederFactories(config.factories, this.options.root);\n\n const all = await this.loadEntities(config);\n\n const tracking = config.seedTracking ||\n all.some((seed) => seed.effectiveTracking(config.seedTracking));\n\n let queryRunner : QueryRunner | undefined;\n let existing : SeederEntity[] = [];\n\n try {\n if (tracking) {\n queryRunner = this.dataSource.createQueryRunner();\n await this.createTableIfNotExist(queryRunner, config.seedTableName);\n existing = await this.loadExisting(queryRunner, config.seedTableName);\n }\n\n const pending = this.filterPending(all, existing, config);\n if (pending.length === 0) {\n return [];\n }\n\n this.dataSource.logger.logSchemaBuild(\n `${existing.length} seeds are already present in the database.`,\n );\n this.dataSource.logger.logSchemaBuild(\n `${all.length} seeds were found in the source code.`,\n );\n\n return await this.runPending(pending, config, queryRunner);\n } finally {\n if (queryRunner) {\n await queryRunner.release();\n }\n }\n }\n\n protected async resolveConfig(input: SeederOptions = {}) : Promise<SeederConfig> {\n const config = resolveSeederConfig(input, this.dataSourceOptions, useEnv());\n\n await this.pathResolver.transformKeys(\n config,\n ['seeds', 'seedName', 'factories'],\n );\n\n return config;\n }\n\n protected async loadEntities(config: SeederConfig) : Promise<SeederEntity[]> {\n const elements = await prepareSeederSeeds(\n config.seeds,\n this.options.root,\n );\n\n return this.buildEntities(elements);\n }\n\n protected filterPending(\n all: SeederEntity[],\n existing: SeederEntity[],\n config: SeederConfig,\n ) : SeederEntity[] {\n return all.filter((seed) => {\n if (!this.isMatch(seed, config)) {\n return false;\n }\n\n const index = existing.findIndex(\n (el) => el.name === seed.name,\n );\n\n if (index === -1) {\n return true;\n }\n\n return !seed.effectiveTracking(config.seedTracking);\n });\n }\n\n protected isMatch(seed: SeederEntity, config: SeederConfig) : boolean {\n if (!config.seedName) {\n return true;\n }\n\n if (\n seed.name === config.seedName ||\n seed.fileName === config.seedName\n ) {\n return true;\n }\n\n if (!seed.filePath) {\n return false;\n }\n\n if (seed.filePath === config.seedName) {\n return true;\n }\n\n return this.pathResolver.absolutize(config.seedName) === seed.filePath;\n }\n\n protected async runPending(\n pending: SeederEntity[],\n config: SeederConfig,\n queryRunner?: QueryRunner,\n ) : Promise<SeederEntity[]> {\n const factoryManager = new SeederFactoryManager({\n items: useSeederFactoryManager().items,\n dataSource: this.dataSource,\n });\n\n const executed : SeederEntity[] = [];\n\n for (const element of pending) {\n const seeder = element.instance;\n if (!seeder) {\n continue;\n }\n\n element.result = await seeder.run(this.dataSource, factoryManager);\n\n if (queryRunner && element.effectiveTracking(config.seedTracking)) {\n await this.track(queryRunner, element, config.seedTableName);\n }\n\n this.dataSource.logger.logSchemaBuild(\n `Seed ${element.name} has been executed successfully.`,\n );\n\n executed.push(element);\n }\n\n return executed;\n }\n\n protected async loadExisting(\n queryRunner: QueryRunner,\n tableName: string,\n ) : Promise<SeederEntity[]> {\n if (this.dataSource.driver.options.type === 'mongodb') {\n const mongoRunner = queryRunner as MongoQueryRunner;\n\n return mongoRunner\n .cursor(tableName, {})\n .sort({ _id: -1 })\n .toArray();\n }\n\n const raw: ObjectLiteral[] = await this.dataSource.manager\n .createQueryBuilder(queryRunner)\n .select()\n .orderBy(this.dataSource.driver.escape('id'), 'DESC')\n .from(this.buildTableName(tableName), tableName)\n .getRawMany();\n\n return raw.map((migrationRaw) => new SeederEntity({\n id: Number.parseInt(migrationRaw.id, 10),\n timestamp: Number.parseInt(migrationRaw.timestamp, 10),\n name: migrationRaw.name,\n constructor: undefined,\n }));\n }\n\n protected async buildEntities(seeds?: SeederPrepareElement[]): Promise<SeederEntity[]> {\n if (!seeds) {\n return [];\n }\n\n let timestampCounter = 0;\n const entities = seeds.map((element) => {\n const {\n constructor: seed,\n fileName,\n filePath,\n } = element;\n\n let { timestamp } = element;\n\n const className = seed.name || (seed.constructor as any).name;\n\n if (!timestamp) {\n timestamp = this.classNameToTimestamp(className);\n }\n\n const entity = new SeederEntity({\n fileName,\n filePath,\n timestamp: timestamp || timestampCounter,\n name: className,\n constructor: seed,\n });\n\n timestampCounter++;\n\n return entity;\n });\n\n this.checkForDuplicates(entities);\n\n return entities.sort(SeederEntity.compare);\n }\n\n protected checkForDuplicates(entities: SeederEntity[]) {\n const names = entities.map((migration) => migration.name);\n const duplicates = Array.from(\n new Set(\n names.filter(\n (migrationName, index) => names.indexOf(migrationName) < index,\n ),\n ),\n );\n if (duplicates.length > 0) {\n throw Error(`Duplicate seeds: ${duplicates.join(', ')}`);\n }\n }\n\n protected async createTableIfNotExist(\n queryRunner: QueryRunner,\n tableName: string,\n ) {\n // If driver is mongo no need to create\n if (this.dataSource.driver.options.type === 'mongodb') {\n return;\n }\n const tableExist = await queryRunner.hasTable(this.buildTableName(tableName));\n if (!tableExist) {\n await queryRunner.createTable(\n new Table({\n database: this.database,\n schema: this.schema,\n name: this.buildTableName(tableName),\n columns: [\n {\n name: 'id',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationId,\n }),\n isGenerated: true,\n generationStrategy: 'increment',\n isPrimary: true,\n isNullable: false,\n },\n {\n name: 'timestamp',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationTimestamp,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: 'name',\n type: this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationName,\n }),\n isNullable: false,\n },\n ],\n }),\n );\n }\n }\n\n protected async track(\n queryRunner: QueryRunner,\n seederEntity: SeederEntity,\n tableName: string,\n ): Promise<void> {\n const values: ObjectLiteral = {};\n if (this.dataSource.driver.options.type === 'mssql') {\n values.timestamp = new MssqlParameter(\n seederEntity.timestamp,\n this.dataSource.driver.normalizeType({\n type: this.dataSource.driver.mappedDataTypes\n .migrationTimestamp,\n }) as any,\n );\n values.name = new MssqlParameter(\n seederEntity.name,\n this.dataSource.driver.normalizeType({ type: this.dataSource.driver.mappedDataTypes.migrationName }) as any,\n );\n } else {\n values.timestamp = seederEntity.timestamp;\n values.name = seederEntity.name;\n }\n\n if (this.dataSource.driver.options.type === 'mongodb') {\n const mongoRunner = queryRunner as MongoQueryRunner;\n await mongoRunner.databaseConnection\n .db(this.dataSource.driver.database)\n .collection(tableName)\n .insertOne(values);\n } else {\n const qb = queryRunner.manager.createQueryBuilder();\n await qb\n .insert()\n .into(this.buildTableName(tableName))\n .values(values)\n .execute();\n }\n }\n\n protected get dataSourceOptions() : DataSourceOptions & SeederOptions {\n return this.dataSource.options;\n }\n\n protected get database() {\n return this.dataSource.driver.database;\n }\n\n protected get schema() {\n return this.dataSource.driver.schema;\n }\n\n protected buildTableName(tableName: string) : string {\n return this.dataSource.driver.buildTableName(\n tableName,\n this.schema,\n this.database,\n );\n }\n\n protected classNameToTimestamp(className: string) {\n const match = className.match(/^(.*)([0-9]{13,})$/);\n if (match) {\n return Number.parseInt(match[2], 10);\n }\n\n return undefined;\n }\n}\n","import type { DataSource } from 'typeorm';\nimport type { SeederEntity } from './entity';\nimport { SeederExecutor } from './executor';\nimport type { SeederConstructor, SeederOptions } from './type';\n\nexport async function runSeeder(\n dataSource: DataSource,\n seeder: SeederConstructor | string,\n options: SeederOptions = {},\n) : Promise<SeederEntity | undefined> {\n if (typeof seeder === 'string') {\n options.seedName = seeder;\n } else {\n options.seeds = [seeder];\n }\n\n const executor = new SeederExecutor(dataSource);\n const output = await executor.execute(options);\n\n return output.pop();\n}\n\nexport async function runSeeders(\n dataSource: DataSource,\n options?: SeederOptions,\n) : Promise<SeederEntity[]> {\n const executor = new SeederExecutor(dataSource);\n return executor.execute(options);\n}\n"],"mappings":"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"}