rake-db 2.3.10 → 2.3.13
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/CHANGELOG.md +22 -0
- package/dist/index.d.ts +111 -7
- package/dist/index.js +221 -120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +222 -121
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/ast.ts +9 -1
- package/src/commands/migrateOrRollback.ts +3 -3
- package/src/common.ts +2 -2
- package/src/migration/migration.ts +3 -3
- package/src/pull/astToMigration.test.ts +56 -0
- package/src/pull/astToMigration.ts +37 -0
- package/src/pull/structureToAst.test.ts +156 -22
- package/src/pull/structureToAst.ts +256 -150
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/common.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/commands/createOrDrop.ts","../src/commands/generate.ts","../src/pull/dbStructure.ts","../src/pull/structureToAst.ts","../src/pull/astToMigration.ts","../src/pull/pull.ts","../src/rakeDb.ts"],"sourcesContent":["import {\n Adapter,\n AdapterOptions,\n columnTypes,\n DbResult,\n NoPrimaryKeyOption,\n QueryLogOptions,\n singleQuote,\n} from 'pqb';\nimport Enquirer from 'enquirer';\nimport path from 'path';\nimport { readdir } from 'fs/promises';\nimport { RakeDbAst } from './ast';\n\ntype Db = DbResult<typeof columnTypes>;\n\nexport type RakeDbConfig = {\n migrationsPath: string;\n migrationsTable: string;\n commands: Record<\n string,\n (\n options: AdapterOptions[],\n config: RakeDbConfig,\n args: string[],\n ) => Promise<void>\n >;\n requireTs(path: string): Promise<void>;\n noPrimaryKey?: NoPrimaryKeyOption;\n appCodeUpdater?: AppCodeUpdater;\n useCodeUpdater?: boolean;\n beforeMigrate?(db: Db): Promise<void>;\n afterMigrate?(db: Db): Promise<void>;\n beforeRollback?(db: Db): Promise<void>;\n afterRollback?(db: Db): Promise<void>;\n} & QueryLogOptions;\n\nexport type AppCodeUpdater = (params: {\n ast: RakeDbAst;\n options: AdapterOptions;\n cache: object;\n}) => Promise<void>;\n\nexport const migrationConfigDefaults: RakeDbConfig = {\n migrationsPath: path.resolve('src', 'db', 'migrations'),\n migrationsTable: 'schemaMigrations',\n commands: {},\n requireTs: (path: string) => import(path),\n log: true,\n logger: console,\n useCodeUpdater: true,\n};\n\nexport const getMigrationConfigWithDefaults = (\n config: Partial<RakeDbConfig>,\n) => {\n return { ...migrationConfigDefaults, ...config };\n};\n\nexport const getDatabaseAndUserFromOptions = (\n options: AdapterOptions,\n): { database: string; user: string } => {\n if (options.databaseURL) {\n const url = new URL(options.databaseURL);\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.databaseURL) {\n const url = new URL(options.databaseURL);\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, databaseURL: 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: RakeDbConfig,\n) => {\n try {\n await db.query(\n `CREATE TABLE ${quoteWithSchema({\n name: 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: RakeDbConfig,\n up: boolean,\n): Promise<MigrationFile[]> => {\n const { migrationsPath } = config;\n\n let files: string[];\n try {\n files = await readdir(path.resolve(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.resolve(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 quoteWithSchema = ({\n schema,\n name,\n}: {\n schema?: string;\n name: string;\n}) => {\n return schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n};\n\nexport const getSchemaAndTableFromName = (\n name: string,\n): [string | undefined, string] => {\n const index = name.indexOf('.');\n return index !== -1\n ? [name.slice(0, index), name.slice(index + 1)]\n : [undefined, name];\n};\n\nexport const quoteSchemaTable = ({\n schema,\n name,\n}: {\n schema?: string;\n name: string;\n}) => {\n return singleQuote(schema ? `${schema}.${name}` : name);\n};\n","import { Migration } from './migration';\n\nlet currentMigration: Migration | undefined;\nlet currentPromise: Promise<void> | undefined;\nlet currentUp = true;\nlet currentChangeCallback: ChangeCallback | undefined;\n\nexport type ChangeCallback = (db: Migration, up: boolean) => Promise<void>;\n\nexport const change = (fn: ChangeCallback) => {\n if (!currentMigration) throw new Error('Database instance is not set');\n currentPromise = fn(currentMigration, currentUp);\n currentChangeCallback = fn;\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\nexport const getCurrentChangeCallback = () => currentChangeCallback;\n","import {\n ColumnType,\n ForeignKeyTable,\n ForeignKeyOptions,\n getRaw,\n isRaw,\n quote,\n Sql,\n TableData,\n toArray,\n} from 'pqb';\nimport { ColumnComment, Migration } from './migration';\nimport {\n getSchemaAndTableFromName,\n joinColumns,\n quoteWithSchema,\n} from '../common';\n\nexport const columnToSql = (\n key: string,\n item: ColumnType,\n values: unknown[],\n hasMultiplePrimaryKeys: boolean,\n): string => {\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 && !hasMultiplePrimaryKeys) {\n line.push('PRIMARY KEY');\n } else if (!item.data.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 { foreignKeys } = item.data;\n if (foreignKeys) {\n for (const foreignKey of foreignKeys) {\n const [schema, 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(schema, table, foreignKey.columns, foreignKey));\n }\n }\n\n return line.join(' ');\n};\n\nexport const addColumnIndex = (\n indexes: TableData.Index[],\n key: string,\n item: ColumnType,\n) => {\n if (item.data.indexes) {\n indexes.push(\n ...item.data.indexes.map((index) => ({\n columns: [{ ...index, column: key }],\n options: 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: (() => ForeignKeyTable) | string,\n): [string | undefined, string] => {\n if (typeof fnOrTable === 'string') {\n return getSchemaAndTableFromName(fnOrTable);\n }\n\n const item = new (fnOrTable())();\n return [item.schema, item.table];\n};\n\nexport const getForeignKeyName = (table: string, columns: string[]) => {\n return `${table}_${columns.join('_')}_fkey`;\n};\n\nexport const constraintToSql = (\n { name }: { schema?: string; name: string },\n up: boolean,\n foreignKey: TableData['foreignKeys'][number],\n) => {\n const constraintName =\n foreignKey.options.name || getForeignKeyName(name, foreignKey.columns);\n\n if (!up) {\n const { dropMode } = foreignKey.options;\n return `CONSTRAINT \"${constraintName}\"${dropMode ? ` ${dropMode}` : ''}`;\n }\n\n const [schema, table] = getForeignKeyTable(foreignKey.fnOrTable);\n return `CONSTRAINT \"${constraintName}\" FOREIGN KEY (${joinColumns(\n foreignKey.columns,\n )}) ${referencesToSql(\n schema,\n table,\n foreignKey.foreignColumns,\n foreignKey.options,\n )}`;\n};\n\nexport const referencesToSql = (\n schema: string | undefined,\n table: string,\n columns: string[],\n foreignKey: Pick<ForeignKeyOptions, 'match' | 'onDelete' | 'onUpdate'>,\n) => {\n const sql: string[] = [\n `REFERENCES ${quoteWithSchema({ schema, name: table })}(${joinColumns(\n columns,\n )})`,\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 getIndexName = (\n table: string,\n columns: TableData.Index['columns'],\n) => {\n return `${table}_${columns\n .map((it) =>\n 'column' in it\n ? it.column\n : it.expression.match(/\\w+/g)?.join('_') || 'expression',\n )\n .join('_')}_idx`;\n};\n\nexport const indexesToQuery = (\n up: boolean,\n { schema, name }: { schema?: string; name: string },\n indexes: TableData.Index[],\n): Sql[] => {\n return indexes.map(({ columns, options }) => {\n const indexName = options.name || getIndexName(name, columns);\n\n if (!up) {\n return {\n text: `DROP INDEX \"${indexName}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n values: [],\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 ${quoteWithSchema({ schema, name })}`);\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' in column ? `\"${column.column}\"` : `(${column.expression})`,\n ];\n\n if (column.collate) {\n columnSql.push(`COLLATE '${column.collate}'`);\n }\n\n if (column.opclass) {\n columnSql.push(column.opclass);\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 { text: sql.join(' '), values };\n });\n};\n\nexport const commentsToQuery = (\n schemaTable: { schema?: string; name: string },\n comments: ColumnComment[],\n): Sql[] => {\n return comments.map(({ column, comment }) => ({\n text: `COMMENT ON COLUMN ${quoteWithSchema(\n schemaTable,\n )}.\"${column}\" IS ${quote(comment)}`,\n values: [],\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.adapter.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.adapter.types,\n );\n\n return rows;\n};\n","import {\n ColumnsShape,\n columnTypes,\n getColumnTypes,\n getTableData,\n NoPrimaryKeyOption,\n quote,\n raw,\n Sql,\n TableData,\n} from 'pqb';\nimport {\n ColumnComment,\n ColumnsShapeCallback,\n MigrationBase,\n runCodeUpdater,\n TableOptions,\n} from './migration';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n indexesToQuery,\n primaryKeyToSql,\n} from './migrationUtils';\nimport { getSchemaAndTableFromName, quoteWithSchema } from '../common';\nimport { RakeDbAst } from '../ast';\n\nconst types = Object.assign(Object.create(columnTypes), {\n raw,\n});\n\nexport const createTable = async (\n migration: MigrationBase,\n up: boolean,\n tableName: string,\n options: TableOptions,\n fn: ColumnsShapeCallback,\n) => {\n const shape = getColumnTypes(types, fn);\n const tableData = getTableData();\n const ast = makeAst(\n up,\n tableName,\n shape,\n tableData,\n options,\n migration.options.noPrimaryKey,\n );\n\n validatePrimaryKey(ast);\n\n const queries = astToQueries(ast);\n for (const query of queries) {\n await migration.adapter.query(query);\n }\n\n await runCodeUpdater(migration, ast);\n};\n\nconst makeAst = (\n up: boolean,\n tableName: string,\n shape: ColumnsShape,\n tableData: TableData,\n options: TableOptions,\n noPrimaryKey?: NoPrimaryKeyOption,\n): RakeDbAst.Table => {\n const shapePKeys: string[] = [];\n for (const key in shape) {\n if (shape[key].isPrimaryKey) {\n shapePKeys.push(key);\n }\n }\n\n const primaryKey = tableData.primaryKey;\n\n const [schema, table] = getSchemaAndTableFromName(tableName);\n\n return {\n type: 'table',\n action: up ? 'create' : 'drop',\n schema,\n name: table,\n shape,\n ...tableData,\n primaryKey:\n shapePKeys.length <= 1\n ? primaryKey\n : primaryKey\n ? { ...primaryKey, columns: [...shapePKeys, ...primaryKey.columns] }\n : { columns: shapePKeys },\n ...options,\n noPrimaryKey: options.noPrimaryKey ? 'ignore' : noPrimaryKey || 'error',\n };\n};\n\nconst validatePrimaryKey = (ast: RakeDbAst.Table) => {\n if (ast.noPrimaryKey !== 'ignore') {\n let hasPrimaryKey = !!ast.primaryKey?.columns?.length;\n if (!hasPrimaryKey) {\n for (const key in ast.shape) {\n if (ast.shape[key].isPrimaryKey) {\n hasPrimaryKey = true;\n break;\n }\n }\n }\n\n if (!hasPrimaryKey) {\n const message = `Table ${ast.name} has no primary key`;\n if (ast.noPrimaryKey === 'error') {\n throw new Error(message);\n } else {\n console.warn(message);\n }\n }\n }\n};\n\nconst astToQueries = (ast: RakeDbAst.Table): Sql[] => {\n if (ast.action === 'drop') {\n return [\n {\n text: `DROP TABLE ${quoteWithSchema(ast)}${\n ast.dropMode ? ` ${ast.dropMode}` : ''\n }`,\n values: [],\n },\n ];\n }\n\n const lines: string[] = [];\n const values: unknown[] = [];\n const indexes: TableData.Index[] = [];\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n addColumnIndex(indexes, key, item);\n addColumnComment(comments, key, item);\n lines.push(`\\n ${columnToSql(key, item, values, !!ast.primaryKey)}`);\n }\n\n if (ast.primaryKey) {\n lines.push(`\\n ${primaryKeyToSql(ast.primaryKey)}`);\n }\n\n ast.foreignKeys.forEach((foreignKey) => {\n lines.push(`\\n ${constraintToSql(ast, true, foreignKey)}`);\n });\n\n indexes.push(...ast.indexes);\n\n const result: Sql[] = [\n {\n text: `CREATE TABLE ${quoteWithSchema(ast)} (${lines.join(',')}\\n)`,\n values,\n },\n ...indexesToQuery(true, ast, indexes),\n ...commentsToQuery(ast, comments),\n ];\n\n if (ast.comment) {\n result.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${quote(ast.comment)}`,\n values: [],\n });\n }\n\n return result;\n};\n","import {\n ColumnType,\n resetTableData,\n getTableData,\n EmptyObject,\n emptyObject,\n TableData,\n RawExpression,\n raw,\n columnTypes,\n Sql,\n quote,\n getRaw,\n isRaw,\n} from 'pqb';\nimport {\n ChangeTableCallback,\n ChangeTableOptions,\n ColumnComment,\n DropMode,\n MigrationBase,\n MigrationColumnTypes,\n runCodeUpdater,\n} from './migration';\nimport { RakeDbAst } from '../ast';\nimport { getSchemaAndTableFromName, quoteWithSchema } from '../common';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n indexesToQuery,\n primaryKeyToSql,\n} from './migrationUtils';\n\ntype ChangeTableData = { add: TableData; drop: TableData };\nconst newChangeTableData = (): ChangeTableData => ({\n add: { indexes: [], foreignKeys: [] },\n drop: { indexes: [], foreignKeys: [] },\n});\n\nlet changeTableData = newChangeTableData();\n\nconst resetChangeTableData = () => {\n changeTableData = newChangeTableData();\n};\n\nconst mergeTableData = (a: TableData, b: TableData) => {\n if (b.primaryKey) {\n if (!a.primaryKey) {\n a.primaryKey = b.primaryKey;\n } else {\n a.primaryKey = {\n columns: [...a.primaryKey.columns, ...b.primaryKey.columns],\n options: { ...a.primaryKey.options, ...b.primaryKey.options },\n };\n }\n }\n a.indexes = [...a.indexes, ...b.indexes];\n a.foreignKeys = [...a.foreignKeys, ...b.foreignKeys];\n};\n\nfunction add(\n item: ColumnType,\n options?: { dropMode?: DropMode },\n): RakeDbAst.ChangeTableItem.Column;\nfunction add(emptyObject: EmptyObject): EmptyObject;\nfunction add(\n items: Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): Record<string, RakeDbAst.ChangeTableItem.Column>;\nfunction add(\n item: ColumnType | EmptyObject | Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n):\n | RakeDbAst.ChangeTableItem.Column\n | EmptyObject\n | Record<string, RakeDbAst.ChangeTableItem.Column> {\n if (item instanceof ColumnType) {\n return { type: 'add', item, dropMode: options?.dropMode };\n } else if (item === emptyObject) {\n mergeTableData(changeTableData.add, getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item) {\n result[key] = {\n type: 'add',\n item: (item as Record<string, ColumnType>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n}\n\nconst drop = ((item, options) => {\n if (item instanceof ColumnType) {\n return { type: 'drop', item, dropMode: options?.dropMode };\n } else if (item === emptyObject) {\n mergeTableData(changeTableData.drop, getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item) {\n result[key] = {\n type: 'drop',\n item: (item as Record<string, ColumnType>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n}) as typeof add;\n\ntype Change = RakeDbAst.ChangeTableItem.Change & ChangeOptions;\n\ntype ChangeOptions = {\n usingUp?: RawExpression;\n usingDown?: RawExpression;\n};\n\nconst columnTypeToColumnChange = (\n item: ColumnType | Change,\n): RakeDbAst.ColumnChange => {\n if (item instanceof ColumnType) {\n const foreignKeys = item.data.foreignKeys;\n if (foreignKeys?.some((it) => 'fn' in it)) {\n throw new Error('Callback in foreignKey is not allowed in migration');\n }\n\n return {\n column: item,\n type: item.toSQL(),\n nullable: item.data.isNullable,\n primaryKey: item.isPrimaryKey,\n ...item.data,\n foreignKeys: foreignKeys as RakeDbAst.ColumnChange['foreignKeys'],\n };\n }\n\n return item.to;\n};\n\ntype TableChangeMethods = typeof tableChangeMethods;\nconst tableChangeMethods = {\n raw: raw,\n add,\n drop,\n change(\n from: ColumnType | Change,\n to: ColumnType | Change,\n options?: ChangeOptions,\n ): Change {\n return {\n type: 'change',\n from: columnTypeToColumnChange(from),\n to: columnTypeToColumnChange(to),\n ...options,\n };\n },\n default(value: unknown | RawExpression): Change {\n return { type: 'change', from: { default: null }, to: { default: value } };\n },\n nullable(): Change {\n return {\n type: 'change',\n from: { nullable: false },\n to: { nullable: true },\n };\n },\n nonNullable(): Change {\n return {\n type: 'change',\n from: { nullable: true },\n to: { nullable: false },\n };\n },\n comment(comment: string | null): Change {\n return { type: 'change', from: { comment: null }, to: { comment } };\n },\n rename(name: string): RakeDbAst.ChangeTableItem.Rename {\n return { type: 'rename', name };\n },\n};\n\nexport type TableChanger = MigrationColumnTypes & TableChangeMethods;\n\nexport type TableChangeData = Record<\n string,\n | RakeDbAst.ChangeTableItem.Column\n | RakeDbAst.ChangeTableItem.Rename\n | Change\n | EmptyObject\n>;\n\nexport const changeTable = async (\n migration: MigrationBase,\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 ast = makeAst(up, tableName, changeData, changeTableData, options);\n\n const queries = astToQueries(ast);\n for (const query of queries) {\n await migration.adapter.query(query);\n }\n\n await runCodeUpdater(migration, ast);\n};\n\nconst makeAst = (\n up: boolean,\n name: string,\n changeData: TableChangeData,\n changeTableData: ChangeTableData,\n options: ChangeTableOptions,\n): RakeDbAst.ChangeTable => {\n const { comment } = options;\n\n const shape: Record<string, RakeDbAst.ChangeTableItem> = {};\n for (const key in changeData) {\n const item = changeData[key];\n if ('type' in item) {\n if (up) {\n shape[key] =\n item.type === 'change' && item.usingUp\n ? { ...item, using: item.usingUp }\n : item;\n } else {\n if (item.type === 'rename') {\n shape[item.name] = { ...item, name: key };\n } else {\n shape[key] =\n item.type === 'add'\n ? { ...item, type: 'drop' }\n : item.type === 'drop'\n ? { ...item, type: 'add' }\n : item.type === 'change'\n ? { ...item, from: item.to, to: item.from, using: item.usingDown }\n : item;\n }\n }\n }\n }\n\n const [schema, table] = getSchemaAndTableFromName(name);\n\n return {\n type: 'changeTable',\n schema,\n name: table,\n comment: comment\n ? up\n ? Array.isArray(comment)\n ? comment[1]\n : comment\n : Array.isArray(comment)\n ? comment[0]\n : null\n : undefined,\n shape,\n ...(up\n ? changeTableData\n : { add: changeTableData.drop, drop: changeTableData.add }),\n };\n};\n\ntype PrimaryKeys = {\n columns: string[];\n change?: true;\n options?: { name?: string };\n};\n\nconst astToQueries = (ast: RakeDbAst.ChangeTable): Sql[] => {\n const result: Sql[] = [];\n\n if (ast.comment !== undefined) {\n result.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${quote(ast.comment)}`,\n values: [],\n });\n }\n\n const addPrimaryKeys: PrimaryKeys = ast.add.primaryKey\n ? { ...ast.add.primaryKey }\n : {\n columns: [],\n };\n const dropPrimaryKeys: PrimaryKeys = ast.drop.primaryKey\n ? { ...ast.drop.primaryKey }\n : {\n columns: [],\n };\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n\n if (item.type === 'add') {\n if (item.item.isPrimaryKey) {\n addPrimaryKeys.columns.push(key);\n }\n } else if (item.type === 'drop') {\n if (item.item.isPrimaryKey) {\n dropPrimaryKeys.columns.push(key);\n }\n } else if (item.type === 'change') {\n if (item.from.primaryKey) {\n dropPrimaryKeys.columns.push(key);\n dropPrimaryKeys.change = true;\n }\n\n if (item.to.primaryKey) {\n addPrimaryKeys.columns.push(key);\n addPrimaryKeys.change = true;\n }\n }\n }\n\n const alterTable: string[] = [];\n const values: unknown[] = [];\n const addIndexes: TableData.Index[] = [...ast.add.indexes];\n const dropIndexes: TableData.Index[] = [...ast.drop.indexes];\n const addForeignKeys: TableData.ForeignKey[] = [...ast.add.foreignKeys];\n const dropForeignKeys: TableData.ForeignKey[] = [...ast.drop.foreignKeys];\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n\n if (item.type === 'add') {\n addColumnIndex(addIndexes, key, item.item);\n addColumnComment(comments, key, item.item);\n\n alterTable.push(\n `ADD COLUMN ${columnToSql(\n key,\n item.item,\n values,\n addPrimaryKeys.columns.length > 1,\n )}`,\n );\n } else if (item.type === 'drop') {\n addColumnIndex(dropIndexes, key, item.item);\n\n alterTable.push(\n `DROP COLUMN \"${key}\"${item.dropMode ? ` ${item.dropMode}` : ''}`,\n );\n } else if (item.type === 'change') {\n const { from, to } = item;\n if (from.type !== to.type || from.collate !== to.collate) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" TYPE ${to.type}${\n to.collate ? ` COLLATE ${quote(to.collate)}` : ''\n }${item.using ? ` USING ${getRaw(item.using, values)}` : ''}`,\n );\n }\n\n if (from.default !== to.default) {\n const value =\n typeof to.default === 'object' && to.default && isRaw(to.default)\n ? getRaw(to.default, values)\n : quote(to.default);\n\n const expr =\n value === undefined ? 'DROP DEFAULT' : `SET DEFAULT ${value}`;\n\n alterTable.push(`ALTER COLUMN \"${key}\" ${expr}`);\n }\n\n if (from.nullable !== to.nullable) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" ${to.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n if (from.compression !== to.compression) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" SET COMPRESSION ${\n to.compression || 'DEFAULT'\n }`,\n );\n }\n\n const foreignKeysLen = Math.max(\n from.foreignKeys?.length || 0,\n to.foreignKeys?.length || 0,\n );\n for (let i = 0; i < foreignKeysLen; i++) {\n const fromFkey = from.foreignKeys?.[i];\n const toFkey = to.foreignKeys?.[i];\n\n if (\n (fromFkey || toFkey) &&\n (!fromFkey ||\n !toFkey ||\n fromFkey.name !== toFkey.name ||\n fromFkey.match !== toFkey.match ||\n fromFkey.onUpdate !== toFkey.onUpdate ||\n fromFkey.onDelete !== toFkey.onDelete ||\n fromFkey.dropMode !== toFkey.dropMode ||\n fromFkey.table !== toFkey.table ||\n fromFkey.columns.join(',') !== toFkey.columns.join(','))\n ) {\n if (fromFkey) {\n dropForeignKeys.push({\n columns: [key],\n fnOrTable: fromFkey.table,\n foreignColumns: fromFkey.columns,\n options: fromFkey,\n });\n }\n\n if (toFkey) {\n addForeignKeys.push({\n columns: [key],\n fnOrTable: toFkey.table,\n foreignColumns: toFkey.columns,\n options: toFkey,\n });\n }\n }\n }\n\n const indexesLen = Math.max(\n from.indexes?.length || 0,\n to.indexes?.length || 0,\n );\n for (let i = 0; i < indexesLen; i++) {\n const fromIndex = from.indexes?.[i];\n const toIndex = to.indexes?.[i];\n\n if (\n (fromIndex || toIndex) &&\n (!fromIndex ||\n !toIndex ||\n fromIndex.collate !== toIndex.collate ||\n fromIndex.opclass !== toIndex.opclass ||\n fromIndex.order !== toIndex.order ||\n fromIndex.name !== toIndex.name ||\n fromIndex.unique !== toIndex.unique ||\n fromIndex.using !== toIndex.using ||\n fromIndex.include !== toIndex.include ||\n (Array.isArray(fromIndex.include) &&\n Array.isArray(toIndex.include) &&\n fromIndex.include.join(',') !== toIndex.include.join(',')) ||\n fromIndex.with !== toIndex.with ||\n fromIndex.tablespace !== toIndex.tablespace ||\n fromIndex.where !== toIndex.where ||\n fromIndex.dropMode !== toIndex.dropMode)\n ) {\n if (fromIndex) {\n dropIndexes.push({\n columns: [\n {\n column: key,\n ...fromIndex,\n },\n ],\n options: fromIndex,\n });\n }\n\n if (toIndex) {\n addIndexes.push({\n columns: [\n {\n column: key,\n ...toIndex,\n },\n ],\n options: toIndex,\n });\n }\n }\n }\n\n if (from.comment !== to.comment) {\n comments.push({ column: key, comment: to.comment || null });\n }\n } else if (item.type === 'rename') {\n alterTable.push(`RENAME COLUMN \"${key}\" TO \"${item.name}\"`);\n }\n }\n\n const prependAlterTable: string[] = [];\n\n if (\n ast.drop.primaryKey ||\n dropPrimaryKeys.change ||\n dropPrimaryKeys.columns.length > 1\n ) {\n const name = dropPrimaryKeys.options?.name || `${ast.name}_pkey`;\n prependAlterTable.push(`DROP CONSTRAINT \"${name}\"`);\n }\n\n prependAlterTable.push(\n ...dropForeignKeys.map(\n (foreignKey) => `\\n DROP ${constraintToSql(ast, false, foreignKey)}`,\n ),\n );\n\n alterTable.unshift(...prependAlterTable);\n\n if (\n ast.add.primaryKey ||\n addPrimaryKeys.change ||\n addPrimaryKeys.columns.length > 1\n ) {\n alterTable.push(`ADD ${primaryKeyToSql(addPrimaryKeys)}`);\n }\n\n alterTable.push(\n ...addForeignKeys.map(\n (foreignKey) => `\\n ADD ${constraintToSql(ast, true, foreignKey)}`,\n ),\n );\n\n if (alterTable.length) {\n result.push({\n text:\n `ALTER TABLE ${quoteWithSchema(ast)}` +\n `\\n ${alterTable.join(',\\n ')}`,\n values,\n });\n }\n\n result.push(...indexesToQuery(false, ast, dropIndexes));\n result.push(...indexesToQuery(true, ast, addIndexes));\n result.push(...commentsToQuery(ast, comments));\n\n return result;\n};\n","import {\n ColumnsShape,\n ColumnType,\n ColumnTypes,\n ForeignKeyOptions,\n IndexColumnOptions,\n IndexOptions,\n logParamToLogObject,\n MaybeArray,\n QueryInput,\n QueryLogObject,\n Sql,\n TransactionAdapter,\n raw,\n TextColumn,\n AdapterOptions,\n createDb,\n columnTypes,\n DbResult,\n} from 'pqb';\nimport { createTable } from './createTable';\nimport { changeTable, TableChangeData, TableChanger } from './changeTable';\nimport {\n RakeDbConfig,\n quoteWithSchema,\n getSchemaAndTableFromName,\n} from '../common';\nimport { RakeDbAst } from '../ast';\n\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\nexport type TableOptions = {\n dropMode?: DropMode;\n comment?: string;\n noPrimaryKey?: boolean;\n};\n\ntype TextColumnCreator = () => TextColumn;\n\nexport type MigrationColumnTypes = Omit<ColumnTypes, 'text' | 'string'> & {\n text: TextColumnCreator;\n string: TextColumnCreator;\n};\n\nexport type ColumnsShapeCallback = (\n t: MigrationColumnTypes & { raw: typeof raw },\n) => ColumnsShape;\n\nexport type ChangeTableOptions = { comment?: string | [string, string] | null };\nexport type ChangeTableCallback = (t: TableChanger) => TableChangeData;\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 type Migration = DbResult<typeof columnTypes> & MigrationBase;\n\nexport const createMigrationInterface = (\n tx: TransactionAdapter,\n up: boolean,\n options: RakeDbConfig,\n adapterOptions: AdapterOptions,\n appCodeUpdaterCache: object,\n) => {\n const adapter = new TransactionAdapter(tx, tx.client, tx.types);\n const { query, arrays } = adapter;\n const log = logParamToLogObject(options.logger || console, options.log);\n\n adapter.query = ((q, types) => {\n return wrapWithLog(log, q, () => query.call(adapter, q, types));\n }) as typeof adapter.query;\n\n adapter.arrays = ((q, types) => {\n return wrapWithLog(log, q, () => arrays.call(adapter, q, types));\n }) as typeof adapter.arrays;\n\n const db = createDb({ adapter, columnTypes }) as unknown as Migration;\n\n const { prototype: proto } = MigrationBase;\n for (const key of Object.getOwnPropertyNames(proto)) {\n (db as unknown as Record<string, unknown>)[key] =\n proto[key as keyof typeof proto];\n }\n\n return Object.assign(db, {\n adapter,\n log,\n up,\n options,\n adapterOptions,\n appCodeUpdaterCache,\n });\n};\n\nexport class MigrationBase {\n public adapter!: TransactionAdapter;\n public log?: QueryLogObject;\n public up!: boolean;\n public options!: RakeDbConfig;\n public adapterOptions!: AdapterOptions;\n public appCodeUpdaterCache!: object;\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 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 [fromSchema, f] = getSchemaAndTableFromName(this.up ? from : to);\n const [toSchema, t] = getSchemaAndTableFromName(this.up ? to : from);\n const ast: RakeDbAst.RenameTable = {\n type: 'renameTable',\n fromSchema,\n from: f,\n toSchema,\n to: t,\n };\n\n await this.adapter.query(\n `ALTER TABLE ${quoteWithSchema({\n schema: ast.fromSchema,\n name: ast.from,\n })} RENAME TO ${quoteWithSchema({\n schema: ast.toSchema,\n name: ast.to,\n })}`,\n );\n\n await runCodeUpdater(this, ast);\n }\n\n addColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => ColumnType,\n ) {\n return addColumn(this, this.up, tableName, columnName, fn);\n }\n\n dropColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => 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, options);\n }\n\n dropExtension(\n name: string,\n options: { ifExists?: boolean; cascade?: boolean } = {},\n ) {\n return createExtension(this, !this.up, name, options);\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: MigrationBase,\n up: boolean,\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => ColumnType,\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n [columnName]: t.add(fn(t)),\n }));\n};\n\nconst addIndex = (\n migration: MigrationBase,\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: MigrationBase,\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: MigrationBase,\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 = async (\n migration: MigrationBase,\n up: boolean,\n name: string,\n) => {\n const ast: RakeDbAst.Schema = {\n type: 'schema',\n action: up ? 'create' : 'drop',\n name,\n };\n\n await migration.adapter.query(\n `${ast.action === 'create' ? 'CREATE' : 'DROP'} SCHEMA \"${name}\"`,\n );\n\n await runCodeUpdater(migration, ast);\n};\n\nconst createExtension = async (\n migration: MigrationBase,\n up: boolean,\n name: string,\n options: ExtensionOptions & {\n checkExists?: boolean;\n },\n) => {\n const ast: RakeDbAst.Extension = {\n type: 'extension',\n action: up ? 'create' : 'drop',\n name,\n ...options,\n };\n\n let query;\n if (ast.action === 'drop') {\n query = `DROP EXTENSION${ast.ifNotExists ? ' IF EXISTS' : ''} \"${\n ast.name\n }\"${ast.cascade ? ' CASCADE' : ''}`;\n } else {\n query = `CREATE EXTENSION${ast.ifExists ? ' IF NOT EXISTS' : ''} \"${\n ast.name\n }\"${ast.schema ? ` SCHEMA \"${ast.schema}\"` : ''}${\n ast.version ? ` VERSION '${ast.version}'` : ''\n }${ast.cascade ? ' CASCADE' : ''}`;\n }\n\n await migration.adapter.query(query);\n\n await runCodeUpdater(migration, ast);\n};\n\nconst queryExists = (\n db: MigrationBase,\n sql: { text: string; values: unknown[] },\n) => {\n return db.adapter.query(sql).then(({ rowCount }) => rowCount > 0);\n};\n\nexport const runCodeUpdater = (migration: MigrationBase, ast: RakeDbAst) => {\n return migration.options.appCodeUpdater?.({\n ast,\n options: migration.adapterOptions,\n cache: migration.appCodeUpdaterCache,\n });\n};\n","import {\n Adapter,\n AdapterOptions,\n columnTypes,\n createDb,\n DbResult,\n MaybeArray,\n toArray,\n} from 'pqb';\nimport {\n createSchemaMigrations,\n getMigrationFiles,\n RakeDbConfig,\n MigrationFile,\n quoteWithSchema,\n} from '../common';\nimport {\n getCurrentPromise,\n setCurrentMigrationUp,\n setCurrentMigration,\n ChangeCallback,\n change,\n getCurrentChangeCallback,\n} from '../migration/change';\nimport { createMigrationInterface } from '../migration/migration';\n\nconst getDb = (adapter: Adapter) => createDb({ adapter, columnTypes });\n\nconst migrateOrRollback = async (\n options: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n args: string[],\n up: boolean,\n) => {\n config = { ...config };\n const files = await getMigrationFiles(config, up);\n\n let count = up ? Infinity : 1;\n let argI = 0;\n const num = args[0] === 'all' ? Infinity : parseInt(args[0]);\n if (!isNaN(num)) {\n argI++;\n count = num;\n }\n\n const arg = args[argI];\n if (arg === '--code') {\n config.useCodeUpdater = args[argI + 1] !== 'false';\n }\n\n if (!config.useCodeUpdater) delete config.appCodeUpdater;\n\n const appCodeUpdaterCache = {};\n\n for (const opts of toArray(options)) {\n const adapter = new Adapter(opts);\n let db: DbResult<typeof columnTypes> | undefined;\n\n if (up) {\n await config.beforeMigrate?.((db ??= getDb(adapter)));\n } else {\n await config.beforeRollback?.((db ??= getDb(adapter)));\n }\n\n const migratedVersions = await getMigratedVersionsMap(adapter, 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(\n adapter,\n up,\n file,\n config,\n opts,\n appCodeUpdaterCache,\n );\n config.logger?.log(`${file.path} ${up ? 'migrated' : 'rolled back'}`);\n }\n\n if (up) {\n await config.afterMigrate?.((db ??= getDb(adapter)));\n } else {\n await config.afterRollback?.((db ??= getDb(adapter)));\n }\n } finally {\n await adapter.close();\n }\n // use appCodeUpdater only for the first provided options\n delete config.appCodeUpdater;\n }\n};\n\nconst changeCache: Record<string, ChangeCallback | undefined> = {};\n\nconst processMigration = async (\n db: Adapter,\n up: boolean,\n file: MigrationFile,\n config: RakeDbConfig,\n options: AdapterOptions,\n appCodeUpdaterCache: object,\n) => {\n await db.transaction(async (tx) => {\n const db = createMigrationInterface(\n tx,\n up,\n config,\n options,\n appCodeUpdaterCache,\n );\n setCurrentMigration(db);\n setCurrentMigrationUp(up);\n\n const callback = changeCache[file.path];\n if (callback) {\n change(callback);\n } else {\n await config.requireTs(file.path);\n changeCache[file.path] = getCurrentChangeCallback();\n }\n\n await getCurrentPromise();\n await (up ? saveMigratedVersion : removeMigratedVersion)(\n db.adapter,\n file.version,\n config,\n );\n });\n};\n\nconst saveMigratedVersion = async (\n db: Adapter,\n version: string,\n config: RakeDbConfig,\n) => {\n await db.query(\n `INSERT INTO ${quoteWithSchema({\n name: config.migrationsTable,\n })} VALUES ('${version}')`,\n );\n};\n\nconst removeMigratedVersion = async (\n db: Adapter,\n version: string,\n config: RakeDbConfig,\n) => {\n await db.query(\n `DELETE FROM ${quoteWithSchema({\n name: config.migrationsTable,\n })} WHERE version = '${version}'`,\n );\n};\n\nconst getMigratedVersionsMap = async (\n db: Adapter,\n config: RakeDbConfig,\n): Promise<Record<string, boolean>> => {\n try {\n const result = await db.arrays<[string]>(\n `SELECT * FROM ${quoteWithSchema({ name: 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: RakeDbConfig,\n args: string[] = [],\n) => migrateOrRollback(options, config, args, true);\n\nexport const rollback = (\n options: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n args: string[] = [],\n) => migrateOrRollback(options, config, args, false);\n","import { Adapter, AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport {\n getDatabaseAndUserFromOptions,\n setAdminCredentialsToOptions,\n setAdapterOptions,\n createSchemaMigrations,\n RakeDbConfig,\n migrationConfigDefaults,\n} from '../common';\nimport { migrate } from './migrateOrRollback';\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.close();\n }\n};\n\nconst createOrDrop = async (\n options: AdapterOptions,\n adminOptions: AdapterOptions,\n config: RakeDbConfig,\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.close();\n};\n\nexport const createDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\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\nexport const resetDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n) => {\n await dropDb(arg);\n await createDb(arg, config);\n await migrate(arg, config);\n};\n","import {\n getFirstWordAndRest,\n getTextAfterFrom,\n getTextAfterTo,\n RakeDbConfig,\n} from '../common';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\n\nexport const writeMigrationFile = async (\n config: RakeDbConfig,\n name: string,\n content: string,\n) => {\n await mkdir(path.resolve(config.migrationsPath), { recursive: true });\n\n const filePath = path.resolve(\n config.migrationsPath,\n `${makeFileTimeStamp()}_${name}.ts`,\n );\n await writeFile(filePath, content);\n console.log(`Created ${filePath}`);\n};\n\nexport const generate = async (config: RakeDbConfig, args: string[]) => {\n const name = args[0];\n if (!name) throw new Error('Migration name is missing');\n\n await writeMigrationFile(config, name, makeContent(name, args.slice(1)));\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 { Adapter } from 'pqb';\n\nexport namespace DbStructure {\n export type Table = {\n schemaName: string;\n name: string;\n comment?: string;\n };\n\n export type View = {\n schemaName: string;\n name: string;\n };\n\n export type Procedure = {\n schemaName: string;\n name: string;\n returnSet: boolean;\n returnType: string;\n kind: string;\n isTrigger: boolean;\n types: string[];\n argTypes: string[];\n argModes: ('i' | 'o')[];\n argNames?: string[];\n };\n\n export type Column = {\n schemaName: string;\n tableName: string;\n name: string;\n type: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n default?: string;\n isNullable: boolean;\n collation?: string;\n compression?: 'p' | 'l'; // p for pglz, l for lz4\n comment?: string;\n };\n\n export type Index = {\n schemaName: string;\n tableName: string;\n name: string;\n using: string;\n isUnique: boolean;\n columns: (({ column: string } | { expression: string }) & {\n collate?: string;\n opclass?: string;\n order?: string;\n })[];\n include?: string[];\n with?: string;\n tablespace?: string;\n where?: string;\n };\n\n // a = no action, r = restrict, c = cascade, n = set null, d = set default\n type ForeignKeyAction = 'a' | 'r' | 'c' | 'n' | 'd';\n\n export type ForeignKey = {\n schemaName: string;\n tableName: string;\n foreignTableSchemaName: string;\n foreignTableName: string;\n name: string;\n columnNames: string[];\n foreignColumnNames: string[];\n match: 'f' | 'p' | 's'; // FULL | PARTIAL | SIMPLE\n onUpdate: ForeignKeyAction;\n onDelete: ForeignKeyAction;\n };\n\n export type PrimaryKey = {\n schemaName: string;\n tableName: string;\n name: string;\n columnNames: string[];\n };\n\n export type Trigger = {\n schemaName: string;\n tableName: string;\n triggerSchema: string;\n name: string;\n events: string[];\n activation: string;\n condition?: string;\n definition: string;\n };\n\n export type Extension = {\n schemaName: string;\n name: string;\n version?: string;\n };\n}\n\nconst filterSchema = (table: string) =>\n `${table} !~ '^pg_' AND ${table} != 'information_schema'`;\n\nexport class DbStructure {\n constructor(private db: Adapter) {}\n\n async getSchemas(): Promise<string[]> {\n const { rows } = await this.db.arrays<[string]>(\n `SELECT n.nspname \"name\"\nFROM pg_catalog.pg_namespace n\nWHERE ${filterSchema('n.nspname')}\nORDER BY \"name\"`,\n );\n return rows.flat();\n }\n\n async getTables() {\n const { rows } = await this.db.query<DbStructure.Table>(\n `SELECT\n nspname AS \"schemaName\",\n relname AS \"name\",\n obj_description(c.oid) AS comment\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nWHERE relkind = 'r'\n AND ${filterSchema('nspname')}\nORDER BY relname`,\n );\n return rows;\n }\n\n async getViews() {\n const { rows } = await this.db.query<DbStructure.View[]>(\n `SELECT\n table_schema \"schemaName\",\n table_name \"name\"\nFROM information_schema.tables\nWHERE table_type = 'VIEW'\n AND ${filterSchema('table_schema')}\nORDER BY table_name`,\n );\n return rows;\n }\n\n async getProcedures() {\n const { rows } = await this.db.query<DbStructure.Procedure[]>(\n `SELECT\n n.nspname AS \"schemaName\",\n proname AS name,\n proretset AS \"returnSet\",\n (\n SELECT typname FROM pg_type WHERE oid = prorettype\n ) AS \"returnType\",\n prokind AS \"kind\",\n coalesce((\n SELECT true FROM information_schema.triggers\n WHERE n.nspname = trigger_schema AND trigger_name = proname\n LIMIT 1\n ), false) AS \"isTrigger\",\n coalesce((\n SELECT json_agg(pg_type.typname)\n FROM unnest(coalesce(proallargtypes, proargtypes)) typeId\n JOIN pg_type ON pg_type.oid = typeId\n ), '[]') AS \"types\",\n coalesce(to_json(proallargtypes::int[]), to_json(proargtypes::int[])) AS \"argTypes\",\n coalesce(to_json(proargmodes), '[]') AS \"argModes\",\n to_json(proargnames) AS \"argNames\"\nFROM pg_proc p\nJOIN pg_namespace n ON p.pronamespace = n.oid\nWHERE ${filterSchema('n.nspname')}`,\n );\n return rows;\n }\n\n async getColumns() {\n const { rows } = await this.db.query<DbStructure.Column>(\n `SELECT\n table_schema \"schemaName\",\n table_name \"tableName\",\n column_name \"name\",\n udt_name \"type\",\n character_maximum_length AS \"maxChars\",\n numeric_precision AS \"numericPrecision\",\n numeric_scale AS \"numericScale\",\n datetime_precision AS \"dateTimePrecision\",\n column_default \"default\",\n is_nullable::boolean \"isNullable\",\n collation_name AS \"collation\",\n NULLIF(a.attcompression, '') AS compression,\n pgd.description AS \"comment\"\nFROM information_schema.columns c\nLEFT JOIN pg_catalog.pg_statio_all_tables AS st\n ON c.table_schema = st.schemaname\n AND c.table_name = st.relname\nLEFT JOIN pg_catalog.pg_description pgd\n ON pgd.objoid = st.relid\n AND pgd.objsubid = c.ordinal_position\nLEFT JOIN pg_catalog.pg_attribute a\n ON a.attrelid = st.relid\n AND a.attnum = c.ordinal_position\nWHERE ${filterSchema('table_schema')}\nORDER BY c.ordinal_position`,\n );\n return rows;\n }\n\n async getIndexes() {\n const { rows } = await this.db.query<DbStructure.Index>(\n `SELECT\n n.nspname \"schemaName\",\n t.relname \"tableName\",\n ic.relname \"name\",\n am.amname AS \"using\",\n i.indisunique \"isUnique\",\n (\n SELECT json_agg(\n (\n CASE WHEN t.e = 0\n THEN jsonb_build_object('expression', pg_get_indexdef(i.indexrelid, t.i::int4, false))\n ELSE jsonb_build_object('column', (\n (\n SELECT attname\n FROM pg_catalog.pg_attribute\n WHERE attrelid = i.indrelid\n AND attnum = t.e\n )\n ))\n END\n ) || (\n CASE WHEN i.indcollation[t.i - 1] = 0\n THEN '{}'::jsonb\n ELSE (\n SELECT (\n CASE WHEN collname = 'default'\n THEN '{}'::jsonb\n ELSE jsonb_build_object('collate', collname)\n END\n )\n FROM pg_catalog.pg_collation\n WHERE oid = i.indcollation[t.i - 1]\n )\n END\n ) || (\n SELECT\n CASE WHEN opcdefault AND attoptions IS NULL\n THEN '{}'::jsonb\n ELSE jsonb_build_object(\n 'opclass', opcname || COALESCE('(' || array_to_string(attoptions, ', ') || ')', '')\n )\n END\n FROM pg_opclass\n LEFT JOIN pg_attribute\n ON attrelid = i.indexrelid\n AND attnum = t.i\n WHERE oid = i.indclass[t.i - 1]\n ) || (\n CASE WHEN i.indoption[t.i - 1] = 0\n THEN '{}'::jsonb\n ELSE jsonb_build_object(\n 'order',\n CASE\n WHEN i.indoption[t.i - 1] = 1 THEN 'DESC NULLS LAST'\n WHEN i.indoption[t.i - 1] = 2 THEN 'ASC NULLS FIRST'\n WHEN i.indoption[t.i - 1] = 3 THEN 'DESC'\n ELSE NULL\n END\n )\n END\n )\n )\n FROM unnest(i.indkey[:indnkeyatts - 1]) WITH ORDINALITY AS t(e, i)\n ) \"columns\",\n (\n SELECT json_agg(\n (\n SELECT attname\n FROM pg_catalog.pg_attribute\n WHERE attrelid = i.indrelid\n AND attnum = j.e\n )\n )\n FROM unnest(i.indkey[indnkeyatts:]) AS j(e)\n ) AS \"include\",\n NULLIF(pg_catalog.array_to_string(\n ic.reloptions || array(SELECT 'toast.' || x FROM pg_catalog.unnest(tc.reloptions) x),\n ', '\n ), '') AS \"with\",\n (\n SELECT tablespace\n FROM pg_indexes\n WHERE schemaname = n.nspname\n AND indexname = ic.relname\n ) AS tablespace,\n pg_get_expr(i.indpred, i.indrelid) AS \"where\"\nFROM pg_index i\nJOIN pg_class t ON t.oid = i.indrelid\nJOIN pg_namespace n ON n.oid = t.relnamespace\nJOIN pg_class ic ON ic.oid = i.indexrelid\nJOIN pg_am am ON am.oid = ic.relam\nLEFT JOIN pg_catalog.pg_class tc ON (ic.reltoastrelid = tc.oid)\nWHERE ${filterSchema('n.nspname')}\n AND NOT i.indisprimary\nORDER BY ic.relname`,\n );\n return rows;\n }\n\n async getForeignKeys() {\n const { rows } = await this.db.query<DbStructure.ForeignKey>(\n `SELECT\n s.nspname AS \"schemaName\",\n t.relname AS \"tableName\",\n fs.nspname AS \"foreignTableSchemaName\",\n ft.relname AS \"foreignTableName\",\n c.conname AS \"name\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.key_column_usage ccu\n WHERE ccu.constraint_name = c.conname\n AND ccu.table_schema = cs.nspname\n ) AS \"columnNames\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.constraint_column_usage ccu\n WHERE ccu.constraint_name = c.conname\n AND ccu.table_schema = cs.nspname\n ) AS \"foreignColumnNames\",\n c.confmatchtype AS match,\n c.confupdtype AS \"onUpdate\",\n c.confdeltype AS \"onDelete\"\nFROM pg_catalog.pg_constraint c\nJOIN pg_class t ON t.oid = conrelid\nJOIN pg_catalog.pg_namespace s ON s.oid = t.relnamespace\nJOIN pg_class ft ON ft.oid = confrelid\nJOIN pg_catalog.pg_namespace fs ON fs.oid = ft.relnamespace\nJOIN pg_catalog.pg_namespace cs ON cs.oid = c.connamespace\nWHERE contype = 'f'\nORDER BY c.conname`,\n );\n return rows;\n }\n\n async getPrimaryKeys() {\n const { rows } = await this.db.query<DbStructure.PrimaryKey>(\n `SELECT tc.table_schema AS \"schemaName\",\n tc.table_name AS \"tableName\",\n tc.constraint_name AS \"name\",\n json_agg(ccu.column_name) \"columnNames\"\nFROM information_schema.table_constraints tc\nJOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\nWHERE tc.constraint_type = 'PRIMARY KEY'\n AND ${filterSchema('tc.table_schema')}\nGROUP BY \"schemaName\", \"tableName\", \"name\"\nORDER BY \"name\"`,\n );\n return rows;\n }\n\n async getTriggers() {\n const { rows } = await this.db.query<DbStructure.Trigger>(\n `SELECT event_object_schema AS \"schemaName\",\n event_object_table AS \"tableName\",\n trigger_schema AS \"triggerSchema\",\n trigger_name AS name,\n json_agg(event_manipulation) AS events,\n action_timing AS activation,\n action_condition AS condition,\n action_statement AS definition\nFROM information_schema.triggers\nWHERE ${filterSchema('event_object_schema')}\nGROUP BY event_object_schema, event_object_table, trigger_schema, trigger_name, action_timing, action_condition, action_statement\nORDER BY trigger_name`,\n );\n return rows;\n }\n\n async getExtensions() {\n const { rows } = await this.db.query<DbStructure.Extension>(\n `SELECT\n nspname AS \"schemaName\",\n extname AS \"name\",\n extversion AS version\nFROM pg_extension\nJOIN pg_catalog.pg_namespace n ON n.oid = extnamespace\n AND ${filterSchema('n.nspname')}`,\n );\n return rows;\n }\n}\n","import { DbStructure } from './dbStructure';\nimport { RakeDbAst } from '../ast';\nimport {\n columnsByType,\n ColumnsShape,\n ForeignKeyOptions,\n instantiateColumn,\n singleQuote,\n} from 'pqb';\nimport { getForeignKeyName, getIndexName } from '../migration/migrationUtils';\n\nconst matchMap = {\n s: undefined,\n f: 'FULL',\n p: 'PARTIAL',\n};\n\nconst fkeyActionMap = {\n a: undefined, // default\n r: 'RESTRICT',\n c: 'CASCADE',\n n: 'SET NULL',\n d: 'SET DEFAULT',\n};\n\nexport const structureToAst = async (db: DbStructure): Promise<RakeDbAst[]> => {\n const ast: RakeDbAst[] = [];\n\n const [\n schemas,\n tables,\n allColumns,\n allPrimaryKeys,\n allIndexes,\n allForeignKeys,\n extensions,\n ] = await Promise.all([\n db.getSchemas(),\n db.getTables(),\n db.getColumns(),\n db.getPrimaryKeys(),\n db.getIndexes(),\n db.getForeignKeys(),\n db.getExtensions(),\n ]);\n\n for (const name of schemas) {\n if (name === 'public') continue;\n\n ast.push({\n type: 'schema',\n action: 'create',\n name,\n });\n }\n\n for (const table of tables) {\n const { schemaName, name } = table;\n\n if (name === 'schemaMigrations') continue;\n\n const belongsToTable = makeBelongsToTable(schemaName, name);\n\n const columns = allColumns.filter(belongsToTable);\n const primaryKey = allPrimaryKeys.find(belongsToTable);\n const tableIndexes = allIndexes.filter(belongsToTable);\n const tableForeignKeys = allForeignKeys.filter(belongsToTable);\n\n const shape: ColumnsShape = {};\n for (let item of columns) {\n const isSerial = getIsSerial(item);\n if (isSerial) {\n item = { ...item, default: undefined };\n }\n\n const klass = columnsByType[getColumnType(item, isSerial)];\n if (!klass) {\n throw new Error(`Column type \\`${item.type}\\` is not supported`);\n }\n\n let column = instantiateColumn(klass, item);\n\n if (\n primaryKey?.columnNames.length === 1 &&\n primaryKey?.columnNames[0] === item.name\n ) {\n column = column.primaryKey();\n }\n\n const indexes = tableIndexes.filter(\n (it) =>\n it.columns.length === 1 &&\n 'column' in it.columns[0] &&\n it.columns[0].column === item.name,\n );\n for (const index of indexes) {\n const options = index.columns[0];\n column = column.index({\n collate: options.collate,\n opclass: options.opclass,\n order: options.order,\n name:\n index.name !== getIndexName(name, index.columns)\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.isUnique,\n include: index.include,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n });\n }\n\n const foreignKeys = tableForeignKeys.filter(\n (it) => it.columnNames.length === 1 && it.columnNames[0] === item.name,\n );\n for (const foreignKey of foreignKeys) {\n column = column.foreignKey(\n foreignKey.foreignTableName,\n foreignKey.foreignColumnNames[0],\n {\n name:\n foreignKey.name &&\n foreignKey.name !==\n getForeignKeyName(name, foreignKey.columnNames)\n ? foreignKey.name\n : undefined,\n match: matchMap[foreignKey.match],\n onUpdate: fkeyActionMap[foreignKey.onUpdate],\n onDelete: fkeyActionMap[foreignKey.onDelete],\n } as ForeignKeyOptions,\n );\n }\n\n shape[item.name] = column;\n }\n\n ast.push({\n type: 'table',\n action: 'create',\n schema: schemaName === 'public' ? undefined : schemaName,\n comment: table.comment,\n name: name,\n shape,\n noPrimaryKey: primaryKey ? 'error' : 'ignore',\n primaryKey:\n primaryKey && primaryKey.columnNames.length > 1\n ? {\n columns: primaryKey.columnNames,\n options:\n primaryKey.name === `${name}_pkey`\n ? undefined\n : { name: primaryKey.name },\n }\n : undefined,\n indexes: tableIndexes\n .filter(\n (index) =>\n index.columns.length > 1 ||\n index.columns.some((it) => 'expression' in it),\n )\n .map((index) => ({\n columns: index.columns.map((it) => ({\n ...('column' in it\n ? { column: it.column }\n : { expression: it.expression }),\n collate: it.collate,\n opclass: it.opclass,\n order: it.order,\n })),\n options: {\n name:\n index.name !== getIndexName(name, index.columns)\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.isUnique,\n include: index.include,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n },\n })),\n foreignKeys: tableForeignKeys\n .filter((it) => it.columnNames.length > 1)\n .map((it) => ({\n columns: it.columnNames,\n fnOrTable: it.foreignTableName,\n foreignColumns: it.foreignColumnNames,\n options: {\n name:\n it.name && it.name !== getForeignKeyName(name, it.columnNames)\n ? it.name\n : undefined,\n match: matchMap[it.match],\n onUpdate: fkeyActionMap[it.onUpdate],\n onDelete: fkeyActionMap[it.onDelete],\n } as ForeignKeyOptions,\n })),\n });\n }\n\n for (const it of extensions) {\n ast.push({\n type: 'extension',\n action: 'create',\n name: it.name,\n schema: it.schemaName === 'public' ? undefined : it.schemaName,\n version: it.version,\n });\n }\n\n return ast;\n};\n\nconst makeBelongsToTable =\n (schema: string | undefined, table: string) =>\n (item: { schemaName: string; tableName: string }) =>\n item.schemaName === schema && item.tableName === table;\n\nconst getIsSerial = (item: DbStructure.Column) => {\n if (item.type === 'int2' || item.type === 'int4' || item.type === 'int8') {\n const { default: def, schemaName, tableName, name } = item;\n const seq = `${tableName}_${name}_seq`;\n if (\n def &&\n (def === `nextval(${singleQuote(`${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${seq}\"`)}::regclass)` ||\n def === `nextval(${singleQuote(`${schemaName}.${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${schemaName}\".${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`${schemaName}.\"${seq}\"`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${schemaName}\".\"${seq}\"`)}::regclass)`)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst getColumnType = (item: DbStructure.Column, isSerial: boolean) => {\n if (isSerial) {\n return item.type === 'int2'\n ? 'smallserial'\n : item.type === 'int4'\n ? 'serial'\n : 'bigserial';\n }\n\n return item.type;\n};\n","import { RakeDbAst } from '../ast';\nimport {\n addCode,\n Code,\n codeToString,\n ColumnType,\n foreignKeyToCode,\n indexToCode,\n isRaw,\n primaryKeyToCode,\n quoteObjectKey,\n singleQuote,\n TimestampColumn,\n} from 'pqb';\nimport { quoteSchemaTable } from '../common';\n\nexport const astToMigration = (ast: RakeDbAst[]): string | undefined => {\n const code: Code[] = [];\n for (const item of ast) {\n if (item.type === 'schema' && item.action === 'create') {\n code.push(createSchema(item));\n } else if (item.type === 'table' && item.action === 'create') {\n if (code.length) code.push([]);\n code.push(...createTable(item));\n }\n }\n\n if (!code.length) return;\n\n return `import { change } from 'rake-db';\n\nchange(async (db) => {\n${codeToString(code, ' ', ' ')}\n});\n`;\n};\n\nconst createSchema = (ast: RakeDbAst.Schema) => {\n return `await db.createSchema(${singleQuote(ast.name)});`;\n};\n\nconst createTable = (ast: RakeDbAst.Table) => {\n const code: Code[] = [];\n addCode(code, `await db.createTable(${quoteSchemaTable(ast)}, (t) => ({`);\n\n const hasTimestamps =\n isTimestamp(ast.shape.createdAt) && isTimestamp(ast.shape.updatedAt);\n\n for (const key in ast.shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n const line: Code[] = [`${quoteObjectKey(key)}: `];\n for (const part of ast.shape[key].toCode('t')) {\n addCode(line, part);\n }\n addCode(line, ',');\n code.push(line);\n }\n\n if (hasTimestamps) {\n code.push(['...t.timestamps(),']);\n }\n\n if (ast.primaryKey) {\n code.push([primaryKeyToCode(ast.primaryKey, 't')]);\n }\n\n for (const index of ast.indexes) {\n code.push(indexToCode(index, 't'));\n }\n\n for (const foreignKey of ast.foreignKeys) {\n code.push(foreignKeyToCode(foreignKey, 't'));\n }\n\n addCode(code, '}));');\n\n return code;\n};\n\nconst isTimestamp = (column?: ColumnType) => {\n if (!column) return false;\n\n const { default: def } = column.data;\n return (\n column instanceof TimestampColumn &&\n !column.data.isNullable &&\n def &&\n typeof def === 'object' &&\n isRaw(def) &&\n def.__raw === 'now()'\n );\n};\n","import { RakeDbConfig } from '../common';\nimport { Adapter, AdapterOptions } from 'pqb';\nimport { DbStructure } from './dbStructure';\nimport { structureToAst } from './structureToAst';\nimport { astToMigration } from './astToMigration';\nimport { writeMigrationFile } from '../commands/generate';\n\nexport const pullDbStructure = async (\n options: AdapterOptions,\n config: RakeDbConfig,\n) => {\n const adapter = new Adapter(options);\n const db = new DbStructure(adapter);\n const ast = await structureToAst(db);\n\n await adapter.close();\n\n const result = astToMigration(ast);\n if (!result) return;\n\n await writeMigrationFile(config, 'pull', result);\n};\n","import { AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport { createDb, dropDb, resetDb } from './commands/createOrDrop';\nimport { migrate, rollback } from './commands/migrateOrRollback';\nimport { getMigrationConfigWithDefaults, RakeDbConfig } from './common';\nimport { generate } from './commands/generate';\nimport { pullDbStructure } from './pull/pull';\n\nexport const rakeDb = async (\n options: MaybeArray<AdapterOptions>,\n partialConfig: Partial<RakeDbConfig> = {},\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 === 'reset') {\n await resetDb(options, config);\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 if (command === 'pull') {\n await pullDbStructure(toArray(options)[0], config);\n } else if (config.commands[command]) {\n await config.commands[command](toArray(options), config, args.slice(1));\n } else {\n printHelp();\n }\n};\n\nconst printHelp = () =>\n console.log(\n `Usage: rake-db [command] [arguments]\n\nCommands:\n create create databases\n drop drop databases\n reset drop, create and migrate databases\n g, generate generate migration file, see below\n migrate migrate pending migrations\n rollback rollback the last migrated\n no or unknown command prints this message\n \nMigrate arguments:\n no arguments run all pending migrations\n number run specific number of pending migrations\n\nRollback arguments:\n no arguments rollback one last applied migration\n number rollback specific number of applied migrations\n all rollback all applied migrations\n\nMigrate and rollback common arguments:\n --code run code updater, overrides \\`useCodeUpdater\\` option\n --code false do not run code updater\n \nGenerate arguments:\n- (required) first argument is migration name\n * create* template for create table\n * change* template for change table\n * add*To* template for add columns\n * remove*From* template for remove columns\n * drop* template for drop table\n\n- other arguments considered as columns with types and optional methods:\n rake-db g createTable id:serial.primaryKey name:text.nullable\n`,\n );\n"],"names":["path","__spreadValues","__spreadProps","Enquirer","readdir","singleQuote","quote","isRaw","getRaw","toArray","columnTypes","raw","createTable","getColumnTypes","getTableData","makeAst","astToQueries","ColumnType","emptyObject","resetTableData","changeTableData","TransactionAdapter","logParamToLogObject","createDb","createSchema","Adapter","db","mkdir","writeFile","method","columnsByType","instantiateColumn","codeToString","addCode","quoteObjectKey","primaryKeyToCode","indexToCode","foreignKeyToCode","TimestampColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/common.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/commands/createOrDrop.ts","../src/commands/generate.ts","../src/pull/dbStructure.ts","../src/pull/structureToAst.ts","../src/pull/astToMigration.ts","../src/pull/pull.ts","../src/rakeDb.ts"],"sourcesContent":["import {\n Adapter,\n AdapterOptions,\n DbResult,\n DefaultColumnTypes,\n NoPrimaryKeyOption,\n QueryLogOptions,\n singleQuote,\n} from 'pqb';\nimport Enquirer from 'enquirer';\nimport path from 'path';\nimport { readdir } from 'fs/promises';\nimport { RakeDbAst } from './ast';\n\ntype Db = DbResult<DefaultColumnTypes>;\n\nexport type RakeDbConfig = {\n migrationsPath: string;\n migrationsTable: string;\n commands: Record<\n string,\n (\n options: AdapterOptions[],\n config: RakeDbConfig,\n args: string[],\n ) => Promise<void>\n >;\n requireTs(path: string): Promise<void>;\n noPrimaryKey?: NoPrimaryKeyOption;\n appCodeUpdater?: AppCodeUpdater;\n useCodeUpdater?: boolean;\n beforeMigrate?(db: Db): Promise<void>;\n afterMigrate?(db: Db): Promise<void>;\n beforeRollback?(db: Db): Promise<void>;\n afterRollback?(db: Db): Promise<void>;\n} & QueryLogOptions;\n\nexport type AppCodeUpdater = (params: {\n ast: RakeDbAst;\n options: AdapterOptions;\n cache: object;\n}) => Promise<void>;\n\nexport const migrationConfigDefaults: RakeDbConfig = {\n migrationsPath: path.resolve('src', 'db', 'migrations'),\n migrationsTable: 'schemaMigrations',\n commands: {},\n requireTs: (path: string) => import(path),\n log: true,\n logger: console,\n useCodeUpdater: true,\n};\n\nexport const getMigrationConfigWithDefaults = (\n config: Partial<RakeDbConfig>,\n) => {\n return { ...migrationConfigDefaults, ...config };\n};\n\nexport const getDatabaseAndUserFromOptions = (\n options: AdapterOptions,\n): { database: string; user: string } => {\n if (options.databaseURL) {\n const url = new URL(options.databaseURL);\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.databaseURL) {\n const url = new URL(options.databaseURL);\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, databaseURL: 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: RakeDbConfig,\n) => {\n try {\n await db.query(\n `CREATE TABLE ${quoteWithSchema({\n name: 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: RakeDbConfig,\n up: boolean,\n): Promise<MigrationFile[]> => {\n const { migrationsPath } = config;\n\n let files: string[];\n try {\n files = await readdir(path.resolve(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.resolve(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 quoteWithSchema = ({\n schema,\n name,\n}: {\n schema?: string;\n name: string;\n}) => {\n return schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n};\n\nexport const getSchemaAndTableFromName = (\n name: string,\n): [string | undefined, string] => {\n const index = name.indexOf('.');\n return index !== -1\n ? [name.slice(0, index), name.slice(index + 1)]\n : [undefined, name];\n};\n\nexport const quoteSchemaTable = ({\n schema,\n name,\n}: {\n schema?: string;\n name: string;\n}) => {\n return singleQuote(schema ? `${schema}.${name}` : name);\n};\n","import { Migration } from './migration';\n\nlet currentMigration: Migration | undefined;\nlet currentPromise: Promise<void> | undefined;\nlet currentUp = true;\nlet currentChangeCallback: ChangeCallback | undefined;\n\nexport type ChangeCallback = (db: Migration, up: boolean) => Promise<void>;\n\nexport const change = (fn: ChangeCallback) => {\n if (!currentMigration) throw new Error('Database instance is not set');\n currentPromise = fn(currentMigration, currentUp);\n currentChangeCallback = fn;\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\nexport const getCurrentChangeCallback = () => currentChangeCallback;\n","import {\n ColumnType,\n ForeignKeyTable,\n ForeignKeyOptions,\n getRaw,\n isRaw,\n quote,\n Sql,\n TableData,\n toArray,\n} from 'pqb';\nimport { ColumnComment, Migration } from './migration';\nimport {\n getSchemaAndTableFromName,\n joinColumns,\n quoteWithSchema,\n} from '../common';\n\nexport const columnToSql = (\n key: string,\n item: ColumnType,\n values: unknown[],\n hasMultiplePrimaryKeys: boolean,\n): string => {\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 && !hasMultiplePrimaryKeys) {\n line.push('PRIMARY KEY');\n } else if (!item.data.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 { foreignKeys } = item.data;\n if (foreignKeys) {\n for (const foreignKey of foreignKeys) {\n const [schema, 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(schema, table, foreignKey.columns, foreignKey));\n }\n }\n\n return line.join(' ');\n};\n\nexport const addColumnIndex = (\n indexes: TableData.Index[],\n key: string,\n item: ColumnType,\n) => {\n if (item.data.indexes) {\n indexes.push(\n ...item.data.indexes.map((index) => ({\n columns: [{ ...index, column: key }],\n options: 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: (() => ForeignKeyTable) | string,\n): [string | undefined, string] => {\n if (typeof fnOrTable === 'string') {\n return getSchemaAndTableFromName(fnOrTable);\n }\n\n const item = new (fnOrTable())();\n return [item.schema, item.table];\n};\n\nexport const getForeignKeyName = (table: string, columns: string[]) => {\n return `${table}_${columns.join('_')}_fkey`;\n};\n\nexport const constraintToSql = (\n { name }: { schema?: string; name: string },\n up: boolean,\n foreignKey: TableData['foreignKeys'][number],\n) => {\n const constraintName =\n foreignKey.options.name || getForeignKeyName(name, foreignKey.columns);\n\n if (!up) {\n const { dropMode } = foreignKey.options;\n return `CONSTRAINT \"${constraintName}\"${dropMode ? ` ${dropMode}` : ''}`;\n }\n\n const [schema, table] = getForeignKeyTable(foreignKey.fnOrTable);\n return `CONSTRAINT \"${constraintName}\" FOREIGN KEY (${joinColumns(\n foreignKey.columns,\n )}) ${referencesToSql(\n schema,\n table,\n foreignKey.foreignColumns,\n foreignKey.options,\n )}`;\n};\n\nexport const referencesToSql = (\n schema: string | undefined,\n table: string,\n columns: string[],\n foreignKey: Pick<ForeignKeyOptions, 'match' | 'onDelete' | 'onUpdate'>,\n) => {\n const sql: string[] = [\n `REFERENCES ${quoteWithSchema({ schema, name: table })}(${joinColumns(\n columns,\n )})`,\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 getIndexName = (\n table: string,\n columns: TableData.Index['columns'],\n) => {\n return `${table}_${columns\n .map((it) =>\n 'column' in it\n ? it.column\n : it.expression.match(/\\w+/g)?.join('_') || 'expression',\n )\n .join('_')}_idx`;\n};\n\nexport const indexesToQuery = (\n up: boolean,\n { schema, name }: { schema?: string; name: string },\n indexes: TableData.Index[],\n): Sql[] => {\n return indexes.map(({ columns, options }) => {\n const indexName = options.name || getIndexName(name, columns);\n\n if (!up) {\n return {\n text: `DROP INDEX \"${indexName}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n values: [],\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 ${quoteWithSchema({ schema, name })}`);\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' in column ? `\"${column.column}\"` : `(${column.expression})`,\n ];\n\n if (column.collate) {\n columnSql.push(`COLLATE '${column.collate}'`);\n }\n\n if (column.opclass) {\n columnSql.push(column.opclass);\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 { text: sql.join(' '), values };\n });\n};\n\nexport const commentsToQuery = (\n schemaTable: { schema?: string; name: string },\n comments: ColumnComment[],\n): Sql[] => {\n return comments.map(({ column, comment }) => ({\n text: `COMMENT ON COLUMN ${quoteWithSchema(\n schemaTable,\n )}.\"${column}\" IS ${quote(comment)}`,\n values: [],\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.adapter.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.adapter.types,\n );\n\n return rows;\n};\n","import {\n ColumnsShape,\n columnTypes,\n getColumnTypes,\n getTableData,\n NoPrimaryKeyOption,\n quote,\n raw,\n Sql,\n TableData,\n} from 'pqb';\nimport {\n ColumnComment,\n ColumnsShapeCallback,\n MigrationBase,\n runCodeUpdater,\n TableOptions,\n} from './migration';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n indexesToQuery,\n primaryKeyToSql,\n} from './migrationUtils';\nimport { getSchemaAndTableFromName, quoteWithSchema } from '../common';\nimport { RakeDbAst } from '../ast';\n\nconst types = Object.assign(Object.create(columnTypes), {\n raw,\n});\n\nexport const createTable = async (\n migration: MigrationBase,\n up: boolean,\n tableName: string,\n options: TableOptions,\n fn: ColumnsShapeCallback,\n) => {\n const shape = getColumnTypes(types, fn);\n const tableData = getTableData();\n const ast = makeAst(\n up,\n tableName,\n shape,\n tableData,\n options,\n migration.options.noPrimaryKey,\n );\n\n validatePrimaryKey(ast);\n\n const queries = astToQueries(ast);\n for (const query of queries) {\n await migration.adapter.query(query);\n }\n\n await runCodeUpdater(migration, ast);\n};\n\nconst makeAst = (\n up: boolean,\n tableName: string,\n shape: ColumnsShape,\n tableData: TableData,\n options: TableOptions,\n noPrimaryKey?: NoPrimaryKeyOption,\n): RakeDbAst.Table => {\n const shapePKeys: string[] = [];\n for (const key in shape) {\n if (shape[key].isPrimaryKey) {\n shapePKeys.push(key);\n }\n }\n\n const primaryKey = tableData.primaryKey;\n\n const [schema, table] = getSchemaAndTableFromName(tableName);\n\n return {\n type: 'table',\n action: up ? 'create' : 'drop',\n schema,\n name: table,\n shape,\n ...tableData,\n primaryKey:\n shapePKeys.length <= 1\n ? primaryKey\n : primaryKey\n ? { ...primaryKey, columns: [...shapePKeys, ...primaryKey.columns] }\n : { columns: shapePKeys },\n ...options,\n noPrimaryKey: options.noPrimaryKey ? 'ignore' : noPrimaryKey || 'error',\n };\n};\n\nconst validatePrimaryKey = (ast: RakeDbAst.Table) => {\n if (ast.noPrimaryKey !== 'ignore') {\n let hasPrimaryKey = !!ast.primaryKey?.columns?.length;\n if (!hasPrimaryKey) {\n for (const key in ast.shape) {\n if (ast.shape[key].isPrimaryKey) {\n hasPrimaryKey = true;\n break;\n }\n }\n }\n\n if (!hasPrimaryKey) {\n const message = `Table ${ast.name} has no primary key`;\n if (ast.noPrimaryKey === 'error') {\n throw new Error(message);\n } else {\n console.warn(message);\n }\n }\n }\n};\n\nconst astToQueries = (ast: RakeDbAst.Table): Sql[] => {\n if (ast.action === 'drop') {\n return [\n {\n text: `DROP TABLE ${quoteWithSchema(ast)}${\n ast.dropMode ? ` ${ast.dropMode}` : ''\n }`,\n values: [],\n },\n ];\n }\n\n const lines: string[] = [];\n const values: unknown[] = [];\n const indexes: TableData.Index[] = [];\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n addColumnIndex(indexes, key, item);\n addColumnComment(comments, key, item);\n lines.push(`\\n ${columnToSql(key, item, values, !!ast.primaryKey)}`);\n }\n\n if (ast.primaryKey) {\n lines.push(`\\n ${primaryKeyToSql(ast.primaryKey)}`);\n }\n\n ast.foreignKeys.forEach((foreignKey) => {\n lines.push(`\\n ${constraintToSql(ast, true, foreignKey)}`);\n });\n\n indexes.push(...ast.indexes);\n\n const result: Sql[] = [\n {\n text: `CREATE TABLE ${quoteWithSchema(ast)} (${lines.join(',')}\\n)`,\n values,\n },\n ...indexesToQuery(true, ast, indexes),\n ...commentsToQuery(ast, comments),\n ];\n\n if (ast.comment) {\n result.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${quote(ast.comment)}`,\n values: [],\n });\n }\n\n return result;\n};\n","import {\n ColumnType,\n resetTableData,\n getTableData,\n EmptyObject,\n emptyObject,\n TableData,\n RawExpression,\n raw,\n columnTypes,\n Sql,\n quote,\n getRaw,\n isRaw,\n} from 'pqb';\nimport {\n ChangeTableCallback,\n ChangeTableOptions,\n ColumnComment,\n DropMode,\n MigrationBase,\n MigrationColumnTypes,\n runCodeUpdater,\n} from './migration';\nimport { RakeDbAst } from '../ast';\nimport { getSchemaAndTableFromName, quoteWithSchema } from '../common';\nimport {\n addColumnComment,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n indexesToQuery,\n primaryKeyToSql,\n} from './migrationUtils';\n\ntype ChangeTableData = { add: TableData; drop: TableData };\nconst newChangeTableData = (): ChangeTableData => ({\n add: { indexes: [], foreignKeys: [] },\n drop: { indexes: [], foreignKeys: [] },\n});\n\nlet changeTableData = newChangeTableData();\n\nconst resetChangeTableData = () => {\n changeTableData = newChangeTableData();\n};\n\nconst mergeTableData = (a: TableData, b: TableData) => {\n if (b.primaryKey) {\n if (!a.primaryKey) {\n a.primaryKey = b.primaryKey;\n } else {\n a.primaryKey = {\n columns: [...a.primaryKey.columns, ...b.primaryKey.columns],\n options: { ...a.primaryKey.options, ...b.primaryKey.options },\n };\n }\n }\n a.indexes = [...a.indexes, ...b.indexes];\n a.foreignKeys = [...a.foreignKeys, ...b.foreignKeys];\n};\n\nfunction add(\n item: ColumnType,\n options?: { dropMode?: DropMode },\n): RakeDbAst.ChangeTableItem.Column;\nfunction add(emptyObject: EmptyObject): EmptyObject;\nfunction add(\n items: Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): Record<string, RakeDbAst.ChangeTableItem.Column>;\nfunction add(\n item: ColumnType | EmptyObject | Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n):\n | RakeDbAst.ChangeTableItem.Column\n | EmptyObject\n | Record<string, RakeDbAst.ChangeTableItem.Column> {\n if (item instanceof ColumnType) {\n return { type: 'add', item, dropMode: options?.dropMode };\n } else if (item === emptyObject) {\n mergeTableData(changeTableData.add, getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item) {\n result[key] = {\n type: 'add',\n item: (item as Record<string, ColumnType>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n}\n\nconst drop = ((item, options) => {\n if (item instanceof ColumnType) {\n return { type: 'drop', item, dropMode: options?.dropMode };\n } else if (item === emptyObject) {\n mergeTableData(changeTableData.drop, getTableData());\n resetTableData();\n return emptyObject;\n } else {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item) {\n result[key] = {\n type: 'drop',\n item: (item as Record<string, ColumnType>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n}) as typeof add;\n\ntype Change = RakeDbAst.ChangeTableItem.Change & ChangeOptions;\n\ntype ChangeOptions = {\n usingUp?: RawExpression;\n usingDown?: RawExpression;\n};\n\nconst columnTypeToColumnChange = (\n item: ColumnType | Change,\n): RakeDbAst.ColumnChange => {\n if (item instanceof ColumnType) {\n const foreignKeys = item.data.foreignKeys;\n if (foreignKeys?.some((it) => 'fn' in it)) {\n throw new Error('Callback in foreignKey is not allowed in migration');\n }\n\n return {\n column: item,\n type: item.toSQL(),\n nullable: item.data.isNullable,\n primaryKey: item.isPrimaryKey,\n ...item.data,\n foreignKeys: foreignKeys as RakeDbAst.ColumnChange['foreignKeys'],\n };\n }\n\n return item.to;\n};\n\ntype TableChangeMethods = typeof tableChangeMethods;\nconst tableChangeMethods = {\n raw: raw,\n add,\n drop,\n change(\n from: ColumnType | Change,\n to: ColumnType | Change,\n options?: ChangeOptions,\n ): Change {\n return {\n type: 'change',\n from: columnTypeToColumnChange(from),\n to: columnTypeToColumnChange(to),\n ...options,\n };\n },\n default(value: unknown | RawExpression): Change {\n return { type: 'change', from: { default: null }, to: { default: value } };\n },\n nullable(): Change {\n return {\n type: 'change',\n from: { nullable: false },\n to: { nullable: true },\n };\n },\n nonNullable(): Change {\n return {\n type: 'change',\n from: { nullable: true },\n to: { nullable: false },\n };\n },\n comment(comment: string | null): Change {\n return { type: 'change', from: { comment: null }, to: { comment } };\n },\n rename(name: string): RakeDbAst.ChangeTableItem.Rename {\n return { type: 'rename', name };\n },\n};\n\nexport type TableChanger = MigrationColumnTypes & TableChangeMethods;\n\nexport type TableChangeData = Record<\n string,\n | RakeDbAst.ChangeTableItem.Column\n | RakeDbAst.ChangeTableItem.Rename\n | Change\n | EmptyObject\n>;\n\nexport const changeTable = async (\n migration: MigrationBase,\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 ast = makeAst(up, tableName, changeData, changeTableData, options);\n\n const queries = astToQueries(ast);\n for (const query of queries) {\n await migration.adapter.query(query);\n }\n\n await runCodeUpdater(migration, ast);\n};\n\nconst makeAst = (\n up: boolean,\n name: string,\n changeData: TableChangeData,\n changeTableData: ChangeTableData,\n options: ChangeTableOptions,\n): RakeDbAst.ChangeTable => {\n const { comment } = options;\n\n const shape: Record<string, RakeDbAst.ChangeTableItem> = {};\n for (const key in changeData) {\n const item = changeData[key];\n if ('type' in item) {\n if (up) {\n shape[key] =\n item.type === 'change' && item.usingUp\n ? { ...item, using: item.usingUp }\n : item;\n } else {\n if (item.type === 'rename') {\n shape[item.name] = { ...item, name: key };\n } else {\n shape[key] =\n item.type === 'add'\n ? { ...item, type: 'drop' }\n : item.type === 'drop'\n ? { ...item, type: 'add' }\n : item.type === 'change'\n ? { ...item, from: item.to, to: item.from, using: item.usingDown }\n : item;\n }\n }\n }\n }\n\n const [schema, table] = getSchemaAndTableFromName(name);\n\n return {\n type: 'changeTable',\n schema,\n name: table,\n comment: comment\n ? up\n ? Array.isArray(comment)\n ? comment[1]\n : comment\n : Array.isArray(comment)\n ? comment[0]\n : null\n : undefined,\n shape,\n ...(up\n ? changeTableData\n : { add: changeTableData.drop, drop: changeTableData.add }),\n };\n};\n\ntype PrimaryKeys = {\n columns: string[];\n change?: true;\n options?: { name?: string };\n};\n\nconst astToQueries = (ast: RakeDbAst.ChangeTable): Sql[] => {\n const result: Sql[] = [];\n\n if (ast.comment !== undefined) {\n result.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${quote(ast.comment)}`,\n values: [],\n });\n }\n\n const addPrimaryKeys: PrimaryKeys = ast.add.primaryKey\n ? { ...ast.add.primaryKey }\n : {\n columns: [],\n };\n const dropPrimaryKeys: PrimaryKeys = ast.drop.primaryKey\n ? { ...ast.drop.primaryKey }\n : {\n columns: [],\n };\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n\n if (item.type === 'add') {\n if (item.item.isPrimaryKey) {\n addPrimaryKeys.columns.push(key);\n }\n } else if (item.type === 'drop') {\n if (item.item.isPrimaryKey) {\n dropPrimaryKeys.columns.push(key);\n }\n } else if (item.type === 'change') {\n if (item.from.primaryKey) {\n dropPrimaryKeys.columns.push(key);\n dropPrimaryKeys.change = true;\n }\n\n if (item.to.primaryKey) {\n addPrimaryKeys.columns.push(key);\n addPrimaryKeys.change = true;\n }\n }\n }\n\n const alterTable: string[] = [];\n const values: unknown[] = [];\n const addIndexes: TableData.Index[] = [...ast.add.indexes];\n const dropIndexes: TableData.Index[] = [...ast.drop.indexes];\n const addForeignKeys: TableData.ForeignKey[] = [...ast.add.foreignKeys];\n const dropForeignKeys: TableData.ForeignKey[] = [...ast.drop.foreignKeys];\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n\n if (item.type === 'add') {\n addColumnIndex(addIndexes, key, item.item);\n addColumnComment(comments, key, item.item);\n\n alterTable.push(\n `ADD COLUMN ${columnToSql(\n key,\n item.item,\n values,\n addPrimaryKeys.columns.length > 1,\n )}`,\n );\n } else if (item.type === 'drop') {\n addColumnIndex(dropIndexes, key, item.item);\n\n alterTable.push(\n `DROP COLUMN \"${key}\"${item.dropMode ? ` ${item.dropMode}` : ''}`,\n );\n } else if (item.type === 'change') {\n const { from, to } = item;\n if (from.type !== to.type || from.collate !== to.collate) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" TYPE ${to.type}${\n to.collate ? ` COLLATE ${quote(to.collate)}` : ''\n }${item.using ? ` USING ${getRaw(item.using, values)}` : ''}`,\n );\n }\n\n if (from.default !== to.default) {\n const value =\n typeof to.default === 'object' && to.default && isRaw(to.default)\n ? getRaw(to.default, values)\n : quote(to.default);\n\n const expr =\n value === undefined ? 'DROP DEFAULT' : `SET DEFAULT ${value}`;\n\n alterTable.push(`ALTER COLUMN \"${key}\" ${expr}`);\n }\n\n if (from.nullable !== to.nullable) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" ${to.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n if (from.compression !== to.compression) {\n alterTable.push(\n `ALTER COLUMN \"${key}\" SET COMPRESSION ${\n to.compression || 'DEFAULT'\n }`,\n );\n }\n\n const foreignKeysLen = Math.max(\n from.foreignKeys?.length || 0,\n to.foreignKeys?.length || 0,\n );\n for (let i = 0; i < foreignKeysLen; i++) {\n const fromFkey = from.foreignKeys?.[i];\n const toFkey = to.foreignKeys?.[i];\n\n if (\n (fromFkey || toFkey) &&\n (!fromFkey ||\n !toFkey ||\n fromFkey.name !== toFkey.name ||\n fromFkey.match !== toFkey.match ||\n fromFkey.onUpdate !== toFkey.onUpdate ||\n fromFkey.onDelete !== toFkey.onDelete ||\n fromFkey.dropMode !== toFkey.dropMode ||\n fromFkey.table !== toFkey.table ||\n fromFkey.columns.join(',') !== toFkey.columns.join(','))\n ) {\n if (fromFkey) {\n dropForeignKeys.push({\n columns: [key],\n fnOrTable: fromFkey.table,\n foreignColumns: fromFkey.columns,\n options: fromFkey,\n });\n }\n\n if (toFkey) {\n addForeignKeys.push({\n columns: [key],\n fnOrTable: toFkey.table,\n foreignColumns: toFkey.columns,\n options: toFkey,\n });\n }\n }\n }\n\n const indexesLen = Math.max(\n from.indexes?.length || 0,\n to.indexes?.length || 0,\n );\n for (let i = 0; i < indexesLen; i++) {\n const fromIndex = from.indexes?.[i];\n const toIndex = to.indexes?.[i];\n\n if (\n (fromIndex || toIndex) &&\n (!fromIndex ||\n !toIndex ||\n fromIndex.collate !== toIndex.collate ||\n fromIndex.opclass !== toIndex.opclass ||\n fromIndex.order !== toIndex.order ||\n fromIndex.name !== toIndex.name ||\n fromIndex.unique !== toIndex.unique ||\n fromIndex.using !== toIndex.using ||\n fromIndex.include !== toIndex.include ||\n (Array.isArray(fromIndex.include) &&\n Array.isArray(toIndex.include) &&\n fromIndex.include.join(',') !== toIndex.include.join(',')) ||\n fromIndex.with !== toIndex.with ||\n fromIndex.tablespace !== toIndex.tablespace ||\n fromIndex.where !== toIndex.where ||\n fromIndex.dropMode !== toIndex.dropMode)\n ) {\n if (fromIndex) {\n dropIndexes.push({\n columns: [\n {\n column: key,\n ...fromIndex,\n },\n ],\n options: fromIndex,\n });\n }\n\n if (toIndex) {\n addIndexes.push({\n columns: [\n {\n column: key,\n ...toIndex,\n },\n ],\n options: toIndex,\n });\n }\n }\n }\n\n if (from.comment !== to.comment) {\n comments.push({ column: key, comment: to.comment || null });\n }\n } else if (item.type === 'rename') {\n alterTable.push(`RENAME COLUMN \"${key}\" TO \"${item.name}\"`);\n }\n }\n\n const prependAlterTable: string[] = [];\n\n if (\n ast.drop.primaryKey ||\n dropPrimaryKeys.change ||\n dropPrimaryKeys.columns.length > 1\n ) {\n const name = dropPrimaryKeys.options?.name || `${ast.name}_pkey`;\n prependAlterTable.push(`DROP CONSTRAINT \"${name}\"`);\n }\n\n prependAlterTable.push(\n ...dropForeignKeys.map(\n (foreignKey) => `\\n DROP ${constraintToSql(ast, false, foreignKey)}`,\n ),\n );\n\n alterTable.unshift(...prependAlterTable);\n\n if (\n ast.add.primaryKey ||\n addPrimaryKeys.change ||\n addPrimaryKeys.columns.length > 1\n ) {\n alterTable.push(`ADD ${primaryKeyToSql(addPrimaryKeys)}`);\n }\n\n alterTable.push(\n ...addForeignKeys.map(\n (foreignKey) => `\\n ADD ${constraintToSql(ast, true, foreignKey)}`,\n ),\n );\n\n if (alterTable.length) {\n result.push({\n text:\n `ALTER TABLE ${quoteWithSchema(ast)}` +\n `\\n ${alterTable.join(',\\n ')}`,\n values,\n });\n }\n\n result.push(...indexesToQuery(false, ast, dropIndexes));\n result.push(...indexesToQuery(true, ast, addIndexes));\n result.push(...commentsToQuery(ast, comments));\n\n return result;\n};\n","import {\n ColumnsShape,\n ColumnType,\n ColumnTypes,\n ForeignKeyOptions,\n IndexColumnOptions,\n IndexOptions,\n logParamToLogObject,\n MaybeArray,\n QueryInput,\n QueryLogObject,\n Sql,\n TransactionAdapter,\n raw,\n TextColumn,\n AdapterOptions,\n createDb,\n DbResult,\n DefaultColumnTypes,\n} from 'pqb';\nimport { createTable } from './createTable';\nimport { changeTable, TableChangeData, TableChanger } from './changeTable';\nimport {\n RakeDbConfig,\n quoteWithSchema,\n getSchemaAndTableFromName,\n} from '../common';\nimport { RakeDbAst } from '../ast';\n\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\nexport type TableOptions = {\n dropMode?: DropMode;\n comment?: string;\n noPrimaryKey?: boolean;\n};\n\ntype TextColumnCreator = () => TextColumn;\n\nexport type MigrationColumnTypes = Omit<ColumnTypes, 'text' | 'string'> & {\n text: TextColumnCreator;\n string: TextColumnCreator;\n};\n\nexport type ColumnsShapeCallback = (\n t: MigrationColumnTypes & { raw: typeof raw },\n) => ColumnsShape;\n\nexport type ChangeTableOptions = { comment?: string | [string, string] | null };\nexport type ChangeTableCallback = (t: TableChanger) => TableChangeData;\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 type Migration = DbResult<DefaultColumnTypes> & MigrationBase;\n\nexport const createMigrationInterface = (\n tx: TransactionAdapter,\n up: boolean,\n options: RakeDbConfig,\n adapterOptions: AdapterOptions,\n appCodeUpdaterCache: object,\n) => {\n const adapter = new TransactionAdapter(tx, tx.client, tx.types);\n const { query, arrays } = adapter;\n const log = logParamToLogObject(options.logger || console, options.log);\n\n adapter.query = ((q, types) => {\n return wrapWithLog(log, q, () => query.call(adapter, q, types));\n }) as typeof adapter.query;\n\n adapter.arrays = ((q, types) => {\n return wrapWithLog(log, q, () => arrays.call(adapter, q, types));\n }) as typeof adapter.arrays;\n\n const db = createDb({ adapter }) as unknown as Migration;\n\n const { prototype: proto } = MigrationBase;\n for (const key of Object.getOwnPropertyNames(proto)) {\n (db as unknown as Record<string, unknown>)[key] =\n proto[key as keyof typeof proto];\n }\n\n return Object.assign(db, {\n adapter,\n log,\n up,\n options,\n adapterOptions,\n appCodeUpdaterCache,\n });\n};\n\nexport class MigrationBase {\n public adapter!: TransactionAdapter;\n public log?: QueryLogObject;\n public up!: boolean;\n public options!: RakeDbConfig;\n public adapterOptions!: AdapterOptions;\n public appCodeUpdaterCache!: object;\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 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 [fromSchema, f] = getSchemaAndTableFromName(this.up ? from : to);\n const [toSchema, t] = getSchemaAndTableFromName(this.up ? to : from);\n const ast: RakeDbAst.RenameTable = {\n type: 'renameTable',\n fromSchema,\n from: f,\n toSchema,\n to: t,\n };\n\n await this.adapter.query(\n `ALTER TABLE ${quoteWithSchema({\n schema: ast.fromSchema,\n name: ast.from,\n })} RENAME TO ${quoteWithSchema({\n schema: ast.toSchema,\n name: ast.to,\n })}`,\n );\n\n await runCodeUpdater(this, ast);\n }\n\n addColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => ColumnType,\n ) {\n return addColumn(this, this.up, tableName, columnName, fn);\n }\n\n dropColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => 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, options);\n }\n\n dropExtension(\n name: string,\n options: { ifExists?: boolean; cascade?: boolean } = {},\n ) {\n return createExtension(this, !this.up, name, options);\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: MigrationBase,\n up: boolean,\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes) => ColumnType,\n) => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n [columnName]: t.add(fn(t)),\n }));\n};\n\nconst addIndex = (\n migration: MigrationBase,\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: MigrationBase,\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: MigrationBase,\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 = async (\n migration: MigrationBase,\n up: boolean,\n name: string,\n) => {\n const ast: RakeDbAst.Schema = {\n type: 'schema',\n action: up ? 'create' : 'drop',\n name,\n };\n\n await migration.adapter.query(\n `${ast.action === 'create' ? 'CREATE' : 'DROP'} SCHEMA \"${name}\"`,\n );\n\n await runCodeUpdater(migration, ast);\n};\n\nconst createExtension = async (\n migration: MigrationBase,\n up: boolean,\n name: string,\n options: ExtensionOptions & {\n checkExists?: boolean;\n },\n) => {\n const ast: RakeDbAst.Extension = {\n type: 'extension',\n action: up ? 'create' : 'drop',\n name,\n ...options,\n };\n\n let query;\n if (ast.action === 'drop') {\n query = `DROP EXTENSION${ast.ifNotExists ? ' IF EXISTS' : ''} \"${\n ast.name\n }\"${ast.cascade ? ' CASCADE' : ''}`;\n } else {\n query = `CREATE EXTENSION${ast.ifExists ? ' IF NOT EXISTS' : ''} \"${\n ast.name\n }\"${ast.schema ? ` SCHEMA \"${ast.schema}\"` : ''}${\n ast.version ? ` VERSION '${ast.version}'` : ''\n }${ast.cascade ? ' CASCADE' : ''}`;\n }\n\n await migration.adapter.query(query);\n\n await runCodeUpdater(migration, ast);\n};\n\nconst queryExists = (\n db: MigrationBase,\n sql: { text: string; values: unknown[] },\n) => {\n return db.adapter.query(sql).then(({ rowCount }) => rowCount > 0);\n};\n\nexport const runCodeUpdater = (migration: MigrationBase, ast: RakeDbAst) => {\n return migration.options.appCodeUpdater?.({\n ast,\n options: migration.adapterOptions,\n cache: migration.appCodeUpdaterCache,\n });\n};\n","import {\n Adapter,\n AdapterOptions,\n createDb,\n DbResult,\n DefaultColumnTypes,\n MaybeArray,\n toArray,\n} from 'pqb';\nimport {\n createSchemaMigrations,\n getMigrationFiles,\n RakeDbConfig,\n MigrationFile,\n quoteWithSchema,\n} from '../common';\nimport {\n getCurrentPromise,\n setCurrentMigrationUp,\n setCurrentMigration,\n ChangeCallback,\n change,\n getCurrentChangeCallback,\n} from '../migration/change';\nimport { createMigrationInterface } from '../migration/migration';\n\nconst getDb = (adapter: Adapter) => createDb({ adapter });\n\nconst migrateOrRollback = async (\n options: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n args: string[],\n up: boolean,\n) => {\n config = { ...config };\n const files = await getMigrationFiles(config, up);\n\n let count = up ? Infinity : 1;\n let argI = 0;\n const num = args[0] === 'all' ? Infinity : parseInt(args[0]);\n if (!isNaN(num)) {\n argI++;\n count = num;\n }\n\n const arg = args[argI];\n if (arg === '--code') {\n config.useCodeUpdater = args[argI + 1] !== 'false';\n }\n\n if (!config.useCodeUpdater) delete config.appCodeUpdater;\n\n const appCodeUpdaterCache = {};\n\n for (const opts of toArray(options)) {\n const adapter = new Adapter(opts);\n let db: DbResult<DefaultColumnTypes> | undefined;\n\n if (up) {\n await config.beforeMigrate?.((db ??= getDb(adapter)));\n } else {\n await config.beforeRollback?.((db ??= getDb(adapter)));\n }\n\n const migratedVersions = await getMigratedVersionsMap(adapter, 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(\n adapter,\n up,\n file,\n config,\n opts,\n appCodeUpdaterCache,\n );\n config.logger?.log(`${file.path} ${up ? 'migrated' : 'rolled back'}`);\n }\n\n if (up) {\n await config.afterMigrate?.((db ??= getDb(adapter)));\n } else {\n await config.afterRollback?.((db ??= getDb(adapter)));\n }\n } finally {\n await adapter.close();\n }\n // use appCodeUpdater only for the first provided options\n delete config.appCodeUpdater;\n }\n};\n\nconst changeCache: Record<string, ChangeCallback | undefined> = {};\n\nconst processMigration = async (\n db: Adapter,\n up: boolean,\n file: MigrationFile,\n config: RakeDbConfig,\n options: AdapterOptions,\n appCodeUpdaterCache: object,\n) => {\n await db.transaction(async (tx) => {\n const db = createMigrationInterface(\n tx,\n up,\n config,\n options,\n appCodeUpdaterCache,\n );\n setCurrentMigration(db);\n setCurrentMigrationUp(up);\n\n const callback = changeCache[file.path];\n if (callback) {\n change(callback);\n } else {\n await config.requireTs(file.path);\n changeCache[file.path] = getCurrentChangeCallback();\n }\n\n await getCurrentPromise();\n await (up ? saveMigratedVersion : removeMigratedVersion)(\n db.adapter,\n file.version,\n config,\n );\n });\n};\n\nconst saveMigratedVersion = async (\n db: Adapter,\n version: string,\n config: RakeDbConfig,\n) => {\n await db.query(\n `INSERT INTO ${quoteWithSchema({\n name: config.migrationsTable,\n })} VALUES ('${version}')`,\n );\n};\n\nconst removeMigratedVersion = async (\n db: Adapter,\n version: string,\n config: RakeDbConfig,\n) => {\n await db.query(\n `DELETE FROM ${quoteWithSchema({\n name: config.migrationsTable,\n })} WHERE version = '${version}'`,\n );\n};\n\nconst getMigratedVersionsMap = async (\n db: Adapter,\n config: RakeDbConfig,\n): Promise<Record<string, boolean>> => {\n try {\n const result = await db.arrays<[string]>(\n `SELECT * FROM ${quoteWithSchema({ name: 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: RakeDbConfig,\n args: string[] = [],\n) => migrateOrRollback(options, config, args, true);\n\nexport const rollback = (\n options: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n args: string[] = [],\n) => migrateOrRollback(options, config, args, false);\n","import { Adapter, AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport {\n getDatabaseAndUserFromOptions,\n setAdminCredentialsToOptions,\n setAdapterOptions,\n createSchemaMigrations,\n RakeDbConfig,\n migrationConfigDefaults,\n} from '../common';\nimport { migrate } from './migrateOrRollback';\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.close();\n }\n};\n\nconst createOrDrop = async (\n options: AdapterOptions,\n adminOptions: AdapterOptions,\n config: RakeDbConfig,\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.close();\n};\n\nexport const createDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\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\nexport const resetDb = async (\n arg: MaybeArray<AdapterOptions>,\n config: RakeDbConfig,\n) => {\n await dropDb(arg);\n await createDb(arg, config);\n await migrate(arg, config);\n};\n","import {\n getFirstWordAndRest,\n getTextAfterFrom,\n getTextAfterTo,\n RakeDbConfig,\n} from '../common';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\n\nexport const writeMigrationFile = async (\n config: RakeDbConfig,\n name: string,\n content: string,\n) => {\n await mkdir(path.resolve(config.migrationsPath), { recursive: true });\n\n const filePath = path.resolve(\n config.migrationsPath,\n `${makeFileTimeStamp()}_${name}.ts`,\n );\n await writeFile(filePath, content);\n console.log(`Created ${filePath}`);\n};\n\nexport const generate = async (config: RakeDbConfig, args: string[]) => {\n const name = args[0];\n if (!name) throw new Error('Migration name is missing');\n\n await writeMigrationFile(config, name, makeContent(name, args.slice(1)));\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 { Adapter } from 'pqb';\n\nexport namespace DbStructure {\n export type Table = {\n schemaName: string;\n name: string;\n comment?: string;\n };\n\n export type View = {\n schemaName: string;\n name: string;\n };\n\n export type Procedure = {\n schemaName: string;\n name: string;\n returnSet: boolean;\n returnType: string;\n kind: string;\n isTrigger: boolean;\n types: string[];\n argTypes: string[];\n argModes: ('i' | 'o')[];\n argNames?: string[];\n };\n\n export type Column = {\n schemaName: string;\n tableName: string;\n name: string;\n type: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n default?: string;\n isNullable: boolean;\n collation?: string;\n compression?: 'p' | 'l'; // p for pglz, l for lz4\n comment?: string;\n };\n\n export type Index = {\n schemaName: string;\n tableName: string;\n name: string;\n using: string;\n isUnique: boolean;\n columns: (({ column: string } | { expression: string }) & {\n collate?: string;\n opclass?: string;\n order?: string;\n })[];\n include?: string[];\n with?: string;\n tablespace?: string;\n where?: string;\n };\n\n // a = no action, r = restrict, c = cascade, n = set null, d = set default\n type ForeignKeyAction = 'a' | 'r' | 'c' | 'n' | 'd';\n\n export type ForeignKey = {\n schemaName: string;\n tableName: string;\n foreignTableSchemaName: string;\n foreignTableName: string;\n name: string;\n columnNames: string[];\n foreignColumnNames: string[];\n match: 'f' | 'p' | 's'; // FULL | PARTIAL | SIMPLE\n onUpdate: ForeignKeyAction;\n onDelete: ForeignKeyAction;\n };\n\n export type PrimaryKey = {\n schemaName: string;\n tableName: string;\n name: string;\n columnNames: string[];\n };\n\n export type Trigger = {\n schemaName: string;\n tableName: string;\n triggerSchema: string;\n name: string;\n events: string[];\n activation: string;\n condition?: string;\n definition: string;\n };\n\n export type Extension = {\n schemaName: string;\n name: string;\n version?: string;\n };\n}\n\nconst filterSchema = (table: string) =>\n `${table} !~ '^pg_' AND ${table} != 'information_schema'`;\n\nexport class DbStructure {\n constructor(private db: Adapter) {}\n\n async getSchemas(): Promise<string[]> {\n const { rows } = await this.db.arrays<[string]>(\n `SELECT n.nspname \"name\"\nFROM pg_catalog.pg_namespace n\nWHERE ${filterSchema('n.nspname')}\nORDER BY \"name\"`,\n );\n return rows.flat();\n }\n\n async getTables() {\n const { rows } = await this.db.query<DbStructure.Table>(\n `SELECT\n nspname AS \"schemaName\",\n relname AS \"name\",\n obj_description(c.oid) AS comment\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nWHERE relkind = 'r'\n AND ${filterSchema('nspname')}\nORDER BY relname`,\n );\n return rows;\n }\n\n async getViews() {\n const { rows } = await this.db.query<DbStructure.View[]>(\n `SELECT\n table_schema \"schemaName\",\n table_name \"name\"\nFROM information_schema.tables\nWHERE table_type = 'VIEW'\n AND ${filterSchema('table_schema')}\nORDER BY table_name`,\n );\n return rows;\n }\n\n async getProcedures() {\n const { rows } = await this.db.query<DbStructure.Procedure[]>(\n `SELECT\n n.nspname AS \"schemaName\",\n proname AS name,\n proretset AS \"returnSet\",\n (\n SELECT typname FROM pg_type WHERE oid = prorettype\n ) AS \"returnType\",\n prokind AS \"kind\",\n coalesce((\n SELECT true FROM information_schema.triggers\n WHERE n.nspname = trigger_schema AND trigger_name = proname\n LIMIT 1\n ), false) AS \"isTrigger\",\n coalesce((\n SELECT json_agg(pg_type.typname)\n FROM unnest(coalesce(proallargtypes, proargtypes)) typeId\n JOIN pg_type ON pg_type.oid = typeId\n ), '[]') AS \"types\",\n coalesce(to_json(proallargtypes::int[]), to_json(proargtypes::int[])) AS \"argTypes\",\n coalesce(to_json(proargmodes), '[]') AS \"argModes\",\n to_json(proargnames) AS \"argNames\"\nFROM pg_proc p\nJOIN pg_namespace n ON p.pronamespace = n.oid\nWHERE ${filterSchema('n.nspname')}`,\n );\n return rows;\n }\n\n async getColumns() {\n const { rows } = await this.db.query<DbStructure.Column>(\n `SELECT\n table_schema \"schemaName\",\n table_name \"tableName\",\n column_name \"name\",\n udt_name \"type\",\n character_maximum_length AS \"maxChars\",\n numeric_precision AS \"numericPrecision\",\n numeric_scale AS \"numericScale\",\n datetime_precision AS \"dateTimePrecision\",\n column_default \"default\",\n is_nullable::boolean \"isNullable\",\n collation_name AS \"collation\",\n NULLIF(a.attcompression, '') AS compression,\n pgd.description AS \"comment\"\nFROM information_schema.columns c\nLEFT JOIN pg_catalog.pg_statio_all_tables AS st\n ON c.table_schema = st.schemaname\n AND c.table_name = st.relname\nLEFT JOIN pg_catalog.pg_description pgd\n ON pgd.objoid = st.relid\n AND pgd.objsubid = c.ordinal_position\nLEFT JOIN pg_catalog.pg_attribute a\n ON a.attrelid = st.relid\n AND a.attnum = c.ordinal_position\nWHERE ${filterSchema('table_schema')}\nORDER BY c.ordinal_position`,\n );\n return rows;\n }\n\n async getIndexes() {\n const { rows } = await this.db.query<DbStructure.Index>(\n `SELECT\n n.nspname \"schemaName\",\n t.relname \"tableName\",\n ic.relname \"name\",\n am.amname AS \"using\",\n i.indisunique \"isUnique\",\n (\n SELECT json_agg(\n (\n CASE WHEN t.e = 0\n THEN jsonb_build_object('expression', pg_get_indexdef(i.indexrelid, t.i::int4, false))\n ELSE jsonb_build_object('column', (\n (\n SELECT attname\n FROM pg_catalog.pg_attribute\n WHERE attrelid = i.indrelid\n AND attnum = t.e\n )\n ))\n END\n ) || (\n CASE WHEN i.indcollation[t.i - 1] = 0\n THEN '{}'::jsonb\n ELSE (\n SELECT (\n CASE WHEN collname = 'default'\n THEN '{}'::jsonb\n ELSE jsonb_build_object('collate', collname)\n END\n )\n FROM pg_catalog.pg_collation\n WHERE oid = i.indcollation[t.i - 1]\n )\n END\n ) || (\n SELECT\n CASE WHEN opcdefault AND attoptions IS NULL\n THEN '{}'::jsonb\n ELSE jsonb_build_object(\n 'opclass', opcname || COALESCE('(' || array_to_string(attoptions, ', ') || ')', '')\n )\n END\n FROM pg_opclass\n LEFT JOIN pg_attribute\n ON attrelid = i.indexrelid\n AND attnum = t.i\n WHERE oid = i.indclass[t.i - 1]\n ) || (\n CASE WHEN i.indoption[t.i - 1] = 0\n THEN '{}'::jsonb\n ELSE jsonb_build_object(\n 'order',\n CASE\n WHEN i.indoption[t.i - 1] = 1 THEN 'DESC NULLS LAST'\n WHEN i.indoption[t.i - 1] = 2 THEN 'ASC NULLS FIRST'\n WHEN i.indoption[t.i - 1] = 3 THEN 'DESC'\n ELSE NULL\n END\n )\n END\n )\n )\n FROM unnest(i.indkey[:indnkeyatts - 1]) WITH ORDINALITY AS t(e, i)\n ) \"columns\",\n (\n SELECT json_agg(\n (\n SELECT attname\n FROM pg_catalog.pg_attribute\n WHERE attrelid = i.indrelid\n AND attnum = j.e\n )\n )\n FROM unnest(i.indkey[indnkeyatts:]) AS j(e)\n ) AS \"include\",\n NULLIF(pg_catalog.array_to_string(\n ic.reloptions || array(SELECT 'toast.' || x FROM pg_catalog.unnest(tc.reloptions) x),\n ', '\n ), '') AS \"with\",\n (\n SELECT tablespace\n FROM pg_indexes\n WHERE schemaname = n.nspname\n AND indexname = ic.relname\n ) AS tablespace,\n pg_get_expr(i.indpred, i.indrelid) AS \"where\"\nFROM pg_index i\nJOIN pg_class t ON t.oid = i.indrelid\nJOIN pg_namespace n ON n.oid = t.relnamespace\nJOIN pg_class ic ON ic.oid = i.indexrelid\nJOIN pg_am am ON am.oid = ic.relam\nLEFT JOIN pg_catalog.pg_class tc ON (ic.reltoastrelid = tc.oid)\nWHERE ${filterSchema('n.nspname')}\n AND NOT i.indisprimary\nORDER BY ic.relname`,\n );\n return rows;\n }\n\n async getForeignKeys() {\n const { rows } = await this.db.query<DbStructure.ForeignKey>(\n `SELECT\n s.nspname AS \"schemaName\",\n t.relname AS \"tableName\",\n fs.nspname AS \"foreignTableSchemaName\",\n ft.relname AS \"foreignTableName\",\n c.conname AS \"name\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.key_column_usage ccu\n WHERE ccu.constraint_name = c.conname\n AND ccu.table_schema = cs.nspname\n ) AS \"columnNames\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.constraint_column_usage ccu\n WHERE ccu.constraint_name = c.conname\n AND ccu.table_schema = cs.nspname\n ) AS \"foreignColumnNames\",\n c.confmatchtype AS match,\n c.confupdtype AS \"onUpdate\",\n c.confdeltype AS \"onDelete\"\nFROM pg_catalog.pg_constraint c\nJOIN pg_class t ON t.oid = conrelid\nJOIN pg_catalog.pg_namespace s ON s.oid = t.relnamespace\nJOIN pg_class ft ON ft.oid = confrelid\nJOIN pg_catalog.pg_namespace fs ON fs.oid = ft.relnamespace\nJOIN pg_catalog.pg_namespace cs ON cs.oid = c.connamespace\nWHERE contype = 'f'\nORDER BY c.conname`,\n );\n return rows;\n }\n\n async getPrimaryKeys() {\n const { rows } = await this.db.query<DbStructure.PrimaryKey>(\n `SELECT tc.table_schema AS \"schemaName\",\n tc.table_name AS \"tableName\",\n tc.constraint_name AS \"name\",\n json_agg(ccu.column_name) \"columnNames\"\nFROM information_schema.table_constraints tc\nJOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\nWHERE tc.constraint_type = 'PRIMARY KEY'\n AND ${filterSchema('tc.table_schema')}\nGROUP BY \"schemaName\", \"tableName\", \"name\"\nORDER BY \"name\"`,\n );\n return rows;\n }\n\n async getTriggers() {\n const { rows } = await this.db.query<DbStructure.Trigger>(\n `SELECT event_object_schema AS \"schemaName\",\n event_object_table AS \"tableName\",\n trigger_schema AS \"triggerSchema\",\n trigger_name AS name,\n json_agg(event_manipulation) AS events,\n action_timing AS activation,\n action_condition AS condition,\n action_statement AS definition\nFROM information_schema.triggers\nWHERE ${filterSchema('event_object_schema')}\nGROUP BY event_object_schema, event_object_table, trigger_schema, trigger_name, action_timing, action_condition, action_statement\nORDER BY trigger_name`,\n );\n return rows;\n }\n\n async getExtensions() {\n const { rows } = await this.db.query<DbStructure.Extension>(\n `SELECT\n nspname AS \"schemaName\",\n extname AS \"name\",\n extversion AS version\nFROM pg_extension\nJOIN pg_catalog.pg_namespace n ON n.oid = extnamespace\n AND ${filterSchema('n.nspname')}`,\n );\n return rows;\n }\n}\n","import { DbStructure } from './dbStructure';\nimport { RakeDbAst } from '../ast';\nimport {\n columnsByType,\n ColumnsShape,\n ForeignKeyOptions,\n instantiateColumn,\n singleQuote,\n TableData,\n} from 'pqb';\nimport { getForeignKeyName, getIndexName } from '../migration/migrationUtils';\n\nconst matchMap = {\n s: undefined,\n f: 'FULL',\n p: 'PARTIAL',\n};\n\nconst fkeyActionMap = {\n a: undefined, // default\n r: 'RESTRICT',\n c: 'CASCADE',\n n: 'SET NULL',\n d: 'SET DEFAULT',\n};\n\ntype Data = {\n schemas: string[];\n tables: DbStructure.Table[];\n columns: DbStructure.Column[];\n primaryKeys: DbStructure.PrimaryKey[];\n indexes: DbStructure.Index[];\n foreignKeys: DbStructure.ForeignKey[];\n extensions: DbStructure.Extension[];\n};\n\ntype PendingTables = Record<\n string,\n { table: DbStructure.Table; dependsOn: Set<string> }\n>;\n\nexport const structureToAst = async (db: DbStructure): Promise<RakeDbAst[]> => {\n const ast: RakeDbAst[] = [];\n\n const data = await getData(db);\n\n for (const name of data.schemas) {\n if (name === 'public') continue;\n\n ast.push({\n type: 'schema',\n action: 'create',\n name,\n });\n }\n\n const pendingTables: PendingTables = {};\n for (const table of data.tables) {\n const key = `${table.schemaName}.${table.name}`;\n const dependsOn = new Set<string>();\n\n for (const fk of data.foreignKeys) {\n if (fk.schemaName !== table.schemaName || fk.tableName !== table.name)\n continue;\n\n const otherKey = `${fk.foreignTableSchemaName}.${fk.foreignTableName}`;\n if (otherKey !== key) {\n dependsOn.add(otherKey);\n }\n }\n\n pendingTables[key] = { table, dependsOn };\n }\n\n for (const key in pendingTables) {\n const { table, dependsOn } = pendingTables[key];\n if (!dependsOn.size) {\n pushTableAst(ast, data, table, pendingTables);\n }\n }\n\n const outerFKeys: [DbStructure.ForeignKey, DbStructure.Table][] = [];\n\n for (const key in pendingTables) {\n const innerFKeys: DbStructure.ForeignKey[] = [];\n const { table } = pendingTables[key];\n\n for (const fkey of data.foreignKeys) {\n if (fkey.schemaName !== table.schemaName || fkey.tableName !== table.name)\n continue;\n\n const otherKey = `${fkey.foreignTableSchemaName}.${fkey.foreignTableName}`;\n if (!pendingTables[otherKey] || otherKey === key) {\n innerFKeys.push(fkey);\n } else {\n outerFKeys.push([fkey, table]);\n }\n }\n\n pushTableAst(ast, data, table, pendingTables, innerFKeys);\n }\n\n for (const [fkey, table] of outerFKeys) {\n ast.push({\n ...foreignKeyToAst(fkey),\n type: 'foreignKey',\n action: 'create',\n tableSchema: table.schemaName === 'public' ? undefined : table.schemaName,\n tableName: fkey.tableName,\n });\n }\n\n for (const it of data.extensions) {\n ast.push({\n type: 'extension',\n action: 'create',\n name: it.name,\n schema: it.schemaName === 'public' ? undefined : it.schemaName,\n version: it.version,\n });\n }\n\n return ast;\n};\n\nconst getData = async (db: DbStructure): Promise<Data> => {\n const [\n schemas,\n tables,\n columns,\n primaryKeys,\n indexes,\n foreignKeys,\n extensions,\n ] = await Promise.all([\n db.getSchemas(),\n db.getTables(),\n db.getColumns(),\n db.getPrimaryKeys(),\n db.getIndexes(),\n db.getForeignKeys(),\n db.getExtensions(),\n ]);\n\n return {\n schemas,\n tables,\n columns,\n primaryKeys,\n indexes,\n foreignKeys,\n extensions,\n };\n};\n\nconst makeBelongsToTable =\n (schema: string | undefined, table: string) =>\n (item: { schemaName: string; tableName: string }) =>\n item.schemaName === schema && item.tableName === table;\n\nconst getIsSerial = (item: DbStructure.Column) => {\n if (item.type === 'int2' || item.type === 'int4' || item.type === 'int8') {\n const { default: def, schemaName, tableName, name } = item;\n const seq = `${tableName}_${name}_seq`;\n if (\n def &&\n (def === `nextval(${singleQuote(`${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${seq}\"`)}::regclass)` ||\n def === `nextval(${singleQuote(`${schemaName}.${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${schemaName}\".${seq}`)}::regclass)` ||\n def === `nextval(${singleQuote(`${schemaName}.\"${seq}\"`)}::regclass)` ||\n def === `nextval(${singleQuote(`\"${schemaName}\".\"${seq}\"`)}::regclass)`)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst getColumnType = (item: DbStructure.Column, isSerial: boolean) => {\n if (isSerial) {\n return item.type === 'int2'\n ? 'smallserial'\n : item.type === 'int4'\n ? 'serial'\n : 'bigserial';\n }\n\n return item.type;\n};\n\nconst pushTableAst = (\n ast: RakeDbAst[],\n data: Data,\n table: DbStructure.Table,\n pendingTables: PendingTables,\n innerFKeys = data.foreignKeys,\n) => {\n const { schemaName, name } = table;\n\n const key = `${schemaName}.${table.name}`;\n delete pendingTables[key];\n\n if (name === 'schemaMigrations') return;\n\n const belongsToTable = makeBelongsToTable(schemaName, name);\n\n const columns = data.columns.filter(belongsToTable);\n const primaryKey = data.primaryKeys.find(belongsToTable);\n const tableIndexes = data.indexes.filter(belongsToTable);\n const tableForeignKeys = innerFKeys.filter(belongsToTable);\n\n const shape: ColumnsShape = {};\n for (let item of columns) {\n const isSerial = getIsSerial(item);\n if (isSerial) {\n item = { ...item, default: undefined };\n }\n\n const klass = columnsByType[getColumnType(item, isSerial)];\n if (!klass) {\n throw new Error(`Column type \\`${item.type}\\` is not supported`);\n }\n\n let column = instantiateColumn(klass, item);\n\n if (\n primaryKey?.columnNames.length === 1 &&\n primaryKey?.columnNames[0] === item.name\n ) {\n column = column.primaryKey();\n }\n\n const indexes = tableIndexes.filter(\n (it) =>\n it.columns.length === 1 &&\n 'column' in it.columns[0] &&\n it.columns[0].column === item.name,\n );\n for (const index of indexes) {\n const options = index.columns[0];\n column = column.index({\n collate: options.collate,\n opclass: options.opclass,\n order: options.order,\n name:\n index.name !== getIndexName(name, index.columns)\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.isUnique,\n include: index.include,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n });\n }\n\n const foreignKeys = tableForeignKeys.filter(\n (it) => it.columnNames.length === 1 && it.columnNames[0] === item.name,\n );\n for (const foreignKey of foreignKeys) {\n column = column.foreignKey(\n foreignKey.foreignTableName,\n foreignKey.foreignColumnNames[0],\n {\n name:\n foreignKey.name &&\n foreignKey.name !== getForeignKeyName(name, foreignKey.columnNames)\n ? foreignKey.name\n : undefined,\n match: matchMap[foreignKey.match],\n onUpdate: fkeyActionMap[foreignKey.onUpdate],\n onDelete: fkeyActionMap[foreignKey.onDelete],\n } as ForeignKeyOptions,\n );\n }\n\n shape[item.name] = column;\n }\n\n ast.push({\n type: 'table',\n action: 'create',\n schema: schemaName === 'public' ? undefined : schemaName,\n comment: table.comment,\n name: name,\n shape,\n noPrimaryKey: primaryKey ? 'error' : 'ignore',\n primaryKey:\n primaryKey && primaryKey.columnNames.length > 1\n ? {\n columns: primaryKey.columnNames,\n options:\n primaryKey.name === `${name}_pkey`\n ? undefined\n : { name: primaryKey.name },\n }\n : undefined,\n indexes: tableIndexes\n .filter(\n (index) =>\n index.columns.length > 1 ||\n index.columns.some((it) => 'expression' in it),\n )\n .map((index) => ({\n columns: index.columns.map((it) => ({\n ...('column' in it\n ? { column: it.column }\n : { expression: it.expression }),\n collate: it.collate,\n opclass: it.opclass,\n order: it.order,\n })),\n options: {\n name:\n index.name !== getIndexName(name, index.columns)\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.isUnique,\n include: index.include,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n },\n })),\n foreignKeys: tableForeignKeys\n .filter((it) => it.columnNames.length > 1)\n .map(foreignKeyToAst),\n });\n\n for (const otherKey in pendingTables) {\n const item = pendingTables[otherKey];\n if (item.dependsOn.delete(key) && item.dependsOn.size === 0) {\n pushTableAst(ast, data, item.table, pendingTables);\n }\n }\n};\n\nconst foreignKeyToAst = (\n fkey: DbStructure.ForeignKey,\n): TableData.ForeignKey => ({\n columns: fkey.columnNames,\n fnOrTable: fkey.foreignTableName,\n foreignColumns: fkey.foreignColumnNames,\n options: {\n name:\n fkey.name &&\n fkey.name !== getForeignKeyName(fkey.tableName, fkey.columnNames)\n ? fkey.name\n : undefined,\n match: matchMap[fkey.match],\n onUpdate: fkeyActionMap[fkey.onUpdate],\n onDelete: fkeyActionMap[fkey.onDelete],\n } as ForeignKeyOptions,\n});\n","import { RakeDbAst } from '../ast';\nimport {\n addCode,\n Code,\n codeToString,\n ColumnType,\n foreignKeyArgsToCode,\n foreignKeyToCode,\n indexToCode,\n isRaw,\n primaryKeyToCode,\n quoteObjectKey,\n singleQuote,\n TimestampColumn,\n} from 'pqb';\nimport { quoteSchemaTable } from '../common';\n\nexport const astToMigration = (ast: RakeDbAst[]): string | undefined => {\n const code: Code[] = [];\n for (const item of ast) {\n if (item.type === 'schema' && item.action === 'create') {\n code.push(createSchema(item));\n } else if (item.type === 'extension' && item.action === 'create') {\n if (code.length) code.push([]);\n code.push(...createExtension(item));\n } else if (item.type === 'table' && item.action === 'create') {\n if (code.length) code.push([]);\n code.push(...createTable(item));\n } else if (item.type === 'foreignKey') {\n if (code.length) code.push([]);\n code.push(...createForeignKey(item));\n }\n }\n\n if (!code.length) return;\n\n return `import { change } from 'rake-db';\n\nchange(async (db) => {\n${codeToString(code, ' ', ' ')}\n});\n`;\n};\n\nconst createSchema = (ast: RakeDbAst.Schema) => {\n return `await db.createSchema(${singleQuote(ast.name)});`;\n};\n\nconst createExtension = (ast: RakeDbAst.Extension): Code[] => {\n const code: Code[] = [`await db.createExtension(${singleQuote(ast.name)}`];\n if (ast.schema || ast.version) {\n addCode(code, ', {');\n if (ast.schema) {\n code.push([`schema: ${singleQuote(ast.schema)},`]);\n }\n if (ast.version) {\n code.push([`version: ${singleQuote(ast.version)},`]);\n }\n addCode(code, '}');\n }\n addCode(code, ')');\n return code;\n};\n\nconst createTable = (ast: RakeDbAst.Table) => {\n const code: Code[] = [];\n addCode(code, `await db.createTable(${quoteSchemaTable(ast)}, (t) => ({`);\n\n const hasTimestamps =\n isTimestamp(ast.shape.createdAt) && isTimestamp(ast.shape.updatedAt);\n\n for (const key in ast.shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n const line: Code[] = [`${quoteObjectKey(key)}: `];\n for (const part of ast.shape[key].toCode('t')) {\n addCode(line, part);\n }\n addCode(line, ',');\n code.push(line);\n }\n\n if (hasTimestamps) {\n code.push(['...t.timestamps(),']);\n }\n\n if (ast.primaryKey) {\n code.push([primaryKeyToCode(ast.primaryKey, 't')]);\n }\n\n for (const index of ast.indexes) {\n code.push(indexToCode(index, 't'));\n }\n\n for (const foreignKey of ast.foreignKeys) {\n code.push(foreignKeyToCode(foreignKey, 't'));\n }\n\n addCode(code, '}));');\n\n return code;\n};\n\nconst isTimestamp = (column?: ColumnType) => {\n if (!column) return false;\n\n const { default: def } = column.data;\n return (\n column instanceof TimestampColumn &&\n !column.data.isNullable &&\n def &&\n typeof def === 'object' &&\n isRaw(def) &&\n def.__raw === 'now()'\n );\n};\n\nconst createForeignKey = (item: RakeDbAst.ForeignKey): Code[] => {\n return [\n `await db.addForeignKey(`,\n [\n `${quoteSchemaTable({\n schema: item.tableSchema,\n name: item.tableName,\n })},`,\n ...foreignKeyArgsToCode(item),\n ],\n ');',\n ];\n};\n","import { RakeDbConfig } from '../common';\nimport { Adapter, AdapterOptions } from 'pqb';\nimport { DbStructure } from './dbStructure';\nimport { structureToAst } from './structureToAst';\nimport { astToMigration } from './astToMigration';\nimport { writeMigrationFile } from '../commands/generate';\n\nexport const pullDbStructure = async (\n options: AdapterOptions,\n config: RakeDbConfig,\n) => {\n const adapter = new Adapter(options);\n const db = new DbStructure(adapter);\n const ast = await structureToAst(db);\n\n await adapter.close();\n\n const result = astToMigration(ast);\n if (!result) return;\n\n await writeMigrationFile(config, 'pull', result);\n};\n","import { AdapterOptions, MaybeArray, toArray } from 'pqb';\nimport { createDb, dropDb, resetDb } from './commands/createOrDrop';\nimport { migrate, rollback } from './commands/migrateOrRollback';\nimport { getMigrationConfigWithDefaults, RakeDbConfig } from './common';\nimport { generate } from './commands/generate';\nimport { pullDbStructure } from './pull/pull';\n\nexport const rakeDb = async (\n options: MaybeArray<AdapterOptions>,\n partialConfig: Partial<RakeDbConfig> = {},\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 === 'reset') {\n await resetDb(options, config);\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 if (command === 'pull') {\n await pullDbStructure(toArray(options)[0], config);\n } else if (config.commands[command]) {\n await config.commands[command](toArray(options), config, args.slice(1));\n } else {\n printHelp();\n }\n};\n\nconst printHelp = () =>\n console.log(\n `Usage: rake-db [command] [arguments]\n\nCommands:\n create create databases\n drop drop databases\n reset drop, create and migrate databases\n g, generate generate migration file, see below\n migrate migrate pending migrations\n rollback rollback the last migrated\n no or unknown command prints this message\n \nMigrate arguments:\n no arguments run all pending migrations\n number run specific number of pending migrations\n\nRollback arguments:\n no arguments rollback one last applied migration\n number rollback specific number of applied migrations\n all rollback all applied migrations\n\nMigrate and rollback common arguments:\n --code run code updater, overrides \\`useCodeUpdater\\` option\n --code false do not run code updater\n \nGenerate arguments:\n- (required) first argument is migration name\n * create* template for create table\n * change* template for change table\n * add*To* template for add columns\n * remove*From* template for remove columns\n * drop* template for drop table\n\n- other arguments considered as columns with types and optional methods:\n rake-db g createTable id:serial.primaryKey name:text.nullable\n`,\n );\n"],"names":["path","__spreadValues","__spreadProps","Enquirer","readdir","singleQuote","quote","isRaw","getRaw","toArray","columnTypes","raw","createTable","getColumnTypes","getTableData","makeAst","astToQueries","ColumnType","emptyObject","resetTableData","changeTableData","TransactionAdapter","logParamToLogObject","createDb","createSchema","createExtension","Adapter","db","mkdir","writeFile","method","columnsByType","instantiateColumn","codeToString","addCode","quoteObjectKey","primaryKeyToCode","indexToCode","foreignKeyToCode","TimestampColumn","foreignKeyArgsToCode"],"mappings":"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"}
|