rake-db 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/common.ts","../src/commands/createOrDrop.ts","../src/migration/change.ts"],"sourcesContent":["import { Adapter, AdapterOptions } from 'pqb';\nimport Enquirer from 'enquirer';\nimport path from 'path';\nimport { readdir } from 'fs/promises';\n\nexport type MigrationConfig = {\n migrationsPath: string;\n migrationsTable: string;\n requireTs(path: string): void;\n};\n\nconst registered = false;\n\nexport const migrationConfigDefaults = {\n migrationsPath: path.resolve(process.cwd(), 'src', 'migrations'),\n migrationsTable: 'schemaMigrations',\n requireTs(path: string) {\n if (!registered) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('ts-node').register({ compilerOptions: { module: 'CommonJS' } });\n }\n require(path);\n },\n};\n\nexport const getMigrationConfigWithDefaults = (\n config: Partial<MigrationConfig>,\n) => {\n return { ...migrationConfigDefaults, ...config };\n};\n\nexport const getDatabaseAndUserFromOptions = (\n options: AdapterOptions,\n): { database: string; user: string } => {\n if (options.connectionString) {\n const url = new URL(options.connectionString);\n return {\n database: url.pathname.slice(1),\n user: url.username,\n };\n } else {\n return {\n database: options.database as string,\n user: options.user as string,\n };\n }\n};\n\nexport const setAdapterOptions = (\n options: AdapterOptions,\n set: { database?: string; user?: string; password?: string },\n): AdapterOptions => {\n if (options.connectionString) {\n const url = new URL(options.connectionString);\n\n if ('database' in set) {\n url.pathname = `/${set.database}`;\n }\n\n if (set.user !== undefined) {\n url.username = set.user;\n }\n\n if (set.password !== undefined) {\n url.password = set.password;\n }\n\n return { ...options, connectionString: url.toString() };\n } else {\n return {\n ...options,\n ...set,\n };\n }\n};\n\nconst askAdminCredentials = async (): Promise<{\n user: string;\n password: string;\n}> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const prompt = new (Enquirer as any).Snippet({\n message: `What are postgres admin login and password?`,\n fields: [\n {\n name: 'user',\n required: true,\n },\n {\n name: 'password',\n },\n ],\n values: {\n user: 'postgres',\n password: '',\n },\n template: 'Admin user: {{user}}\\nAdmin password: {{password}}',\n });\n\n const { values } = await prompt.run();\n if (!values.password) values.password = '';\n\n return values;\n};\n\nexport const setAdminCredentialsToOptions = async (\n options: AdapterOptions,\n): Promise<AdapterOptions> => {\n const values = await askAdminCredentials();\n return setAdapterOptions(options, values);\n};\n\nexport const createSchemaMigrations = async (\n db: Adapter,\n config: MigrationConfig,\n) => {\n try {\n await db.query(\n `CREATE TABLE \"${config.migrationsTable}\" ( version TEXT NOT NULL )`,\n );\n console.log('Created versions table');\n } catch (err) {\n if ((err as Record<string, unknown>).code === '42P07') {\n console.log('Versions table exists');\n } else {\n throw err;\n }\n }\n};\n\nexport const getFirstWordAndRest = (\n input: string,\n): [string] | [string, string] => {\n const index = input.search(/(?=[A-Z])|[-_]/);\n if (index !== -1) {\n const restStart =\n input[index] === '-' || input[index] === '_' ? index + 1 : index;\n const rest = input.slice(restStart);\n return [input.slice(0, index), rest[0].toLowerCase() + rest.slice(1)];\n } else {\n return [input];\n }\n};\n\nconst getTextAfterRegExp = (\n input: string,\n regex: RegExp,\n length: number,\n): string | undefined => {\n let index = input.search(regex);\n if (index === -1) return;\n\n if (input[index] === '-' || input[index] === '_') index++;\n index += length;\n\n const start = input[index] == '-' || input[index] === '_' ? index + 1 : index;\n const text = input.slice(start);\n return text[0].toLowerCase() + text.slice(1);\n};\n\nexport const getTextAfterTo = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(To|-to|_to)[A-Z-_]/, 2);\n};\n\nexport const getTextAfterFrom = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(From|-from|_from)[A-Z-_]/, 4);\n};\n\nexport type MigrationFile = {\n path: string;\n version: string;\n};\n\nexport const getMigrationFiles = async (\n config: MigrationConfig,\n up: boolean,\n): Promise<MigrationFile[]> => {\n const { migrationsPath } = config;\n\n let files: string[];\n try {\n files = await readdir(migrationsPath);\n } catch (_) {\n return [];\n }\n\n const sort = up ? sortAsc : sortDesc;\n return sort(files).map((file) => {\n if (!file.endsWith('.ts')) {\n throw new Error(\n `Only .ts files are supported for migration, received: ${file}`,\n );\n }\n\n const timestampMatch = file.match(/^(\\d{14})\\D/);\n if (!timestampMatch) {\n throw new Error(\n `Migration file name should start with 14 digit version, received ${file}`,\n );\n }\n\n return {\n path: path.join(migrationsPath, file),\n version: timestampMatch[1],\n };\n });\n};\n\nexport const sortAsc = (arr: string[]) => arr.sort();\n\nexport const sortDesc = (arr: string[]) => arr.sort((a, b) => (a > b ? -1 : 1));\n\nexport const joinWords = (...words: string[]) => {\n return words\n .slice(1)\n .reduce(\n (acc, word) => acc + word[0].toUpperCase() + word.slice(1),\n words[0],\n );\n};\n\nexport const joinColumns = (columns: string[]) => {\n return columns.map((column) => `\"${column}\"`).join(', ');\n};\n","import { Adapter, AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport {\n getDatabaseAndUserFromOptions,\n setAdminCredentialsToOptions,\n setAdapterOptions,\n createSchemaMigrations,\n MigrationConfig,\n migrationConfigDefaults,\n} from '../common';\n\nconst execute = async (\n options: AdapterOptions,\n sql: string,\n): Promise<'ok' | 'already' | 'forbidden' | { error: unknown }> => {\n const db = new Adapter(options);\n try {\n await db.query(sql);\n return 'ok';\n } catch (error) {\n const err = error as Record<string, unknown>;\n if (err.code === '42P04' || err.code === '3D000') {\n return 'already';\n } else if (err.code === '42501') {\n return 'forbidden';\n } else {\n return { error };\n }\n } finally {\n await db.destroy();\n }\n};\n\nconst createOrDrop = async (\n options: AdapterOptions,\n adminOptions: AdapterOptions,\n config: MigrationConfig,\n args: {\n sql(params: { database: string; user: string }): string;\n successMessage(params: { database: string }): string;\n alreadyMessage(params: { database: string }): string;\n createVersionsTable?: boolean;\n },\n) => {\n const params = getDatabaseAndUserFromOptions(options);\n\n const result = await execute(\n setAdapterOptions(adminOptions, { database: 'postgres' }),\n args.sql(params),\n );\n if (result === 'ok') {\n console.log(args.successMessage(params));\n } else if (result === 'already') {\n console.log(args.alreadyMessage(params));\n } else if (result === 'forbidden') {\n await createOrDrop(\n options,\n await setAdminCredentialsToOptions(options),\n config,\n args,\n );\n return;\n } else {\n throw result.error;\n }\n\n if (!args.createVersionsTable) return;\n\n const db = new Adapter(options);\n await createSchemaMigrations(db, config);\n await db.destroy();\n};\n\nexport const createDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: MigrationConfig,\n) => {\n for (const options of toArray(arg)) {\n await createOrDrop(options, options, config, {\n sql({ database, user }) {\n return `CREATE DATABASE \"${database}\" OWNER \"${user}\"`;\n },\n successMessage({ database }) {\n return `Database ${database} successfully created`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} already exists`;\n },\n createVersionsTable: true,\n });\n }\n};\n\nexport const dropDb = async (arg: MaybeArray<AdapterOptions>) => {\n for (const options of toArray(arg)) {\n await createOrDrop(options, options, migrationConfigDefaults, {\n sql({ database }) {\n return `DROP DATABASE \"${database}\"`;\n },\n successMessage({ database }) {\n return `Database ${database} was successfully dropped`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} does not exist`;\n },\n });\n }\n};\n","import { Migration } from './migration';\n\nlet currentMigration: Migration | undefined;\nlet currentPromise: Promise<void> | undefined;\nlet currentUp = true;\n\nexport const change = (fn: (db: Migration, up: boolean) => Promise<void>) => {\n if (!currentMigration) throw new Error('Database instance is not set');\n currentPromise = fn(currentMigration, currentUp);\n};\n\nexport const setCurrentMigration = (db: Migration) => {\n currentMigration = db;\n};\n\nexport const setCurrentMigrationUp = (up: boolean) => {\n currentUp = up;\n};\n\nexport const getCurrentPromise = () => currentPromise;\n"],"names":["path","Enquirer","Adapter","toArray"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/common.ts","../src/commands/createOrDrop.ts","../src/commands/generate.ts","../src/migration/change.ts","../src/migration/migrationUtils.ts","../src/migration/createTable.ts","../src/migration/changeTable.ts","../src/migration/migration.ts","../src/commands/migrateOrRollback.ts","../src/rakeDb.ts"],"sourcesContent":["import { Adapter, AdapterOptions, QueryLogOptions } from 'pqb';\nimport Enquirer from 'enquirer';\nimport path from 'path';\nimport { readdir } from 'fs/promises';\n\nexport type MigrationConfig = {\n migrationsPath: string;\n migrationsTable: string;\n requireTs(path: string): void;\n} & QueryLogOptions;\n\nconst registered = false;\n\nexport const migrationConfigDefaults = {\n migrationsPath: path.resolve(process.cwd(), 'src', 'migrations'),\n migrationsTable: 'schemaMigrations',\n requireTs(path: string) {\n if (!registered) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('ts-node').register({ compilerOptions: { module: 'CommonJS' } });\n }\n require(path);\n },\n log: true,\n logger: console,\n};\n\nexport const getMigrationConfigWithDefaults = (\n config: Partial<MigrationConfig>,\n) => {\n return { ...migrationConfigDefaults, ...config };\n};\n\nexport const getDatabaseAndUserFromOptions = (\n options: AdapterOptions,\n): { database: string; user: string } => {\n if (options.connectionString) {\n const url = new URL(options.connectionString);\n return {\n database: url.pathname.slice(1),\n user: url.username,\n };\n } else {\n return {\n database: options.database as string,\n user: options.user as string,\n };\n }\n};\n\nexport const setAdapterOptions = (\n options: AdapterOptions,\n set: { database?: string; user?: string; password?: string },\n): AdapterOptions => {\n if (options.connectionString) {\n const url = new URL(options.connectionString);\n\n if ('database' in set) {\n url.pathname = `/${set.database}`;\n }\n\n if (set.user !== undefined) {\n url.username = set.user;\n }\n\n if (set.password !== undefined) {\n url.password = set.password;\n }\n\n return { ...options, connectionString: url.toString() };\n } else {\n return {\n ...options,\n ...set,\n };\n }\n};\n\nconst askAdminCredentials = async (): Promise<{\n user: string;\n password: string;\n}> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const prompt = new (Enquirer as any).Snippet({\n message: `What are postgres admin login and password?`,\n fields: [\n {\n name: 'user',\n required: true,\n },\n {\n name: 'password',\n },\n ],\n values: {\n user: 'postgres',\n password: '',\n },\n template: 'Admin user: {{user}}\\nAdmin password: {{password}}',\n });\n\n const { values } = await prompt.run();\n if (!values.password) values.password = '';\n\n return values;\n};\n\nexport const setAdminCredentialsToOptions = async (\n options: AdapterOptions,\n): Promise<AdapterOptions> => {\n const values = await askAdminCredentials();\n return setAdapterOptions(options, values);\n};\n\nexport const createSchemaMigrations = async (\n db: Adapter,\n config: MigrationConfig,\n) => {\n try {\n await db.query(\n `CREATE TABLE ${quoteTable(\n config.migrationsTable,\n )} ( version TEXT NOT NULL )`,\n );\n console.log('Created versions table');\n } catch (err) {\n if ((err as Record<string, unknown>).code === '42P07') {\n console.log('Versions table exists');\n } else {\n throw err;\n }\n }\n};\n\nexport const getFirstWordAndRest = (\n input: string,\n): [string] | [string, string] => {\n const index = input.search(/(?=[A-Z])|[-_]/);\n if (index !== -1) {\n const restStart =\n input[index] === '-' || input[index] === '_' ? index + 1 : index;\n const rest = input.slice(restStart);\n return [input.slice(0, index), rest[0].toLowerCase() + rest.slice(1)];\n } else {\n return [input];\n }\n};\n\nconst getTextAfterRegExp = (\n input: string,\n regex: RegExp,\n length: number,\n): string | undefined => {\n let index = input.search(regex);\n if (index === -1) return;\n\n if (input[index] === '-' || input[index] === '_') index++;\n index += length;\n\n const start = input[index] == '-' || input[index] === '_' ? index + 1 : index;\n const text = input.slice(start);\n return text[0].toLowerCase() + text.slice(1);\n};\n\nexport const getTextAfterTo = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(To|-to|_to)[A-Z-_]/, 2);\n};\n\nexport const getTextAfterFrom = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(From|-from|_from)[A-Z-_]/, 4);\n};\n\nexport type MigrationFile = {\n path: string;\n version: string;\n};\n\nexport const getMigrationFiles = async (\n config: MigrationConfig,\n up: boolean,\n): Promise<MigrationFile[]> => {\n const { migrationsPath } = config;\n\n let files: string[];\n try {\n files = await readdir(migrationsPath);\n } catch (_) {\n return [];\n }\n\n const sort = up ? sortAsc : sortDesc;\n return sort(files).map((file) => {\n if (!file.endsWith('.ts')) {\n throw new Error(\n `Only .ts files are supported for migration, received: ${file}`,\n );\n }\n\n const timestampMatch = file.match(/^(\\d{14})\\D/);\n if (!timestampMatch) {\n throw new Error(\n `Migration file name should start with 14 digit version, received ${file}`,\n );\n }\n\n return {\n path: path.join(migrationsPath, file),\n version: timestampMatch[1],\n };\n });\n};\n\nexport const sortAsc = (arr: string[]) => arr.sort();\n\nexport const sortDesc = (arr: string[]) => arr.sort((a, b) => (a > b ? -1 : 1));\n\nexport const joinWords = (...words: string[]) => {\n return words\n .slice(1)\n .reduce(\n (acc, word) => acc + word[0].toUpperCase() + word.slice(1),\n words[0],\n );\n};\n\nexport const joinColumns = (columns: string[]) => {\n return columns.map((column) => `\"${column}\"`).join(', ');\n};\n\nexport const quoteTable = (table: string) => {\n const index = table.indexOf('.');\n if (index !== -1) {\n return `\"${table.slice(0, index)}\".\"${table.slice(index + 1)}\"`;\n } else {\n return `\"${table}\"`;\n }\n};\n","import { Adapter, AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport {\n getDatabaseAndUserFromOptions,\n setAdminCredentialsToOptions,\n setAdapterOptions,\n createSchemaMigrations,\n MigrationConfig,\n migrationConfigDefaults,\n} from '../common';\n\nconst execute = async (\n options: AdapterOptions,\n sql: string,\n): Promise<'ok' | 'already' | 'forbidden' | { error: unknown }> => {\n const db = new Adapter(options);\n try {\n await db.query(sql);\n return 'ok';\n } catch (error) {\n const err = error as Record<string, unknown>;\n if (err.code === '42P04' || err.code === '3D000') {\n return 'already';\n } else if (err.code === '42501') {\n return 'forbidden';\n } else {\n return { error };\n }\n } finally {\n await db.destroy();\n }\n};\n\nconst createOrDrop = async (\n options: AdapterOptions,\n adminOptions: AdapterOptions,\n config: MigrationConfig,\n args: {\n sql(params: { database: string; user: string }): string;\n successMessage(params: { database: string }): string;\n alreadyMessage(params: { database: string }): string;\n createVersionsTable?: boolean;\n },\n) => {\n const params = getDatabaseAndUserFromOptions(options);\n\n const result = await execute(\n setAdapterOptions(adminOptions, { database: 'postgres' }),\n args.sql(params),\n );\n if (result === 'ok') {\n console.log(args.successMessage(params));\n } else if (result === 'already') {\n console.log(args.alreadyMessage(params));\n } else if (result === 'forbidden') {\n await createOrDrop(\n options,\n await setAdminCredentialsToOptions(options),\n config,\n args,\n );\n return;\n } else {\n throw result.error;\n }\n\n if (!args.createVersionsTable) return;\n\n const db = new Adapter(options);\n await createSchemaMigrations(db, config);\n await db.destroy();\n};\n\nexport const createDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: MigrationConfig,\n) => {\n for (const options of toArray(arg)) {\n await createOrDrop(options, options, config, {\n sql({ database, user }) {\n return `CREATE DATABASE \"${database}\" OWNER \"${user}\"`;\n },\n successMessage({ database }) {\n return `Database ${database} successfully created`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} already exists`;\n },\n createVersionsTable: true,\n });\n }\n};\n\nexport const dropDb = async (arg: MaybeArray<AdapterOptions>) => {\n for (const options of toArray(arg)) {\n await createOrDrop(options, options, migrationConfigDefaults, {\n sql({ database }) {\n return `DROP DATABASE \"${database}\"`;\n },\n successMessage({ database }) {\n return `Database ${database} was successfully dropped`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} does not exist`;\n },\n });\n }\n};\n","import {\n getFirstWordAndRest,\n getTextAfterFrom,\n getTextAfterTo,\n MigrationConfig,\n} from '../common';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\n\nexport const generate = async (config: MigrationConfig, args: string[]) => {\n const name = args[0];\n if (!name) throw new Error('Migration name is missing');\n\n await mkdir(config.migrationsPath, { recursive: true });\n\n const filePath = path.resolve(\n config.migrationsPath,\n `${makeFileTimeStamp()}_${name}.ts`,\n );\n await writeFile(filePath, makeContent(name, args.slice(1)));\n console.log(`Created ${filePath}`);\n};\n\nconst makeFileTimeStamp = () => {\n const now = new Date();\n return [\n now.getUTCFullYear(),\n now.getUTCMonth() + 1,\n now.getUTCDate(),\n now.getUTCHours(),\n now.getUTCMinutes(),\n now.getUTCSeconds(),\n ]\n .map((value) => (value < 10 ? `0${value}` : value))\n .join('');\n};\n\nconst makeContent = (name: string, args: string[]): string => {\n let content = `import { change } from 'rake-db';\\n\\nchange(async (db) => {`;\n\n const [first, rest] = getFirstWordAndRest(name);\n if (rest) {\n if (first === 'create' || first === 'drop') {\n content += `\\n await db.${\n first === 'create' ? 'createTable' : 'dropTable'\n }('${rest}', (t) => ({`;\n content += makeColumnsContent(args);\n content += '\\n }));';\n } else if (first === 'change') {\n content += `\\n await db.changeTable('${rest}', (t) => ({`;\n content += '\\n }));';\n } else if (first === 'add' || first === 'remove') {\n const table =\n first === 'add' ? getTextAfterTo(rest) : getTextAfterFrom(rest);\n content += `\\n await db.changeTable(${\n table ? `'${table}'` : 'tableName'\n }, (t) => ({`;\n content += makeColumnsContent(args, first);\n content += '\\n }));';\n }\n }\n\n return content + '\\n});\\n';\n};\n\nconst makeColumnsContent = (args: string[], method?: string) => {\n let content = '';\n const prepend = method ? `t.${method}(` : '';\n const append = method ? ')' : '';\n\n for (const arg of args) {\n const [name, def] = arg.split(':');\n if (!def) {\n throw new Error(\n `Column argument should be similar to name:type, name:type.method1.method2, name:type(arg).method(arg). Example: name:varchar(20).nullable. Received: ${arg}`,\n );\n }\n\n const methods = def\n .split('.')\n .map((method) => (method.endsWith(')') ? `.${method}` : `.${method}()`));\n content += `\\n ${name}: ${prepend}t${methods.join('')}${append},`;\n }\n return content;\n};\n","import { Migration } from './migration';\n\nlet currentMigration: Migration | undefined;\nlet currentPromise: Promise<void> | undefined;\nlet currentUp = true;\n\nexport const change = (fn: (db: Migration, up: boolean) => Promise<void>) => {\n if (!currentMigration) throw new Error('Database instance is not set');\n currentPromise = fn(currentMigration, currentUp);\n};\n\nexport const setCurrentMigration = (db: Migration) => {\n currentMigration = db;\n};\n\nexport const setCurrentMigrationUp = (up: boolean) => {\n currentUp = up;\n};\n\nexport const getCurrentPromise = () => currentPromise;\n","import {\n ColumnType,\n ForeignKeyModel,\n ForeignKeyOptions,\n getRaw,\n isRaw,\n quote,\n TableData,\n toArray,\n} from 'pqb';\nimport { ColumnComment, ColumnIndex, Migration } from './migration';\nimport { joinColumns, joinWords, quoteTable } from '../common';\n\nexport const columnToSql = (\n key: string,\n item: ColumnType,\n { values }: { values: unknown[] },\n) => {\n const line = [`\"${key}\" ${item.toSQL()}`];\n\n if (item.data.compression) {\n line.push(`COMPRESSION ${item.data.compression}`);\n }\n\n if (item.data.collate) {\n line.push(`COLLATE ${quote(item.data.collate)}`);\n }\n\n if (item.isPrimaryKey) {\n line.push('PRIMARY KEY');\n } else if (!item.isNullable) {\n line.push('NOT NULL');\n }\n\n if (item.data.default !== undefined) {\n if (\n typeof item.data.default === 'object' &&\n item.data.default &&\n isRaw(item.data.default)\n ) {\n line.push(`DEFAULT ${getRaw(item.data.default, values)}`);\n } else {\n line.push(`DEFAULT ${quote(item.data.default)}`);\n }\n }\n\n const { foreignKey } = item.data;\n if (foreignKey) {\n const table = getForeignKeyTable(\n 'fn' in foreignKey ? foreignKey.fn : foreignKey.table,\n );\n\n if (foreignKey.name) {\n line.push(`CONSTRAINT \"${foreignKey.name}\"`);\n }\n\n line.push(referencesToSql(table, foreignKey.columns, foreignKey));\n }\n\n return line.join(' ');\n};\n\nexport const addColumnIndex = (\n indexes: ColumnIndex[],\n key: string,\n item: ColumnType,\n) => {\n if (item.data) {\n if (item.data.index) {\n indexes.push({\n columns: [{ ...item.data.index, column: key }],\n options: item.data.index,\n });\n }\n }\n};\n\nexport const addColumnComment = (\n comments: ColumnComment[],\n key: string,\n item: ColumnType,\n) => {\n if (item.data.comment) {\n comments.push({ column: key, comment: item.data.comment });\n }\n};\n\nexport const getForeignKeyTable = (\n fnOrTable: (() => ForeignKeyModel) | string,\n) => {\n if (typeof fnOrTable === 'string') {\n return fnOrTable;\n }\n\n const klass = fnOrTable();\n return new klass().table;\n};\n\nexport const constraintToSql = (\n tableName: string,\n up: boolean,\n foreignKey: TableData['foreignKeys'][number],\n) => {\n const table = getForeignKeyTable(foreignKey.fnOrTable);\n const constraintName =\n foreignKey.options.name || joinWords(tableName, 'to', table);\n\n if (!up) {\n const { dropMode } = foreignKey.options;\n return `CONSTRAINT \"${constraintName}\"${dropMode ? ` ${dropMode}` : ''}`;\n }\n\n return `CONSTRAINT \"${constraintName}\" FOREIGN KEY (${joinColumns(\n foreignKey.columns,\n )}) ${referencesToSql(table, foreignKey.foreignColumns, foreignKey.options)}`;\n};\n\nexport const referencesToSql = (\n table: string,\n columns: string[],\n foreignKey: Pick<ForeignKeyOptions, 'match' | 'onDelete' | 'onUpdate'>,\n) => {\n const sql: string[] = [\n `REFERENCES ${quoteTable(table)}(${joinColumns(columns)})`,\n ];\n\n if (foreignKey.match) {\n sql.push(`MATCH ${foreignKey.match.toUpperCase()}`);\n }\n\n if (foreignKey.onDelete) {\n sql.push(`ON DELETE ${foreignKey.onDelete.toUpperCase()}`);\n }\n\n if (foreignKey.onUpdate) {\n sql.push(`ON UPDATE ${foreignKey.onUpdate.toUpperCase()}`);\n }\n\n return sql.join(' ');\n};\n\nexport const migrateIndexes = async (\n state: {\n migration: Migration;\n tableName: string;\n },\n indexes: ColumnIndex[],\n up: boolean,\n) => {\n for (const item of indexes) {\n await migrateIndex(state, up, item);\n }\n};\n\nexport const migrateIndex = (\n state: { migration: Migration; tableName: string },\n up: boolean,\n { columns, options }: ColumnIndex,\n) => {\n const indexName =\n options.name ||\n joinWords(state.tableName, ...columns.map(({ column }) => column), 'index');\n\n if (!up) {\n return state.migration.query(\n `DROP INDEX \"${indexName}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n );\n }\n\n const values: unknown[] = [];\n\n const sql: string[] = ['CREATE'];\n\n if (options.unique) {\n sql.push('UNIQUE');\n }\n\n sql.push(`INDEX \"${indexName}\" ON ${quoteTable(state.tableName)}`);\n\n if (options.using) {\n sql.push(`USING ${options.using}`);\n }\n\n const columnsSql: string[] = [];\n\n columns.forEach((column) => {\n const columnSql: string[] = [\n `\"${column.column}\"${column.expression ? `(${column.expression})` : ''}`,\n ];\n\n if (column.collate) {\n columnSql.push(`COLLATE '${column.collate}'`);\n }\n\n if (column.operator) {\n columnSql.push(column.operator);\n }\n\n if (column.order) {\n columnSql.push(column.order);\n }\n\n columnsSql.push(columnSql.join(' '));\n });\n\n sql.push(`(${columnsSql.join(', ')})`);\n\n if (options.include) {\n sql.push(\n `INCLUDE (${toArray(options.include)\n .map((column) => `\"${column}\"`)\n .join(', ')})`,\n );\n }\n\n if (options.with) {\n sql.push(`WITH (${options.with})`);\n }\n\n if (options.tablespace) {\n sql.push(`TABLESPACE ${options.tablespace}`);\n }\n\n if (options.where) {\n sql.push(\n `WHERE ${\n typeof options.where === 'object' &&\n options.where &&\n isRaw(options.where)\n ? getRaw(options.where, values)\n : options.where\n }`,\n );\n }\n\n return state.migration.query({ text: sql.join(' '), values });\n};\n\nexport const migrateComments = async (\n state: { migration: Migration; tableName: string },\n comments: ColumnComment[],\n) => {\n for (const { column, comment } of comments) {\n await state.migration.query(\n `COMMENT ON COLUMN ${quoteTable(state.tableName)}.\"${column}\" IS ${quote(\n comment,\n )}`,\n );\n }\n};\n\nexport const primaryKeyToSql = (\n primaryKey: Exclude<TableData['primaryKey'], undefined>,\n) => {\n const name = primaryKey.options?.name;\n return `${name ? `CONSTRAINT \"${name}\" ` : ''}PRIMARY KEY (${joinColumns(\n primaryKey.columns,\n )})`;\n};\n\nexport const getPrimaryKeysOfTable = async (\n db: Migration,\n tableName: string,\n): Promise<{ name: string; type: string }[]> => {\n const { rows } = await db.query<{ name: string; type: string }>(\n {\n text: `SELECT\n pg_attribute.attname AS name,\n format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type\nFROM pg_index, pg_class, pg_attribute, pg_namespace\nWHERE\n pg_class.oid = $1::regclass AND\n indrelid = pg_class.oid AND\n nspname = 'public' AND\n pg_class.relnamespace = pg_namespace.oid AND\n pg_attribute.attrelid = pg_class.oid AND\n pg_attribute.attnum = any(pg_index.indkey) AND\n indisprimary`,\n values: [tableName],\n },\n db.types,\n undefined,\n );\n\n return rows;\n};\n","import {\n ColumnType,\n columnTypes,\n getColumnTypes,\n getTableData,\n Operators,\n quote,\n} from 'pqb';\nimport {\n TableOptions,\n ColumnsShapeCallback,\n Migration,\n ColumnIndex,\n ColumnComment,\n JoinTableOptions,\n} from './migration';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n constraintToSql,\n getPrimaryKeysOfTable,\n migrateComments,\n migrateIndexes,\n primaryKeyToSql,\n} from './migrationUtils';\nimport { joinWords, quoteTable } from '../common';\nimport { singular } from 'pluralize';\n\nclass UnknownColumn extends ColumnType {\n operators = Operators.any;\n\n constructor(public dataType: string) {\n super();\n }\n}\n\nexport const createJoinTable = async (\n migration: Migration,\n up: boolean,\n tables: string[],\n options: JoinTableOptions,\n fn?: ColumnsShapeCallback,\n) => {\n const tableName = options.tableName || joinWords(...tables);\n\n if (!up) {\n return createTable(migration, up, tableName, options, () => ({}));\n }\n\n const tablesWithPrimaryKeys = await Promise.all(\n tables.map(async (table) => {\n const primaryKeys = await getPrimaryKeysOfTable(migration, table).then(\n (items) =>\n items.map((item) => ({\n ...item,\n joinedName: joinWords(singular(table), item.name),\n })),\n );\n\n if (!primaryKeys.length) {\n throw new Error(\n `Primary key for table ${quoteTable(table)} is not defined`,\n );\n }\n\n return [table, primaryKeys] as const;\n }),\n );\n\n return createTable(migration, up, tableName, options, (t) => {\n const result: Record<string, ColumnType> = {};\n\n tablesWithPrimaryKeys.forEach(([table, primaryKeys]) => {\n if (primaryKeys.length === 1) {\n const [{ type, joinedName, name }] = primaryKeys;\n\n const column = new UnknownColumn(type);\n\n result[joinedName] = column.foreignKey(table, name);\n\n return;\n }\n\n primaryKeys.forEach(({ joinedName, type }) => {\n result[joinedName] = new UnknownColumn(type);\n });\n\n t.foreignKey(\n primaryKeys.map((key) => key.joinedName) as [string, ...string[]],\n table,\n primaryKeys.map((key) => key.name) as [string, ...string[]],\n );\n });\n\n if (fn) {\n Object.assign(result, fn(t));\n }\n\n t.primaryKey(\n tablesWithPrimaryKeys.flatMap(([, primaryKeys]) =>\n primaryKeys.map((item) => item.joinedName),\n ),\n );\n\n return result;\n });\n};\n\nexport const createTable = async (\n migration: Migration,\n up: boolean,\n tableName: string,\n options: TableOptions,\n fn: ColumnsShapeCallback,\n) => {\n const shape = getColumnTypes(columnTypes, fn);\n\n if (!up) {\n const { dropMode } = options;\n await migration.query(\n `DROP TABLE ${quoteTable(tableName)}${dropMode ? ` ${dropMode}` : ''}`,\n );\n return;\n }\n\n const lines: string[] = [];\n\n const state: {\n migration: Migration;\n tableName: string;\n values: unknown[];\n indexes: ColumnIndex[];\n comments: ColumnComment[];\n } = {\n migration,\n tableName,\n values: [],\n indexes: [],\n comments: [],\n };\n\n for (const key in shape) {\n const item = shape[key];\n addColumnIndex(state.indexes, key, item);\n addColumnComment(state.comments, key, item);\n lines.push(`\\n ${columnToSql(key, item, state)}`);\n }\n\n const tableData = getTableData();\n if (tableData.primaryKey) {\n lines.push(`\\n ${primaryKeyToSql(tableData.primaryKey)}`);\n }\n\n tableData.foreignKeys.forEach((foreignKey) => {\n lines.push(`\\n ${constraintToSql(state.tableName, up, foreignKey)}`);\n });\n\n await migration.query({\n text: `CREATE TABLE ${quoteTable(tableName)} (${lines.join(',')}\\n)`,\n values: state.values,\n });\n\n state.indexes.push(...tableData.indexes);\n\n await migrateIndexes(state, state.indexes, up);\n await migrateComments(state, state.comments);\n\n if (options.comment) {\n await migration.query(\n `COMMENT ON TABLE ${quoteTable(tableName)} IS ${quote(options.comment)}`,\n );\n }\n};\n","import {\n ColumnTypes,\n ColumnType,\n columnTypes,\n resetTableData,\n quote,\n getTableData,\n EmptyObject,\n emptyObject,\n TableData,\n RawExpression,\n getRaw,\n isRaw,\n} from 'pqb';\nimport {\n ChangeTableCallback,\n ChangeTableOptions,\n ColumnComment,\n ColumnIndex,\n DropMode,\n Migration,\n} from './migration';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n constraintToSql,\n migrateComments,\n migrateIndexes,\n primaryKeyToSql,\n} from './migrationUtils';\nimport { quoteTable } from '../common';\n\nconst newChangeTableData = () => ({\n add: [],\n drop: [],\n});\n\nlet changeTableData: { add: TableData[]; drop: TableData[] } =\n newChangeTableData();\n\nconst resetChangeTableData = () => {\n changeTableData = newChangeTableData();\n};\n\nfunction add(item: ColumnType, options?: { dropMode?: DropMode }): ChangeItem;\nfunction add(emptyObject: EmptyObject): EmptyObject;\nfunction add(\n items: Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): Record<string, ChangeItem>;\nfunction add(\n item: ColumnType | EmptyObject | Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): ChangeItem | EmptyObject | Record<string, ChangeItem> {\n if (item instanceof ColumnType) {\n return ['add', item, options];\n } else if (item === emptyObject) {\n changeTableData.add.push(getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, ChangeItem> = {};\n for (const key in item) {\n result[key] = ['add', (item as Record<string, ColumnType>)[key], options];\n }\n return result;\n }\n}\n\nconst drop = ((item, options) => {\n if (item instanceof ColumnType) {\n return ['drop', item, options];\n } else if (item === emptyObject) {\n changeTableData.drop.push(getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, ChangeItem> = {};\n for (const key in item) {\n result[key] = [\n 'drop',\n (item as Record<string, ColumnType>)[key],\n options,\n ];\n }\n return result;\n }\n}) as typeof add;\n\ntype ChangeOptions = {\n usingUp?: RawExpression;\n usingDown?: RawExpression;\n};\n\ntype ChangeArg =\n | ColumnType\n | ['default', unknown | RawExpression]\n | ['nullable', boolean]\n | ['comment', string | null];\n\ntype TableChangeMethods = typeof tableChangeMethods;\nconst tableChangeMethods = {\n add,\n drop,\n change(from: ChangeArg, to: ChangeArg, options?: ChangeOptions): ChangeItem {\n return ['change', from, to, options];\n },\n default(value: unknown | RawExpression): ChangeArg {\n return ['default', value];\n },\n nullable(): ChangeArg {\n return ['nullable', true];\n },\n nonNullable(): ChangeArg {\n return ['nullable', false];\n },\n comment(name: string | null): ChangeArg {\n return ['comment', name];\n },\n rename(name: string): ChangeItem {\n return ['rename', name];\n },\n};\n\nexport type ChangeItem =\n | [\n action: 'add' | 'drop',\n item: ColumnType,\n options?: { dropMode?: DropMode },\n ]\n | [action: 'change', from: ChangeArg, to: ChangeArg, options?: ChangeOptions]\n | ['rename', string];\n\nexport type TableChanger = ColumnTypes & TableChangeMethods;\n\nexport type TableChangeData = Record<string, ChangeItem | EmptyObject>;\n\ntype ChangeTableState = {\n migration: Migration;\n up: boolean;\n tableName: string;\n alterTable: string[];\n values: unknown[];\n indexes: ColumnIndex[];\n dropIndexes: ColumnIndex[];\n comments: ColumnComment[];\n};\n\nexport const changeTable = async (\n migration: Migration,\n up: boolean,\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback,\n) => {\n resetTableData();\n resetChangeTableData();\n\n const tableChanger = Object.create(columnTypes) as TableChanger;\n Object.assign(tableChanger, tableChangeMethods);\n\n const changeData = fn?.(tableChanger) || {};\n\n const state: ChangeTableState = {\n migration,\n up,\n tableName,\n alterTable: [],\n values: [],\n indexes: [],\n dropIndexes: [],\n comments: [],\n };\n\n if (options.comment !== undefined) {\n await changeActions.tableComment(state, tableName, options.comment);\n }\n\n for (const key in changeData) {\n const result = changeData[key];\n if (Array.isArray(result)) {\n const [action] = result;\n if (action === 'change') {\n const [, from, to, options] = result;\n changeActions.change(state, up, key, from, to, options);\n } else if (action === 'rename') {\n const [, name] = result;\n changeActions.rename(state, up, key, name);\n } else {\n const [action, item, options] = result;\n changeActions[action](state, up, key, item, options);\n }\n }\n }\n\n changeTableData.add.forEach((tableData) => {\n handleTableData(state, up, tableName, tableData);\n });\n\n changeTableData.drop.forEach((tableData) => {\n handleTableData(state, !up, tableName, tableData);\n });\n\n if (state.alterTable.length) {\n await migration.query(\n `ALTER TABLE ${quoteTable(tableName)}` +\n `\\n ${state.alterTable.join(',\\n ')}`,\n );\n }\n\n const createIndexes = up ? state.indexes : state.dropIndexes;\n const dropIndexes = up ? state.dropIndexes : state.indexes;\n await migrateIndexes(state, createIndexes, up);\n await migrateIndexes(state, dropIndexes, !up);\n await migrateComments(state, state.comments);\n};\n\nconst changeActions = {\n tableComment(\n { migration, up }: ChangeTableState,\n tableName: string,\n comment: Exclude<ChangeTableOptions['comment'], undefined>,\n ) {\n let value;\n if (up) {\n value = Array.isArray(comment) ? comment[1] : comment;\n } else {\n value = Array.isArray(comment) ? comment[0] : null;\n }\n return migration.query(\n `COMMENT ON TABLE ${quoteTable(tableName)} IS ${quote(value)}`,\n );\n },\n\n add(\n state: ChangeTableState,\n up: boolean,\n key: string,\n item: ColumnType,\n options?: { dropMode?: DropMode },\n ) {\n addColumnIndex(state[up ? 'indexes' : 'dropIndexes'], key, item);\n\n if (up) {\n addColumnComment(state.comments, key, item);\n }\n\n if (up) {\n state.alterTable.push(`ADD COLUMN ${columnToSql(key, item, state)}`);\n } else {\n state.alterTable.push(\n `DROP COLUMN \"${key}\"${\n options?.dropMode ? ` ${options.dropMode}` : ''\n }`,\n );\n }\n },\n\n drop(\n state: ChangeTableState,\n up: boolean,\n key: string,\n item: ColumnType,\n options?: { dropMode?: DropMode },\n ) {\n this.add(state, !up, key, item, options);\n },\n\n change(\n state: ChangeTableState,\n up: boolean,\n key: string,\n first: ChangeArg,\n second: ChangeArg,\n options?: ChangeOptions,\n ) {\n const [fromItem, toItem] = up ? [first, second] : [second, first];\n\n const from = getChangeProperties(fromItem);\n const to = getChangeProperties(toItem);\n\n if (from.type !== to.type || from.collate !== to.collate) {\n const using = up ? options?.usingUp : options?.usingDown;\n state.alterTable.push(\n `ALTER COLUMN \"${key}\" TYPE ${to.type}${\n to.collate ? ` COLLATE ${quote(to.collate)}` : ''\n }${using ? ` USING ${getRaw(using, state.values)}` : ''}`,\n );\n }\n\n if (from.default !== to.default) {\n const value = getRawOrValue(to.default, state.values);\n const expr =\n value === undefined ? `DROP DEFAULT` : `SET DEFAULT ${value}`;\n state.alterTable.push(`ALTER COLUMN \"${key}\" ${expr}`);\n }\n\n if (from.nullable !== to.nullable) {\n state.alterTable.push(\n `ALTER COLUMN \"${key}\" ${to.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n if (from.comment !== to.comment) {\n state.comments.push({ column: key, comment: to.comment || null });\n }\n },\n\n rename(state: ChangeTableState, up: boolean, key: string, name: string) {\n const [from, to] = up ? [key, name] : [name, key];\n state.alterTable.push(`RENAME COLUMN \"${from}\" TO \"${to}\"`);\n },\n};\n\nconst getChangeProperties = (\n item: ChangeArg,\n): {\n type?: string;\n collate?: string;\n default?: unknown | RawExpression;\n nullable?: boolean;\n comment?: string | null;\n} => {\n if (item instanceof ColumnType) {\n return {\n type: item.toSQL(),\n collate: item.data.collate,\n default: item.data.default,\n nullable: item.isNullable,\n comment: item.data.comment,\n };\n } else {\n return {\n type: undefined,\n collate: undefined,\n default: item[0] === 'default' ? item[1] : undefined,\n nullable: item[0] === 'nullable' ? item[1] : undefined,\n comment: item[0] === 'comment' ? item[1] : undefined,\n };\n }\n};\n\nconst handleTableData = (\n state: ChangeTableState,\n up: boolean,\n tableName: string,\n tableData: TableData,\n) => {\n if (tableData.primaryKey) {\n if (up) {\n state.alterTable.push(`ADD ${primaryKeyToSql(tableData.primaryKey)}`);\n } else {\n const name = tableData.primaryKey.options?.name || `${tableName}_pkey`;\n state.alterTable.push(`DROP CONSTRAINT \"${name}\"`);\n }\n }\n\n if (tableData.indexes.length) {\n state[up ? 'indexes' : 'dropIndexes'].push(...tableData.indexes);\n }\n\n if (tableData.foreignKeys.length) {\n tableData.foreignKeys.forEach((foreignKey) => {\n const action = up ? 'ADD' : 'DROP';\n state.alterTable.push(\n `\\n ${action} ${constraintToSql(state.tableName, up, foreignKey)}`,\n );\n });\n }\n};\n\nconst getRawOrValue = (item: unknown | RawExpression, values: unknown[]) => {\n return typeof item === 'object' && item && isRaw(item)\n ? getRaw(item, values)\n : quote(item);\n};\n","import {\n ColumnsShape,\n ColumnType,\n ColumnTypes,\n ForeignKeyOptions,\n IndexColumnOptions,\n IndexOptions,\n logParamToLogObject,\n MaybeArray,\n QueryArraysResult,\n QueryInput,\n QueryLogObject,\n QueryLogOptions,\n QueryResult,\n QueryResultRow,\n Sql,\n TransactionAdapter,\n TypeParsers,\n} from 'pqb';\nimport { createJoinTable, createTable } from './createTable';\nimport { changeTable, TableChangeData, TableChanger } from './changeTable';\nimport { quoteTable } from '../common';\n\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\nexport type TableOptions = { dropMode?: DropMode; comment?: string };\nexport type ColumnsShapeCallback = (t: ColumnTypes) => ColumnsShape;\n\nexport type ChangeTableOptions = { comment?: string | [string, string] | null };\nexport type ChangeTableCallback = (t: TableChanger) => TableChangeData;\n\nexport type ColumnIndex = {\n columns: IndexColumnOptions[];\n options: IndexOptions;\n};\nexport type ColumnComment = { column: string; comment: string | null };\n\nexport type JoinTableOptions = {\n tableName?: string;\n comment?: string;\n dropMode?: DropMode;\n};\n\nexport type ExtensionOptions = {\n schema?: string;\n version?: string;\n cascade?: boolean;\n};\n\nexport class Migration extends TransactionAdapter {\n public log?: QueryLogObject;\n\n constructor(\n tx: TransactionAdapter,\n public up: boolean,\n options: QueryLogOptions,\n ) {\n super(tx.pool, tx.client, tx.types);\n this.log = logParamToLogObject(options.logger || console, options.log);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async query<T extends QueryResultRow = any>(\n query: QueryInput,\n types: TypeParsers = this.types,\n log = this.log,\n ): Promise<QueryResult<T>> {\n return wrapWithLog(log, query, () => super.query(query, types));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n query: QueryInput,\n types: TypeParsers = this.types,\n log = this.log,\n ): Promise<QueryArraysResult<R>> {\n return wrapWithLog(log, query, () => super.arrays(query, types));\n }\n\n createTable(\n tableName: string,\n options: TableOptions,\n fn: ColumnsShapeCallback,\n ): Promise<void>;\n createTable(tableName: string, fn: ColumnsShapeCallback): Promise<void>;\n createTable(\n tableName: string,\n cbOrOptions: ColumnsShapeCallback | TableOptions,\n cb?: ColumnsShapeCallback,\n ): Promise<void> {\n const options = typeof cbOrOptions === 'function' ? {} : cbOrOptions;\n const fn = (cb || cbOrOptions) as ColumnsShapeCallback;\n\n return createTable(this, this.up, tableName, options, fn);\n }\n\n dropTable(\n tableName: string,\n options: TableOptions,\n fn: ColumnsShapeCallback,\n ): Promise<void>;\n dropTable(tableName: string, fn: ColumnsShapeCallback): Promise<void>;\n dropTable(\n tableName: string,\n cbOrOptions: ColumnsShapeCallback | TableOptions,\n cb?: ColumnsShapeCallback,\n ) {\n const options = typeof cbOrOptions === 'function' ? {} : cbOrOptions;\n const fn = (cb || cbOrOptions) as ColumnsShapeCallback;\n\n return createTable(this, !this.up, tableName, options, fn);\n }\n\n createJoinTable(\n tables: string[],\n options?: JoinTableOptions,\n fn?: ColumnsShapeCallback,\n ): Promise<void>;\n createJoinTable(tables: string[], fn?: ColumnsShapeCallback): Promise<void>;\n async createJoinTable(\n tables: string[],\n cbOrOptions?: ColumnsShapeCallback | JoinTableOptions,\n cb?: ColumnsShapeCallback,\n ): Promise<void> {\n const options = typeof cbOrOptions === 'function' ? {} : cbOrOptions || {};\n const fn = (cb || cbOrOptions) as ColumnsShapeCallback | undefined;\n\n return createJoinTable(this, this.up, tables, options, fn);\n }\n\n dropJoinTable(\n tables: string[],\n options?: JoinTableOptions,\n fn?: ColumnsShapeCallback,\n ): Promise<void>;\n dropJoinTable(tables: string[], fn?: ColumnsShapeCallback): Promise<void>;\n async dropJoinTable(\n tables: string[],\n cbOrOptions?: ColumnsShapeCallback | JoinTableOptions,\n cb?: ColumnsShapeCallback,\n ): Promise<void> {\n const options = typeof cbOrOptions === 'function' ? {} : cbOrOptions || {};\n const fn = (cb || cbOrOptions) as ColumnsShapeCallback | undefined;\n\n return createJoinTable(this, !this.up, tables, options, fn);\n }\n\n changeTable(\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback,\n ): Promise<void>;\n changeTable(tableName: string, fn: ChangeTableCallback): Promise<void>;\n changeTable(\n tableName: string,\n cbOrOptions: ChangeTableCallback | ChangeTableOptions,\n cb?: ChangeTableCallback,\n ) {\n const [fn, options] =\n typeof cbOrOptions === 'function' ? [cbOrOptions, {}] : [cb, cbOrOptions];\n\n return changeTable(this, this.up, tableName, options, fn);\n }\n\n async renameTable(from: string, to: string): Promise<void> {\n const [table, newName] = this.up ? [from, to] : [to, from];\n await this.query(`ALTER TABLE ${quoteTable(table)} RENAME TO \"${newName}\"`);\n }\n\n addColumn(\n tableName: string,\n columnName: string,\n fn: (t: ColumnTypes) => ColumnType,\n ) {\n return addColumn(this, this.up, tableName, columnName, fn);\n }\n\n dropColumn(\n tableName: string,\n columnName: string,\n fn: (t: ColumnTypes) => ColumnType,\n ) {\n return addColumn(this, !this.up, tableName, columnName, fn);\n }\n\n addIndex(\n tableName: string,\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ) {\n return addIndex(this, this.up, tableName, columns, options);\n }\n\n dropIndex(\n tableName: string,\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n ) {\n return addIndex(this, !this.up, tableName, columns, options);\n }\n\n addForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: ForeignKeyOptions,\n ) {\n return addForeignKey(\n this,\n this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n dropForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: ForeignKeyOptions,\n ) {\n return addForeignKey(\n this,\n !this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n addPrimaryKey(\n tableName: string,\n columns: string[],\n options?: { name?: string },\n ) {\n return addPrimaryKey(this, this.up, tableName, columns, options);\n }\n\n dropPrimaryKey(\n tableName: string,\n columns: string[],\n options?: { name?: string },\n ) {\n return addPrimaryKey(this, !this.up, tableName, columns, options);\n }\n\n renameColumn(tableName: string, from: string, to: string) {\n return this.changeTable(tableName, (t) => ({\n [from]: t.rename(to),\n }));\n }\n\n createSchema(schemaName: string) {\n return createSchema(this, this.up, schemaName);\n }\n\n dropSchema(schemaName: string) {\n return createSchema(this, !this.up, schemaName);\n }\n\n createExtension(\n name: string,\n options: ExtensionOptions & { ifNotExists?: boolean } = {},\n ) {\n return createExtension(this, this.up, name, {\n ...options,\n checkExists: options.ifNotExists,\n });\n }\n\n dropExtension(\n name: string,\n options: { ifExists?: boolean; cascade?: boolean } = {},\n ) {\n return createExtension(this, !this.up, name, {\n ...options,\n checkExists: options.ifExists,\n });\n }\n\n async tableExists(tableName: string) {\n return queryExists(this, {\n text: `SELECT 1 FROM \"information_schema\".\"tables\" WHERE \"table_name\" = $1`,\n values: [tableName],\n });\n }\n\n async columnExists(tableName: string, columnName: string): Promise<boolean> {\n return queryExists(this, {\n text: `SELECT 1 FROM \"information_schema\".\"columns\" WHERE \"table_name\" = $1 AND \"column_name\" = $2`,\n values: [tableName, columnName],\n });\n }\n\n async constraintExists(constraintName: string): Promise<boolean> {\n return queryExists(this, {\n text: `SELECT 1 FROM \"information_schema\".\"table_constraints\" WHERE \"constraint_name\" = $1`,\n values: [constraintName],\n });\n }\n}\n\nconst wrapWithLog = async <Result>(\n log: QueryLogObject | undefined,\n query: QueryInput,\n fn: () => Promise<Result>,\n): Promise<Result> => {\n if (!log) {\n return fn();\n } else {\n const sql = (\n typeof query === 'string'\n ? { text: query, values: [] }\n : query.values\n ? query\n : { ...query, values: [] }\n ) as Sql;\n\n const logData = log.beforeQuery(sql);\n\n try {\n const result = await fn();\n log.afterQuery(sql, logData);\n return result;\n } catch (err) {\n log.onError(err as Error, sql, logData);\n throw err;\n }\n }\n};\n\nconst addColumn = (\n migration: Migration,\n up: boolean,\n tableName: string,\n columnName: string,\n fn: (t: ColumnTypes) => ColumnType,\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n [columnName]: t.add(fn(t)),\n }));\n};\n\nconst addIndex = (\n migration: Migration,\n up: boolean,\n tableName: string,\n columns: MaybeArray<string | IndexColumnOptions>,\n options?: IndexOptions,\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.index(columns, options)),\n }));\n};\n\nconst addForeignKey = (\n migration: Migration,\n up: boolean,\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: ForeignKeyOptions,\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.foreignKey(columns, foreignTable, foreignColumns, options)),\n }));\n};\n\nconst addPrimaryKey = (\n migration: Migration,\n up: boolean,\n tableName: string,\n columns: string[],\n options?: { name?: string },\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.primaryKey(columns, options)),\n }));\n};\n\nconst createSchema = (\n migration: Migration,\n up: boolean,\n schemaName: string,\n) => {\n if (up) {\n return migration.query(`CREATE SCHEMA \"${schemaName}\"`);\n } else {\n return migration.query(`DROP SCHEMA \"${schemaName}\"`);\n }\n};\n\nconst createExtension = (\n migration: Migration,\n up: boolean,\n name: string,\n options: ExtensionOptions & {\n checkExists?: boolean;\n },\n) => {\n if (!up) {\n return migration.query(\n `DROP EXTENSION${options.checkExists ? ' IF EXISTS' : ''} \"${name}\"${\n options.cascade ? ' CASCADE' : ''\n }`,\n );\n }\n\n return migration.query(\n `CREATE EXTENSION${options.checkExists ? ' IF NOT EXISTS' : ''} \"${name}\"${\n options.schema ? ` SCHEMA \"${options.schema}\"` : ''\n }${options.version ? ` VERSION '${options.version}'` : ''}${\n options.cascade ? ' CASCADE' : ''\n }`,\n );\n};\n\nconst queryExists = (\n db: Migration,\n sql: { text: string; values: unknown[] },\n) => {\n return db.query(sql).then(({ rowCount }) => rowCount > 0);\n};\n","import { Adapter, AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport {\n createSchemaMigrations,\n getMigrationFiles,\n MigrationConfig,\n MigrationFile,\n quoteTable,\n} from '../common';\nimport {\n getCurrentPromise,\n setCurrentMigrationUp,\n setCurrentMigration,\n} from '../migration/change';\nimport { Migration } from '../migration/migration';\n\nconst migrateOrRollback = async (\n options: MaybeArray<AdapterOptions>,\n config: MigrationConfig,\n args: string[],\n up: boolean,\n) => {\n const files = await getMigrationFiles(config, up);\n\n const argCount = parseInt(args[0]);\n let count = isNaN(argCount) ? (up ? Infinity : 1) : argCount;\n\n for (const opts of toArray(options)) {\n const db = new Adapter(opts);\n const migratedVersions = await getMigratedVersionsMap(db, config);\n try {\n for (const file of files) {\n if (\n (up && migratedVersions[file.version]) ||\n (!up && !migratedVersions[file.version])\n ) {\n continue;\n }\n\n if (count-- <= 0) break;\n\n await processMigration(db, up, file, config);\n config.logger?.log(`${file.path} ${up ? 'migrated' : 'rolled back'}`);\n }\n } finally {\n await db.destroy();\n }\n }\n};\n\nconst processMigration = async (\n db: Adapter,\n up: boolean,\n file: MigrationFile,\n config: MigrationConfig,\n) => {\n await db.transaction(async (tx) => {\n const db = new Migration(tx, up, config);\n setCurrentMigration(db);\n setCurrentMigrationUp(up);\n config.requireTs(file.path);\n await getCurrentPromise();\n await (up ? saveMigratedVersion : removeMigratedVersion)(\n db,\n file.version,\n config,\n );\n });\n};\n\nconst saveMigratedVersion = async (\n db: Adapter,\n version: string,\n config: MigrationConfig,\n) => {\n await db.query(\n `INSERT INTO ${quoteTable(config.migrationsTable)} VALUES ('${version}')`,\n );\n};\n\nconst removeMigratedVersion = async (\n db: Adapter,\n version: string,\n config: MigrationConfig,\n) => {\n await db.query(\n `DELETE FROM ${quoteTable(\n config.migrationsTable,\n )} WHERE version = '${version}'`,\n );\n};\n\nconst getMigratedVersionsMap = async (\n db: Adapter,\n config: MigrationConfig,\n): Promise<Record<string, boolean>> => {\n try {\n const result = await db.arrays<[string]>(\n `SELECT * FROM ${quoteTable(config.migrationsTable)}`,\n );\n return Object.fromEntries(result.rows.map((row) => [row[0], true]));\n } catch (err) {\n if ((err as Record<string, unknown>).code === '42P01') {\n await createSchemaMigrations(db, config);\n return {};\n }\n throw err;\n }\n};\n\nexport const migrate = (\n options: MaybeArray<AdapterOptions>,\n config: MigrationConfig,\n args: string[],\n) => migrateOrRollback(options, config, args, true);\n\nexport const rollback = (\n options: MaybeArray<AdapterOptions>,\n config: MigrationConfig,\n args: string[],\n) => migrateOrRollback(options, config, args, false);\n","import { AdapterOptions, MaybeArray } from 'pqb';\nimport { createDb, dropDb } from './commands/createOrDrop';\nimport { migrate, rollback } from './commands/migrateOrRollback';\nimport { getMigrationConfigWithDefaults, MigrationConfig } from './common';\nimport { generate } from './commands/generate';\n\nexport const rakeDb = async (\n options: MaybeArray<AdapterOptions>,\n partialConfig: Partial<MigrationConfig> = {},\n args: string[] = process.argv.slice(2),\n) => {\n const config = getMigrationConfigWithDefaults(partialConfig);\n\n const command = args[0].split(':')[0];\n\n if (command === 'create') {\n await createDb(options, config);\n } else if (command === 'drop') {\n await dropDb(options);\n } else if (command === 'migrate') {\n await migrate(options, config, args.slice(1));\n } else if (command === 'rollback') {\n await rollback(options, config, args.slice(1));\n } else if (command === 'g' || command === 'generate') {\n await generate(config, args.slice(1));\n } else {\n console.log(`Usage: rake-db [command] [arguments]`);\n }\n};\n"],"names":["path","__spreadValues","__spreadProps","Enquirer","readdir","Adapter","toArray","mkdir","writeFile","method","quote","isRaw","getRaw","ColumnType","Operators","singular","getColumnTypes","columnTypes","getTableData","emptyObject","resetTableData","options","action","TransactionAdapter","logParamToLogObject","db"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createTable('user', (t) => ({
5
+ id: t.serial().primaryKey(),
6
+ name: t.text(),
7
+ password: t.text(),
8
+ picture: t.text().nullable(),
9
+ data: t.json((t) => t.any()).nullable(),
10
+ age: t.integer().nullable(),
11
+ active: t.boolean().nullable(),
12
+ ...t.timestamps(),
13
+ }));
14
+ });
@@ -0,0 +1,10 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createTable('profile', (t) => ({
5
+ id: t.serial().primaryKey(),
6
+ userId: t.integer().foreignKey('user', 'id').nullable(),
7
+ bio: t.text().nullable(),
8
+ ...t.timestamps(),
9
+ }));
10
+ });
@@ -0,0 +1,9 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createTable('chat', (t) => ({
5
+ id: t.serial().primaryKey(),
6
+ title: t.text(),
7
+ ...t.timestamps(),
8
+ }));
9
+ });
@@ -0,0 +1,7 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createJoinTable(['chat', 'user'], (t) => ({
5
+ ...t.timestamps(),
6
+ }));
7
+ });
@@ -0,0 +1,12 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createTable('message', (t) => ({
5
+ id: t.serial().primaryKey(),
6
+ chatId: t.integer().foreignKey('chat', 'id').index(),
7
+ authorId: t.integer().foreignKey('user', 'id').nullable().index(),
8
+ text: t.text(),
9
+ meta: t.json((t) => t.any()).nullable(),
10
+ ...t.timestamps(),
11
+ }));
12
+ });
@@ -0,0 +1,5 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createSchema('geo');
5
+ });
@@ -1,8 +1,8 @@
1
1
  import { change } from '../src';
2
2
 
3
3
  change(async (db) => {
4
- await db.createTable('first', (t) => ({
5
- id: t.integer().primaryKey(),
4
+ await db.createTable('geo.country', (t) => ({
5
+ id: t.serial().primaryKey(),
6
6
  name: t.text(),
7
7
  }));
8
8
  });
@@ -0,0 +1,9 @@
1
+ import { change } from '../src';
2
+
3
+ change(async (db) => {
4
+ await db.createTable('geo.city', (t) => ({
5
+ id: t.serial().primaryKey(),
6
+ name: t.text(),
7
+ countryId: t.integer().foreignKey('geo.country', 'id'),
8
+ }));
9
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rake-db",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Migrations tools for Postgresql DB",
5
5
  "repository": {
6
6
  "type": "git",
@@ -43,7 +43,7 @@ describe('generate', () => {
43
43
  `import { change } from 'rake-db';
44
44
 
45
45
  change(async (db) => {
46
- db.createTable('table', (t) => ({
46
+ await db.createTable('table', (t) => ({
47
47
  id: t.integer().primaryKey(),
48
48
  name: t.varchar(20).nullable(),
49
49
  }));
@@ -58,7 +58,7 @@ change(async (db) => {
58
58
  `import { change } from 'rake-db';
59
59
 
60
60
  change(async (db) => {
61
- db.changeTable('table', (t) => ({
61
+ await db.changeTable('table', (t) => ({
62
62
  }));
63
63
  });
64
64
  `,
@@ -71,7 +71,7 @@ change(async (db) => {
71
71
  `import { change } from 'rake-db';
72
72
 
73
73
  change(async (db) => {
74
- db.changeTable(tableName, (t) => ({
74
+ await db.changeTable(tableName, (t) => ({
75
75
  }));
76
76
  });
77
77
  `,
@@ -88,7 +88,7 @@ change(async (db) => {
88
88
  `import { change } from 'rake-db';
89
89
 
90
90
  change(async (db) => {
91
- db.changeTable('table', (t) => ({
91
+ await db.changeTable('table', (t) => ({
92
92
  id: t.add(t.integer().primaryKey()),
93
93
  name: t.add(t.varchar(20).nullable()),
94
94
  }));
@@ -107,7 +107,7 @@ change(async (db) => {
107
107
  `import { change } from 'rake-db';
108
108
 
109
109
  change(async (db) => {
110
- db.changeTable('table', (t) => ({
110
+ await db.changeTable('table', (t) => ({
111
111
  id: t.remove(t.integer().primaryKey()),
112
112
  name: t.remove(t.varchar(20).nullable()),
113
113
  }));
@@ -122,7 +122,7 @@ change(async (db) => {
122
122
  `import { change } from 'rake-db';
123
123
 
124
124
  change(async (db) => {
125
- db.dropTable('table', (t) => ({
125
+ await db.dropTable('table', (t) => ({
126
126
  id: t.integer().primaryKey(),
127
127
  name: t.varchar(20).nullable(),
128
128
  }));
@@ -41,18 +41,18 @@ const makeContent = (name: string, args: string[]): string => {
41
41
  const [first, rest] = getFirstWordAndRest(name);
42
42
  if (rest) {
43
43
  if (first === 'create' || first === 'drop') {
44
- content += `\n db.${
44
+ content += `\n await db.${
45
45
  first === 'create' ? 'createTable' : 'dropTable'
46
46
  }('${rest}', (t) => ({`;
47
47
  content += makeColumnsContent(args);
48
48
  content += '\n }));';
49
49
  } else if (first === 'change') {
50
- content += `\n db.changeTable('${rest}', (t) => ({`;
50
+ content += `\n await db.changeTable('${rest}', (t) => ({`;
51
51
  content += '\n }));';
52
52
  } else if (first === 'add' || first === 'remove') {
53
53
  const table =
54
54
  first === 'add' ? getTextAfterTo(rest) : getTextAfterFrom(rest);
55
- content += `\n db.changeTable(${
55
+ content += `\n await db.changeTable(${
56
56
  table ? `'${table}'` : 'tableName'
57
57
  }, (t) => ({`;
58
58
  content += makeColumnsContent(args, first);
@@ -1,7 +1,7 @@
1
1
  import { migrate, rollback } from './migrateOrRollback';
2
2
  import { createSchemaMigrations, migrationConfigDefaults } from '../common';
3
3
  import { getMigrationFiles } from '../common';
4
- import { Adapter, TransactionAdapter } from 'pqb';
4
+ import { Adapter, noop, TransactionAdapter } from 'pqb';
5
5
  import { Migration } from '../migration/migration';
6
6
 
7
7
  jest.mock('../common', () => ({
@@ -35,6 +35,11 @@ const requireTsMock = jest.fn();
35
35
  const config = {
36
36
  ...migrationConfigDefaults,
37
37
  requireTs: requireTsMock,
38
+ log: false,
39
+ logger: {
40
+ log: jest.fn(),
41
+ error: noop,
42
+ },
38
43
  };
39
44
 
40
45
  describe('migrateOrRollback', () => {
@@ -49,7 +54,7 @@ describe('migrateOrRollback', () => {
49
54
  queryMock.mockReturnValueOnce(undefined);
50
55
  requireTsMock.mockResolvedValue(undefined);
51
56
 
52
- await migrate(options, config);
57
+ await migrate(options, config, []);
53
58
 
54
59
  expect(getMigrationFiles).toBeCalledWith(config, true);
55
60
 
@@ -62,6 +67,9 @@ describe('migrateOrRollback', () => {
62
67
  expect(transactionQueryMock).toBeCalledWith(
63
68
  `INSERT INTO "schemaMigrations" VALUES ('3')`,
64
69
  );
70
+
71
+ expect(config.logger.log).toBeCalledWith('file2 migrated');
72
+ expect(config.logger.log).toBeCalledWith('file3 migrated');
65
73
  });
66
74
 
67
75
  it('should create migrations table if it not exist', async () => {
@@ -69,12 +77,13 @@ describe('migrateOrRollback', () => {
69
77
  getMigratedVersionsArrayMock.mockRejectedValueOnce({ code: '42P01' });
70
78
  (createSchemaMigrations as jest.Mock).mockResolvedValueOnce(undefined);
71
79
 
72
- await migrate(options, config);
80
+ await migrate(options, config, []);
73
81
 
74
82
  expect(getMigrationFiles).toBeCalledWith(config, true);
75
83
  expect(createSchemaMigrations).toBeCalled();
76
84
  expect(requireTsMock).not.toBeCalled();
77
85
  expect(transactionQueryMock).not.toBeCalled();
86
+ expect(config.logger.log).not.toBeCalled();
78
87
  });
79
88
  });
80
89
 
@@ -87,19 +96,20 @@ describe('migrateOrRollback', () => {
87
96
  queryMock.mockReturnValueOnce(undefined);
88
97
  requireTsMock.mockResolvedValue(undefined);
89
98
 
90
- await rollback(options, config);
99
+ await rollback(options, config, []);
91
100
 
92
101
  expect(getMigrationFiles).toBeCalledWith(config, false);
93
102
 
103
+ expect(requireTsMock).toBeCalledTimes(1);
94
104
  expect(requireTsMock).toBeCalledWith('file2');
95
- expect(requireTsMock).toBeCalledWith('file1');
96
105
 
106
+ expect(transactionQueryMock).toBeCalledTimes(1);
97
107
  expect(transactionQueryMock).toBeCalledWith(
98
108
  `DELETE FROM "schemaMigrations" WHERE version = '2'`,
99
109
  );
100
- expect(transactionQueryMock).toBeCalledWith(
101
- `DELETE FROM "schemaMigrations" WHERE version = '1'`,
102
- );
110
+
111
+ expect(config.logger.log).toBeCalledTimes(1);
112
+ expect(config.logger.log).toBeCalledWith('file2 rolled back');
103
113
  });
104
114
 
105
115
  it('should create migrations table if it not exist', async () => {
@@ -107,12 +117,13 @@ describe('migrateOrRollback', () => {
107
117
  getMigratedVersionsArrayMock.mockRejectedValueOnce({ code: '42P01' });
108
118
  (createSchemaMigrations as jest.Mock).mockResolvedValueOnce(undefined);
109
119
 
110
- await rollback(options, config);
120
+ await rollback(options, config, []);
111
121
 
112
122
  expect(getMigrationFiles).toBeCalledWith(config, false);
113
123
  expect(createSchemaMigrations).toBeCalled();
114
124
  expect(requireTsMock).not.toBeCalled();
115
125
  expect(transactionQueryMock).not.toBeCalled();
126
+ expect(config.logger.log).not.toBeCalled();
116
127
  });
117
128
  });
118
129
  });
@@ -4,6 +4,7 @@ import {
4
4
  getMigrationFiles,
5
5
  MigrationConfig,
6
6
  MigrationFile,
7
+ quoteTable,
7
8
  } from '../common';
8
9
  import {
9
10
  getCurrentPromise,
@@ -15,10 +16,14 @@ import { Migration } from '../migration/migration';
15
16
  const migrateOrRollback = async (
16
17
  options: MaybeArray<AdapterOptions>,
17
18
  config: MigrationConfig,
19
+ args: string[],
18
20
  up: boolean,
19
21
  ) => {
20
22
  const files = await getMigrationFiles(config, up);
21
23
 
24
+ const argCount = parseInt(args[0]);
25
+ let count = isNaN(argCount) ? (up ? Infinity : 1) : argCount;
26
+
22
27
  for (const opts of toArray(options)) {
23
28
  const db = new Adapter(opts);
24
29
  const migratedVersions = await getMigratedVersionsMap(db, config);
@@ -31,7 +36,10 @@ const migrateOrRollback = async (
31
36
  continue;
32
37
  }
33
38
 
39
+ if (count-- <= 0) break;
40
+
34
41
  await processMigration(db, up, file, config);
42
+ config.logger?.log(`${file.path} ${up ? 'migrated' : 'rolled back'}`);
35
43
  }
36
44
  } finally {
37
45
  await db.destroy();
@@ -46,7 +54,7 @@ const processMigration = async (
46
54
  config: MigrationConfig,
47
55
  ) => {
48
56
  await db.transaction(async (tx) => {
49
- const db = new Migration(tx, up);
57
+ const db = new Migration(tx, up, config);
50
58
  setCurrentMigration(db);
51
59
  setCurrentMigrationUp(up);
52
60
  config.requireTs(file.path);
@@ -65,7 +73,7 @@ const saveMigratedVersion = async (
65
73
  config: MigrationConfig,
66
74
  ) => {
67
75
  await db.query(
68
- `INSERT INTO "${config.migrationsTable}" VALUES ('${version}')`,
76
+ `INSERT INTO ${quoteTable(config.migrationsTable)} VALUES ('${version}')`,
69
77
  );
70
78
  };
71
79
 
@@ -75,7 +83,9 @@ const removeMigratedVersion = async (
75
83
  config: MigrationConfig,
76
84
  ) => {
77
85
  await db.query(
78
- `DELETE FROM "${config.migrationsTable}" WHERE version = '${version}'`,
86
+ `DELETE FROM ${quoteTable(
87
+ config.migrationsTable,
88
+ )} WHERE version = '${version}'`,
79
89
  );
80
90
  };
81
91
 
@@ -85,7 +95,7 @@ const getMigratedVersionsMap = async (
85
95
  ): Promise<Record<string, boolean>> => {
86
96
  try {
87
97
  const result = await db.arrays<[string]>(
88
- `SELECT * FROM "${config.migrationsTable}"`,
98
+ `SELECT * FROM ${quoteTable(config.migrationsTable)}`,
89
99
  );
90
100
  return Object.fromEntries(result.rows.map((row) => [row[0], true]));
91
101
  } catch (err) {
@@ -100,9 +110,11 @@ const getMigratedVersionsMap = async (
100
110
  export const migrate = (
101
111
  options: MaybeArray<AdapterOptions>,
102
112
  config: MigrationConfig,
103
- ) => migrateOrRollback(options, config, true);
113
+ args: string[],
114
+ ) => migrateOrRollback(options, config, args, true);
104
115
 
105
116
  export const rollback = (
106
117
  options: MaybeArray<AdapterOptions>,
107
118
  config: MigrationConfig,
108
- ) => migrateOrRollback(options, config, false);
119
+ args: string[],
120
+ ) => migrateOrRollback(options, config, args, false);