rake-db 2.27.22 → 2.27.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/errors.ts","../src/migration/change.ts","../src/migration/migration.utils.ts","../src/migration/tableMethods.ts","../src/migration/createTable.ts","../src/migration/changeTable.ts","../src/migration/createView.ts","../src/migration/migration.ts","../src/commands/newMigration.ts","../src/commands/changeIds.ts","../src/migration/migrationsSet.ts","../src/migration/manageMigratedVersions.ts","../src/migration/migrationsTable.ts","../src/commands/migrateOrRollback.ts","../src/common.ts","../src/config.ts","../src/prompt.ts","../src/commands/createOrDrop.ts","../src/commands/recurrent.ts","../src/generate/dbStructure.ts","../src/generate/structureToAst.ts","../src/generate/astToGenerateItems.ts","../src/generate/astToMigration.ts","../src/generate/pull.ts","../src/commands/rebase.ts","../src/commands/listMigrationsStatuses.ts","../src/commands.ts","../src/rake-db.ts","../src/migration/migrate/migrate.ts"],"sourcesContent":["export class RakeDbError extends Error {}\n\nexport class NoPrimaryKey extends RakeDbError {}\n","import { DbMigration } from './migration';\nimport { RakeDbConfig } from '../config';\nimport { ColumnSchemaConfig } from 'pqb';\n\nexport interface MigrationChange {\n fn: ChangeCallback<unknown>;\n config: RakeDbConfig<ColumnSchemaConfig, unknown>;\n}\n\nlet currentChanges: MigrationChange[] = [];\n\nexport type ChangeCallback<CT> = (\n db: DbMigration<CT>,\n up: boolean,\n) => Promise<void>;\n\nexport const clearChanges = () => {\n currentChanges = [];\n};\n\nexport const getCurrentChanges = () => currentChanges;\nexport const pushChange = (change: MigrationChange) =>\n currentChanges.push(change);\n","import {\n ArrayColumn,\n ColumnType,\n DomainColumn,\n escapeForMigration,\n TableData,\n ColumnDataCheckBase,\n ColumnTypeBase,\n ForeignKeyTable,\n isRawSQL,\n RawSQLBase,\n SingleSql,\n toArray,\n toCamelCase,\n toSnakeCase,\n} from 'pqb';\nimport { ColumnComment } from './migration';\nimport {\n getSchemaAndTableFromName,\n joinColumns,\n quoteCustomType,\n quoteNameFromString,\n quoteTable,\n quoteWithSchema,\n} from '../common';\nimport { AnyRakeDbConfig } from '../config';\nimport { TableQuery } from './createTable';\n\nexport const versionToString = (\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n version: number,\n) =>\n config.migrationId === 'timestamp'\n ? `${version}`\n : `${version}`.padStart(config.migrationId.serial, '0');\n\nexport const columnTypeToSql = (item: ColumnTypeBase) => {\n return item.data.isOfCustomType\n ? item instanceof DomainColumn\n ? quoteNameFromString(item.dataType)\n : quoteCustomType(item.toSQL())\n : item.toSQL();\n};\n\nexport const getColumnName = (\n item: { data: { name?: string } },\n key: string,\n snakeCase: boolean | undefined,\n) => {\n return item.data.name || (snakeCase ? toSnakeCase(key) : key);\n};\n\nexport const columnToSql = (\n name: string,\n item: ColumnType,\n values: unknown[],\n hasMultiplePrimaryKeys: boolean,\n snakeCase: boolean | undefined,\n): string => {\n const line = [`\"${name}\" ${columnTypeToSql(item)}`];\n\n if (item.data.compression) {\n line.push(`COMPRESSION ${item.data.compression}`);\n }\n\n if (item.data.collate) {\n line.push(`COLLATE ${quoteNameFromString(item.data.collate)}`);\n }\n\n if (item.data.identity) {\n line.push(identityToSql(item.data.identity));\n } else if (item.data.generated) {\n line.push(\n `GENERATED ALWAYS AS (${item.data.generated.toSQL({\n values,\n snakeCase,\n })}) STORED`,\n );\n }\n\n if (item.data.primaryKey && !hasMultiplePrimaryKeys) {\n if (item.data.primaryKey !== (true as never)) {\n line.push(`CONSTRAINT \"${item.data.primaryKey}\"`);\n }\n line.push('PRIMARY KEY');\n } else if (!item.data.isNullable) {\n line.push('NOT NULL');\n }\n\n if (item.data.checks) {\n line.push(\n item.data.checks\n .map(\n (check) =>\n (check.name ? `CONSTRAINT \"${check.name}\" ` : '') +\n checkToSql(check.sql, values),\n )\n .join(', '),\n );\n }\n\n const def = encodeColumnDefault(item.data.default, values, item);\n if (def !== null) line.push(`DEFAULT ${def}`);\n\n const { foreignKeys } = item.data;\n if (foreignKeys) {\n for (const foreignKey of foreignKeys) {\n if (foreignKey.options?.name) {\n line.push(`CONSTRAINT \"${foreignKey.options?.name}\"`);\n }\n\n line.push(\n referencesToSql(\n {\n columns: [name],\n ...foreignKey,\n },\n snakeCase,\n ),\n );\n }\n }\n\n return line.join(' ');\n};\n\nexport const encodeColumnDefault = (\n def: unknown,\n values: unknown[],\n column?: ColumnTypeBase,\n): string | null => {\n if (def !== undefined && def !== null && typeof def !== 'function') {\n if (isRawSQL(def)) {\n return def.toSQL({ values });\n } else {\n return escapeForMigration(\n column instanceof ArrayColumn && Array.isArray(def)\n ? '{' +\n (column.data.item.data.encode\n ? def.map((x) => column.data.item.data.encode(x))\n : def\n ).join(',') +\n '}'\n : column?.data.encode\n ? column.data.encode(def)\n : def,\n );\n }\n }\n\n return null;\n};\n\nexport const identityToSql = (identity: TableData.Identity) => {\n const options = sequenceOptionsToSql(identity);\n return `GENERATED ${identity.always ? 'ALWAYS' : 'BY DEFAULT'} AS IDENTITY${\n options ? ` (${options})` : ''\n }`;\n};\n\nconst sequenceOptionsToSql = (item: TableData.SequenceOptions) => {\n const line: string[] = [];\n if (item.dataType) line.push(`AS ${item.dataType}`);\n if (item.increment !== undefined) line.push(`INCREMENT BY ${item.increment}`);\n if (item.min !== undefined) line.push(`MINVALUE ${item.min}`);\n if (item.max !== undefined) line.push(`MAXVALUE ${item.max}`);\n if (item.start !== undefined) line.push(`START WITH ${item.start}`);\n if (item.cache !== undefined) line.push(`CACHE ${item.cache}`);\n if (item.cycle) line.push(`CYCLE`);\n if (item.ownedBy) {\n const [schema, table] = getSchemaAndTableFromName(item.ownedBy);\n line.push(`OWNED BY ${quoteTable(schema, table)}`);\n }\n return line.join(' ');\n};\n\nexport const addColumnIndex = (\n indexes: TableData.Index[],\n name: string,\n item: ColumnType,\n) => {\n if (item.data.indexes) {\n indexes.push(\n ...item.data.indexes.map((index) => ({\n columns: [{ ...index.options, column: name }],\n ...index,\n })),\n );\n }\n};\n\nexport const addColumnExclude = (\n excludes: TableData.Exclude[],\n name: string,\n item: ColumnType,\n) => {\n if (item.data.excludes) {\n excludes.push(\n ...item.data.excludes.map(({ with: w, ...exclude }) => ({\n columns: [{ ...exclude.options, column: name, with: w }],\n ...exclude,\n })),\n );\n }\n};\n\nexport const addColumnComment = (\n comments: ColumnComment[],\n name: string,\n item: ColumnType,\n) => {\n if (item.data.comment) {\n comments.push({ column: name, 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 getConstraintName = (\n table: string,\n constraint: {\n references?: { columns: string[] };\n check?: unknown;\n identity?: unknown;\n },\n snakeCase: boolean | undefined,\n) => {\n if (constraint.references) {\n let { columns } = constraint.references;\n if (snakeCase) {\n columns = columns.map(toSnakeCase);\n }\n return makeConstraintName(table, columns, 'fkey');\n }\n if (constraint.check) return `${table}_check`;\n if (constraint.identity) return `${table}_identity`;\n return `${table}_constraint`;\n};\n\nexport const constraintToSql = (\n { name }: { schema?: string; name: string },\n up: boolean,\n constraint: TableData.Constraint,\n values: unknown[],\n snakeCase: boolean | undefined,\n) => {\n const constraintName =\n constraint.name || getConstraintName(name, constraint, snakeCase);\n\n if (!up) {\n const { dropMode } = constraint;\n return `CONSTRAINT \"${constraintName}\"${dropMode ? ` ${dropMode}` : ''}`;\n }\n\n const sql = [`CONSTRAINT \"${constraintName}\"`];\n\n if (constraint.references) {\n sql.push(foreignKeyToSql(constraint.references, snakeCase));\n }\n\n if (constraint.check) {\n sql.push(checkToSql(constraint.check, values));\n }\n\n return sql.join(' ');\n};\n\nconst checkToSql = (check: RawSQLBase, values: unknown[]) => {\n return `CHECK (${check.toSQL({ values })})`;\n};\n\nconst foreignKeyToSql = (item: TableData.References, snakeCase?: boolean) => {\n return `FOREIGN KEY (${joinColumns(\n snakeCase ? item.columns.map(toSnakeCase) : item.columns,\n )}) ${referencesToSql(item, snakeCase)}`;\n};\n\nexport const referencesToSql = (\n references: TableData.References,\n snakeCase: boolean | undefined,\n) => {\n const [schema, table] = getForeignKeyTable(references.fnOrTable);\n\n const sql: string[] = [\n `REFERENCES ${quoteTable(schema, table)}(${joinColumns(\n snakeCase\n ? references.foreignColumns.map(toSnakeCase)\n : references.foreignColumns,\n )})`,\n ];\n\n const { options } = references;\n if (options?.match) {\n sql.push(`MATCH ${options?.match.toUpperCase()}`);\n }\n\n if (options?.onDelete) {\n sql.push(`ON DELETE ${options?.onDelete.toUpperCase()}`);\n }\n\n if (options?.onUpdate) {\n sql.push(`ON UPDATE ${options?.onUpdate.toUpperCase()}`);\n }\n\n return sql.join(' ');\n};\n\nconst MAX_CONSTRAINT_NAME_LEN = 63;\nconst makeConstraintName = (\n table: string,\n columns: string[],\n suffix: string,\n) => {\n const long = `${table}_${columns.join('_')}_${suffix}`;\n if (long.length <= MAX_CONSTRAINT_NAME_LEN) return long;\n\n for (let partLen = 3; partLen > 0; partLen--) {\n const shorter = `${toCamelCase(\n toSnakeCase(table)\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n )}_${columns\n .map((c) =>\n toCamelCase(\n c\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n ),\n )\n .join('_')}_${suffix}`;\n\n if (shorter.length <= MAX_CONSTRAINT_NAME_LEN) return shorter;\n }\n\n const short = `${table}_${columns.length}columns_${suffix}`;\n if (short.length <= MAX_CONSTRAINT_NAME_LEN) return short;\n\n for (let partLen = 3; partLen > 0; partLen--) {\n const short = `${toCamelCase(\n toSnakeCase(table)\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n )}_${columns.length}columns_${suffix}`;\n\n if (short.length <= MAX_CONSTRAINT_NAME_LEN) return short;\n }\n\n return `long_ass_table_${suffix}`;\n};\n\nconst getIndexOrExcludeName = (\n table: string,\n columns: ({ column?: string } | { expression: string })[],\n suffix: string,\n): string =>\n makeConstraintName(\n table,\n columns.map((it) =>\n 'column' in it ? (it.column as string) : 'expression',\n ),\n suffix,\n );\n\nexport interface GetIndexOrExcludeName {\n (\n table: string,\n columns: ({ column?: string } | { expression: string })[],\n ): string;\n}\n\nexport const getIndexName: GetIndexOrExcludeName = (table, columns) =>\n getIndexOrExcludeName(table, columns, 'idx');\n\nexport const getExcludeName: GetIndexOrExcludeName = (table, columns) =>\n getIndexOrExcludeName(table, columns, 'exclude');\n\nexport const indexesToQuery = (\n up: boolean,\n { schema, name: tableName }: { schema?: string; name: string },\n indexes: TableData.Index[],\n snakeCase: boolean | undefined,\n language?: string,\n): SingleSql[] => {\n return indexes.map((index) => {\n const { options } = index;\n\n const { columns, include, name } = getIndexOrExcludeMainOptions(\n tableName,\n index,\n getIndexName,\n snakeCase,\n );\n\n if (!up) {\n return {\n text: `DROP INDEX \"${name}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n };\n }\n\n const values: unknown[] = [];\n\n const sql: string[] = ['CREATE'];\n\n if (options.unique) {\n sql.push('UNIQUE');\n }\n\n sql.push(`INDEX \"${name}\" ON ${quoteTable(schema, tableName)}`);\n\n const u = options.using || (options.tsVector && 'GIN');\n if (u) {\n sql.push(`USING ${u}`);\n }\n\n const lang =\n options.tsVector && options.languageColumn\n ? `\"${options.languageColumn}\"`\n : options.language\n ? `'${options.language}'`\n : `'${language || 'english'}'`;\n\n let hasWeight =\n options.tsVector && columns.some((column) => !!column.weight);\n\n const columnsSql = columns.map((column) => {\n let sql = [\n 'expression' in column\n ? `(${column.expression})`\n : `\"${column.column}\"`,\n column.collate && `COLLATE ${quoteNameFromString(column.collate)}`,\n column.opclass,\n column.order,\n ]\n .filter((x): x is string => !!x)\n .join(' ');\n\n if (hasWeight) {\n sql = `to_tsvector(${lang}, coalesce(${sql}, ''))`;\n\n if (column.weight) {\n hasWeight = true;\n sql = `setweight(${sql}, '${column.weight}')`;\n }\n }\n\n return sql;\n });\n\n let columnList;\n if (hasWeight) {\n columnList = `(${columnsSql.join(' || ')})`;\n } else if (options.tsVector) {\n columnList = `to_tsvector(${lang}, ${columnsSql.join(\" || ' ' || \")})`;\n } else {\n columnList = columnsSql.join(', ');\n }\n\n sql.push(`(${columnList})`);\n\n if (include && include.length) {\n sql.push(\n `INCLUDE (${include.map((column) => `\"${column}\"`).join(', ')})`,\n );\n }\n\n if (options.nullsNotDistinct) {\n sql.push(`NULLS NOT DISTINCT`);\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 isRawSQL(options.where)\n ? options.where.toSQL({ values })\n : options.where\n }`,\n );\n }\n\n return { text: sql.join(' '), values };\n });\n};\n\nexport const excludesToQuery = (\n up: boolean,\n { schema, name: tableName }: { schema?: string; name: string },\n excludes: TableData.Exclude[],\n snakeCase: boolean | undefined,\n): SingleSql[] => {\n return excludes.map((exclude) => {\n const { options } = exclude;\n\n const { columns, include, name } = getIndexOrExcludeMainOptions(\n tableName,\n exclude,\n getExcludeName,\n snakeCase,\n );\n\n if (!up) {\n return {\n text: `ALTER TABLE ${quoteTable(\n schema,\n tableName,\n )} DROP CONSTRAINT \"${name}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n };\n }\n\n const columnList = columns\n .map((column) =>\n [\n 'expression' in column\n ? `(${column.expression})`\n : `\"${column.column}\"`,\n column.collate && `COLLATE ${quoteNameFromString(column.collate)}`,\n column.opclass,\n column.order,\n `WITH ${column.with}`,\n ]\n .filter((x): x is string => !!x)\n .join(' '),\n )\n .join(', ');\n\n const values: unknown[] = [];\n\n const text = [\n `ALTER TABLE ${quoteTable(\n schema,\n tableName,\n )} ADD CONSTRAINT \"${name}\" EXCLUDE`,\n options.using && `USING ${options.using}`,\n `(${columnList})`,\n include?.length &&\n `INCLUDE (${include.map((column) => `\"${column}\"`).join(', ')})`,\n options.with && `WITH (${options.with})`,\n options.tablespace && `USING INDEX TABLESPACE ${options.tablespace}`,\n options.where &&\n `WHERE ${\n isRawSQL(options.where)\n ? options.where.toSQL({ values })\n : options.where\n }`,\n ]\n .filter((x): x is string => !!x)\n .join(' ');\n\n return { text, values };\n });\n};\n\nconst getIndexOrExcludeMainOptions = <\n T extends TableData.Index | TableData.Exclude,\n>(\n tableName: string,\n item: T,\n getName: GetIndexOrExcludeName,\n snakeCase?: boolean,\n): { columns: T['columns']; include?: string[]; name: string } => {\n let include = item.options.include\n ? toArray(item.options.include)\n : undefined;\n\n let { columns } = item;\n if (snakeCase) {\n columns = columns.map((c) =>\n 'column' in c ? { ...c, column: toSnakeCase(c.column) } : c,\n );\n if (include) include = include.map(toSnakeCase);\n }\n\n return {\n columns,\n include,\n name: item.options?.name || getName(tableName, columns),\n };\n};\n\nexport const commentsToQuery = (\n schemaTable: { schema?: string; name: string },\n comments: ColumnComment[],\n): SingleSql[] => {\n return comments.map(({ column, comment }) => ({\n text: `COMMENT ON COLUMN ${quoteWithSchema(\n schemaTable,\n )}.\"${column}\" IS ${escapeForMigration(comment)}`,\n values: [],\n }));\n};\n\nexport const primaryKeyToSql = (\n primaryKey: Exclude<TableData['primaryKey'], undefined>,\n) => {\n return `${\n primaryKey.name ? `CONSTRAINT \"${primaryKey.name}\" ` : ''\n }PRIMARY KEY (${joinColumns(primaryKey.columns)})`;\n};\n\nexport const interpolateSqlValues = ({ text, values }: TableQuery): string => {\n return values?.length\n ? text.replace(/\\$(\\d+)/g, (_, n) => {\n const i = +n - 1;\n return escapeForMigration(values[i]);\n })\n : text;\n};\n\nexport interface ColumnNamedCheck extends ColumnDataCheckBase {\n name: string;\n}\n\nexport const nameColumnChecks = (\n table: string,\n column: string,\n checks: ColumnDataCheckBase[],\n): ColumnNamedCheck[] =>\n checks.map((check, i) => ({\n ...check,\n name: check.name || `${table}_${column}_check${i === 0 ? '' : i}`,\n }));\n\nexport const cmpRawSql = (a: RawSQLBase, b: RawSQLBase) => {\n const values: unknown[] = [];\n\n const aSql = a.makeSQL({ values });\n const aValues = JSON.stringify(values);\n\n values.length = 0;\n\n const bSql = b.makeSQL({ values });\n const bValues = JSON.stringify(values);\n\n return aSql === bSql && aValues === bValues;\n};\n","import { EnumColumn, defaultSchemaConfig } from 'pqb';\n\nexport const tableMethods = {\n enum(name: string) {\n // empty array will be filled during the migration by querying db\n return new EnumColumn(\n defaultSchemaConfig,\n name,\n [] as unknown as [string, ...string[]],\n undefined,\n );\n },\n};\n","import {\n ColumnsShape,\n Db,\n EnumColumn,\n getColumnTypes,\n NoPrimaryKeyOption,\n parseTableData,\n escapeString,\n TableData,\n TableDataFn,\n TableDataItem,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n RecordUnknown,\n snakeCaseKey,\n} from 'pqb';\nimport {\n ColumnComment,\n ColumnsShapeCallback,\n DbMigration,\n Migration,\n TableOptions,\n} from './migration';\nimport {\n addColumnComment,\n addColumnExclude,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n excludesToQuery,\n getColumnName,\n indexesToQuery,\n interpolateSqlValues,\n primaryKeyToSql,\n} from './migration.utils';\nimport {\n getSchemaAndTableFromName,\n makePopulateEnumQuery,\n quoteWithSchema,\n} from '../common';\nimport { RakeDbAst } from '../ast';\nimport { tableMethods } from './tableMethods';\nimport { NoPrimaryKey } from '../errors';\n\nexport interface TableQuery {\n text: string;\n values?: unknown[];\n then?(result: QueryArraysResult): void;\n}\n\nexport interface CreateTableResult<\n Table extends string,\n Shape extends ColumnsShape,\n> {\n table: Db<Table, Shape>;\n}\n\nexport const createTable = async <\n CT,\n Table extends string,\n Shape extends ColumnsShape,\n>(\n migration: Migration<CT>,\n up: boolean,\n tableName: Table,\n first?: TableOptions | ColumnsShapeCallback<CT, Shape>,\n second?:\n | ColumnsShapeCallback<CT, Shape>\n | TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>,\n third?: TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>,\n): Promise<CreateTableResult<Table, Shape>> => {\n let options: TableOptions;\n let fn: ColumnsShapeCallback<CT, Shape> | undefined;\n let dataFn: TableDataFn<RecordUnknown, MaybeArray<TableDataItem>> | undefined;\n if (typeof first === 'object') {\n options = first;\n fn = second as ColumnsShapeCallback<CT, Shape>;\n dataFn = third as TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>;\n } else {\n options = emptyObject;\n fn = first;\n dataFn = second as TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>;\n }\n\n const snakeCase =\n 'snakeCase' in options ? options.snakeCase : migration.options.snakeCase;\n const language =\n 'language' in options ? options.language : migration.options.language;\n\n const types = Object.assign(\n Object.create(migration.columnTypes as object),\n tableMethods,\n );\n types[snakeCaseKey] = snakeCase;\n\n let shape: Shape;\n let tableData;\n if (fn) {\n shape = getColumnTypes(\n types,\n fn,\n migration.options.baseTable?.nowSQL,\n language,\n );\n tableData = parseTableData(dataFn);\n tableData.constraints?.forEach((x, i) => {\n if (x.name || !x.check) return;\n\n x.name = `${tableName}_check${i === 0 ? '' : i}`;\n });\n } else {\n shape = (tableData = emptyObject) as Shape;\n }\n\n const ast = makeAst(\n up,\n tableName,\n shape,\n tableData,\n options,\n migration.options.noPrimaryKey,\n );\n\n fn && validatePrimaryKey(ast);\n\n const queries = astToQueries(ast, snakeCase, language);\n for (const { then, ...query } of queries) {\n const result = await migration.adapter.arrays(interpolateSqlValues(query));\n then?.(result);\n }\n\n let table: Db<Table, Shape> | undefined;\n\n return {\n get table(): Db<Table, Shape> {\n return (table ??= (migration as unknown as DbMigration<unknown>)(\n tableName,\n shape,\n undefined,\n {\n noPrimaryKey: options.noPrimaryKey ? 'ignore' : undefined,\n snakeCase,\n },\n ) as unknown as Db<Table, Shape>);\n },\n };\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 const column = shape[key];\n if (column.data.primaryKey) {\n shapePKeys.push(key);\n }\n }\n\n const { primaryKey } = tableData;\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 ? {\n ...primaryKey,\n columns: [...new Set([...shapePKeys, ...primaryKey.columns])],\n }\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].data.primaryKey) {\n hasPrimaryKey = true;\n break;\n }\n }\n }\n\n if (!hasPrimaryKey) {\n const error = new NoPrimaryKey(\n `Table ${ast.name} has no primary key.\\nYou can suppress this error by setting { noPrimaryKey: true } after a table name.`,\n );\n if (ast.noPrimaryKey === 'error') {\n throw error;\n } else {\n console.warn(error.message);\n }\n }\n }\n};\n\nconst astToQueries = (\n ast: RakeDbAst.Table,\n snakeCase?: boolean,\n language?: string,\n): TableQuery[] => {\n const queries: TableQuery[] = [];\n const { shape } = ast;\n\n for (const key in shape) {\n const item = shape[key];\n if (!(item instanceof EnumColumn)) continue;\n\n queries.push(makePopulateEnumQuery(item));\n }\n\n if (ast.action === 'drop') {\n queries.push({\n text: `DROP TABLE${\n ast.dropIfExists ? ' IF EXISTS' : ''\n } ${quoteWithSchema(ast)}${ast.dropMode ? ` ${ast.dropMode}` : ''}`,\n });\n return queries;\n }\n\n const lines: string[] = [];\n const values: unknown[] = [];\n const indexes: TableData.Index[] = [];\n const excludes: TableData.Exclude[] = [];\n const comments: ColumnComment[] = [];\n\n for (const key in shape) {\n const item = shape[key];\n const name = getColumnName(item, key, snakeCase);\n addColumnIndex(indexes, name, item);\n addColumnExclude(excludes, name, item);\n addColumnComment(comments, name, item);\n lines.push(\n `\\n ${columnToSql(name, item, values, !!ast.primaryKey, snakeCase)}`,\n );\n }\n\n if (ast.primaryKey) {\n lines.push(\n `\\n ${primaryKeyToSql({\n name: ast.primaryKey.name,\n columns: ast.primaryKey.columns.map((key) =>\n getColumnName(shape[key], key, snakeCase),\n ),\n })}`,\n );\n }\n\n ast.constraints?.forEach((item) => {\n lines.push(\n `\\n ${constraintToSql(\n ast,\n true,\n {\n ...item,\n references: item.references\n ? {\n ...item.references,\n columns: item.references.columns.map((column) =>\n getColumnName(shape[column], column, snakeCase),\n ),\n }\n : undefined,\n },\n values,\n snakeCase,\n )}`,\n );\n });\n\n pushIndexesOrExcludesFromAst(indexes, ast.indexes, shape, snakeCase);\n pushIndexesOrExcludesFromAst(excludes, ast.excludes, shape, snakeCase);\n\n queries.push(\n {\n text: `CREATE TABLE${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } ${quoteWithSchema(ast)} (${lines.join(',')}\\n)`,\n values,\n },\n ...indexesToQuery(true, ast, indexes, snakeCase, language),\n ...excludesToQuery(true, ast, excludes, snakeCase),\n ...commentsToQuery(ast, comments),\n );\n\n if (ast.comment) {\n queries.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${escapeString(\n ast.comment,\n )}`,\n });\n }\n\n return queries;\n};\n\nconst pushIndexesOrExcludesFromAst = <\n T extends TableData.Index | TableData.Exclude,\n>(\n arr: T[],\n inAst: T[] | undefined,\n shape: ColumnsShape,\n snakeCase?: boolean,\n) => {\n arr.push(\n ...(inAst?.map((x) => ({\n ...x,\n columns: x.columns.map((item) => ({\n ...item,\n ...('column' in item\n ? {\n column: getColumnName(shape[item.column], item.column, snakeCase),\n }\n : {}),\n })),\n })) || []),\n );\n};\n","import {\n ColumnType,\n EnumColumn,\n parseTableDataInput,\n escapeString,\n TableData,\n TableDataMethods,\n tableDataMethods,\n UnknownColumn,\n DomainColumn,\n ArrayColumn,\n ColumnTypeBase,\n consumeColumnName,\n deepCompare,\n EmptyObject,\n RawSQLBase,\n RecordKeyTrue,\n RecordUnknown,\n setCurrentColumnName,\n setDefaultLanguage,\n snakeCaseKey,\n toArray,\n toSnakeCase,\n} from 'pqb';\nimport {\n ChangeTableCallback,\n ChangeTableOptions,\n ColumnComment,\n DropMode,\n Migration,\n MigrationColumnTypes,\n} from './migration';\nimport { RakeDbAst } from '../ast';\nimport {\n getSchemaAndTableFromName,\n makePopulateEnumQuery,\n quoteCustomType,\n quoteNameFromString,\n quoteWithSchema,\n} from '../common';\nimport {\n addColumnComment,\n addColumnExclude,\n addColumnIndex,\n cmpRawSql,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n encodeColumnDefault,\n excludesToQuery,\n getColumnName,\n identityToSql,\n indexesToQuery,\n interpolateSqlValues,\n nameColumnChecks,\n primaryKeyToSql,\n} from './migration.utils';\nimport { tableMethods } from './tableMethods';\nimport { TableQuery } from './createTable';\n\ninterface ChangeTableData {\n add: TableData;\n drop: TableData;\n}\n\nconst newChangeTableData = (): ChangeTableData => ({\n add: {},\n drop: {},\n});\n\nlet changeTableData = newChangeTableData();\n\nconst resetChangeTableData = () => {\n changeTableData = newChangeTableData();\n};\n\nconst addOrDropChanges: RakeDbAst.ChangeTableItem.Column[] = [];\n\n// add column\nfunction add(\n item: ColumnType,\n options?: { dropMode?: DropMode },\n): SpecialChange;\n// add primary key, index, etc\nfunction add(emptyObject: EmptyObject): SpecialChange;\n// add timestamps\nfunction add(\n items: Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): Record<string, RakeDbAst.ChangeTableItem.Column>;\nfunction add(\n this: TableChangeMethods,\n item: ColumnType | EmptyObject | Record<string, ColumnType>,\n options?: { dropMode?: DropMode },\n): undefined | EmptyObject | Record<string, RakeDbAst.ChangeTableItem.Column> {\n consumeColumnName();\n setName(this, item);\n\n if (item instanceof ColumnType) {\n const result = addOrDrop('add', item, options);\n if (result.type === 'change') return result;\n addOrDropChanges.push(result);\n return (addOrDropChanges.length - 1) as unknown as EmptyObject;\n }\n\n for (const key in item) {\n // ...t.timestamps() case\n if (\n (item as Record<string, RakeDbAst.ChangeTableItem.Column>)[key] instanceof\n ColumnTypeBase\n ) {\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 parseTableDataInput(changeTableData.add, item);\n break;\n }\n\n return undefined as never;\n}\n\nconst drop = function (this: TableChangeMethods, item, options) {\n consumeColumnName();\n setName(this, item);\n\n if (item instanceof ColumnType) {\n const result = addOrDrop('drop', item, options);\n if (result.type === 'change') return result;\n addOrDropChanges.push(result);\n return addOrDropChanges.length - 1;\n }\n\n for (const key in item) {\n // ...t.timestamps() case\n if (\n (item as unknown as Record<string, RakeDbAst.ChangeTableItem.Column>)[\n key\n ] instanceof ColumnTypeBase\n ) {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item as any) {\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\n parseTableDataInput(changeTableData.drop, item);\n break;\n }\n\n return undefined as never;\n} as typeof add;\n\nconst addOrDrop = (\n type: 'add' | 'drop',\n item: ColumnType,\n options?: { dropMode?: DropMode },\n): RakeDbAst.ChangeTableItem.Column | RakeDbAst.ChangeTableItem.Change => {\n if (item instanceof UnknownColumn) {\n const empty = columnTypeToColumnChange({\n type: 'change',\n to: {},\n });\n const add = columnTypeToColumnChange({\n type: 'change',\n to: {\n checks: item.data.checks,\n },\n });\n\n return {\n type: 'change',\n from: type === 'add' ? empty : add,\n to: type === 'add' ? add : empty,\n ...options,\n };\n }\n\n return {\n type,\n item,\n dropMode: options?.dropMode,\n };\n};\n\ninterface Change extends RakeDbAst.ChangeTableItem.Change, ChangeOptions {}\n\ntype ChangeOptions = RakeDbAst.ChangeTableItem.ChangeUsing;\n\ninterface SpecialChange {\n type: SpecialChange;\n}\n\ninterface OneWayChange {\n type: 'change';\n name?: string;\n to: RakeDbAst.ColumnChange;\n using?: RakeDbAst.ChangeTableItem.ChangeUsing;\n}\n\nconst columnTypeToColumnChange = (\n item: ColumnType | OneWayChange,\n name?: string,\n): RakeDbAst.ColumnChange => {\n if (item instanceof ColumnType) {\n let column = item;\n const foreignKeys = column.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 if (name && !column.data.name) {\n column = Object.create(column);\n column.data = { ...column.data, name };\n }\n\n return {\n column: column,\n type: column.toSQL(),\n nullable: column.data.isNullable,\n ...column.data,\n primaryKey: column.data.primaryKey === undefined ? undefined : true,\n foreignKeys: foreignKeys as RakeDbAst.ColumnChange['foreignKeys'],\n };\n }\n\n return item.to;\n};\n\nconst nameKey = Symbol('name');\n\nconst setName = (\n self: TableChangeMethods,\n item: RakeDbAst.ColumnChange | ColumnType,\n) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const name = (self as any)[nameKey];\n if (!name) return;\n\n if ('column' in item && item.column instanceof ColumnType) {\n item.column.data.name ??= name;\n } else if (item instanceof ColumnType) {\n item.data.name ??= name;\n } else {\n (item as RecordUnknown).name ??= name;\n }\n};\n\ntype TableChangeMethods = typeof tableChangeMethods;\nconst tableChangeMethods = {\n ...tableMethods,\n ...(tableDataMethods as TableDataMethods<string>),\n name(name: string) {\n setCurrentColumnName(name);\n const types = Object.create(this);\n types[nameKey] = name;\n return types;\n },\n add,\n drop,\n change(\n from: ColumnType | OneWayChange,\n to: ColumnType | OneWayChange,\n using?: ChangeOptions,\n ): Change {\n consumeColumnName();\n const f = columnTypeToColumnChange(from);\n const t = columnTypeToColumnChange(to);\n setName(this, f);\n setName(this, t);\n\n return {\n type: 'change',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: (this as any)[nameKey],\n from: f,\n to: t,\n using,\n };\n },\n default(value: unknown | RawSQLBase): OneWayChange {\n return { type: 'change', to: { default: value } };\n },\n nullable(): OneWayChange {\n return {\n type: 'change',\n to: { nullable: true },\n };\n },\n nonNullable(): OneWayChange {\n return {\n type: 'change',\n to: { nullable: false },\n };\n },\n comment(comment: string | null): OneWayChange {\n return { type: 'change', to: { comment } };\n },\n /**\n * Rename a column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTable('table', (t) => ({\n * oldColumnName: t.rename('newColumnName'),\n * }));\n * });\n * ```\n *\n * Note that the renaming `ALTER TABLE` is executed before the rest of alterations,\n * so if you're also adding a new constraint on this column inside the same `changeTable`,\n * refer to it with a new name.\n *\n * @param name\n */\n rename(name: string): RakeDbAst.ChangeTableItem.Rename {\n return { type: 'rename', name };\n },\n};\n\nexport type TableChanger<CT> = MigrationColumnTypes<CT> & TableChangeMethods;\n\nexport type TableChangeData = Record<\n string,\n | RakeDbAst.ChangeTableItem.Column\n | RakeDbAst.ChangeTableItem.Rename\n | Change\n | SpecialChange\n | ColumnTypeBase\n>;\n\nexport const changeTable = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback<CT>,\n): Promise<void> => {\n const snakeCase =\n 'snakeCase' in options ? options.snakeCase : migration.options.snakeCase;\n const language =\n 'language' in options ? options.language : migration.options.language;\n\n setDefaultLanguage(language);\n resetChangeTableData();\n\n const tableChanger = Object.create(\n migration.columnTypes as object,\n ) as TableChanger<CT>;\n Object.assign(tableChanger, tableChangeMethods);\n\n (tableChanger as { [snakeCaseKey]?: boolean })[snakeCaseKey] = snakeCase;\n\n addOrDropChanges.length = 0;\n const changeData = fn?.(tableChanger) || {};\n\n const ast = makeAst(up, tableName, changeData, changeTableData, options);\n\n const queries = astToQueries(ast, snakeCase, language);\n for (const query of queries) {\n const result = await migration.adapter.arrays(interpolateSqlValues(query));\n query.then?.(result);\n }\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: RakeDbAst.ChangeTableShape = {};\n const consumedChanges: RecordKeyTrue = {};\n for (const key in changeData) {\n let item = changeData[key] as\n | Change\n | RakeDbAst.ChangeTableItem.Rename\n | RakeDbAst.ChangeTableItem.Column;\n\n if (typeof item === 'number') {\n consumedChanges[item] = true;\n item = addOrDropChanges[item];\n } else if (item instanceof ColumnType) {\n item = addOrDrop('add', item);\n }\n\n if ('type' in item) {\n if (up) {\n shape[key] = 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 ? {\n ...item,\n from: item.to,\n to: item.from,\n using: item.using && {\n usingUp: item.using.usingDown,\n usingDown: item.using.usingUp,\n },\n }\n : item;\n }\n }\n }\n }\n\n for (let i = 0; i < addOrDropChanges.length; i++) {\n if (consumedChanges[i]) continue;\n\n const change = addOrDropChanges[i];\n const name = change.item.data.name;\n if (!name) {\n throw new Error(`Column in ...t.${change.type}() must have a name`);\n }\n\n const arr = shape[name] ? toArray(shape[name]) : [];\n arr[up ? 'push' : 'unshift'](\n up ? change : { ...change, type: change.type === 'add' ? 'drop' : 'add' },\n );\n shape[name] = arr;\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\ninterface PrimaryKey extends TableData.PrimaryKey {\n change?: true;\n}\n\nconst astToQueries = (\n ast: RakeDbAst.ChangeTable,\n snakeCase?: boolean,\n language?: string,\n): TableQuery[] => {\n const queries: TableQuery[] = [];\n\n if (ast.comment !== undefined) {\n queries.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${\n ast.comment === null\n ? 'NULL'\n : escapeString(\n typeof ast.comment === 'string' ? ast.comment : ast.comment[1],\n )\n }`,\n });\n }\n\n const addPrimaryKeys: PrimaryKey = {\n columns: [],\n };\n\n const dropPrimaryKeys: PrimaryKey = {\n columns: [],\n };\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n if (Array.isArray(item)) {\n for (const it of item) {\n handlePrerequisitesForTableItem(\n key,\n it,\n queries,\n addPrimaryKeys,\n dropPrimaryKeys,\n snakeCase,\n );\n }\n } else {\n handlePrerequisitesForTableItem(\n key,\n item,\n queries,\n addPrimaryKeys,\n dropPrimaryKeys,\n snakeCase,\n );\n }\n }\n\n if (ast.add.primaryKey) {\n addPrimaryKeys.name = ast.add.primaryKey.name;\n const { columns } = ast.add.primaryKey;\n addPrimaryKeys.columns.push(\n ...(snakeCase ? columns.map(toSnakeCase) : columns),\n );\n }\n\n if (ast.drop.primaryKey) {\n dropPrimaryKeys.name = ast.drop.primaryKey.name;\n const { columns } = ast.drop.primaryKey;\n dropPrimaryKeys.columns.push(\n ...(snakeCase ? columns.map(toSnakeCase) : columns),\n );\n }\n\n const alterTable: string[] = [];\n const renameItems: string[] = [];\n const values: unknown[] = [];\n const addIndexes = ast.add.indexes ?? [];\n const dropIndexes = ast.drop.indexes ?? [];\n const addExcludes = ast.add.excludes ?? [];\n const dropExcludes = ast.drop.excludes ?? [];\n const addConstraints = ast.add.constraints ?? [];\n const dropConstraints = ast.drop.constraints ?? [];\n\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n if (Array.isArray(item)) {\n for (const it of item) {\n handleTableItemChange(\n key,\n it,\n ast,\n alterTable,\n renameItems,\n values,\n addPrimaryKeys,\n addIndexes,\n dropIndexes,\n addExcludes,\n dropExcludes,\n addConstraints,\n dropConstraints,\n comments,\n snakeCase,\n );\n }\n } else {\n handleTableItemChange(\n key,\n item,\n ast,\n alterTable,\n renameItems,\n values,\n addPrimaryKeys,\n addIndexes,\n dropIndexes,\n addExcludes,\n dropExcludes,\n addConstraints,\n dropConstraints,\n comments,\n snakeCase,\n );\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.name || `${ast.name}_pkey`;\n prependAlterTable.push(`DROP CONSTRAINT \"${name}\"`);\n }\n\n prependAlterTable.push(\n ...dropConstraints.map(\n (foreignKey) =>\n `\\n DROP ${constraintToSql(ast, false, foreignKey, values, snakeCase)}`,\n ),\n );\n\n alterTable.unshift(...prependAlterTable);\n\n if (\n ast.add.primaryKey ||\n addPrimaryKeys.change ||\n addPrimaryKeys.columns.length > 1\n ) {\n addPrimaryKeys.columns = [...new Set(addPrimaryKeys.columns)];\n\n alterTable.push(\n `ADD ${primaryKeyToSql(\n snakeCase\n ? {\n name: addPrimaryKeys.name,\n columns: addPrimaryKeys.columns.map(toSnakeCase),\n }\n : addPrimaryKeys,\n )}`,\n );\n }\n\n alterTable.push(\n ...addConstraints.map(\n (foreignKey) =>\n `\\n ADD ${constraintToSql(ast, true, foreignKey, values, snakeCase)}`,\n ),\n );\n\n const tableName = quoteWithSchema(ast);\n if (renameItems.length) {\n queries.push(\n ...renameItems.map((sql) => ({\n text: `ALTER TABLE ${tableName}\n ${sql}`,\n values,\n })),\n );\n }\n\n if (alterTable.length) {\n queries.push(alterTableSql(tableName, alterTable, values));\n }\n\n queries.push(...indexesToQuery(false, ast, dropIndexes, snakeCase, language));\n queries.push(...indexesToQuery(true, ast, addIndexes, snakeCase, language));\n queries.push(...excludesToQuery(false, ast, dropExcludes, snakeCase));\n queries.push(...excludesToQuery(true, ast, addExcludes, snakeCase));\n queries.push(...commentsToQuery(ast, comments));\n\n return queries;\n};\n\nconst alterTableSql = (\n tableName: string,\n lines: string[],\n values: unknown[],\n) => ({\n text: `ALTER TABLE ${tableName}\n ${lines.join(',\\n ')}`,\n values,\n});\n\nconst handlePrerequisitesForTableItem = (\n key: string,\n item: RakeDbAst.ChangeTableItem,\n queries: TableQuery[],\n addPrimaryKeys: PrimaryKey,\n dropPrimaryKeys: PrimaryKey,\n snakeCase?: boolean,\n) => {\n if ('item' in item) {\n const { item: column } = item;\n if (column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(column));\n }\n }\n\n if (item.type === 'add') {\n if (item.item.data.primaryKey) {\n addPrimaryKeys.columns.push(getColumnName(item.item, key, snakeCase));\n }\n } else if (item.type === 'drop') {\n if (item.item.data.primaryKey) {\n dropPrimaryKeys.columns.push(getColumnName(item.item, key, snakeCase));\n }\n } else if (item.type === 'change') {\n if (item.from.column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(item.from.column));\n }\n\n if (item.to.column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(item.to.column));\n }\n\n if (item.from.primaryKey) {\n dropPrimaryKeys.columns.push(\n item.from.column\n ? getColumnName(item.from.column, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key,\n );\n dropPrimaryKeys.change = true;\n }\n\n if (item.to.primaryKey) {\n addPrimaryKeys.columns.push(\n item.to.column\n ? getColumnName(item.to.column, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key,\n );\n addPrimaryKeys.change = true;\n }\n }\n};\n\nconst handleTableItemChange = (\n key: string,\n item: RakeDbAst.ChangeTableItem,\n ast: RakeDbAst.ChangeTable,\n alterTable: string[],\n renameItems: string[],\n values: unknown[],\n addPrimaryKeys: PrimaryKey,\n addIndexes: TableData.Index[],\n dropIndexes: TableData.Index[],\n addExcludes: TableData.Exclude[],\n dropExcludes: TableData.Exclude[],\n addConstraints: TableData.Constraint[],\n dropConstraints: TableData.Constraint[],\n comments: ColumnComment[],\n snakeCase?: boolean,\n) => {\n if (item.type === 'add') {\n const column = item.item;\n const name = getColumnName(column, key, snakeCase);\n addColumnIndex(addIndexes, name, column);\n addColumnExclude(addExcludes, name, column);\n addColumnComment(comments, name, column);\n\n alterTable.push(\n `ADD COLUMN ${columnToSql(\n name,\n column,\n values,\n addPrimaryKeys.columns.length > 1,\n snakeCase,\n )}`,\n );\n } else if (item.type === 'drop') {\n const name = getColumnName(item.item, key, snakeCase);\n\n alterTable.push(\n `DROP COLUMN \"${name}\"${item.dropMode ? ` ${item.dropMode}` : ''}`,\n );\n } else if (item.type === 'change') {\n const { from, to } = item;\n const name = getChangeColumnName('to', item, key, snakeCase);\n const fromName = getChangeColumnName('from', item, key, snakeCase);\n\n if (fromName !== name) {\n renameItems.push(renameColumnSql(fromName, name));\n }\n\n let changeType = false;\n if (to.type && (from.type !== to.type || from.collate !== to.collate)) {\n changeType = true;\n\n const type =\n !to.column || to.column.data.isOfCustomType\n ? to.column && to.column instanceof DomainColumn\n ? quoteNameFromString(to.type)\n : quoteCustomType(to.type)\n : to.type;\n\n const using = item.using?.usingUp\n ? ` USING ${item.using.usingUp.toSQL({ values })}`\n : to.column instanceof EnumColumn\n ? ` USING \"${name}\"::text::${type}`\n : to.column instanceof ArrayColumn\n ? ` USING \"${name}\"::text[]::${type}`\n : '';\n\n alterTable.push(\n `ALTER COLUMN \"${name}\" TYPE ${type}${\n to.collate ? ` COLLATE ${quoteNameFromString(to.collate)}` : ''\n }${using}`,\n );\n }\n\n if (\n typeof from.identity !== typeof to.identity ||\n !deepCompare(from.identity, to.identity)\n ) {\n if (from.identity) {\n alterTable.push(`ALTER COLUMN \"${name}\" DROP IDENTITY`);\n }\n\n if (to.identity) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" ADD ${identityToSql(to.identity)}`,\n );\n }\n }\n\n if (from.default !== to.default) {\n const value = encodeColumnDefault(to.default, values, to.column);\n\n // when changing type, need to first drop an existing default before setting a new one\n if (changeType && value !== null) {\n alterTable.push(`ALTER COLUMN \"${name}\" DROP DEFAULT`);\n }\n\n const expr = value === null ? 'DROP DEFAULT' : `SET DEFAULT ${value}`;\n\n alterTable.push(`ALTER COLUMN \"${name}\" ${expr}`);\n }\n\n if (from.nullable !== to.nullable) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" ${to.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n if (from.compression !== to.compression) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" SET COMPRESSION ${to.compression || 'DEFAULT'}`,\n );\n }\n\n const fromChecks =\n from.checks && nameColumnChecks(ast.name, fromName, from.checks);\n const toChecks = to.checks && nameColumnChecks(ast.name, name, to.checks);\n\n fromChecks?.forEach((fromCheck) => {\n if (!toChecks?.some((toCheck) => cmpRawSql(fromCheck.sql, toCheck.sql))) {\n alterTable.push(`DROP CONSTRAINT \"${fromCheck.name}\"`);\n }\n });\n\n toChecks?.forEach((toCheck) => {\n if (\n !fromChecks?.some((fromCheck) => cmpRawSql(fromCheck.sql, toCheck.sql))\n ) {\n alterTable.push(\n `ADD CONSTRAINT \"${toCheck.name}\"\\n CHECK (${toCheck.sql.toSQL({\n values,\n })})`,\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.options?.name !== toFkey.options?.name ||\n fromFkey.options?.match !== toFkey.options?.match ||\n fromFkey.options?.onUpdate !== toFkey.options?.onUpdate ||\n fromFkey.options?.onDelete !== toFkey.options?.onDelete ||\n fromFkey.options?.dropMode !== toFkey.options?.dropMode ||\n (fromFkey.fnOrTable as string) !== (toFkey.fnOrTable as string))\n ) {\n if (fromFkey) {\n dropConstraints.push({\n name: fromFkey.options?.name,\n dropMode: fromFkey.options?.dropMode,\n references: {\n columns: [name],\n ...fromFkey,\n foreignColumns: snakeCase\n ? fromFkey.foreignColumns.map(toSnakeCase)\n : fromFkey.foreignColumns,\n },\n });\n }\n\n if (toFkey) {\n addConstraints.push({\n name: toFkey.options?.name,\n dropMode: toFkey.options?.dropMode,\n references: {\n columns: [name],\n ...toFkey,\n foreignColumns: snakeCase\n ? toFkey.foreignColumns.map(toSnakeCase)\n : toFkey.foreignColumns,\n },\n });\n }\n }\n }\n\n pushIndexesOrExcludes('indexes', from, to, name, addIndexes, dropIndexes);\n pushIndexesOrExcludes(\n 'excludes',\n from,\n to,\n name,\n addExcludes,\n dropExcludes,\n );\n\n if (from.comment !== to.comment) {\n comments.push({ column: name, comment: to.comment || null });\n }\n } else if (item.type === 'rename') {\n renameItems.push(\n snakeCase\n ? renameColumnSql(toSnakeCase(key), toSnakeCase(item.name))\n : renameColumnSql(key, item.name),\n );\n }\n};\n\nconst pushIndexesOrExcludes = <T extends TableData.Index | TableData.Exclude>(\n key: 'indexes' | 'excludes',\n from: RakeDbAst.ColumnChange,\n to: RakeDbAst.ColumnChange,\n name: string,\n add: T[],\n drop: T[],\n) => {\n const len = Math.max(from[key]?.length || 0, to[key]?.length || 0);\n for (let i = 0; i < len; i++) {\n const fromItem = from[key]?.[i];\n const toItem = to[key]?.[i];\n\n if (\n (fromItem || toItem) &&\n (!fromItem || !toItem || !deepCompare(fromItem, toItem))\n ) {\n if (fromItem) {\n drop.push({\n ...fromItem,\n columns: [\n {\n column: name,\n ...fromItem.options,\n with: (fromItem as TableData.ColumnExclude).with,\n },\n ],\n } as T);\n }\n\n if (toItem) {\n add.push({\n ...toItem,\n columns: [\n {\n column: name,\n ...toItem.options,\n with: (toItem as TableData.ColumnExclude).with,\n },\n ],\n } as T);\n }\n }\n }\n};\n\nconst getChangeColumnName = (\n what: 'from' | 'to',\n change: RakeDbAst.ChangeTableItem.Change,\n key: string,\n snakeCase?: boolean,\n) => {\n return (\n change.name ||\n (change[what].column\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n getColumnName(change[what].column!, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key)\n );\n};\n\nconst renameColumnSql = (from: string, to: string) => {\n return `RENAME COLUMN \"${from}\" TO \"${to}\"`;\n};\n","import { Migration } from './migration';\nimport { RawSQLBase, singleQuote, SingleSql, raw } from 'pqb';\nimport { RakeDbAst } from '../ast';\nimport { interpolateSqlValues } from './migration.utils';\n\nexport const createView = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n): Promise<void> => {\n const ast = makeAst(up, name, options, sql);\n const query = astToQuery(ast);\n\n await migration.adapter.arrays(interpolateSqlValues(query));\n};\n\nconst makeAst = (\n up: boolean,\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n): RakeDbAst.View => {\n if (typeof sql === 'string') {\n sql = raw({ raw: sql });\n }\n\n return {\n type: 'view',\n action: up ? 'create' : 'drop',\n name,\n shape: {},\n sql,\n options,\n deps: [],\n };\n};\n\nconst astToQuery = (ast: RakeDbAst.View): SingleSql => {\n const values: unknown[] = [];\n const sql: string[] = [];\n const { options } = ast;\n\n if (ast.action === 'create') {\n sql.push('CREATE');\n\n if (options?.createOrReplace) sql.push('OR REPLACE');\n if (options?.temporary) sql.push('TEMPORARY');\n if (options?.recursive) sql.push('RECURSIVE');\n\n sql.push(`VIEW \"${ast.name}\"`);\n\n if (options?.columns) {\n sql.push(\n `(${options.columns.map((column) => `\"${column}\"`).join(', ')})`,\n );\n }\n\n if (options?.with) {\n const list: string[] = [];\n if (options.with.checkOption)\n list.push(`check_option = ${singleQuote(options.with.checkOption)}`);\n if (options.with.securityBarrier) list.push(`security_barrier = true`);\n if (options.with.securityInvoker) list.push(`security_invoker = true`);\n sql.push(`WITH ( ${list.join(', ')} )`);\n }\n\n sql.push(`AS (${ast.sql.toSQL({ values })})`);\n } else {\n sql.push('DROP VIEW');\n\n if (options?.dropIfExists) sql.push(`IF EXISTS`);\n\n sql.push(`\"${ast.name}\"`);\n\n if (options?.dropMode) sql.push(options.dropMode);\n }\n\n return {\n text: sql.join(' '),\n values,\n };\n};\n","import {\n ColumnsShape,\n ColumnType,\n createDbWithAdapter,\n DbDomainArg,\n DbResult,\n EnumColumn,\n logParamToLogObject,\n escapeForMigration,\n raw,\n TableData,\n TableDataFn,\n TableDataItem,\n AdapterBase,\n ColumnSchemaConfig,\n emptyObject,\n MaybeArray,\n QueryLogObject,\n QueryLogOptions,\n RawSQLBase,\n RecordString,\n RecordUnknown,\n singleQuote,\n toSnakeCase,\n} from 'pqb';\nimport { createTable, CreateTableResult } from './createTable';\nimport { changeTable, TableChangeData, TableChanger } from './changeTable';\nimport {\n getSchemaAndTableFromName,\n quoteNameFromString,\n quoteTable,\n quoteWithSchema,\n} from '../common';\nimport { RakeDbAst } from '../ast';\nimport {\n columnTypeToSql,\n encodeColumnDefault,\n interpolateSqlValues,\n} from './migration.utils';\nimport { createView } from './createView';\nimport { RakeDbConfig } from '../config';\n\n// Drop mode to use when dropping various database entities.\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\n// Options for creating a table.\nexport type TableOptions = {\n // create the table only if it not exists already\n createIfNotExists?: boolean;\n // drop the table only if it exists\n dropIfExists?: boolean;\n // Drop mode to use when dropping the table.\n dropMode?: DropMode;\n // Create a table with a database comment on it.\n comment?: string;\n // Ignore the absence of a primary key. Will throw otherwise.\n noPrimaryKey?: boolean;\n // Translate columns name into snake case\n snakeCase?: boolean;\n language?: string;\n};\n\n// Overridden column types to simplify and adapt some column types for a migration.\nexport type MigrationColumnTypes<CT> = Omit<CT, 'enum'> & {\n enum: (\n name: string,\n ) => EnumColumn<ColumnSchemaConfig, unknown, readonly string[]>;\n};\n\n// Create table callback\nexport type ColumnsShapeCallback<\n CT,\n Shape extends ColumnsShape = ColumnsShape,\n> = (t: MigrationColumnTypes<CT> & { raw: typeof raw }) => Shape;\n\n// Options for changing a table\nexport type ChangeTableOptions = {\n snakeCase?: boolean;\n language?: string;\n comment?: string | [string, string] | null;\n};\n\n// Callback for a table change\nexport type ChangeTableCallback<CT> = (t: TableChanger<CT>) => TableChangeData;\n\n// DTO for column comments\nexport type ColumnComment = { column: string; comment: string | null };\n\n// Database adapter methods to perform queries without logging\nexport type SilentQueries = {\n // Query without logging\n silentQuery: AdapterBase['query'];\n // Query arrays without logging\n silentArrays: AdapterBase['arrays'];\n};\n\n// Combined queryable database instance and a migration interface\nexport type DbMigration<CT> = DbResult<CT> &\n Migration<CT> & {\n // Add `SilentQueries` to an existing `adapter` type in the `DbResult`\n adapter: SilentQueries;\n };\n\nexport interface CreateMigrationInterfaceConfig<CT> extends QueryLogOptions {\n columnTypes: CT;\n}\n\n/**\n * Creates a new `db` instance that is an instance of `pqb` with mixed in migration methods from the `Migration` class.\n * It overrides `query` and `array` db adapter methods to intercept SQL for the logging.\n *\n * @param tx - database adapter that executes inside a transaction\n * @param up - migrate or rollback\n * @param config - config of `rakeDb`\n */\nexport const createMigrationInterface = <CT>(\n tx: AdapterBase,\n up: boolean,\n config: CreateMigrationInterfaceConfig<CT>,\n): DbMigration<CT> => {\n const adapter = Object.create(tx) as MigrationAdapter;\n adapter.schema = adapter.getSchema() ?? 'public';\n\n const { query, arrays } = adapter;\n const log = logParamToLogObject(config.logger || console, config.log);\n\n adapter.query = ((text, values) => {\n return wrapWithLog(log, text, values, () =>\n query.call(adapter, text, values),\n );\n }) as typeof adapter.query;\n\n adapter.arrays = ((text, values) => {\n return wrapWithLog(log, text, values, () =>\n arrays.call(adapter, text, values),\n );\n }) as typeof adapter.arrays;\n\n Object.assign(adapter, { silentQuery: query, silentArrays: arrays });\n\n const db = createDbWithAdapter({\n adapter,\n columnTypes: config.columnTypes,\n }) as unknown as DbMigration<CT>;\n\n const { prototype: proto } = Migration;\n for (const key of Object.getOwnPropertyNames(proto)) {\n (db as unknown as RecordUnknown)[key] = proto[key as keyof typeof proto];\n }\n\n return Object.assign(db, {\n adapter,\n log,\n up,\n options: config,\n });\n};\n\nexport interface MigrationAdapter extends AdapterBase {\n schema: string;\n}\n\n// Migration interface to use inside the `change` callback.\nexport class Migration<CT> {\n // Database adapter to perform queries with.\n public adapter!: MigrationAdapter;\n // The logger config.\n public log?: QueryLogObject;\n // Is migrating or rolling back.\n public up!: boolean;\n // `rakeDb` config.\n public options!: RakeDbConfig<ColumnSchemaConfig>;\n // Available column types that may be customized by a user.\n // They are pulled from a `baseTable` or a `columnTypes` option of the `rakeDb` config.\n public columnTypes!: CT;\n\n /**\n * `createTable` accepts a string for a table name, optional options, and a callback to specify columns.\n *\n * `dropTable` accepts the same arguments, it will drop the table when migrating and create a table when rolling back.\n *\n * To create an empty table, the callback with columns may be omitted.\n *\n * When creating a table within a specific schema, write the table name with schema name: `'schemaName.tableName'`.\n *\n * Returns object `{ table: TableInterface }` that allows to insert records right after creating a table.\n *\n * Options are:\n *\n * ```ts\n * type TableOptions = {\n * // create the table only if it not exists already\n * createIfNotExists?: boolean;\n *\n * // drop the table only if it exists\n * dropIfExists?: boolean;\n *\n * // used when reverting a `createTable`\n * dropMode?: 'CASCADE' | 'RESTRICT';\n *\n * // add a database comment on the table\n * comment?: string;\n *\n * // by default, it will throw an error when the table has no primary key\n * // set `noPrimaryKey` to `true` to bypass it\n * noPrimaryKey?: boolean;\n *\n * // override rakeDb `snakeCase` option for only this table\n * snakeCase?: boolean;\n * };\n * ```\n *\n * Example:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db, up) => {\n * // call `createTable` with options\n * await db.createTable(\n * 'table',\n * {\n * comment: 'Table comment',\n * dropMode: 'CASCADE',\n * noPrimaryKey: true,\n * },\n * (t) => ({\n * // ...\n * }),\n * );\n *\n * // call without options\n * const { table } = await db.createTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * email: t.text().unique(),\n * name: t.text(),\n * active: t.boolean().nullable(),\n * ...t.timestamps(),\n * }));\n *\n * // create records only when migrating up\n * if (up) {\n * // table is a db table interface, all query methods are available\n * await table.createMany([...data]);\n * }\n * });\n * ```\n *\n * @param tableName - name of the table to create\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n createTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n /**\n * See {@link createTable}\n *\n * @param tableName - name of the table to create\n * @param options - {@link TableOptions}\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n createTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n options: TableOptions,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n createTable(\n tableName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n first?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n second?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n third?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return createTable(this, this.up, tableName, first, second, third);\n }\n\n /**\n * Drop the table, create it on rollback. See {@link createTable}.\n *\n * @param tableName - name of the table to drop\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n dropTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n /**\n * Drop the table, create it on rollback. See {@link createTable}.\n *\n * @param tableName - name of the table to drop\n * @param options - {@link TableOptions}\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n dropTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n options: TableOptions,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n dropTable(\n tableName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n first?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n second?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n third?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return createTable(this, !this.up, tableName, first, second, third);\n }\n\n /**\n * `changeTable` accepts a table name, optional options, and a special callback with column changes.\n *\n * When changing a table within a specific schema, write the table name with schema name: `'schemaName.tableName'`.\n *\n * Options are:\n *\n * ```ts\n * type ChangeTableOptions = {\n * comment?:\n * | // add a comment to the table on migrating, remove a comment on rollback\n * string // change comment from first to second on migrating, from second to first on rollback\n * | [string, string] // remove a comment on both migrate and rollback\n * | null;\n *\n * // override rakeDb `snakeCase` option for only this table\n * snakeCase?: boolean;\n * };\n * ```\n *\n * The callback of the `changeTable` is different from `createTable` in the way that it expects columns to be wrapped in change methods such as `add`, `drop`, and `change`.\n *\n * @param tableName - name of the table to change (ALTER)\n * @param fn - change table callback\n */\n changeTable(tableName: string, fn: ChangeTableCallback<CT>): Promise<void>;\n /**\n * See {@link changeTable}\n *\n * @param tableName - name of the table to change (ALTER)\n * @param options - change table options\n * @param fn - change table callback\n */\n changeTable(\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback<CT>,\n ): Promise<void>;\n changeTable(\n tableName: string,\n cbOrOptions: ChangeTableCallback<CT> | ChangeTableOptions,\n cb?: ChangeTableCallback<CT>,\n ): Promise<void> {\n const [fn, options] =\n typeof cbOrOptions === 'function' ? [cbOrOptions, {}] : [cb, cbOrOptions];\n\n return changeTable(this, this.up, tableName, options, fn);\n }\n\n /**\n * Rename a table:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameTable('oldTableName', 'newTableName');\n * });\n * ```\n *\n * Prefix table name with a schema to set a different schema:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameTable('fromSchema.oldTable', 'toSchema.newTable');\n * });\n * ```\n *\n * @param from - rename the table from\n * @param to - rename the table to\n */\n renameTable(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'TABLE');\n }\n\n /**\n * Set a different schema to the table:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTableSchema('tableName', 'fromSchema', 'toSchema');\n * });\n * ```\n *\n * @param table - table name\n * @param from - current table schema\n * @param to - desired table schema\n */\n changeTableSchema(table: string, from: string, to: string) {\n return this.renameTable(`${from}.${table}`, `${to}.${table}`);\n }\n\n /**\n * Add a column to the table on migrating, and remove it on rollback.\n *\n * `dropColumn` takes the same arguments, removes a column on migrate, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addColumn('tableName', 'columnName', (t) =>\n * t.integer().index().nullable(),\n * );\n * });\n * ```\n *\n * @param tableName - name of the table to add the column to\n * @param columnName - name of the column to add\n * @param fn - function returning a type of the column\n */\n addColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => ColumnType,\n ): Promise<void> {\n return addColumn(this, this.up, tableName, columnName, fn);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addColumn}.\n *\n * @param tableName - name of the table to add the column to\n * @param columnName - name of the column to add\n * @param fn - function returning a type of the column\n */\n dropColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => ColumnType,\n ): Promise<void> {\n return addColumn(this, !this.up, tableName, columnName, fn);\n }\n\n /**\n * Add an index to the table on migrating, and remove it on rollback.\n *\n * `dropIndex` takes the same arguments, removes the index on migrate, and adds it on rollback.\n *\n * The first argument is the table name, other arguments are the same as in [composite index](#composite-index).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addIndex(\n * 'tableName',\n * ['column1', { column: 'column2', order: 'DESC' }],\n * {\n * name: 'indexName',\n * },\n * );\n * });\n * ```\n *\n * @param tableName - name of the table to add the index for\n * @param columns - indexed columns\n * @param args - index options\n */\n addIndex(\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n ): Promise<void> {\n return addIndex(this, this.up, tableName, columns, ...args);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addIndex}.\n *\n * @param tableName - name of the table to add the index for\n * @param columns - indexed columns\n * @param args - index options\n */\n dropIndex(\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n ): Promise<void> {\n return addIndex(this, !this.up, tableName, columns, ...args);\n }\n\n /**\n * Rename index:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * // tableName can be prefixed with a schema\n * await db.renameIndex('tableName', 'oldIndexName', 'newIndexName');\n * });\n * ```\n *\n * @param tableName - table which this index belongs to\n * @param from - rename the index from\n * @param to - rename the index to\n */\n renameIndex(tableName: string, from: string, to: string): Promise<void> {\n return renameTableItem(this, tableName, from, to, 'INDEX');\n }\n\n /**\n * Add a foreign key to a table on migrating, and remove it on rollback.\n *\n * `dropForeignKey` takes the same arguments, removes the foreign key on migrate, and adds it on rollback.\n *\n * Arguments:\n *\n * - table name\n * - column names in the table\n * - other table name\n * - column names in the other table\n * - options:\n * - `name`: constraint name\n * - `match`: 'FULL', 'PARTIAL', or 'SIMPLE'\n * - `onUpdate` and `onDelete`: 'NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL', or 'SET DEFAULT'\n *\n * The first argument is the table name, other arguments are the same as in [composite foreign key](#composite-foreign-key).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addForeignKey(\n * 'tableName',\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * );\n * });\n * ```\n *\n * @param tableName - table name\n * @param columns - column names in the table\n * @param foreignTable - other table name\n * @param foreignColumns - column names in the other table\n * @param options - foreign key options\n */\n addForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): Promise<void> {\n return addForeignKey(\n this,\n this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addForeignKey}.\n *\n * @param tableName - table name\n * @param columns - column names in the table\n * @param foreignTable - other table name\n * @param foreignColumns - column names in the other table\n * @param options - foreign key options\n */\n dropForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): Promise<void> {\n return addForeignKey(\n this,\n !this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n /**\n * Add a primary key to a table on migrate, and remove it on rollback.\n *\n * `dropPrimaryKey` takes the same arguments, removes the primary key on migrate, and adds it on rollback.\n *\n * First argument is a table name, second argument is an array of columns.\n * The optional third argument may have a name for the primary key constraint.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addPrimaryKey('tableName', ['id', 'name'], {\n * name: 'tablePkeyName',\n * });\n * });\n * ```\n *\n * @param tableName - name of the table\n * @param columns - array of the columns\n * @param name - optionally, set a primary key constraint name\n */\n addPrimaryKey(\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n ): Promise<void> {\n return addPrimaryKey(this, this.up, tableName, columns, name);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addPrimaryKey}.\n *\n * @param tableName - name of the table\n * @param columns - array of the columns\n * @param name - optionally, set a primary key constraint name\n */\n dropPrimaryKey(\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n ): Promise<void> {\n return addPrimaryKey(this, !this.up, tableName, columns, name);\n }\n\n /**\n * Add or drop a check for multiple columns.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addCheck('tableName', t.sql`column > 123`);\n * });\n * ```\n *\n * @param tableName - name of the table to add the check into\n * @param check - raw SQL for the check\n */\n addCheck(tableName: string, check: RawSQLBase): Promise<void> {\n return addCheck(this, this.up, tableName, check);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addCheck}.\n *\n * @param tableName - name of the table to add the check into\n * @param check - raw SQL for the check\n */\n dropCheck(tableName: string, check: RawSQLBase): Promise<void> {\n return addCheck(this, !this.up, tableName, check);\n }\n\n /**\n * Rename a table constraint such as a primary key or a database check.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameConstraint(\n * 'tableName', // may include schema: 'schema.table'\n * 'oldConstraintName',\n * 'newConstraintName',\n * );\n * });\n * ```\n *\n * @param tableName - name of the table containing the constraint, may include schema name, may include schema name\n * @param from - current name of the constraint\n * @param to - desired name\n */\n renameConstraint(tableName: string, from: string, to: string): Promise<void> {\n return renameTableItem(this, tableName, from, to, 'CONSTRAINT');\n }\n\n /**\n * Rename a column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameColumn('tableName', 'oldColumnName', 'newColumnName');\n * });\n * ```\n *\n * @param tableName - name of the table to rename the column in\n * @param from - rename column from\n * @param to - rename column to\n */\n renameColumn(tableName: string, from: string, to: string): Promise<void> {\n return this.changeTable(tableName, (t) => ({\n [from]: t.rename(to),\n }));\n }\n\n /**\n * `createSchema` creates a database schema, and removes it on rollback.\n *\n * `dropSchema` takes the same arguments, removes schema on migration, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createSchema('schemaName');\n * });\n * ```\n *\n * @param schemaName - name of the schema\n */\n createSchema(schemaName: string): Promise<void> {\n return createSchema(this, this.up, schemaName);\n }\n\n /**\n * Renames a database schema, renames it backwards on roll back.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameSchema('from', 'to');\n * });\n * ```\n *\n * @param from - existing schema to rename\n * @param to - desired schema name\n */\n async renameSchema(from: string, to: string): Promise<void> {\n await this.adapter.query(\n `ALTER SCHEMA \"${this.up ? from : to}\" RENAME TO \"${\n this.up ? to : from\n }\"`,\n );\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link createSchema}.\n *\n * @param schemaName - name of the schema\n */\n dropSchema(schemaName: string): Promise<void> {\n return createSchema(this, !this.up, schemaName);\n }\n\n /**\n * `createExtension` creates a database extension, and removes it on rollback.\n *\n * `dropExtension` takes the same arguments, removes the extension on migrate, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createExtension('pg_trgm');\n * });\n * ```\n *\n * @param name - name of the extension\n * @param options - extension options\n */\n createExtension(\n name: string,\n options?: RakeDbAst.ExtensionArg,\n ): Promise<void> {\n return createExtension(this, this.up, name, options);\n }\n\n /**\n * Drop the extension, create it on rollback. See {@link createExtension}.\n *\n * @param name - name of the extension\n * @param options - extension options\n */\n dropExtension(name: string, options?: RakeDbAst.ExtensionArg): Promise<void> {\n return createExtension(this, !this.up, name, options);\n }\n\n /**\n * `createEnum` creates an enum on migrate, drops it on rollback.\n *\n * `dropEnum` does the opposite.\n *\n * Third argument for options is optional.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createEnum('number', ['one', 'two', 'three']);\n *\n * // use `schemaName.enumName` format to specify a schema\n * await db.createEnum('customSchema.mood', ['sad', 'ok', 'happy'], {\n * // following options are used when dropping enum\n * dropIfExists: true,\n * cascade: true,\n * });\n * });\n * ```\n *\n * @param name - name of the enum\n * @param values - possible enum values\n * @param options - enum options\n */\n createEnum(\n name: string,\n values: [string, ...string[]],\n options?: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n >,\n ): Promise<void> {\n return createEnum(this, this.up, name, values, options);\n }\n\n /**\n * Drop the enum, create it on rollback. See {@link createEnum}.\n *\n * @param name - name of the enum\n * @param values - possible enum values\n * @param options - enum options\n */\n dropEnum(\n name: string,\n values: [string, ...string[]],\n options?: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n >,\n ): Promise<void> {\n return createEnum(this, !this.up, name, values, options);\n }\n\n /**\n * Use these methods to add or drop one or multiple values from an existing enum.\n *\n * `addEnumValues` will drop values when rolling back the migration.\n *\n * Dropping a value internally acts in multiple steps:\n *\n * 1. Select all columns from the database that depends on the enum;\n * 2. Alter all these columns to have text type;\n * 3. Drop the enum;\n * 4. Re-create the enum without the value given;\n * 5. Alter all columns from the first step to have the enum type;\n *\n * In the case when the value is used by some table,\n * migrating `dropEnumValue` or rolling back `addEnumValue` will throw an error with a descriptive message,\n * in such case you'd need to manually resolve the issue by deleting rows with the value, or changing such values.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addEnumValue('numbers', 'four');\n *\n * // you can pass options\n * await db.addEnumValue('numbers', 'three', {\n * // where to insert\n * before: 'four',\n * // skip if already exists\n * ifNotExists: true,\n * });\n *\n * // enum name can be prefixed with schema\n * await db.addEnumValue('public.numbers', 'five', {\n * after: 'four',\n * });\n * });\n * ```\n *\n * @param enumName - target enum name\n * @param values - array of values to add\n * @param options - optional object with options\n * @param options.before - insert before the specified value\n * @param options.after - insert after the specified value\n * @param options.ifNotExists - skip adding if already exists\n */\n addEnumValues(\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n ): Promise<void> {\n return addOrDropEnumValues(this, this.up, enumName, values, options);\n }\n\n /**\n * See {@link addEnumValues}\n */\n dropEnumValues(\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n ): Promise<void> {\n return addOrDropEnumValues(this, !this.up, enumName, values, options);\n }\n\n /**\n * Rename one or multiple enum values using this method:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * // rename value \"from\" to \"to\"\n * await db.rename('numbers', { from: 'to' });\n *\n * // enum name can be prefixed with schema\n * await db.rename('public.numbers', { from: 'to' });\n * });\n * ```\n *\n * @param enumName - target enum name, can be prefixed with schema\n * @param values - object where keys are for old names, values are for new names\n */\n async renameEnumValues(\n enumName: string,\n values: RecordString,\n ): Promise<void> {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n\n const ast: RakeDbAst.RenameEnumValues = {\n type: 'renameEnumValues',\n schema,\n name,\n values,\n };\n\n for (const pair of Object.entries(ast.values)) {\n const [from, to] = this.up ? pair : [pair[1], pair[0]];\n await this.adapter.query(\n `ALTER TYPE ${quoteTable(\n ast.schema,\n ast.name,\n )} RENAME VALUE \"${from}\" TO \"${to}\"`,\n );\n }\n }\n\n /**\n * Drops the enum and re-creates it with a new set of values.\n * Before dropping, changes all related column types to text, and after creating changes types back to the enum,\n * in the same way as [dropEnumValues](/guide/migration-writing.html#addenumvalues,-dropenumvalues) works.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeEnumValues(\n * // can be prefixed with schema: 'public.numbers'\n * 'numbers',\n * // change from:\n * ['one', 'two'],\n * // change to:\n * ['three', 'four'],\n * );\n * });\n * ```\n *\n * @param enumName - target enum name, can be prefixed with schema\n * @param fromValues - array of values before the change\n * @param toValues - array of values to set\n */\n changeEnumValues(\n enumName: string,\n fromValues: string[],\n toValues: string[],\n ): Promise<void> {\n return changeEnumValues(this, enumName, fromValues, toValues);\n }\n\n /**\n * Rename a type (such as enum):\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameType('oldTypeName', 'newTypeName');\n * });\n * ```\n *\n * Prefix the type name with a schema to set a different schema:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameType('fromSchema.oldType', 'toSchema.newType');\n * });\n * ```\n *\n * @param from - rename the type from\n * @param to - rename the type to\n */\n renameType(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'TYPE');\n }\n\n /**\n * Set a different schema to the type (such as enum):\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTypeSchema('typeName', 'fromSchema', 'toSchema');\n * });\n * ```\n *\n * @param name - type name\n * @param from - current table schema\n * @param to - desired table schema\n */\n changeTypeSchema(name: string, from: string, to: string): Promise<void> {\n return this.renameType(`${from}.${name}`, `${to}.${name}`);\n }\n\n /**\n * Domain is a custom database type that is based on other type and can include `NOT NULL` and a `CHECK` (see [postgres tutorial](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/)).\n *\n * Construct a column type in the function as the second argument.\n *\n * Specifiers [nullable](/guide/common-column-methods.html#nullable), [default](/guide/common-column-methods.html#default), [check](/guide/migration-column-methods.html#check), [collate](/guide/migration-column-methods.html#collate)\n * will be saved to the domain type on database level.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createDomain('domainName', (t) =>\n * t.integer().check(t.sql`value = 42`),\n * );\n *\n * // use `schemaName.domainName` format to specify a schema\n * await db.createDomain('schemaName.domainName', (t) =>\n * t\n * .text()\n * .nullable()\n * .collate('C')\n * .default('default text')\n * .check(t.sql`length(value) > 10`),\n * );\n * });\n * ```\n *\n * @param name - name of the domain\n * @param fn - function returning a column type. Options `nullable`, `collate`, `default`, `check` will be applied to domain\n */\n createDomain(name: string, fn: DbDomainArg<CT>): Promise<void> {\n return createDomain(this, this.up, name, fn);\n }\n\n /**\n * Drop the domain, create it on rollback. See {@link dropDomain}.\n *\n * @param name - name of the domain\n * @param fn - function returning a column type. Options `nullable`, `collate`, `default`, `check` will be applied to domain\n */\n dropDomain(name: string, fn: DbDomainArg<CT>): Promise<void> {\n return createDomain(this, !this.up, name, fn);\n }\n\n /**\n * To rename a domain:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameDomain('oldName', 'newName');\n *\n * // to move domain to a different schema\n * await db.renameDomain('oldSchema.domain', 'newSchema.domain');\n * });\n * ```\n *\n * @param from - old domain name (can include schema)\n * @param to - new domain name (can include schema)\n */\n renameDomain(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'DOMAIN');\n }\n\n /**\n * Create and drop a database collation, (see [Postgres docs](https://www.postgresql.org/docs/current/sql-createcollation.html)).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('myCollation', {\n * // This is a shortcut for setting lcCollate and lcCType at once.\n * locale: 'en-u-kn-true',\n *\n * // set `lcType` and `lcCType` only if the `locale` is not set.\n * // lcType: 'C',\n * // lcCType: 'C',\n *\n * // provider can be 'icu' or 'libc'. 'libc' is a default.\n * provider: 'icu',\n *\n * // true by default, false is only supported with 'icu' provider.\n * deterministic: true,\n *\n * // Is intended to by used by `pg_upgrade`. Normally, it should be omitted.\n * version: '1.2.3',\n *\n * // For `CREATE IF NOT EXISTS` when creating.\n * createIfNotExists: true,\n *\n * // For `DROP IF EXISTS` when dropping.\n * dropIfExists: true,\n *\n * // For `DROP ... CASCADE` when dropping.\n * cascase: true,\n * });\n * });\n * ```\n *\n * Instead of specifying the collation options, you can specify a collation to copy options from.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('myCollation', {\n * fromExisting: 'otherCollation',\n * });\n * });\n * ```\n *\n * To create a collation withing a specific database schema, prepend it to the collation name:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('schemaName.myCollation', {\n * // `fromExisting` also can accept a collation name with a schema.\n * fromExisting: 'schemaName.otherCollation',\n * });\n * });\n * ```\n *\n * @param name - name of the collation, can contain a name of schema separated with a dot.\n * @param options - options to create and drop the collation.\n */\n createCollation(\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n ): Promise<void> {\n return createCollation(this, this.up, name, options);\n }\n\n /**\n * Drop the collation, create it on rollback. See {@link createCollation}.\n *\n * @param name - name of the collation, can contain a name of schema separated with a dot.\n * @param options - options to create and drop the collation.\n */\n dropCollation(\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n ): Promise<void> {\n return createCollation(this, !this.up, name, options);\n }\n\n /**\n * Create and drop database views.\n *\n * Provide SQL as a string or via `t.sql` that can accept variables.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createView(\n * 'simpleView',\n * `\n * SELECT a.one, b.two\n * FROM a\n * JOIN b ON b.\"aId\" = a.id\n * `,\n * );\n *\n * // view can accept t.sql with variables in such way:\n * const value = 'some value';\n * await db.createView(\n * 'viewWithVariables',\n * t.sql`\n * SELECT * FROM a WHERE key = ${value}\n * `,\n * );\n *\n * // view with options\n * await db.createView(\n * 'schemaName.recursiveView',\n * {\n * // createOrReplace has effect when creating the view\n * createOrReplace: true,\n *\n * // dropIfExists and dropMode have effect when dropping the view\n * dropIfExists: true,\n * dropMode: 'CASCADE',\n *\n * // for details, check Postgres docs for CREATE VIEW,\n * // these options are matching CREATE VIEW options\n * temporary: true,\n * recursive: true,\n * columns: ['n'],\n * with: {\n * checkOption: 'LOCAL', // or 'CASCADED'\n * securityBarrier: true,\n * securityInvoker: true,\n * },\n * },\n * `\n * VALUES (1)\n * UNION ALL\n * SELECT n + 1 FROM \"schemaName\".\"recursiveView\" WHERE n < 100;\n * `,\n * );\n * });\n * ```\n *\n * @param name - name of the view\n * @param options - view options\n * @param sql - SQL to create the view with\n */\n createView(\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n ): Promise<void>;\n /**\n * See {@link createView}\n *\n * @param name - name of the view\n * @param sql - SQL to create the view with\n */\n createView(name: string, sql: string | RawSQLBase): Promise<void>;\n createView(name: string, ...args: unknown[]): Promise<void> {\n const [options, sql] = args.length === 2 ? args : [emptyObject, args[0]];\n\n return createView(\n this,\n this.up,\n name,\n options as RakeDbAst.ViewOptions,\n sql as string | RawSQLBase,\n );\n }\n\n /**\n * Drop the view, create it on rollback. See {@link createView}.\n *\n * @param name - name of the view\n * @param options - view options\n * @param sql - SQL to create the view with\n */\n dropView(\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n ): Promise<void>;\n /**\n * Drop the view, create it on rollback. See {@link createView}.\n *\n * @param name - name of the view\n * @param sql - SQL to create the view with\n */\n dropView(name: string, sql: string | RawSQLBase): Promise<void>;\n dropView(name: string, ...args: unknown[]): Promise<void> {\n const [options, sql] = args.length === 2 ? args : [emptyObject, args[0]];\n\n return createView(\n this,\n !this.up,\n name,\n options as RakeDbAst.ViewOptions,\n sql as string | RawSQLBase,\n );\n }\n\n /**\n * Returns boolean to know if table exists:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.tableExists('tableName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param tableName - name of the table\n */\n async tableExists(tableName: string): Promise<boolean> {\n return queryExists(this, {\n text: `SELECT 1 FROM \"information_schema\".\"tables\" WHERE \"table_name\" = $1`,\n values: [tableName],\n });\n }\n\n /**\n * Returns boolean to know if a column exists:\n *\n * Note that when `snakeCase` option is set to true, this method won't translate column to snake case, unlike other parts.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.columnExists('tableName', 'columnName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param tableName - name of the table to check for the column in\n * @param columnName - name of the column\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: [\n tableName,\n this.options.snakeCase ? toSnakeCase(columnName) : columnName,\n ],\n });\n }\n\n /**\n * Returns boolean to know if constraint exists:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.constraintExists('constraintName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param constraintName - name of the constraint\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\n/**\n * If `log` object is specified, it will perform the query with logging.\n *\n * @param log - logger object\n * @param text - SQL text\n * @param values - SQL values\n * @param fn - function to call the original `query` or `arrays`\n */\nconst wrapWithLog = async <Result>(\n log: QueryLogObject | undefined,\n text: string,\n values: unknown[] | undefined,\n fn: () => Promise<Result>,\n): Promise<Result> => {\n if (!log) {\n return fn();\n } else {\n const sql = {\n text,\n values: values || [],\n };\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\n/**\n * See {@link Migration.prototype.addColumn}\n */\nconst addColumn = <CT>(\n migration: Migration<CT>,\n up: boolean,\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => ColumnType,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n [columnName]: t.add(fn(t)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addIndex}\n */\nconst addIndex = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.index(columns, ...args)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addForeignKey}\n */\nconst addForeignKey = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.foreignKey(columns, foreignTable, foreignColumns, options)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addPrimaryKey}\n */\nconst addPrimaryKey = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.primaryKey(columns, name)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addCheck}\n */\nconst addCheck = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n check: RawSQLBase,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.check(check)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.createSchema}\n */\nconst createSchema = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n): Promise<void> => {\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\n/**\n * See {@link Migration.createExtension}\n */\nconst createExtension = async (\n migration: Migration<unknown>,\n up: boolean,\n fullName: string,\n options?: RakeDbAst.ExtensionArg,\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(fullName);\n\n const ast: RakeDbAst.Extension = {\n type: 'extension',\n action: up ? 'create' : 'drop',\n schema,\n name,\n ...options,\n };\n\n let query;\n if (ast.action === 'drop') {\n query = `DROP EXTENSION${ast.dropIfExists ? ' IF EXISTS' : ''} \"${\n ast.name\n }\"${ast.cascade ? ' CASCADE' : ''}`;\n } else {\n query = `CREATE EXTENSION${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } \"${ast.name}\"${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\n/**\n * See {@link Migration.prototype.createEnum}\n */\nconst createEnum = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n values: [string, ...string[]],\n options: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n > = {},\n): Promise<void> => {\n const [schema, enumName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Enum = {\n type: 'enum',\n action: up ? 'create' : 'drop',\n schema,\n name: enumName,\n values,\n ...options,\n };\n\n let query;\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n query = `CREATE TYPE ${quotedName} AS ENUM (${values\n .map(escapeForMigration)\n .join(', ')})`;\n } else {\n query = `DROP TYPE${ast.dropIfExists ? ' IF EXISTS' : ''} ${quotedName}${\n ast.cascade ? ' CASCADE' : ''\n }`;\n }\n\n await migration.adapter.query(query);\n};\n\n/**\n * See {@link Migration.prototype.createDomain}\n */\nconst createDomain = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n name: string,\n fn: DbDomainArg<CT>,\n): Promise<void> => {\n const [schema, domainName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Domain = {\n type: 'domain',\n action: up ? 'create' : 'drop',\n schema,\n name: domainName,\n baseType: fn(migration.columnTypes),\n };\n\n let query;\n const values: unknown[] = [];\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n const column = ast.baseType;\n query = `CREATE DOMAIN ${quotedName} AS ${columnTypeToSql(column)}${\n column.data.collate\n ? `\nCOLLATE \"${column.data.collate}\"`\n : ''\n }${\n column.data.default !== undefined\n ? `\nDEFAULT ${encodeColumnDefault(column.data.default, values)}`\n : ''\n }${!column.data.isNullable || column.data.checks ? '\\n' : ''}${[\n !column.data.isNullable && 'NOT NULL',\n column.data.checks\n ?.map((check) => `CHECK (${check.sql.toSQL({ values })})`)\n .join(' '),\n ]\n .filter(Boolean)\n .join(' ')}`;\n } else {\n query = `DROP DOMAIN ${quotedName}`;\n }\n\n await migration.adapter.query(\n interpolateSqlValues({\n text: query,\n values,\n }),\n );\n};\n\n/**\n * See {@link Migration.prototype.createCollation}\n */\nconst createCollation = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n): Promise<void> => {\n const [schema, collationName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Collation = {\n type: 'collation',\n action: up ? 'create' : 'drop',\n schema,\n name: collationName,\n ...options,\n };\n\n let query;\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n query = `CREATE COLLATION${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } ${quotedName} `;\n\n if (ast.fromExisting) {\n query += `FROM ${quoteNameFromString(ast.fromExisting)}`;\n } else {\n const config: string[] = [];\n if (ast.locale) config.push(`locale = '${ast.locale}'`);\n if (ast.lcCollate) config.push(`lc_collate = '${ast.lcCollate}'`);\n if (ast.lcCType) config.push(`lc_ctype = '${ast.lcCType}'`);\n if (ast.provider) config.push(`provider = ${ast.provider}`);\n if (ast.deterministic !== undefined)\n config.push(`deterministic = ${ast.deterministic}`);\n if (ast.version) config.push(`version = '${ast.version}'`);\n\n query += `(\\n ${config.join(',\\n ')}\\n)`;\n }\n } else {\n query = `DROP COLLATION${\n ast.dropIfExists ? ' IF EXISTS' : ''\n } ${quotedName}${ast.cascade ? ` CASCADE` : ''}`;\n }\n\n await migration.adapter.query(query);\n};\n\n/**\n * Run the query and check if it has rows.\n *\n * @param db - migration instance\n * @param sql - raw SQL object to execute\n */\nconst queryExists = (\n db: Migration<unknown>,\n sql: { text: string; values: unknown[] },\n): Promise<boolean> => {\n return db.adapter\n .query(sql.text, sql.values)\n .then(({ rowCount }) => rowCount > 0);\n};\n\nexport const renameType = async (\n migration: Migration<unknown>,\n from: string,\n to: string,\n kind: RakeDbAst.RenameType['kind'],\n): Promise<void> => {\n const [fromSchema, f] = getSchemaAndTableFromName(migration.up ? from : to);\n const [toSchema, t] = getSchemaAndTableFromName(migration.up ? to : from);\n const ast: RakeDbAst.RenameType = {\n type: 'renameType',\n kind,\n fromSchema,\n from: f,\n toSchema,\n to: t,\n };\n\n if (ast.from !== ast.to) {\n await migration.adapter.query(\n `ALTER ${ast.kind} ${quoteTable(ast.fromSchema, ast.from)} RENAME TO \"${\n ast.to\n }\"`,\n );\n }\n\n if (ast.fromSchema !== ast.toSchema) {\n await migration.adapter.query(\n `ALTER ${ast.kind} ${quoteTable(ast.fromSchema, ast.to)} SET SCHEMA \"${\n ast.toSchema ?? migration.adapter.schema\n }\"`,\n );\n }\n};\n\nconst renameTableItem = async (\n migration: Migration<unknown>,\n tableName: string,\n from: string,\n to: string,\n kind: RakeDbAst.RenameTableItem['kind'],\n) => {\n const [schema, table] = getSchemaAndTableFromName(tableName);\n const [f, t] = migration.up ? [from, to] : [to, from];\n await migration.adapter.query(\n kind === 'INDEX'\n ? `ALTER INDEX ${quoteTable(schema, f)} RENAME TO \"${t}\"`\n : `ALTER TABLE ${quoteTable(\n schema,\n table,\n )} RENAME CONSTRAINT \"${f}\" TO \"${t}\"`,\n );\n};\n\ninterface AddEnumValueOptions {\n // add only if not already exists\n ifNotExists?: boolean;\n // insert before other value\n before?: string;\n // insert after other value\n after?: string;\n}\n\nexport const addOrDropEnumValues = async (\n migration: Migration<unknown>,\n up: boolean,\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n const quotedName = quoteTable(schema, name);\n\n const ast: RakeDbAst.EnumValues = {\n type: 'enumValues',\n action: up ? 'add' : 'drop',\n schema,\n name,\n values,\n place: options?.before ? 'before' : options?.after ? 'after' : undefined,\n relativeTo: options?.before ?? options?.after,\n ifNotExists: options?.ifNotExists,\n };\n\n if (ast.action === 'add') {\n await Promise.all(\n (ast.place === 'after' ? [...ast.values].reverse() : ast.values).map(\n (value) =>\n migration.adapter.query(\n `ALTER TYPE ${quoteTable(ast.schema, ast.name)} ADD VALUE${\n ast.ifNotExists ? ' IF NOT EXISTS' : ''\n } ${singleQuote(value)}${\n ast.place && ast.relativeTo\n ? ` ${ast.place.toUpperCase()} ${singleQuote(ast.relativeTo)}`\n : ''\n }`,\n ),\n ),\n );\n return;\n }\n\n const { rows: valuesRows } = await migration.adapter.query<{ value: string }>(\n `SELECT unnest(enum_range(NULL::${quotedName}))::text value`,\n );\n const existingValues = valuesRows.map((r) => r.value);\n\n await recreateEnum(\n migration,\n ast,\n existingValues.filter((v) => !ast.values.includes(v)),\n (quotedName, table, column) =>\n `Cannot drop ${quotedName} enum values [${ast.values\n .map(singleQuote)\n .join(\n ', ',\n )}]: table ${table} has a row with such value in the column \"${column}\"`,\n );\n};\n\nexport const changeEnumValues = async (\n migration: Migration<unknown>,\n enumName: string,\n fromValues: string[],\n toValues: string[],\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n\n if (!migration.up) {\n const values = fromValues;\n fromValues = toValues;\n toValues = values;\n }\n\n const ast: RakeDbAst.ChangeEnumValues = {\n type: 'changeEnumValues',\n schema,\n name,\n fromValues,\n toValues,\n };\n\n await recreateEnum(\n migration,\n ast,\n ast.toValues,\n (quotedName, table, column) =>\n `Cannot change ${quotedName} enum values from [${fromValues\n .map(singleQuote)\n .join(', ')}] to [${toValues\n .map(singleQuote)\n .join(\n ', ',\n )}]: table ${table} has a row with removed value in the column \"${column}\"`,\n );\n};\n\nconst recreateEnum = async (\n migration: Migration<unknown>,\n { schema, name }: { schema?: string; name: string },\n values: string[],\n errorMessage: (quotedName: string, table: string, column: string) => string,\n) => {\n const defaultSchema = migration.adapter.schema;\n const quotedName = quoteTable(schema, name);\n\n const relKinds = ['r', 'm']; // r is for table, m is for materialized views, TODO: not sure if materialized views are needed here.\n const { rows: tables } = await migration.adapter.query<{\n schema: string;\n table: string;\n columns: { name: string; arrayDims: number }[];\n }>(\n `SELECT n.nspname AS \"schema\",\n c.relname AS \"table\",\n json_agg(\n json_build_object('name', a.attname, 'arrayDims', a.attndims)\n ORDER BY a.attnum\n ) AS \"columns\"\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nJOIN pg_type bt ON bt.typname = ${singleQuote(name)}\nJOIN pg_type t ON t.oid = bt.oid OR t.typelem = bt.oid\nJOIN pg_attribute a ON a.attrelid = c.oid AND a.atttypid = t.oid\nJOIN pg_namespace tn ON tn.oid = t.typnamespace AND tn.nspname = ${singleQuote(\n schema ?? defaultSchema,\n )}\nWHERE c.relkind IN (${relKinds.map((c) => `'${c}'`).join(', ')})\nGROUP BY n.nspname, c.relname`,\n );\n\n const sql = tables.map(\n (t) =>\n `ALTER TABLE ${quoteTable(t.schema, t.table)}\n ${t.columns\n .map(\n (c) =>\n ` ALTER COLUMN \"${c.name}\" TYPE text${'[]'.repeat(c.arrayDims)}`,\n )\n .join(',\\n')}`,\n );\n\n sql.push(\n `DROP TYPE ${quotedName}`,\n `CREATE TYPE ${quotedName} AS ENUM (${values.map(singleQuote).join(', ')})`,\n );\n\n await migration.adapter.query(sql.join(';\\n'));\n\n for (const t of tables) {\n const table = quoteTable(t.schema, t.table);\n for (const c of t.columns) {\n const type = quotedName + '[]'.repeat(c.arrayDims);\n\n try {\n await migration.adapter.query(\n `ALTER TABLE ${table}\n ALTER COLUMN \"${c.name}\" TYPE ${type} USING \"${c.name}\"::${type}`,\n );\n } catch (err) {\n if ((err as { code: string }).code === '22P02') {\n throw new Error(errorMessage(quotedName, table, c.name), {\n cause: err,\n });\n }\n throw err;\n }\n }\n }\n};\n","import {\n getFirstWordAndRest,\n getTextAfterFrom,\n getTextAfterTo,\n RakeDbCtx,\n} from '../common';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { getImportPath, pathToLog } from 'pqb';\nimport { AnyRakeDbConfig } from '../config';\nimport { getMigrations } from '../migration/migrationsSet';\n\nexport const writeMigrationFile = async (\n config: AnyRakeDbConfig,\n version: string,\n name: string,\n migrationCode: string,\n): Promise<void> => {\n await mkdir(config.migrationsPath, { recursive: true });\n\n const filePath = path.resolve(\n config.migrationsPath,\n `${version}_${name.replaceAll(' ', '-')}.ts`,\n );\n const importPath = getImportPath(\n filePath,\n path.join(config.basePath, config.dbScript),\n );\n\n await writeFile(\n filePath,\n `import { change } from '${importPath}';\\n${migrationCode}`,\n );\n\n config.logger?.log(`Created ${pathToLog(filePath)}`);\n};\n\nexport const newMigration = async (\n config: AnyRakeDbConfig,\n [name]: string[],\n): Promise<void> => {\n if (!name) throw new Error('Migration name is missing');\n\n const version = await makeFileVersion({}, config);\n await writeMigrationFile(config, version, name, makeContent(name));\n};\n\nexport const makeFileVersion = async (\n ctx: RakeDbCtx,\n config: AnyRakeDbConfig,\n) => {\n if (config.migrationId === 'timestamp') {\n return generateTimeStamp();\n } else {\n const {\n migrations: [first],\n } = await getMigrations(ctx, config, false);\n return first\n ? String(parseInt(first.version) + 1).padStart(4, '0')\n : '0001';\n }\n};\n\nexport const generateTimeStamp = () => {\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): string => {\n let content = `\\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 \\n }));`;\n } else if (first === 'change') {\n content += `\\n await db.changeTable('${rest}', (t) => ({\\n \\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 \\n }));`;\n }\n }\n\n return content + '\\n});\\n';\n};\n","import { AnyRakeDbConfig, PickMigrationsTable } from '../config';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { generateTimeStamp } from './newMigration';\nimport { getMigrations } from '../migration/migrationsSet';\nimport { AdapterBase } from 'pqb';\n\nexport const fileNamesToChangeMigrationId = {\n serial: '.rename-to-serial.json',\n timestamp: '.rename-to-timestamp.json',\n};\n\nexport const fileNamesToChangeMigrationIdMap = Object.fromEntries(\n Object.entries(fileNamesToChangeMigrationId).map(([_, name]) => [name, true]),\n);\n\nexport const changeIds = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n [arg, digitsArg]: string[],\n) => {\n if (arg !== 'serial' && arg !== 'timestamp') {\n throw new Error(\n `Pass \"serial\" or \"timestamp\" argument to the \"change-ids\" command`,\n );\n }\n\n let digits = digitsArg && parseInt(digitsArg);\n if (!digits || isNaN(digits)) digits = 4;\n\n const data = await getMigrations({}, config, true, false, (_, filePath) => {\n const fileName = path.basename(filePath);\n const match = fileName.match(/^(\\d+)\\D/);\n if (!match) {\n throw new Error(\n `Migration file name should start digits, received ${fileName}`,\n );\n }\n\n return match[1];\n });\n\n if (data.renameTo) {\n if (\n (arg === 'serial' &&\n typeof data.renameTo.to === 'object' &&\n digits === data.renameTo.to.serial) ||\n (arg === 'timestamp' && data.renameTo.to === 'timestamp')\n ) {\n config.logger?.log(\n config.migrations\n ? '`renameMigrations` setting is already set'\n : `${fileNamesToChangeMigrationId[arg]} already exists`,\n );\n return;\n }\n\n if (!config.migrations) {\n await fs.unlink(\n path.join(\n config.migrationsPath,\n fileNamesToChangeMigrationId[\n data.renameTo.to === 'timestamp' ? 'timestamp' : 'serial'\n ],\n ),\n );\n }\n }\n\n const version = arg === 'timestamp' ? parseInt(generateTimeStamp()) : 1;\n\n const rename: Record<string, number> = Object.fromEntries(\n data.migrations.map((item, i) => [path.basename(item.path), version + i]),\n );\n\n if (config.migrations) {\n const to = arg === 'timestamp' ? `'${arg}'` : `{ serial: ${digits} }`;\n config.logger?.log(\n `Save the following settings into your rake-db config under the \\`migrations\\` setting, it will instruct rake-db to rename migration entries during the next deploy:\\n${\n arg !== 'serial' || digits !== 4 ? `\\nmigrationId: ${to},` : ''\n }\\nrenameMigrations: {\\n to: ${to},\\n map: {\\n ` +\n Object.entries(rename)\n .map(([key, value]) => `\"${key}\": ${value},`)\n .join('\\n ') +\n '\\n },\\n},\\n\\n',\n );\n } else {\n await fs.writeFile(\n path.join(config.migrationsPath, fileNamesToChangeMigrationId[arg]),\n JSON.stringify(rename, null, 2),\n );\n }\n\n const values: RenameMigrationVersionsValue[] = data.migrations.map(\n (item, i) => {\n let newVersion = String(version + i);\n\n if (arg === 'serial') newVersion = newVersion.padStart(digits, '0');\n\n const name = path.basename(item.path).slice(item.version.length + 1);\n\n return [item.version, name, newVersion];\n },\n );\n if (!values.length) return;\n\n if (config.migrations) {\n config.logger?.log(\n `If your migrations are stored in files, navigate to migrations directory and run the following commands to rename them:\\n\\n${values\n .map(\n ([version, name, newVersion]) =>\n `mv \"${version}_${name}\" \"${newVersion}_${name}\"`,\n )\n .join(\n '\\n',\n )}\\n\\nAfter setting \\`renameMigrations\\` (see above) and renaming the files, run the db up command to rename migration entries in your database`,\n );\n return;\n }\n\n await Promise.all(\n data.migrations.map(async (item, i) => {\n const [, name, newVersion] = values[i];\n await fs.rename(\n item.path,\n path.join(path.dirname(item.path), `${newVersion}_${name}`),\n );\n }),\n );\n\n await Promise.all(\n adapters.map((adapter) => {\n renameMigrationVersionsInDb(config, adapter, values).then(() =>\n adapter.close(),\n );\n }),\n );\n\n config.logger?.log(\n `Migration files were renamed, a config file ${\n fileNamesToChangeMigrationId[arg]\n } for renaming migrations after deploy was created, and migrations in local db were renamed successfully.\\n\\n${\n arg === 'timestamp' || digits !== 4\n ? `Set \\`migrationId\\`: ${\n arg === 'timestamp' ? `'timestamp'` : `{ serial: ${digits} }`\n }`\n : `Remove \\`migrationId\\``\n } setting in the rake-db config`,\n );\n};\n\nexport type RenameMigrationVersionsValue = [\n oldVersion: string,\n name: string,\n newVersion: string | number,\n];\n\nexport const renameMigrationVersionsInDb = async (\n config: PickMigrationsTable,\n adapter: AdapterBase,\n values: RenameMigrationVersionsValue[],\n) => {\n await adapter.arrays(\n `UPDATE \"${\n config.migrationsTable\n }\" AS t SET version = v.version FROM (VALUES ${values\n .map(\n ([oldVersion, , newVersion], i) =>\n `('${oldVersion}', $${i + 1}, '${newVersion}')`,\n )\n .join(\n ', ',\n )}) v(oldVersion, name, version) WHERE t.version = v.oldVersion`,\n values.map(([, name]) => name),\n );\n};\n","import path from 'path';\nimport {\n AnyRakeDbConfig,\n RakeDbRenameMigrations,\n RakeDbRenameMigrationsMap,\n} from '../config';\nimport { RecordString } from 'pqb';\nimport { pathToFileURL } from 'node:url';\nimport { Dirent } from 'node:fs';\nimport { readdir } from 'fs/promises';\nimport { RakeDbCtx } from '../common';\nimport { fileNamesToChangeMigrationIdMap } from '../commands/changeIds';\nimport fs from 'fs/promises';\n\nexport interface MigrationItemHasLoad {\n path?: string;\n\n /**\n * Function that loads the migration content,\n * can store lazy import of a migration file.\n * Promise can return `{ default: x }` where `x` is a return of `change` or an array of such returns.\n */\n load(): Promise<unknown>;\n}\n\nexport interface MigrationItem extends MigrationItemHasLoad {\n path: string;\n version: string;\n}\n\nexport interface MigrationsSet {\n renameTo?: RakeDbRenameMigrations;\n migrations: MigrationItem[];\n}\n\n// If the config has a `migrations` object, it will be returned as array of migration items.\n// If `up` is false, will reverse the resulting array.\n// Otherwise, it will scan directory which is set in `migrationPath` and convert files into migration items.\n// `up` value determines sorting of files: `true` for ascending, `false` for descending.\nexport const getMigrations = async (\n ctx: RakeDbCtx,\n config: Pick<\n AnyRakeDbConfig,\n | 'migrationId'\n | 'renameMigrations'\n | 'migrations'\n | 'basePath'\n | 'import'\n | 'migrationsPath'\n >,\n up: boolean,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> => {\n return (ctx.migrationsPromise ??= config.migrations\n ? getMigrationsFromConfig(\n { ...config, migrations: config.migrations },\n allowDuplicates,\n getVersion,\n )\n : getMigrationsFromFiles(config, allowDuplicates, getVersion)).then(\n (data) =>\n up\n ? data\n : {\n renameTo: data.renameTo,\n migrations: [...data.migrations].reverse(),\n },\n );\n};\n\n// Converts user-provided migrations object into array of migration items.\nfunction getMigrationsFromConfig(\n config: Pick<\n AnyRakeDbConfig,\n 'migrationId' | 'renameMigrations' | 'migrations' | 'basePath'\n >,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> {\n const result: MigrationItem[] = [];\n const versions: RecordString = {};\n\n const { migrations, basePath } = config;\n for (const key in migrations) {\n const version = getVersion(config, path.basename(key));\n if (versions[version] && !allowDuplicates) {\n throw new Error(\n `Migration ${key} has the same version as ${versions[version]}`,\n );\n }\n\n versions[version] = key;\n\n result.push({\n path: path.resolve(basePath, key),\n version,\n load: migrations[key],\n });\n }\n\n const { renameMigrations } = config;\n return Promise.resolve({\n migrations: result,\n renameTo: renameMigrations\n ? { to: renameMigrations.to, map: () => renameMigrations.map }\n : undefined,\n });\n}\n\n// For sorting migration files in ascending sort.\nexport const sortMigrationsAsc = (\n a: { version: string },\n b: { version: string },\n) => +a.version - +b.version;\n\n// Scans files under `migrationsPath` to convert files into migration items.\nexport async function getMigrationsFromFiles(\n config: Pick<AnyRakeDbConfig, 'migrationId' | 'migrationsPath' | 'import'>,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> {\n const { migrationsPath, import: imp } = config;\n\n const entries = await readdir(migrationsPath, { withFileTypes: true }).catch(\n () => [] as Dirent[],\n );\n\n const versions: RecordString = {};\n\n const result = entries.reduce<MigrationsSet>(\n (data, file) => {\n if (!file.isFile()) return data;\n\n if (fileNamesToChangeMigrationIdMap[file.name]) {\n if (data.renameTo) {\n throw new Error(\n `Both files for renaming to serial and timestamp found, only one must remain`,\n );\n }\n\n const isSerialFile = file.name === '.rename-to-serial.json';\n const isSerialConfig = config.migrationId !== 'timestamp';\n if (\n (isSerialFile && !isSerialConfig) ||\n (!isSerialFile && isSerialConfig)\n ) {\n throw new Error(\n `File ${\n file.name\n } to rename migrations does not match \\`migrationId\\` ${JSON.stringify(\n config.migrationId,\n )} set in config`,\n );\n }\n\n data.renameTo = {\n to: config.migrationId,\n map: () => renameMigrationsMap(config, file.name),\n };\n\n return data;\n } else {\n checkExt(file.name);\n }\n\n const version = getVersion(config, file.name);\n const filePath = path.resolve(migrationsPath, file.name);\n\n if (versions[version] && !allowDuplicates) {\n throw new Error(\n `Migration ${pathToFileURL(\n filePath,\n )} has the same version as ${pathToFileURL(\n versions[version],\n )}\\nRun \\`**db command** rebase\\` to reorganize files with duplicated versions.`,\n );\n }\n\n versions[version] = filePath;\n\n data.migrations.push({\n path: filePath,\n version,\n async load() {\n try {\n await imp(this.path);\n } catch (err) {\n // throw if unknown error\n if (\n (err as { code: string }).code !==\n 'ERR_UNSUPPORTED_ESM_URL_SCHEME'\n )\n throw err;\n\n // this error happens on windows in ESM mode, try import transformed url\n await imp(pathToFileURL(this.path).pathname);\n }\n },\n });\n\n return data;\n },\n { migrations: [] },\n );\n\n result.migrations.sort(sortMigrationsAsc);\n\n return result;\n}\n\nconst renameMigrationsMap = async (\n config: Pick<AnyRakeDbConfig, 'migrationsPath'>,\n fileName: string,\n): Promise<RakeDbRenameMigrationsMap> => {\n const filePath = path.join(config.migrationsPath, fileName);\n\n const json = await fs.readFile(filePath, 'utf-8');\n\n let data: RakeDbRenameMigrationsMap;\n try {\n data = JSON.parse(json);\n if (typeof data !== 'object')\n throw new Error('Config for renaming is not an object');\n } catch (err) {\n throw new Error(`Failed to read ${pathToFileURL(filePath)}`, {\n cause: err,\n });\n }\n\n return data;\n};\n\n// Restrict supported file extensions to `.ts`, `.js`, and `.mjs`.\nfunction checkExt(filePath: string): void {\n const ext = path.extname(filePath);\n if (ext !== '.ts' && ext !== '.js' && ext !== '.mjs') {\n throw new Error(\n `Only .ts, .js, and .mjs files are supported for migration, received: ${filePath}`,\n );\n }\n}\n\n// Extract a 14-chars long timestamp from a beginning of a file name.\nexport function getMigrationVersionOrThrow(\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n filePath: string,\n): string {\n const name = path.basename(filePath);\n const value = getMigrationVersion(config, name);\n if (value) return value;\n\n if (config.migrationId === 'timestamp') {\n throw new Error(\n `Migration file name should start with 14 digit timestamp, received ${name}`,\n );\n } else {\n throw new Error(\n `Migration file name should start with 4 digit serial number, received ${name}.\nYou can automatically change migration ids to serial by running \\`*db-command* change-ids serial\\`.\nTo keep using timestamp ids, set \\`migrationId\\` option of rake-db to 'timestamp'.`,\n );\n }\n}\n\nexport function getMigrationVersion(\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n name: string,\n) {\n return (\n config.migrationId === 'timestamp'\n ? name.match(/^(\\d{14})(_|\\b)/)\n : name.match(/^(\\d{4})(_|\\b)/)\n )?.[1];\n}\n\nexport function getDigitsPrefix(name: string) {\n const value = name.match(/^(\\d+)\\D/)?.[1];\n if (!value) {\n throw new Error(\n `Migration file should be prefixed with a serial number, received ${name}`,\n );\n }\n\n return value;\n}\n","import { RakeDbCtx } from '../common';\nimport { SilentQueries } from './migration';\nimport {\n AdapterBase,\n RecordOptionalString,\n RecordString,\n RecordUnknown,\n} from 'pqb';\nimport {\n PickBasePath,\n PickImport,\n PickMigrationId,\n PickMigrations,\n PickMigrationsPath,\n PickMigrationsTable,\n PickRenameMigrations,\n RakeDbRenameMigrations,\n} from '../config';\nimport path from 'path';\nimport {\n getDigitsPrefix,\n getMigrations,\n getMigrationVersion,\n} from './migrationsSet';\nimport {\n renameMigrationVersionsInDb,\n RenameMigrationVersionsValue,\n} from '../commands/changeIds';\n\nexport const saveMigratedVersion = async (\n db: SilentQueries,\n version: string,\n name: string,\n config: PickMigrationsTable,\n): Promise<void> => {\n await db.silentArrays(\n `INSERT INTO \"${config.migrationsTable}\"(version, name) VALUES ($1, $2)`,\n [version, name],\n );\n};\n\nexport const deleteMigratedVersion = async (\n db: SilentQueries,\n version: string,\n name: string,\n config: PickMigrationsTable,\n) => {\n const res = await db.silentArrays(\n `DELETE FROM \"${config.migrationsTable}\" WHERE version = $1 AND name = $2`,\n [version, name],\n );\n\n if (res.rowCount === 0) {\n throw new Error(`Migration ${version}_${name} was not found in db`);\n }\n};\n\nexport class NoMigrationsTableError extends Error {}\n\nexport type RakeDbAppliedVersions = {\n map: RecordOptionalString;\n sequence: number[];\n};\n\ninterface MigratedVersionsMapConfig\n extends PickMigrationId,\n PickMigrationsTable,\n PickRenameMigrations,\n PickMigrations,\n PickBasePath,\n PickImport,\n PickMigrationsPath {}\n\nexport const getMigratedVersionsMap = async (\n ctx: RakeDbCtx,\n adapter: AdapterBase,\n config: MigratedVersionsMapConfig,\n renameTo?: RakeDbRenameMigrations,\n): Promise<RakeDbAppliedVersions> => {\n try {\n const table = `\"${config.migrationsTable}\"`;\n\n const result = await adapter.arrays<[string, string]>(\n `SELECT * FROM ${table} ORDER BY version`,\n );\n\n if (!result.fields[1]) {\n const { migrations } = await getMigrations(ctx, config, true);\n\n const map: RecordString = {};\n for (const item of migrations) {\n const name = path.basename(item.path);\n map[item.version] = name.slice(getDigitsPrefix(name).length + 1);\n }\n\n for (const row of result.rows) {\n const [version] = row;\n const name = map[version];\n if (!name) {\n throw new Error(\n `Migration for version ${version} is stored in db but is not found among available migrations`,\n );\n }\n\n row[1] = name;\n }\n\n await adapter.arrays(`ALTER TABLE ${table} ADD COLUMN name TEXT`);\n\n await Promise.all(\n result.rows.map(([version, name]) =>\n adapter.arrays(`UPDATE ${table} SET name = $2 WHERE version = $1`, [\n version,\n name,\n ]),\n ),\n );\n\n await adapter.arrays(\n `ALTER TABLE ${table} ALTER COLUMN name SET NOT NULL`,\n );\n }\n\n let versions = Object.fromEntries(result.rows);\n\n if (renameTo) {\n versions = await renameMigrations(config, adapter, versions, renameTo);\n }\n\n return { map: versions, sequence: result.rows.map((row) => +row[0]) };\n } catch (err) {\n if ((err as RecordUnknown).code === '42P01') {\n throw new NoMigrationsTableError();\n } else {\n throw err;\n }\n }\n};\n\ninterface RenameMigrationsConfig extends PickMigrationId, PickMigrationsTable {}\n\nasync function renameMigrations(\n config: RenameMigrationsConfig,\n trx: AdapterBase,\n versions: RecordString,\n renameTo: RakeDbRenameMigrations,\n) {\n let first: string | undefined;\n for (const version in versions) {\n first = version;\n break;\n }\n\n if (!first || getMigrationVersion(config, first)) return versions;\n\n const values: RenameMigrationVersionsValue[] = [];\n\n const updatedVersions: RecordString = {};\n\n const data = await renameTo.map();\n\n for (const version in versions) {\n const name = versions[version];\n const key = `${version}_${name}`;\n let newVersion = data[key] as string | number;\n if (!newVersion) {\n throw new Error(\n `Failed to find an entry for the migrated ${key} in the renaming config`,\n );\n }\n\n if (typeof renameTo.to === 'object') {\n newVersion = String(newVersion).padStart(renameTo.to.serial, '0');\n }\n\n updatedVersions[newVersion] = name;\n values.push([version, name, newVersion]);\n }\n\n await renameMigrationVersionsInDb(config, trx, values);\n\n return updatedVersions;\n}\n","import { RakeDbConfig } from '../config';\nimport { AdapterBase, ColumnSchemaConfig, RecordUnknown } from 'pqb';\n\nexport const createMigrationsTable = async (\n db: AdapterBase,\n config: Pick<RakeDbConfig<ColumnSchemaConfig>, 'migrationsTable' | 'logger'>,\n) => {\n const { schema } = db;\n if (schema && schema !== 'public') {\n try {\n await db.query(`CREATE SCHEMA \"${schema}\"`);\n config.logger?.log(`Created schema ${schema}`);\n } catch (err) {\n if ((err as { code: string }).code !== '42P06') {\n throw err;\n }\n }\n }\n\n try {\n await db.query(\n `CREATE TABLE \"${config.migrationsTable}\" ( version TEXT NOT NULL, name TEXT NOT NULL )`,\n );\n config.logger?.log('Created versions table');\n } catch (err) {\n if ((err as RecordUnknown).code === '42P07') {\n config.logger?.log('Versions table exists');\n } else {\n throw err;\n }\n }\n};\n","import {\n createDbWithAdapter,\n DbResult,\n AdapterBase,\n ColumnSchemaConfig,\n emptyArray,\n MaybeArray,\n pathToLog,\n QueryLogOptions,\n toArray,\n} from 'pqb';\nimport { queryLock, RakeDbCtx, transaction } from '../common';\nimport {\n clearChanges,\n getCurrentChanges,\n MigrationChange,\n} from '../migration/change';\nimport {\n createMigrationInterface,\n CreateMigrationInterfaceConfig,\n SilentQueries,\n} from '../migration/migration';\nimport {\n getMigratedVersionsMap,\n NoMigrationsTableError,\n deleteMigratedVersion,\n saveMigratedVersion,\n RakeDbAppliedVersions,\n} from '../migration/manageMigratedVersions';\nimport { RakeDbError } from '../errors';\nimport {\n PickAfterChangeCommit,\n PickBasePath,\n PickForceDefaultExports,\n PickImport,\n PickMigrationCallbacks,\n PickMigrationId,\n PickMigrationsPath,\n PickMigrationsTable,\n PickTransactionSetting,\n RakeDbConfig,\n} from '../config';\nimport path from 'path';\nimport { createMigrationsTable } from '../migration/migrationsTable';\nimport {\n getMigrations,\n MigrationItem,\n MigrationItemHasLoad,\n MigrationsSet,\n} from '../migration/migrationsSet';\nimport { versionToString } from '../migration/migration.utils';\n\nexport const RAKE_DB_LOCK_KEY = '8582141715823621641';\n\nexport interface MigrateFnConfig\n extends MigrateOrRollbackConfig,\n PickAfterChangeCommit,\n PickBasePath,\n PickImport,\n PickMigrationsPath,\n PickTransactionSetting {}\n\ninterface MigrateFnParams {\n ctx?: RakeDbCtx;\n adapter: AdapterBase;\n config: MigrateFnConfig;\n count?: number;\n force?: boolean;\n}\n\ntype MigrateFn = (params: MigrateFnParams) => Promise<void>;\n\nconst transactionIfSingle = (\n params: MigrateFnParams,\n fn: (trx: AdapterBase) => Promise<void>,\n) => {\n return params.config.transaction === 'single'\n ? transaction(params.adapter, fn)\n : fn(params.adapter);\n};\n\nfunction makeMigrateFn(\n up: boolean,\n fn: (\n trx: AdapterBase,\n config: MigrateFnConfig,\n set: MigrationsSet,\n versions: RakeDbAppliedVersions,\n count: number,\n force: boolean,\n ) => Promise<MigrationItem[]>,\n): MigrateFn {\n return async (params): Promise<void> => {\n const ctx = params.ctx || {};\n const set = await getMigrations(ctx, params.config, up);\n const count = params.count ?? Infinity;\n const force = params.force ?? false;\n\n let migrations: MigrationItem[] | undefined;\n try {\n await transactionIfSingle(params, async (trx) => {\n const versions = await getMigratedVersionsMap(\n ctx,\n trx,\n params.config,\n set.renameTo,\n );\n\n migrations = await fn(trx, params.config, set, versions, count, force);\n });\n } catch (err) {\n if (err instanceof NoMigrationsTableError) {\n await transactionIfSingle(params, async (trx) => {\n await createMigrationsTable(trx, params.config);\n\n const versions = await getMigratedVersionsMap(\n ctx,\n trx,\n params.config,\n set.renameTo,\n );\n\n migrations = await fn(\n trx,\n params.config,\n set,\n versions,\n count,\n force,\n );\n });\n } else {\n throw err;\n }\n }\n\n params.config.afterChangeCommit?.({\n adapter: params.adapter,\n up,\n migrations: migrations as MigrationItem[],\n });\n };\n}\n\ntype MigrateCommand = (\n adapters: AdapterBase[],\n config: RakeDbConfig<ColumnSchemaConfig>,\n args: string[],\n) => Promise<void>;\n\nconst makeMigrateCommand = (\n migrateFn: MigrateFn,\n defaultCount: number,\n): MigrateCommand => {\n return async (adapters, config, args) => {\n const arg = args[0];\n let force = arg === 'force';\n let count = defaultCount;\n if (arg === 'force') {\n force = true;\n } else {\n force = false;\n const num = arg === 'all' ? Infinity : parseInt(arg || '');\n if (!isNaN(num)) {\n count = num;\n }\n }\n\n for (const adapter of adapters) {\n await migrateFn({ ctx: {}, adapter, config, count, force });\n }\n };\n};\n\n/**\n * Will run all pending yet migrations, sequentially in order,\n * will apply `change` functions top-to-bottom.\n *\n * @param options - options to construct db adapter with\n * @param config - specifies how to load migrations, callbacks, and logger\n * @param args - pass none or `all` to run all migrations, pass int for how many to migrate\n */\nexport const migrate: MigrateFn = makeMigrateFn(\n true,\n (trx, config, set, versions, count, force) =>\n migrateOrRollback(trx, config, set, versions, count, true, false, force),\n);\n\nexport const migrateAndClose: MigrateFn = async (params) => {\n await migrate(params);\n await params.adapter.close();\n};\n\nexport const migrateCommand = makeMigrateCommand(migrate, Infinity);\n\n/**\n * Will roll back one latest applied migration,\n * will apply `change` functions bottom-to-top.\n *\n * Takes the same options as {@link migrate}.\n */\nexport const rollback: MigrateFn = makeMigrateFn(\n false,\n (trx, config, set, versions, count, force) =>\n migrateOrRollback(trx, config, set, versions, count, false, false, force),\n);\n\nexport const rollbackCommand = makeMigrateCommand(rollback, 1);\n\n/**\n * Calls {@link rollback} and then {@link migrate}.\n *\n * Takes the same options as {@link migrate}.\n */\nexport const redo: MigrateFn = makeMigrateFn(\n true,\n async (trx, config, set, versions, count, force) => {\n set.migrations.reverse();\n\n await migrateOrRollback(trx, config, set, versions, count, false, true);\n\n set.migrations.reverse();\n\n return migrateOrRollback(\n trx,\n config,\n set,\n versions,\n count,\n true,\n true,\n force,\n true,\n );\n },\n);\n\nexport const redoCommand = makeMigrateCommand(redo, 1);\n\nconst getDb = (adapter: AdapterBase) =>\n createDbWithAdapter<ColumnSchemaConfig>({ adapter });\n\ninterface MigrateOrRollbackConfig\n extends PickMigrationCallbacks,\n PickMigrationId,\n QueryLogOptions,\n PickForceDefaultExports,\n PickMigrationsTable,\n PickTransactionSetting {\n columnTypes: unknown;\n}\n\nexport const migrateOrRollback = async (\n trx: AdapterBase,\n config: MigrateOrRollbackConfig,\n set: MigrationsSet,\n versions: RakeDbAppliedVersions,\n count: number,\n up: boolean,\n redo: boolean,\n force?: boolean,\n skipLock?: boolean,\n): Promise<MigrationItem[]> => {\n const { sequence, map: versionsMap } = versions;\n\n if (up) {\n const rollbackTo = checkMigrationOrder(config, set, versions, force);\n\n if (rollbackTo) {\n let i = sequence.length - 1;\n for (; i >= 0; i--) {\n if (rollbackTo >= sequence[i]) {\n i++;\n break;\n }\n }\n if (i < 0) i = 0;\n\n set.migrations.reverse();\n\n await migrateOrRollback(\n trx,\n config,\n set,\n versions,\n sequence.length - i,\n false,\n redo,\n );\n\n set.migrations.reverse();\n }\n }\n\n if (!skipLock) await queryLock(trx);\n\n let db: DbResult<unknown> | undefined;\n\n const beforeMigrate = config[up ? 'beforeMigrate' : 'beforeRollback'];\n if (beforeMigrate || config.beforeChange) {\n db ??= getDb(trx);\n const { migrations } = set;\n await beforeMigrate?.({ db, migrations });\n await config.beforeChange?.({ db, migrations, up, redo });\n }\n\n let loggedAboutStarting = false;\n\n let migrations: MigrationItem[] | undefined;\n\n const migrationRunner =\n config.transaction === 'single'\n ? runMigration\n : runMigrationInOwnTransaction;\n\n for (const file of set.migrations) {\n if (\n (up && versionsMap[file.version]) ||\n (!up && !versionsMap[file.version])\n ) {\n continue;\n }\n\n if (count-- <= 0) break;\n\n if (!loggedAboutStarting && (!redo || !up)) {\n loggedAboutStarting = true;\n config.logger?.log(\n `${\n redo ? 'Reapplying migrations for' : up ? 'Migrating' : 'Rolling back'\n } database ${trx.getDatabase()}\\n`,\n );\n }\n\n const changes = await getChanges(file, config);\n const adapter = await migrationRunner(trx, up, changes, config);\n await changeMigratedVersion(adapter, up, file, config);\n\n (migrations ??= []).push(file);\n\n if (up) {\n const name = path.basename(file.path);\n versionsMap[file.version] = name;\n sequence.push(+file.version);\n } else {\n versionsMap[file.version] = undefined;\n sequence.pop();\n }\n\n config.logger?.log(\n `${up ? 'Migrated' : 'Rolled back'} ${pathToLog(file.path)}\\n`,\n );\n }\n\n migrations ??= emptyArray;\n\n const afterMigrate = config[up ? 'afterMigrate' : 'afterRollback'];\n if (config.afterChange || afterMigrate) {\n db ??= getDb(trx);\n await config.afterChange?.({ db, up, redo, migrations });\n await afterMigrate?.({ db, migrations });\n }\n\n return migrations;\n};\n\nconst checkMigrationOrder = (\n config: PickMigrationId,\n set: MigrationsSet,\n { sequence, map }: RakeDbAppliedVersions,\n force?: boolean,\n) => {\n if (config.migrationId !== 'timestamp') {\n let prev: MigrationItem = set.migrations[0];\n for (let i = 1; i < set.migrations.length; i++) {\n const file = set.migrations[i];\n\n const version = +file.version;\n const prevVersion = +prev.version;\n if (version === prevVersion) {\n throw new Error(\n `Found migrations with the same number: ${prev.path} and ${file.path}`,\n );\n } else if (version - prevVersion > 1) {\n throw new Error(\n `There is a gap between migrations ${prev.path} and ${file.path}`,\n );\n }\n\n prev = file;\n }\n }\n\n const last = sequence[sequence.length - 1];\n if (last) {\n for (const file of set.migrations) {\n const version = +file.version;\n if (version > last || map[file.version]) continue;\n\n if (!force) {\n throw new Error(\n `Cannot migrate ${path.basename(\n file.path,\n )} because the higher position ${\n map[versionToString(config, last)]\n } was already migrated.\\nRun \\`**db command** up force\\` to rollback the above migrations and migrate all`,\n );\n }\n\n return version;\n }\n }\n return;\n};\n\n// Cache `change` functions of migrations. Key is a migration file name, value is array of `change` functions.\n// When migrating two or more databases, files are loaded just once due to this cache.\nexport const changeCache: Record<string, MigrationChange[] | undefined> = {};\n\nexport const getChanges = async (\n file: MigrationItemHasLoad,\n config?: PickForceDefaultExports,\n): Promise<MigrationChange[]> => {\n clearChanges();\n\n let changes = file.path ? changeCache[file.path] : undefined;\n if (!changes) {\n const module = (await file.load()) as\n | {\n default?: MaybeArray<MigrationChange>;\n }\n | undefined;\n\n const exported = module?.default && toArray(module.default);\n\n if (config?.forceDefaultExports && !exported) {\n throw new RakeDbError(\n `Missing a default export in ${file.path} migration`,\n );\n }\n\n changes = exported || getCurrentChanges();\n if (file.path) changeCache[file.path] = changes;\n }\n\n return changes;\n};\n\nexport const runMigrationInOwnTransaction: typeof runMigration = (\n adapter,\n ...rest\n) => {\n return transaction(adapter, (trx) => runMigration(trx, ...rest));\n};\n\n/**\n * Process one migration file.\n * It performs a db transaction, loads `change` functions from a file, executes them in order specified by `up` parameter.\n * After calling `change` functions successfully, will save new entry or delete one in case of `up: false` from the migrations table.\n */\nexport const runMigration = async <CT>(\n trx: AdapterBase,\n up: boolean,\n changes: MigrationChange[],\n config: CreateMigrationInterfaceConfig<CT>,\n): Promise<SilentQueries> => {\n const db = createMigrationInterface<CT>(trx, up, config);\n\n if (changes.length) {\n // when up: for (let i = 0; i !== changes.length - 1; i++)\n // when down: for (let i = changes.length - 1; i !== -1; i--)\n const from = up ? 0 : changes.length - 1;\n const to = up ? changes.length : -1;\n const step = up ? 1 : -1;\n for (let i = from; i !== to; i += step) {\n await changes[i].fn(db, up);\n }\n }\n\n return db.adapter;\n};\n\nconst changeMigratedVersion = async (\n adapter: SilentQueries,\n up: boolean,\n file: MigrationItem,\n config: PickMigrationsTable,\n) => {\n await (up ? saveMigratedVersion : deleteMigratedVersion)(\n adapter,\n file.version,\n path.basename(file.path).slice(file.version.length + 1),\n config,\n );\n};\n","import { EnumColumn, AdapterBase, ColumnSchemaConfig, singleQuote } from 'pqb';\nimport { TableQuery } from './migration/createTable';\nimport { RAKE_DB_LOCK_KEY } from './commands/migrateOrRollback';\nimport { MigrationsSet } from './migration/migrationsSet';\n\nexport interface RakeDbCtx {\n migrationsPromise?: Promise<MigrationsSet>;\n}\n\nexport const getFirstWordAndRest = (\n input: string,\n): [string] | [string, string] => {\n const i = input.search(/(?=[A-Z])|[-_ ]/);\n if (i !== -1) {\n const restStart =\n input[i] === '-' || input[i] === '_' || input[i] === ' ' ? i + 1 : i;\n const rest = input.slice(restStart);\n return [input.slice(0, i), 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 i = input.search(regex);\n if (i === -1) return;\n\n if (input[i] === '-' || input[i] === '_' || input[i] === ' ') i++;\n i += length;\n\n const start =\n input[i] == '-' || input[i] === '_' || input[i] === ' ' ? i + 1 : i;\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| to)[A-Z-_ ]/, 2);\n};\n\nexport const getTextAfterFrom = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(From|-from|_from| from)[A-Z-_ ]/, 4);\n};\n\n// Join array of strings into a camelCased string.\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}) => quoteTable(schema, name);\n\nexport const quoteTable = (schema: string | undefined, table: string) =>\n schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n\nexport const getSchemaAndTableFromName = (\n name: string,\n): [string | undefined, string] => {\n const i = name.indexOf('.');\n return i !== -1 ? [name.slice(0, i), name.slice(i + 1)] : [undefined, name];\n};\n\nexport const quoteNameFromString = (string: string) => {\n return quoteTable(...getSchemaAndTableFromName(string));\n};\n\n/**\n * Do not quote the type itself because it can be an expression like `geography(point)` for postgis.\n */\nexport const quoteCustomType = (s: string) => {\n const [schema, type] = getSchemaAndTableFromName(s);\n return schema ? '\"' + schema + '\".' + type : type;\n};\n\nexport const quoteSchemaTable = (\n arg: { schema?: string; name: string },\n excludeCurrentSchema?: string,\n) => {\n return singleQuote(concatSchemaAndName(arg, excludeCurrentSchema));\n};\n\nexport const concatSchemaAndName = (\n {\n schema,\n name,\n }: {\n schema?: string;\n name: string;\n },\n excludeCurrentSchema?: string,\n) => {\n return schema && schema !== excludeCurrentSchema ? `${schema}.${name}` : name;\n};\n\nexport const makePopulateEnumQuery = (\n item: EnumColumn<ColumnSchemaConfig, unknown, readonly string[]>,\n): TableQuery => {\n const [schema, name] = getSchemaAndTableFromName(item.enumName);\n return {\n text: `SELECT unnest(enum_range(NULL::${quoteTable(schema, name)}))::text`,\n then(result) {\n // populate empty options array with values from db\n (item.options as string[]).push(...result.rows.map(([value]) => value));\n },\n };\n};\n\nexport const transaction = <T>(\n adapter: AdapterBase,\n fn: (trx: AdapterBase) => Promise<T>,\n): Promise<T> => {\n return adapter.transaction<T>(undefined, fn);\n};\n\nexport const queryLock = (trx: AdapterBase) =>\n trx.query(`SELECT pg_advisory_xact_lock('${RAKE_DB_LOCK_KEY}')`);\n\nexport const getCliParam = (\n args: string[] | undefined,\n name: string,\n): string | undefined => {\n if (args) {\n const key = '--' + name;\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === key) return args[i + 1];\n else if (arg.startsWith(key)) return arg.slice(key.length + 1);\n }\n }\n return;\n};\n","import {\n DbResult,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n defaultSchemaConfig,\n makeColumnTypes as defaultColumnTypes,\n NoPrimaryKeyOption,\n AdapterBase,\n ColumnSchemaConfig,\n getStackTrace,\n MaybePromise,\n QueryLogOptions,\n} from 'pqb';\nimport path from 'path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationItem } from './migration/migrationsSet';\nimport { getCliParam } from './common';\n\nexport interface CommandFn<SchemaConfig extends ColumnSchemaConfig, CT> {\n (\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[],\n ): void | Promise<void>;\n}\n\nexport interface PickBasePath {\n basePath: string;\n}\n\nexport interface PickImport {\n import(path: string): Promise<unknown>;\n}\n\nexport interface PickMigrationId {\n migrationId: RakeDbMigrationId;\n}\n\nexport interface PickMigrations {\n migrations?: ModuleExportsRecord;\n}\n\nexport interface PickMigrationsPath {\n migrationsPath: string;\n}\n\nexport interface PickOptionalMigrationsPath {\n migrationsPath?: string;\n}\n\nexport interface PickRenameMigrations {\n renameMigrations?: RakeDbRenameMigrationsInput;\n}\n\nexport interface PickMigrationsTable {\n migrationsTable: string;\n}\n\nexport interface PickTransactionSetting {\n transaction: 'single' | 'per-migration';\n}\n\nexport interface PickMigrationCallbacks {\n beforeChange?: ChangeCallback;\n afterChange?: ChangeCallback;\n beforeMigrate?: MigrationCallback;\n afterMigrate?: MigrationCallback;\n beforeRollback?: MigrationCallback;\n afterRollback?: MigrationCallback;\n}\n\nexport interface PickAfterChangeCommit {\n afterChangeCommit?: ChangeCommitCallback;\n}\n\nexport interface PickForceDefaultExports {\n // throw if a migration doesn't have a default export\n forceDefaultExports?: boolean;\n}\n\ninterface RakeDbBaseConfig<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n> extends QueryLogOptions,\n PickImport,\n PickMigrationId,\n PickMigrationsPath,\n PickMigrations,\n PickRenameMigrations,\n PickMigrationsTable,\n PickMigrationCallbacks,\n PickForceDefaultExports,\n PickAfterChangeCommit {\n schemaConfig: SchemaConfig;\n snakeCase: boolean;\n language?: string;\n commands: Record<string, CommandFn<SchemaConfig, CT>>;\n noPrimaryKey?: NoPrimaryKeyOption;\n baseTable?: RakeDbBaseTable<CT>;\n}\n\nexport interface RakeDbConfig<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n> extends RakeDbBaseConfig<SchemaConfig, CT>,\n PickBasePath,\n PickTransactionSetting {\n columnTypes: CT;\n dbScript: string;\n recurrentPath: string;\n}\n\nexport interface InputRakeDbConfigBase<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends QueryLogOptions,\n PickOptionalMigrationsPath {\n columnTypes?: CT | ((t: DefaultColumnTypes<DefaultSchemaConfig>) => CT);\n baseTable?: RakeDbBaseTable<CT>;\n schemaConfig?: SchemaConfig;\n basePath?: string;\n dbScript?: string;\n migrationId?: 'serial' | RakeDbMigrationId;\n recurrentPath?: string;\n migrationsTable?: string;\n snakeCase?: boolean;\n language?: string;\n commands?: Record<\n string,\n (\n adapter: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[],\n ) => void | Promise<void>\n >;\n noPrimaryKey?: NoPrimaryKeyOption;\n forceDefaultExports?: boolean;\n /**\n * Is called once per db before migrating or rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.up - whether it's migrating up or down\n * @param arg.redo - whether it's migrating down and then up for `redo` command\n * @param arg.migrations - array of executed (up or down) migrations\n */\n beforeChange?: ChangeCallback;\n /**\n * Is called once per db after migrating or rolling back a set of migrations.\n * Runs inside the same transaction as migrations,\n * for running after commit use {@link afterChangeCommit}.\n *\n * @param arg.db - query builder\n * @param arg.up - whether it's migrating up or down\n * @param arg.redo - whether it's migrating down and then up for `redo` command\n * @param arg.migrations - array of executed (up or down) migrations\n */\n afterChange?: ChangeCallback;\n /**\n * Is called once per db after migrating or rolling back a set of migrations.\n * Runs **after** committing migrations transaction.\n *\n * @param arg.options - database connection options\n * @param arg.up - whether it's migrating up or down\n * @param arg.migrations - array of executed (up or down) migrations\n */\n afterChangeCommit?: ChangeCommitCallback;\n /**\n * Is called once per db before migrating (up) a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - applied migrations\n */\n beforeMigrate?: MigrationCallback;\n /**\n * Is called once per db after migrating (up) a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - applied migrations\n */\n afterMigrate?: MigrationCallback;\n /**\n * Is called once per db before rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - rolled back migrations\n */\n beforeRollback?: MigrationCallback;\n /**\n * Is called once per db before rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - rolled back migrations\n */\n afterRollback?: MigrationCallback;\n}\n\ninterface InputRakeDbConfigFileBased<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends InputRakeDbConfigBase<SchemaConfig, CT> {\n /**\n * It may look odd, but it's required for `tsx` and other bundlers to have such `import` config specified explicitly.\n */\n import(path: string): Promise<unknown>;\n}\n\ninterface InputRakeDbConfigCodeBased<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends InputRakeDbConfigBase<SchemaConfig, CT> {\n /**\n * To specify array of migrations explicitly, without loading them from files.\n */\n migrations: ModuleExportsRecord;\n renameMigrations?: RakeDbRenameMigrationsInput;\n /**\n * It may look odd, but it's required for `tsx` and other bundlers to have such `import` config specified explicitly.\n */\n import?(path: string): Promise<unknown>;\n}\n\nexport type InputRakeDbConfig<SchemaConfig extends ColumnSchemaConfig, CT> =\n | InputRakeDbConfigFileBased<SchemaConfig, CT>\n | InputRakeDbConfigCodeBased<SchemaConfig, CT>;\n\ninterface ChangeCallback {\n (arg: {\n db: DbResult<unknown>;\n up: boolean;\n redo: boolean;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\ninterface ChangeCommitCallback {\n (arg: {\n adapter: AdapterBase;\n up: boolean;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\ninterface MigrationCallback {\n (arg: {\n db: DbResult<unknown>;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRakeDbConfig = RakeDbConfig<any, any>;\n\nexport interface RakeDbBaseTable<CT> {\n exportAs: string;\n\n getFilePath(): string;\n\n nowSQL?: string;\n\n new (): {\n types: CT;\n snakeCase?: boolean;\n language?: string;\n };\n}\n\nexport interface ModuleExportsRecord {\n [K: string]: () => Promise<unknown>;\n}\n\nexport type RakeDbMigrationId = 'timestamp' | { serial: number };\n\nexport interface RakeDbRenameMigrationsMap {\n [K: string]: number;\n}\n\nexport interface RakeDbRenameMigrations {\n to: RakeDbMigrationId;\n map(): MaybePromise<RakeDbRenameMigrationsMap>;\n}\n\nexport interface RakeDbRenameMigrationsInput {\n to: RakeDbMigrationId;\n map: RakeDbRenameMigrationsMap;\n}\n\nexport const migrationConfigDefaults: RakeDbBaseConfig<ColumnSchemaConfig> = {\n schemaConfig: defaultSchemaConfig,\n migrationsPath: path.join('src', 'db', 'migrations'),\n migrationId: { serial: 4 },\n migrationsTable: 'schemaMigrations',\n snakeCase: false,\n commands: {},\n log: true,\n logger: console,\n import() {\n throw new Error(\n 'Add `import: (path) => import(path),` setting to `rakeDb` config',\n );\n },\n};\n\nexport const ensureMigrationsPath = <\n T extends {\n migrationsPath?: string;\n basePath: string;\n },\n>(\n config: T,\n): T & { migrationsPath: string } => {\n if (!config.migrationsPath) {\n config.migrationsPath = migrationConfigDefaults.migrationsPath;\n }\n\n if (!path.isAbsolute(config.migrationsPath)) {\n config.migrationsPath = path.resolve(\n config.basePath,\n config.migrationsPath,\n );\n }\n\n return config as never;\n};\n\nexport const ensureBasePathAndDbScript = <\n T extends {\n basePath?: string;\n dbScript?: string;\n },\n>(\n config: T,\n intermediateCallers = 0,\n): T & { basePath: string; dbScript: string } => {\n if (config.basePath && config.dbScript) return config as never;\n\n // 0 is getStackTrace file, 1 is this function, 2 is a caller in rakeDb.ts, 3 is the user db script file.\n // when called from processRakeDbConfig, 1 call is added.\n // bundlers can bundle all files into a single file, or change file structure, so this must rely only on the caller index.\n let filePath = getStackTrace()?.[3 + intermediateCallers].getFileName();\n if (!filePath) {\n throw new Error(\n 'Failed to determine path to db script. Please set basePath option of rakeDb',\n );\n }\n\n if (filePath.startsWith('file://')) {\n filePath = fileURLToPath(filePath);\n }\n\n const ext = path.extname(filePath);\n if (ext !== '.ts' && ext !== '.js' && ext !== '.mjs') {\n throw new Error(\n `Add a .ts suffix to the \"${path.basename(filePath)}\" when calling it`,\n );\n }\n\n config.basePath = path.dirname(filePath);\n config.dbScript = path.basename(filePath);\n return config as never;\n};\n\nexport const processRakeDbConfig = <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n config: InputRakeDbConfig<SchemaConfig, CT>,\n args?: string[],\n): RakeDbConfig<SchemaConfig, CT> => {\n const result = { ...migrationConfigDefaults, ...config } as RakeDbConfig<\n SchemaConfig,\n CT\n >;\n\n if (!result.log) {\n delete result.logger;\n }\n\n ensureBasePathAndDbScript(result, 1);\n ensureMigrationsPath(result);\n\n if (!result.recurrentPath) {\n result.recurrentPath = path.join(\n result.migrationsPath as string,\n 'recurrent',\n );\n }\n\n if ('recurrentPath' in result && !path.isAbsolute(result.recurrentPath)) {\n result.recurrentPath = path.resolve(result.basePath, result.recurrentPath);\n }\n\n if ('baseTable' in config && config.baseTable) {\n const { types, snakeCase, language } = config.baseTable.prototype;\n result.columnTypes = types || defaultColumnTypes(defaultSchemaConfig);\n if (snakeCase) result.snakeCase = true;\n if (language) result.language = language;\n } else {\n const ct = 'columnTypes' in config && config.columnTypes;\n result.columnTypes = ((typeof ct === 'function'\n ? (ct as (t: DefaultColumnTypes<ColumnSchemaConfig>) => CT)(\n defaultColumnTypes(defaultSchemaConfig),\n )\n : ct) || defaultColumnTypes(defaultSchemaConfig)) as CT;\n }\n\n if (config.migrationId === 'serial') {\n result.migrationId = { serial: 4 };\n }\n\n const transaction = getCliParam(args, 'transaction');\n if (transaction) {\n if (transaction !== 'single' && transaction !== 'per-migration') {\n throw new Error(\n `Unsupported transaction param ${transaction}, expected single or per-migration`,\n );\n }\n result.transaction = transaction;\n } else if (!result.transaction) {\n result.transaction = 'single';\n }\n\n return result as RakeDbConfig<SchemaConfig, CT>;\n};\n","import { colors } from 'pqb';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst cursorShow = `${CSI}?25h`;\nconst cursorHide = `${CSI}?25l`;\nconst { stdin, stdout } = process;\n\nconst visibleChars = (s: string) =>\n s.replace(\n // eslint-disable-next-line no-control-regex\n /[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))/g,\n '',\n ).length;\n\nconst clear = (text: string) => {\n const rows = text\n .split(/\\r?\\n/)\n .reduce(\n (rows, line) =>\n rows +\n 1 +\n Math.floor(Math.max(visibleChars(line) - 1, 0) / stdout.columns),\n 0,\n );\n\n let clear = '';\n for (let i = 0; i < rows; i++) {\n clear += `${CSI}2K`;\n if (i < rows - 1) {\n clear += `${CSI}${i < rows - 1 ? '1A' : 'G'}`;\n }\n }\n return clear;\n};\n\ninterface Ctx<T> {\n value: T;\n submitted: boolean;\n render: () => void;\n submit(value?: T): void;\n}\n\nconst prompt = async <T>({\n render,\n onKeyPress,\n validate,\n value,\n cursor: showCursor,\n}: {\n render(ctx: Ctx<T>): string;\n onKeyPress(ctx: Ctx<T>, s: string): void;\n validate?(ctx: Ctx<T>): boolean;\n value?: T;\n cursor?: boolean;\n}): Promise<T> => {\n stdin.resume();\n if (stdin.isTTY) stdin.setRawMode(true);\n stdin.setEncoding('utf-8');\n\n if (!showCursor) stdout.write(cursorHide);\n\n return new Promise<T>((res) => {\n let prevText: string | undefined;\n\n const ctx: Ctx<T> = {\n value: value as T,\n submitted: false,\n render() {\n let text =\n (ctx.submitted ? colors.greenBold('✔') : colors.yellowBold('?')) +\n ' ' +\n render(ctx);\n\n if (ctx.submitted) text += '\\n';\n\n stdout.write(prevText ? clear(prevText) + '\\r' + text : text);\n\n prevText = text;\n },\n submit(value) {\n if (value !== undefined) ctx.value = value;\n if (ctx.value === undefined || (validate && !validate?.(ctx))) return;\n\n ctx.submitted = true;\n ctx.render();\n close();\n res(ctx.value);\n },\n };\n\n const close = () => {\n if (!showCursor) stdout.write(cursorShow);\n if (stdin.isTTY) stdin.setRawMode(false);\n stdin.off('data', keypress);\n stdin.pause();\n };\n\n const keypress = (s: string) => {\n // ctrl-c, ctrl-d\n if (s === '\\u0003' || s === '\\u0004') {\n close?.();\n process.exit(0);\n }\n\n if (s === '\\r' || s === '\\n' || s === '\\r\\n') {\n ctx.submit();\n } else {\n onKeyPress(ctx, s);\n }\n };\n\n stdin.on('data', keypress);\n\n ctx.render();\n });\n};\n\nconst defaultActive = (s: string) => `${colors.blueBold('❯')} ${s}`;\nconst defaultInactive = (s: string) => ` ${s}`;\n\nexport const promptSelect = ({\n message,\n options,\n active = defaultActive,\n inactive = defaultInactive,\n}: {\n message: string;\n options: string[];\n active?: (s: string) => string;\n inactive?: (s: string) => string;\n}) =>\n prompt<number>({\n value: 0,\n render(ctx) {\n let text = `${message} ${colors.pale(\n 'Use arrows or jk. Press enter to submit.',\n )}\\n`;\n\n for (let i = 0; i < options.length; i++) {\n text += (ctx.value === i ? active : inactive)(options[i]) + '\\n';\n }\n\n return text;\n },\n onKeyPress(ctx, s) {\n ctx.value =\n s === '\\u001b[H' // home\n ? 0\n : s === '\\u001b[F' // end\n ? options.length - 1\n : s === '\\u001b[A' || s === 'k' // up\n ? ctx.value === 0\n ? options.length - 1\n : ctx.value - 1\n : s === '\\u001b[B' || s === 'j' || s === '\\t' // down\n ? ctx.value === options.length - 1\n ? 0\n : ctx.value + 1\n : ctx.value;\n\n ctx.render();\n },\n });\n\nexport const promptConfirm = ({\n message,\n}: {\n message: string;\n password?: boolean;\n}) =>\n prompt<boolean>({\n value: true,\n render(ctx) {\n return `${colors.bright(message)}\\n${\n ctx.submitted\n ? `> ${ctx.value ? colors.greenBold('Yes') : colors.yellowBold('No')}`\n : colors.pale(`> (Y/n)`)\n }\\n`;\n },\n onKeyPress(ctx, s) {\n let ok;\n if (s === 'y' || s === 'Y') ok = true;\n else if (s === 'n' || s === 'N') ok = false;\n\n if (ok !== undefined) {\n ctx.submit(ok);\n }\n },\n });\n\nexport const promptText = ({\n message,\n default: def = '',\n password,\n min,\n}: {\n message: string;\n default?: string;\n password?: boolean;\n min?: number;\n}) => {\n let showDefault = true;\n let x = 0;\n\n const renderValue = (ctx: Ctx<string>) =>\n password ? '*'.repeat(ctx.value.length) : ctx.value;\n\n return prompt<string>({\n value: def,\n cursor: true,\n validate: (ctx) => !min || ctx.value.length >= min,\n render(ctx) {\n let text = `${colors.bright(message)}\\n> ${\n ctx.submitted\n ? renderValue(ctx)\n : showDefault\n ? colors.pale(def) + '\\b'.repeat(def.length)\n : ctx.value\n }`;\n\n if (ctx.submitted) text += '\\n';\n\n return text;\n },\n onKeyPress(ctx, s) {\n let value = showDefault ? '' : ctx.value;\n if (s === '\\u001b[D' && x > 0) {\n // left\n x--;\n stdout.write('\\b');\n } else if (s === '\\u001b[C' && x < value.length) {\n // right\n stdout.write(value[x]);\n x++;\n }\n\n if (s !== '' && s !== '\\u001b[3~' && !visibleChars(s)) return;\n\n if (showDefault) {\n showDefault = false;\n stdout.write(' '.repeat(def.length) + '\\b'.repeat(def.length));\n }\n\n const prev = value;\n const prevX = x;\n\n if (s === '') {\n if (x > 0) {\n value = value.slice(0, x - 1) + value.slice(x);\n x--;\n }\n } else if (s === '\\u001b[3~') {\n if (x < value.length) {\n value = value.slice(0, x) + value.slice(x + 1);\n }\n } else {\n value = value.slice(0, x) + s + value.slice(x);\n x++;\n }\n\n ctx.value = value;\n\n const spaces = prev.length - value.length;\n stdout.write(\n '\\b'.repeat(prevX) +\n renderValue(ctx) +\n (spaces > 0 ? ' '.repeat(spaces) + '\\b'.repeat(spaces) : '') +\n '\\b'.repeat(value.length - x),\n );\n },\n });\n};\n","import { AdapterBase, ColumnSchemaConfig, RecordUnknown } from 'pqb';\nimport { migrate } from './migrateOrRollback';\nimport { RakeDbConfig } from '../config';\nimport { createMigrationsTable } from '../migration/migrationsTable';\nimport { promptConfirm, promptText } from '../prompt';\n\nconst execute = async (\n adapter: AdapterBase,\n sql: string,\n): Promise<\n 'ok' | 'already' | 'forbidden' | 'ssl required' | { error: unknown }\n> => {\n try {\n await adapter.query(sql);\n return 'ok';\n } catch (error) {\n const err = error as RecordUnknown;\n\n if (\n typeof err.message === 'string' &&\n err.message.includes('sslmode=require')\n ) {\n return 'ssl required';\n }\n\n if (err.code === '42P04' || err.code === '3D000') {\n return 'already';\n } else if (\n err.code === '42501' ||\n (typeof err.message === 'string' &&\n err.message.includes('password authentication failed'))\n ) {\n return 'forbidden';\n } else {\n return { error };\n }\n } finally {\n await adapter.close();\n }\n};\n\nconst createOrDrop = async (\n adapter: AdapterBase,\n adminAdapter: AdapterBase,\n config: Pick<RakeDbConfig<ColumnSchemaConfig>, 'migrationsTable' | 'logger'>,\n args: {\n sql(params: { database: string; user: string }): string;\n successMessage(params: { database: string }): string;\n alreadyMessage(params: { database: string }): string;\n create?: boolean;\n },\n) => {\n const params = {\n database: adapter.getDatabase(),\n user: adapter.getUser(),\n };\n\n const result = await execute(\n adminAdapter.reconfigure({ database: 'postgres' }),\n args.sql(params),\n );\n if (result === 'ok') {\n config.logger?.log(args.successMessage(params));\n } else if (result === 'already') {\n config.logger?.log(args.alreadyMessage(params));\n } else if (result === 'ssl required') {\n config.logger?.log(\n 'SSL is required: append ?ssl=true to the database url string',\n );\n return;\n } else if (result === 'forbidden') {\n let message = `Permission denied to ${\n args.create ? 'create' : 'drop'\n } database.`;\n\n const host = adminAdapter.getHost();\n\n const isLocal = host === 'localhost';\n if (!isLocal) {\n message += `\\nDon't use this command for database service providers, only for a local db.`;\n }\n\n config.logger?.log(message);\n\n const params = await askForAdminCredentials(args.create);\n if (!params) return;\n\n await createOrDrop(adapter, adminAdapter.reconfigure(params), config, args);\n return;\n } else {\n throw result.error;\n }\n\n if (!args.create) return;\n\n const newlyConnectedAdapter = adapter.reconfigure({});\n\n await createMigrationsTable(newlyConnectedAdapter, config);\n await newlyConnectedAdapter.close();\n};\n\nexport const createDb = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n for (const adapter of adapters) {\n await createOrDrop(adapter, adapter, config, {\n sql({ database, user }) {\n return `CREATE DATABASE \"${database}\"${user ? ` OWNER \"${user}\"` : ''}`;\n },\n successMessage({ database }) {\n return `Database ${database} successfully created`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} already exists`;\n },\n create: true,\n });\n }\n};\n\nexport const dropDb = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n for (const adapter of adapters) {\n await createOrDrop(adapter, adapter, config, {\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 <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n await dropDb(adapters, config);\n await createDb(adapters, config);\n for (const adapter of adapters) {\n await migrate({ adapter, config });\n }\n};\n\nexport const askForAdminCredentials = async (\n create?: boolean,\n): Promise<{ user: string; password?: string } | undefined> => {\n const ok = await promptConfirm({\n message: `Would you like to share admin credentials to ${\n create ? 'create' : 'drop'\n } a database?`,\n });\n\n if (!ok) {\n return;\n }\n\n const user = await promptText({\n message: 'Enter admin user:',\n default: 'postgres',\n min: 1,\n });\n\n const password = await promptText({\n message: 'Enter admin password:',\n password: true,\n });\n\n return {\n user,\n password: password || undefined,\n };\n};\n","import {\n AdapterBase,\n ColumnSchemaConfig,\n createDbWithAdapter,\n DbResult,\n} from 'pqb';\nimport { join } from 'path';\nimport { readdir, stat, readFile } from 'fs/promises';\nimport { RakeDbConfig } from '../config';\n\nexport const runRecurrentMigrations = async <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n): Promise<void> => {\n let dbs: DbResult<unknown>[] | undefined;\n let files = 0;\n\n await readdirRecursive(config.recurrentPath, async (path) => {\n files++;\n\n // init dbs lazily\n dbs ??= adapters.map((adapter) => createDbWithAdapter({ adapter }));\n\n const sql = await readFile(path, 'utf-8');\n await Promise.all(\n dbs.map(async (db) => {\n await db.adapter.arrays(sql);\n }),\n );\n });\n\n if (files > 0) {\n config.logger?.log(\n `Applied ${files} recurrent migration file${files > 1 ? 's' : ''}`,\n );\n }\n};\n\nconst readdirRecursive = async (\n dirPath: string,\n cb: (path: string) => Promise<void>,\n) => {\n const list = await readdir(dirPath).catch((err) => {\n if (err.code !== 'ENOENT') throw err;\n return;\n });\n\n if (!list) return;\n\n await Promise.all(\n list.map(async (item) => {\n const path = join(dirPath, item);\n const info = await stat(path);\n if (info.isDirectory()) {\n await readdirRecursive(path, cb);\n } else if (info.isFile() && path.endsWith('.sql')) {\n await cb(path);\n }\n }),\n );\n};\n","import { SearchWeight, AdapterBase, EmptyObject, RecordUnknown } from 'pqb';\nimport { RakeDbAst } from '../ast';\n\nexport namespace DbStructure {\n export interface TableNameAndSchemaName {\n schemaName: string;\n tableName: string;\n }\n\n export interface Table {\n schemaName: string;\n name: string;\n comment?: string;\n columns: Column[];\n }\n\n export interface View {\n schemaName: string;\n name: string;\n deps: RakeDbAst.View['deps'];\n isRecursive: boolean;\n with?: string[]; // ['check_option=LOCAL', 'security_barrier=true']\n columns: Column[];\n sql: string;\n }\n\n export interface 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 interface Column extends TableNameAndSchemaName {\n name: string;\n typeSchema: string;\n type: string;\n arrayDims: number;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n default?: string;\n isNullable: boolean;\n collate?: string;\n compression?: 'pglz' | 'lz4';\n comment?: string;\n identity?: {\n always: boolean;\n start: number;\n increment: number;\n min?: number;\n max?: number;\n cache: number;\n cycle: boolean;\n };\n extension?: string;\n typmod: number;\n }\n\n export interface Index extends TableNameAndSchemaName {\n name: string;\n using: string;\n unique: boolean;\n columns: (({ column: string } | { expression: string }) & {\n collate?: string;\n opclass?: string;\n order?: string;\n weight?: SearchWeight;\n })[];\n include?: string[];\n nullsNotDistinct?: boolean;\n with?: string;\n tablespace?: string;\n where?: string;\n tsVector?: boolean;\n language?: string;\n languageColumn?: string;\n }\n\n export interface Exclude extends Index {\n exclude: string[]; // array of operators for index columns and expressions\n }\n\n // FULL | PARTIAL | SIMPLE\n export type ForeignKeyMatch = 'f' | 'p' | 's';\n\n // a = no action, r = restrict, c = cascade, n = set null, d = set default\n export type ForeignKeyAction = 'a' | 'r' | 'c' | 'n' | 'd';\n\n export interface Constraint extends TableNameAndSchemaName {\n name: string;\n primaryKey?: string[];\n references?: References;\n check?: Check;\n }\n\n export interface References {\n foreignSchema: string;\n foreignTable: string;\n columns: string[];\n foreignColumns: string[];\n match: ForeignKeyMatch;\n onUpdate: ForeignKeyAction;\n onDelete: ForeignKeyAction;\n }\n\n export interface Check {\n columns?: string[];\n expression: string;\n }\n\n export interface Trigger extends TableNameAndSchemaName {\n triggerSchema: string;\n name: string;\n events: string[];\n activation: string;\n condition?: string;\n definition: string;\n }\n\n export interface Extension {\n schemaName: string;\n name: string;\n version?: string;\n }\n\n export interface Enum {\n schemaName: string;\n name: string;\n values: [string, ...string[]];\n }\n\n export interface Domain {\n schemaName: string;\n name: string;\n type: string;\n typeSchema: string;\n arrayDims: number;\n isNullable: boolean;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n collate?: string;\n default?: string;\n checks?: string[];\n }\n\n export interface Collation {\n schemaName: string;\n name: string;\n provider: string;\n deterministic: boolean;\n lcCollate?: string;\n lcCType?: string;\n locale?: string;\n version?: string;\n }\n}\n\nconst filterSchema = (table: string) =>\n `${table} !~ '^pg_' AND ${table} != 'information_schema'`;\n\nconst jsonAgg = (sql: string, as: string) =>\n `(SELECT coalesce(json_agg(t.*), '[]') FROM (${sql}) t) AS \"${as}\"`;\n\nconst columnsSql = ({\n schema,\n table,\n join = '',\n where,\n}: {\n schema: string;\n table: string;\n join?: string;\n where: string;\n}) => `SELECT\n ${schema}.nspname \"schemaName\",\n ${table}.relname \"tableName\",\n a.attname \"name\",\n t.typname \"type\",\n tn.nspname \"typeSchema\",\n a.attndims \"arrayDims\",\n information_schema._pg_char_max_length(tt.id, tt.mod) \"maxChars\",\n information_schema._pg_numeric_precision(tt.id, tt.mod) \"numericPrecision\",\n information_schema._pg_numeric_scale(tt.id,tt.mod) \"numericScale\",\n information_schema._pg_datetime_precision(tt.id,tt.mod) \"dateTimePrecision\",\n CAST(\n CASE WHEN a.attgenerated = ''\n THEN pg_get_expr(ad.adbin, ad.adrelid)\n END AS information_schema.character_data\n ) AS \"default\",\n NOT (a.attnotnull OR (t.typtype = 'd' AND t.typnotnull)) AS \"isNullable\",\n co.collname AS \"collate\",\n NULLIF(a.attcompression, '') AS compression,\n pgd.description AS \"comment\",\n (\n CASE WHEN a.attidentity IN ('a', 'd') THEN (\n json_build_object(\n 'always',\n a.attidentity = 'a',\n 'start',\n seq.seqstart,\n 'increment',\n seq.seqincrement,\n 'min',\n nullif(seq.seqmin, 1),\n 'max',\n nullif(seq.seqmax, (\n CASE t.typname\n WHEN 'int2' THEN 32767\n WHEN 'int4' THEN 2147483647\n WHEN 'int8' THEN 9223372036854775807\n ELSE NULL\n END\n )),\n 'cache',\n seq.seqcache,\n 'cycle',\n seq.seqcycle\n )\n ) END\n ) \"identity\",\n ext.extname \"extension\",\n a.atttypmod \"typmod\"\nFROM pg_attribute a\n${join}\nLEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum\nJOIN pg_type t\n ON t.oid = (\n CASE WHEN a.attndims = 0\n THEN a.atttypid\n ELSE (SELECT t.typelem FROM pg_type t WHERE t.oid = a.atttypid)\n END\n )\nJOIN LATERAL (\n SELECT\n CASE WHEN t.typtype = 'd' THEN t.typbasetype ELSE t.oid END id,\n CASE WHEN t.typtype = 'd' THEN t.typtypmod ELSE a.atttypmod END mod\n) tt ON true\nJOIN pg_namespace tn ON tn.oid = t.typnamespace\nLEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))\n ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')\nLEFT JOIN pg_catalog.pg_description pgd\n ON pgd.objoid = a.attrelid\n AND pgd.objsubid = a.attnum\nLEFT JOIN (pg_depend dep JOIN pg_sequence seq ON (dep.classid = 'pg_class'::regclass AND dep.objid = seq.seqrelid AND dep.deptype = 'i'))\n ON (dep.refclassid = 'pg_class'::regclass AND dep.refobjid = ${table}.oid AND dep.refobjsubid = a.attnum)\nLEFT JOIN pg_depend d ON d.objid = t.oid AND d.classid = 'pg_type'::regclass AND d.deptype = 'e'\nLEFT JOIN pg_extension ext ON ext.oid = d.refobjid\nWHERE a.attnum > 0\n AND NOT a.attisdropped\n AND ${where}\nORDER BY a.attnum`;\n\nconst schemasSql = `SELECT coalesce(json_agg(nspname ORDER BY nspname), '[]')\nFROM pg_catalog.pg_namespace n\nWHERE ${filterSchema('nspname')}`;\n\n// `relkind` r = regular table, p = partitioned table.\nconst tablesSql = `SELECT\n nspname AS \"schemaName\",\n relname AS \"name\",\n obj_description(c.oid) AS comment,\n (SELECT coalesce(json_agg(t), '[]') FROM (${columnsSql({\n schema: 'n',\n table: 'c',\n where: 'a.attrelid = c.oid',\n })}) t) AS \"columns\"\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nWHERE (relkind = 'r' OR relkind = 'p')\n AND ${filterSchema('nspname')}\nORDER BY relname`;\n\nconst viewsSql = `SELECT\n nc.nspname AS \"schemaName\",\n c.relname AS \"name\",\n (\n SELECT COALESCE(json_agg(t.*), '[]')\n FROM (\n SELECT\n ns.nspname AS \"schemaName\",\n obj.relname AS \"name\"\n FROM pg_class obj\n JOIN pg_depend dep ON dep.refobjid = obj.oid\n JOIN pg_rewrite rew ON rew.oid = dep.objid\n JOIN pg_namespace ns ON ns.oid = obj.relnamespace\n WHERE rew.ev_class = c.oid AND obj.oid <> c.oid\n ) t\n ) \"deps\",\n right(substring(r.ev_action from ':hasRecursive \\w'), 1)::bool AS \"isRecursive\",\n array_to_json(c.reloptions) AS \"with\",\n (SELECT coalesce(json_agg(t), '[]') FROM (${columnsSql({\n schema: 'nc',\n table: 'c',\n where: 'a.attrelid = c.oid',\n })}) t) AS \"columns\",\n pg_get_viewdef(c.oid) AS \"sql\"\nFROM pg_namespace nc\nJOIN pg_class c\n ON nc.oid = c.relnamespace\n AND c.relkind = 'v'\n AND c.relpersistence != 't'\nJOIN pg_rewrite r ON r.ev_class = c.oid\nWHERE ${filterSchema('nc.nspname')}\nORDER BY c.relname`;\n\nconst indexesSql = `SELECT\n n.nspname \"schemaName\",\n t.relname \"tableName\",\n ic.relname \"name\",\n am.amname AS \"using\",\n i.indisunique \"unique\",\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 (to_jsonb(i.*)->'indnullsnotdistinct')::bool AS \"nullsNotDistinct\",\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\",\n (\n CASE i.indisexclusion WHEN true\n THEN (\n SELECT json_agg(o.oprname)\n FROM pg_catalog.pg_constraint c, LATERAL unnest(c.conexclop) op_oid\n JOIN pg_operator o ON o.oid = op_oid\n WHERE c.conindid = ic.oid\n )\n END\n ) \"exclude\"\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\nconst constraintsSql = `SELECT\n s.nspname AS \"schemaName\",\n t.relname AS \"tableName\",\n c.conname AS \"name\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.constraint_column_usage ccu\n WHERE contype = 'p'\n AND ccu.constraint_name = c.conname\n AND ccu.table_schema = s.nspname\n ) AS \"primaryKey\",\n (\n SELECT\n json_build_object(\n 'foreignSchema',\n fs.nspname,\n 'foreignTable',\n ft.relname,\n 'columns',\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 ),\n 'foreignColumns',\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 ),\n 'match',\n c.confmatchtype,\n 'onUpdate',\n c.confupdtype,\n 'onDelete',\n c.confdeltype\n )\n FROM pg_class ft\n JOIN pg_catalog.pg_namespace fs ON fs.oid = ft.relnamespace\n JOIN pg_catalog.pg_namespace cs ON cs.oid = c.connamespace\n WHERE contype = 'f' AND ft.oid = confrelid\n ) AS \"references\",\n (\n SELECT\n CASE conbin IS NULL\n WHEN false THEN\n json_build_object(\n 'columns',\n json_agg(ccu.column_name),\n 'expression',\n pg_get_expr(conbin, conrelid)\n )\n END\n FROM information_schema.constraint_column_usage ccu\n WHERE conbin IS NOT NULL\n AND ccu.constraint_name = c.conname\n AND ccu.table_schema = s.nspname\n ) AS \"check\"\nFROM pg_catalog.pg_constraint c\nJOIN pg_class t ON t.oid = conrelid\nJOIN pg_catalog.pg_namespace s\n ON s.oid = t.relnamespace\n AND contype IN ('p', 'f', 'c')\n AND ${filterSchema('s.nspname')}\nORDER BY c.conname`;\n\nconst triggersSql = `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\nconst extensionsSql = `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\nconst enumsSql = `SELECT\n n.nspname as \"schemaName\",\n t.typname as name,\n json_agg(e.enumlabel ORDER BY e.enumsortorder) as values\nFROM pg_type t\nJOIN pg_enum e ON t.oid = e.enumtypid\nJOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\nWHERE ${filterSchema('n.nspname')}\nGROUP BY n.nspname, t.typname`;\n\nconst domainsSql = `SELECT\n n.nspname AS \"schemaName\",\n d.typname AS \"name\",\n t.typname AS \"type\",\n s.nspname AS \"typeSchema\",\n NOT d.typnotnull AS \"isNullable\",\n d.typndims AS \"arrayDims\",\n character_maximum_length AS \"maxChars\",\n numeric_precision AS \"numericPrecision\",\n numeric_scale AS \"numericScale\",\n datetime_precision AS \"dateTimePrecision\",\n collation_name AS \"collate\",\n domain_default AS \"default\",\n (\n SELECT json_agg(pg_get_expr(conbin, conrelid))\n FROM pg_catalog.pg_constraint c\n WHERE c.contypid = d.oid\n ) AS \"checks\"\nFROM pg_catalog.pg_type d\nJOIN pg_catalog.pg_namespace n ON n.oid = d.typnamespace\nJOIN information_schema.domains i\n ON i.domain_schema = nspname\n AND i.domain_name = d.typname\nJOIN pg_catalog.pg_type t\n ON (\n CASE WHEN d.typcategory = 'A'\n THEN t.typarray\n ELSE t.oid\n END\n ) = d.typbasetype\nJOIN pg_catalog.pg_namespace s ON s.oid = t.typnamespace\nWHERE d.typtype = 'd' AND ${filterSchema('n.nspname')}`;\n\nconst collationsSql = (version: number) => `SELECT\n nspname \"schemaName\",\n collname \"name\",\n CASE WHEN collprovider = 'i' THEN 'icu' WHEN collprovider = 'c' THEN 'libc' ELSE collprovider::text END \"provider\",\n collisdeterministic \"deterministic\",\n collcollate \"lcCollate\",\n collctype \"lcCType\",\n ${version >= 17 ? 'colllocale' : 'colliculocale'} \"locale\",\n collversion \"version\"\nFROM pg_collation\nJOIN pg_namespace n on pg_collation.collnamespace = n.oid\nWHERE ${filterSchema('n.nspname')}`;\n\n// procedures\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\"\n// FROM pg_proc p\n// JOIN pg_namespace n ON p.pronamespace = n.oid\n// WHERE ${filterSchema('n.nspname')}`\n\nconst sql = (version: number) =>\n `SELECT (${schemasSql}) AS \"schemas\", ${jsonAgg(\n tablesSql,\n 'tables',\n )}, ${jsonAgg(viewsSql, 'views')}, ${jsonAgg(\n indexesSql,\n 'indexes',\n )}, ${jsonAgg(constraintsSql, 'constraints')}, ${jsonAgg(\n triggersSql,\n 'triggers',\n )}, ${jsonAgg(extensionsSql, 'extensions')}, ${jsonAgg(\n enumsSql,\n 'enums',\n )}, ${jsonAgg(domainsSql, 'domains')}, ${jsonAgg(\n collationsSql(version),\n 'collations',\n )}`;\n\nexport interface IntrospectedStructure {\n schemas: string[];\n tables: DbStructure.Table[];\n views: DbStructure.View[];\n indexes: DbStructure.Index[];\n excludes: DbStructure.Exclude[];\n constraints: DbStructure.Constraint[];\n triggers: DbStructure.Trigger[];\n extensions: DbStructure.Extension[];\n enums: DbStructure.Enum[];\n domains: DbStructure.Domain[];\n collations: DbStructure.Collation[];\n}\n\nexport async function introspectDbSchema(\n db: AdapterBase,\n): Promise<IntrospectedStructure> {\n const {\n rows: [{ version: versionString }],\n } = await db.query<{ version: string }>('SELECT version()');\n\n const version = +(versionString.match(/\\d+/) as string[])[0];\n\n const data = await db.query<IntrospectedStructure>(sql(version));\n const result = data.rows[0];\n\n for (const domain of result.domains) {\n domain.checks = domain.checks?.filter((check) => check);\n nullsToUndefined(domain);\n }\n\n for (const table of result.tables) {\n for (const column of table.columns) {\n nullsToUndefined(column);\n if (column.identity) nullsToUndefined(column.identity);\n if (column.compression) {\n column.compression =\n (column.compression as string) === 'p' ? 'pglz' : 'lz4';\n }\n }\n }\n\n const indexes: DbStructure.Index[] = [];\n const excludes: DbStructure.Exclude[] = [];\n\n for (const index of result.indexes) {\n nullsToUndefined(index);\n for (const column of index.columns) {\n if (!('expression' in column)) continue;\n\n const s = column.expression;\n const columnR = `\"?\\\\w+\"?`;\n const langR = `(${columnR}|'\\\\w+'::regconfig)`;\n const firstColumnR = `[(]*${columnR}`;\n const concatR = `\\\\|\\\\|`;\n const restColumnR = ` ${concatR} ' '::text\\\\) ${concatR} ${columnR}\\\\)`;\n const coalesceColumn = `COALESCE\\\\(${columnR}, ''::text\\\\)`;\n const tsVectorR = `to_tsvector\\\\(${langR}, (${firstColumnR}|${restColumnR}|${coalesceColumn})+\\\\)`;\n const weightR = `'\\\\w'::\"char\"`;\n const setWeightR = `setweight\\\\(${tsVectorR}, ${weightR}\\\\)`;\n const setWeightOrTsVectorR = `(${setWeightR}|${tsVectorR})`;\n\n const match = s.match(\n new RegExp(`^([\\\\(]*${setWeightOrTsVectorR}[\\\\)]*( ${concatR} )?)+$`),\n );\n if (!match) continue;\n\n let language: string | undefined;\n let languageColumn: string | undefined;\n const tokens = match[0]\n .match(\n new RegExp(\n `setweight\\\\(|to_tsvector\\\\(${langR}|[:']?${columnR}\\\\(?`,\n 'g',\n ),\n )\n ?.reduce<\n (\n | { kind: 'weight'; value: SearchWeight }\n | { kind: 'column'; value: string }\n )[]\n >((acc, token) => {\n if (\n token === 'setweight(' ||\n token === 'COALESCE(' ||\n token[0] === ':'\n )\n return acc;\n\n if (token.startsWith('to_tsvector(')) {\n if (token[12] === \"'\") {\n language = token.slice(13, -12);\n } else {\n languageColumn = token.slice(12);\n }\n } else if (token[0] === \"'\") {\n acc.push({ kind: 'weight', value: token[1] as SearchWeight });\n } else {\n if (token[0] === '\"') token = token.slice(1, -1);\n acc.push({ kind: 'column', value: token });\n }\n\n return acc;\n }, []);\n\n if (!tokens) continue;\n\n index.language = language;\n index.languageColumn = languageColumn;\n index.tsVector = true;\n index.columns = [];\n\n for (const token of tokens) {\n if (token.kind === 'column') {\n index.columns.push({\n column: token.value,\n });\n } else if (token.kind === 'weight') {\n index.columns[index.columns.length - 1].weight = token.value;\n }\n }\n }\n\n ((index as DbStructure.Exclude).exclude ? excludes : indexes).push(index);\n }\n\n result.indexes = indexes;\n result.excludes = excludes;\n\n return result;\n}\n\nconst nullsToUndefined = (obj: EmptyObject) => {\n for (const key in obj) {\n if ((obj as RecordUnknown)[key] === null)\n (obj as RecordUnknown)[key] = undefined;\n }\n};\n","import {\n DbStructure,\n introspectDbSchema,\n IntrospectedStructure,\n} from './dbStructure';\nimport { RakeDbAst } from '../ast';\nimport {\n ArrayColumn,\n assignDbDataToColumn,\n ColumnFromDbParams,\n ColumnsByType,\n ColumnsShape,\n ColumnType,\n CustomTypeColumn,\n DbStructureDomainsMap,\n DomainColumn,\n EnumColumn,\n makeColumnsByType,\n PostgisGeographyPointColumn,\n raw,\n RawSQL,\n TableData,\n AdapterBase,\n ColumnSchemaConfig,\n singleQuote,\n TemplateLiteralArgs,\n toCamelCase,\n toSnakeCase,\n} from 'pqb';\nimport {\n getConstraintName,\n getExcludeName,\n getIndexName,\n} from '../migration/migration.utils';\nimport { AnyRakeDbConfig } from '../config';\n\nconst matchMap: Record<string, undefined | TableData.References.Match> = {\n s: undefined,\n f: 'FULL',\n p: 'PARTIAL',\n};\n\nconst fkeyActionMap: Record<string, undefined | TableData.References.Action> = {\n a: undefined, // default\n r: 'RESTRICT',\n c: 'CASCADE',\n n: 'SET NULL',\n d: 'SET DEFAULT',\n};\n\nexport interface StructureToAstCtx {\n snakeCase?: boolean;\n unsupportedTypes: Record<string, string[]>;\n currentSchema: string;\n columnSchemaConfig: ColumnSchemaConfig;\n columnsByType: ColumnsByType;\n}\n\nexport interface StructureToAstTableData {\n primaryKey?: TableData.PrimaryKey;\n indexes: DbStructure.Index[];\n excludes: DbStructure.Exclude[];\n constraints: DbStructure.Constraint[];\n}\n\nexport const makeStructureToAstCtx = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n): StructureToAstCtx => ({\n snakeCase: config.snakeCase,\n unsupportedTypes: {},\n currentSchema,\n columnSchemaConfig: config.schemaConfig,\n columnsByType: makeColumnsByType(config.schemaConfig),\n});\n\nexport const structureToAst = async (\n ctx: StructureToAstCtx,\n adapter: AdapterBase,\n config: AnyRakeDbConfig,\n): Promise<RakeDbAst[]> => {\n const ast: RakeDbAst[] = [];\n\n const data = await introspectDbSchema(adapter);\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 for (const it of data.collations) {\n ast.push({\n type: 'collation',\n action: 'create',\n ...it,\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n });\n }\n\n const domains = makeDomainsMap(ctx, data);\n\n for (const table of data.tables) {\n if (table.name === config.migrationsTable) continue;\n\n ast.push(tableToAst(ctx, data, table, 'create', domains));\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 === ctx.currentSchema ? undefined : it.schemaName,\n version: it.version,\n });\n }\n\n for (const it of data.enums) {\n ast.push({\n type: 'enum',\n action: 'create',\n name: it.name,\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n values: it.values,\n });\n }\n\n for (const it of data.domains) {\n ast.push({\n type: 'domain',\n action: 'create',\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n name: it.name,\n baseType: domains[`${it.schemaName}.${it.name}`],\n });\n }\n\n for (const table of data.tables) {\n for (const fkey of data.constraints) {\n if (\n fkey.references &&\n fkey.tableName === table.name &&\n fkey.schemaName === table.schemaName &&\n checkIfIsOuterRecursiveFkey(data, table, fkey.references)\n ) {\n ast.push({\n ...constraintToAst(ctx, fkey),\n type: 'constraint',\n action: 'create',\n tableSchema:\n table.schemaName === ctx.currentSchema\n ? undefined\n : table.schemaName,\n tableName: fkey.tableName,\n });\n }\n }\n }\n\n for (const view of data.views) {\n ast.push(viewToAst(ctx, data, domains, view));\n }\n\n return ast;\n};\n\nexport const makeDomainsMap = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n): DbStructureDomainsMap => {\n const domains: DbStructureDomainsMap = {};\n\n for (const it of data.domains) {\n const column = instantiateDbColumn(ctx, data, domains, {\n schemaName: it.schemaName,\n name: it.name,\n type: it.type,\n typeSchema: it.typeSchema,\n arrayDims: it.arrayDims,\n tableName: '',\n isNullable: it.isNullable,\n collate: it.collate,\n default: it.default,\n typmod: -1,\n });\n\n if (it.checks) {\n column.data.checks = it.checks.map((check) => ({\n sql: new RawSQL([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n domains[`${it.schemaName}.${it.name}`] = column;\n }\n\n return domains;\n};\n\nconst getDbColumnIsSerial = (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\nexport const instantiateDbColumn = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n dbColumn: DbStructure.Column,\n) => {\n const isSerial = getDbColumnIsSerial(dbColumn);\n if (isSerial) {\n dbColumn = { ...dbColumn, default: undefined };\n }\n\n let column: ColumnType;\n\n const col = instantiateColumnByDbType(ctx, dbColumn.type, isSerial, dbColumn);\n if (col) {\n column = col;\n } else {\n const { typeSchema, type: typeName } = dbColumn;\n const typeId =\n typeSchema === 'pg_catalog' ? typeName : `${typeSchema}.${typeName}`;\n const domainColumn = domains[typeId];\n if (domainColumn) {\n column = new DomainColumn(\n ctx.columnSchemaConfig,\n typeName,\n typeSchema,\n dbColumn.extension,\n ).as(domainColumn);\n } else {\n const enumType = data.enums.find(\n (x) => x.name === typeName && x.schemaName === typeSchema,\n );\n if (enumType) {\n column = new EnumColumn(\n ctx.columnSchemaConfig,\n typeSchema === ctx.currentSchema ? typeName : typeId,\n enumType.values,\n ctx.columnSchemaConfig.type,\n );\n } else {\n column = new CustomTypeColumn(\n ctx.columnSchemaConfig,\n typeName,\n typeSchema === 'pg_catalog' ? undefined : typeSchema,\n dbColumn.extension,\n );\n\n (ctx.unsupportedTypes[dbColumn.type] ??= []).push(\n `${dbColumn.schemaName}${\n dbColumn.tableName ? `.${dbColumn.tableName}` : ''\n }.${dbColumn.name}`,\n );\n }\n\n assignDbDataToColumn(column, dbColumn);\n }\n }\n\n column.data.name = undefined;\n if (!column.data.isNullable) column.data.isNullable = undefined;\n\n if (dbColumn.arrayDims) {\n const arr = new ArrayColumn(\n ctx.columnSchemaConfig,\n column,\n ctx.columnSchemaConfig.type,\n );\n arr.data.isNullable = dbColumn.isNullable as true;\n arr.data.arrayDims = dbColumn.arrayDims;\n column = arr;\n }\n\n return column;\n};\n\nconst instantiateColumnByDbType = (\n ctx: StructureToAstCtx,\n type: string,\n isSerial: boolean,\n params: ColumnFromDbParams,\n): ColumnType | undefined => {\n let columnFn =\n ctx.columnsByType[\n !isSerial\n ? type\n : type === 'int2'\n ? 'smallserial'\n : type === 'int4'\n ? 'serial'\n : 'bigserial'\n ];\n\n if (\n !columnFn &&\n params.extension === 'postgis' &&\n type === 'geography' &&\n PostgisGeographyPointColumn.isDefaultPoint(params.typmod)\n ) {\n columnFn = ctx.columnsByType.geographyDefaultPoint;\n }\n\n return columnFn\n ? (assignDbDataToColumn(columnFn(), params) as ColumnType)\n : undefined;\n};\n\nexport const tableToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n table: DbStructure.Table,\n action: 'create' | 'drop',\n domains: DbStructureDomainsMap,\n): RakeDbAst.Table => {\n const { schemaName, name: tableName } = table;\n\n const tableData = getDbStructureTableData(data, table);\n const { primaryKey, constraints } = tableData;\n\n return {\n type: 'table',\n action,\n schema: schemaName === ctx.currentSchema ? undefined : schemaName,\n comment: table.comment,\n name: tableName,\n shape: makeDbStructureColumnsShape(ctx, data, domains, table, tableData),\n noPrimaryKey: tableData.primaryKey ? 'error' : 'ignore',\n primaryKey:\n primaryKey && primaryKey.columns.length > 1\n ? { ...primaryKey, columns: primaryKey.columns.map(toCamelCase) }\n : undefined,\n indexes: indexesOrExcludesToAst<TableData.Index[]>(\n tableName,\n tableData,\n 'indexes',\n ),\n excludes: indexesOrExcludesToAst<TableData.Exclude[]>(\n tableName,\n tableData,\n 'excludes',\n ),\n constraints: constraints.reduce<TableData.Constraint[]>((acc, it) => {\n if (\n (it.check && it.references) ||\n (it.check && it.check.columns?.length !== 1) ||\n (it.references &&\n it.references.columns.length !== 1 &&\n !checkIfIsOuterRecursiveFkey(data, table, it.references))\n ) {\n acc.push(dbConstraintToTableConstraint(ctx, table, it));\n }\n\n return acc;\n }, []),\n };\n};\n\nconst indexesOrExcludesToAst = <T>(\n tableName: string,\n tableData: StructureToAstTableData,\n key: 'indexes' | 'excludes',\n): T => {\n return tableData[key].reduce<TableData.Index[]>((acc, item) => {\n if (\n item.columns.length > 1 ||\n item.columns.some((it) => 'expression' in it)\n ) {\n const options = makeIndexOrExcludeOptions(tableName, item, key);\n\n acc.push({\n columns: item.columns.map((it, i) => ({\n with: 'exclude' in item && item.exclude ? item.exclude[i] : undefined,\n ...('expression' in it\n ? { expression: it.expression }\n : { column: toCamelCase(it.column) }),\n collate: it.collate,\n opclass: it.opclass,\n order: it.order,\n })),\n options: {\n ...options,\n include: item.include?.map(toCamelCase),\n },\n });\n }\n return acc;\n }, []) as T;\n};\n\nexport const getDbStructureTableData = (\n data: IntrospectedStructure,\n { name, schemaName }: DbStructure.Table,\n): StructureToAstTableData => {\n const filterFn = filterByTableSchema(name, schemaName);\n\n const constraints = data.constraints.filter(filterFn);\n\n const primaryKey = constraints.find((c) => c.primaryKey);\n\n return {\n primaryKey: primaryKey?.primaryKey\n ? {\n columns: primaryKey.primaryKey,\n name:\n primaryKey.name === `${name}_pkey` ? undefined : primaryKey.name,\n }\n : undefined,\n indexes: data.indexes.filter(filterFn),\n excludes: data.excludes.filter(filterFn),\n constraints,\n };\n};\n\nconst filterByTableSchema =\n (tableName: string, schemaName: string) =>\n (x: DbStructure.TableNameAndSchemaName) =>\n x.tableName === tableName && x.schemaName === schemaName;\n\nconst constraintToAst = (\n ctx: StructureToAstCtx,\n item: DbStructure.Constraint,\n): TableData.Constraint => {\n const result: TableData.Constraint = {};\n\n const { references, check } = item;\n\n if (references) {\n const options: TableData.References.Options = {};\n result.references = {\n columns: references.columns,\n fnOrTable: getReferencesTable(ctx, references),\n foreignColumns: references.foreignColumns,\n options,\n };\n\n const match = matchMap[references.match];\n if (match) options.match = match;\n\n const onUpdate = fkeyActionMap[references.onUpdate];\n if (onUpdate) options.onUpdate = onUpdate;\n\n const onDelete = fkeyActionMap[references.onDelete];\n if (onDelete) options.onDelete = onDelete;\n }\n\n if (check) {\n result.check = raw({ raw: check.expression });\n }\n\n if (\n item.name &&\n item.name !== getConstraintName(item.tableName, result, ctx.snakeCase)\n ) {\n result.name = item.name;\n if (result.references?.options) {\n result.references.options.name = item.name;\n }\n }\n\n return result;\n};\n\nconst getReferencesTable = (\n ctx: StructureToAstCtx,\n references: DbStructure.References,\n) => {\n return references.foreignSchema !== ctx.currentSchema\n ? `${references.foreignSchema}.${references.foreignTable}`\n : references.foreignTable;\n};\n\nconst isColumnCheck = (\n it: DbStructure.Constraint,\n): it is DbStructure.Constraint & {\n check: DbStructure.Check & { columns: string[] };\n} => {\n return !it.references && it.check?.columns?.length === 1;\n};\n\nconst viewToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n view: DbStructure.View,\n): RakeDbAst.View => {\n const shape = makeDbStructureColumnsShape(ctx, data, domains, view);\n\n const options: RakeDbAst.ViewOptions = {};\n if (view.isRecursive) options.recursive = true;\n\n if (view.with) {\n const withOptions: Record<string, unknown> = {};\n options.with = withOptions;\n for (const pair of view.with) {\n const [key, value] = pair.split('=');\n withOptions[toCamelCase(key) as 'checkOption'] =\n value === 'true' ? true : value === 'false' ? false : value;\n }\n }\n\n return {\n type: 'view',\n action: 'create',\n schema: view.schemaName === ctx.currentSchema ? undefined : view.schemaName,\n name: view.name,\n shape,\n sql: raw({ raw: view.sql }),\n options,\n deps: view.deps,\n };\n};\n\nexport const makeDbStructureColumnsShape = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n table: DbStructure.Table | DbStructure.View,\n tableData?: StructureToAstTableData,\n): ColumnsShape => {\n const shape: ColumnsShape = {};\n const checks = tableData ? getDbTableColumnsChecks(tableData) : undefined;\n\n for (const item of table.columns) {\n const [key, column] = dbColumnToAst(\n ctx,\n data,\n domains,\n table.name,\n item,\n table,\n tableData,\n checks,\n );\n shape[key] = column;\n }\n\n return shape;\n};\n\nexport interface ColumnChecks {\n [K: string]: string[];\n}\n\nexport const getDbTableColumnsChecks = (tableData: StructureToAstTableData) =>\n tableData.constraints.reduce<ColumnChecks>((acc, item) => {\n if (isColumnCheck(item)) {\n (acc[item.check.columns[0]] ??= []).push(item.check.expression);\n }\n return acc;\n }, {});\n\nexport const dbColumnToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n tableName: string,\n item: DbStructure.Column,\n table?: DbStructure.Table,\n tableData?: StructureToAstTableData,\n checks?: ColumnChecks,\n): [key: string, column: ColumnType] => {\n let column = instantiateDbColumn(ctx, data, domains, item);\n column.data.name = item.name;\n\n if (item.identity) {\n column.data.identity = item.identity;\n if (!item.identity.always) delete column.data.identity?.always;\n }\n\n if (\n tableData?.primaryKey?.columns?.length === 1 &&\n tableData?.primaryKey?.columns[0] === item.name\n ) {\n column = column.primaryKey();\n }\n\n collectColumnIndexesOrExcludes(item, column, tableName, tableData, 'indexes');\n collectColumnIndexesOrExcludes(\n item,\n column,\n tableName,\n tableData,\n 'excludes',\n );\n\n if (table) {\n for (const it of data.constraints) {\n if (\n it.tableName !== table.name ||\n it.schemaName !== table.schemaName ||\n it.check ||\n it.references?.columns.length !== 1 ||\n it.references.columns[0] !== item.name ||\n checkIfIsOuterRecursiveFkey(data, table, it.references)\n ) {\n continue;\n }\n\n const c = dbConstraintToTableConstraint(ctx, table, it);\n\n column = column.foreignKey(\n c.references?.fnOrTable as string,\n it.references.foreignColumns[0],\n c.references?.options,\n );\n }\n }\n\n const columnChecks = checks?.[item.name];\n if (columnChecks) {\n column.data.checks = columnChecks.map((check) => ({\n sql: new RawSQL([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n const camelCaseName = toCamelCase(item.name);\n\n if (ctx.snakeCase) {\n const snakeCaseName = toSnakeCase(camelCaseName);\n\n if (snakeCaseName !== item.name) column.data.name = item.name;\n } else if (camelCaseName !== item.name) {\n column.data.name = item.name;\n }\n\n return [camelCaseName, column];\n};\n\nconst collectColumnIndexesOrExcludes = (\n dbColumn: DbStructure.Column,\n column: ColumnType,\n tableName: string,\n tableData: StructureToAstTableData | undefined,\n key: 'indexes' | 'excludes',\n) => {\n const items = tableData?.[key];\n if (!items) return;\n\n const columnItems = items.filter(\n (it) =>\n it.columns.length === 1 &&\n 'column' in it.columns[0] &&\n it.columns[0].column === dbColumn.name,\n );\n for (const item of columnItems) {\n const columnOptions = item.columns[0];\n const { name, ...itemOptions } = makeIndexOrExcludeOptions(\n tableName,\n item,\n key,\n );\n (column.data[key] ??= []).push({\n with: ('exclude' in item && item.exclude\n ? (item as DbStructure.Exclude).exclude[0]\n : undefined) as never,\n options: {\n name,\n collate: columnOptions.collate,\n opclass: columnOptions.opclass,\n order: columnOptions.order,\n ...itemOptions,\n },\n });\n }\n};\n\nconst dbConstraintToTableConstraint = (\n ctx: StructureToAstCtx,\n table: DbStructure.Table,\n item: DbStructure.Constraint,\n) => {\n const { references, check } = item;\n\n const constraint: TableData.Constraint = {\n references: references\n ? {\n columns: references.columns,\n fnOrTable: getReferencesTable(ctx, references),\n foreignColumns: references.foreignColumns,\n options: {\n match: matchMap[references.match],\n onUpdate: fkeyActionMap[references.onUpdate],\n onDelete: fkeyActionMap[references.onDelete],\n },\n }\n : undefined,\n check: check ? raw({ raw: check.expression }) : undefined,\n };\n\n const name =\n item.name &&\n item.name !== getConstraintName(table.name, constraint, ctx.snakeCase)\n ? item.name\n : undefined;\n\n if (name) {\n constraint.name = name;\n if (constraint.references?.options) {\n constraint.references.options.name = name;\n }\n }\n\n return constraint;\n};\n\nconst makeIndexOrExcludeOptions = (\n tableName: string,\n index: DbStructure.Index,\n key: 'indexes' | 'excludes',\n) => {\n return {\n name:\n index.name !==\n (key === 'indexes' ? getIndexName : getExcludeName)(\n tableName,\n index.columns,\n )\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.unique || undefined,\n include: index.include,\n nullsNotDistinct: index.nullsNotDistinct || undefined,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n };\n};\n\nconst checkIfIsOuterRecursiveFkey = (\n data: IntrospectedStructure,\n table: DbStructure.Table,\n references: DbStructure.References,\n) => {\n const referencesId = `${references.foreignSchema}.${references.foreignTable}`;\n const tableId = `${table.schemaName}.${table.name}`;\n for (const other of data.tables) {\n const id = `${other.schemaName}.${other.name}`;\n if (referencesId === id) {\n for (const c of data.constraints) {\n if (\n c.tableName === other.name &&\n c.schemaName === other.schemaName &&\n c.references?.foreignTable === table.name &&\n c.references.foreignSchema === table.schemaName &&\n tableId < id\n ) {\n return true;\n }\n }\n break;\n }\n }\n return false;\n};\n","import { RakeDbAst } from '../ast';\nimport {\n getConstraintName,\n getExcludeName,\n getForeignKeyTable,\n getIndexName,\n} from '../migration/migration.utils';\nimport {\n ArrayColumn,\n ArrayColumnValue,\n ColumnType,\n EnumColumn,\n TableData,\n ColumnTypeSchemaArg,\n toArray,\n exhaustive,\n} from 'pqb';\nimport { getSchemaAndTableFromName } from '../common';\nimport { AnyRakeDbConfig } from 'rake-db';\n\nexport interface GenerateItem {\n ast: RakeDbAst;\n add: Set<string>;\n drop: Set<string>;\n deps: Set<string>;\n}\n\ntype TableColumn = [\n keys: string[],\n name: string,\n column: RakeDbAst.ColumnChange,\n];\n\nexport const astToGenerateItems = (\n config: AnyRakeDbConfig,\n asts: RakeDbAst[],\n currentSchema: string,\n): GenerateItem[] => {\n return asts.map((ast) => astToGenerateItem(config, ast, currentSchema));\n};\n\nexport const astToGenerateItem = (\n config: AnyRakeDbConfig,\n ast: RakeDbAst,\n currentSchema: string,\n): GenerateItem => {\n const add: string[] = [];\n const drop: string[] = [];\n const deps: string[] = [];\n const typeSchemaCache = new Map<string, string>();\n const resolveType = (type: string): string => {\n let dep = typeSchemaCache.get(type);\n if (!dep) {\n const [schema = currentSchema, name] = getSchemaAndTableFromName(type);\n dep = `${schema}.${name}`;\n typeSchemaCache.set(type, dep);\n }\n return dep;\n };\n\n switch (ast.type) {\n case 'table':\n case 'changeTable':\n case 'view': {\n const schema = ast.schema ?? currentSchema;\n const table = `${schema}.${ast.name}`;\n\n if (ast.type === 'table' || ast.type === 'view') {\n const keys = ast.action === 'create' ? add : drop;\n keys.push(table);\n deps.push(schema);\n\n const columns: TableColumn[] = Object.entries(ast.shape).map(\n ([name, column]) => [keys, name, { column }],\n );\n\n analyzeTableColumns(\n config,\n currentSchema,\n schema,\n table,\n deps,\n resolveType,\n columns,\n );\n\n if (ast.type === 'table') {\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n keys,\n deps,\n ast,\n );\n } else {\n deps.push(\n ...ast.deps.map(({ schemaName, name }) => `${schemaName}.${name}`),\n );\n }\n } else {\n deps.push(table);\n\n const columns: TableColumn[] = [];\n\n for (const name in ast.shape) {\n const arr = toArray(ast.shape[name]);\n for (const item of arr) {\n if (item.type === 'add') {\n columns.push([add, name, { column: item.item }]);\n } else if (item.type === 'drop') {\n columns.push([drop, name, { column: item.item }]);\n } else if (item.type === 'change') {\n columns.push([add, name, item.to]);\n columns.push([drop, name, item.from]);\n }\n }\n }\n\n analyzeTableColumns(\n config,\n currentSchema,\n schema,\n table,\n deps,\n resolveType,\n columns,\n );\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n add,\n deps,\n ast.add,\n );\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n drop,\n deps,\n ast.drop,\n );\n }\n break;\n }\n case 'renameType': {\n const { fromSchema = currentSchema, toSchema = currentSchema } = ast;\n add.push(`${toSchema}.${ast.to}`);\n drop.push(`${fromSchema}.${ast.from}`);\n deps.push(fromSchema, toSchema);\n break;\n }\n case 'schema': {\n (ast.action === 'create' ? add : drop).push(ast.name);\n break;\n }\n case 'renameSchema': {\n drop.push(ast.from);\n add.push(ast.to);\n break;\n }\n case 'enum':\n case 'collation':\n case 'extension': {\n const schema = ast.schema ?? currentSchema;\n (ast.action === 'create' ? add : drop).push(`${schema}.${ast.name}`);\n deps.push(schema);\n break;\n }\n case 'enumValues':\n case 'renameEnumValues':\n case 'changeEnumValues': {\n const schema = ast.schema ?? currentSchema;\n deps.push(schema, `${schema}.${ast.name}`);\n break;\n }\n case 'domain': {\n const schema = ast.schema ?? currentSchema;\n (ast.action === 'create' ? add : drop).push(`${schema}.${ast.name}`);\n const column = ast.baseType;\n deps.push(schema, resolveType(column.dataType));\n if (column.data.collate) deps.push(column.data.collate);\n break;\n }\n case 'constraint': {\n const { tableSchema = currentSchema, tableName } = ast;\n const name = `${tableSchema}.${\n ast.name ?? getConstraintName(tableName, ast, config.snakeCase)\n }`;\n (ast.action === 'create' ? add : drop).push(name);\n deps.push(tableSchema, `${tableSchema}.${tableName}`);\n break;\n }\n case 'renameTableItem': {\n const { tableSchema = currentSchema, tableName } = ast;\n drop.push(ast.from);\n add.push(ast.to);\n deps.push(tableSchema, `${tableSchema}.${tableName}`);\n break;\n }\n default:\n exhaustive(ast);\n }\n\n return {\n ast,\n add: new Set(add),\n drop: new Set(drop),\n deps: new Set(deps),\n };\n};\n\nconst analyzeTableColumns = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n schema: string,\n table: string,\n deps: string[],\n resolveType: (type: string) => string,\n columns: TableColumn[],\n) => {\n for (const [keys, name, change] of columns) {\n const { column } = change;\n if (column) {\n let c = column;\n\n while (c.dataType === 'array') {\n c = (\n column as ArrayColumn<\n ColumnTypeSchemaArg,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >\n ).data.item as ColumnType;\n }\n\n let type: string;\n if (c.dataType === 'enum') {\n type = (\n c as EnumColumn<ColumnTypeSchemaArg, unknown, readonly string[]>\n ).enumName;\n } else {\n type = c.dataType;\n }\n\n deps.push(resolveType(type));\n } else if (change.type) {\n deps.push(resolveType(change.type));\n }\n\n const collate = change.column?.data.collate ?? change.collate;\n if (collate) deps.push(collate);\n\n const primaryKey = change.primaryKey || change.column?.data.primaryKey;\n if (primaryKey) {\n keys.push(`${table}_pkey`);\n }\n\n pushIndexOrExcludeKeys(change, keys, schema, table, name, 'indexes');\n pushIndexOrExcludeKeys(change, keys, schema, table, name, 'excludes');\n\n const foreignKeys = change.foreignKeys || change.column?.data.foreignKeys;\n if (foreignKeys) {\n for (const fkey of foreignKeys) {\n keys.push(\n fkey.options?.name\n ? `${schema}.${fkey.options.name}`\n : getConstraintName(\n table,\n {\n references: { columns: [change.column?.data.name ?? name] },\n },\n config.snakeCase,\n ),\n );\n\n const [s = currentSchema, t] = getForeignKeyTable(fkey.fnOrTable);\n const foreignTable = `${s}.${t}`;\n if (foreignTable !== table) {\n deps.push(foreignTable);\n }\n }\n }\n }\n};\n\nconst pushIndexOrExcludeKeys = (\n change: RakeDbAst.ColumnChange,\n keys: string[],\n schema: string,\n table: string,\n name: string,\n key: 'indexes' | 'excludes',\n) => {\n const items = change[key] || change.column?.data[key];\n if (items) {\n const getName = key === 'indexes' ? getIndexName : getExcludeName;\n for (const x of items) {\n keys.push(\n x.options.name\n ? `${schema}.${x.options.name}`\n : getName(table, [{ column: change.column?.data.name ?? name }]),\n );\n }\n }\n};\n\nconst pushIndexesOrExcludesKeys = (\n keys: string[],\n schema: string,\n table: string,\n data: TableData,\n key: 'indexes' | 'excludes',\n) => {\n const arr = data[key];\n if (arr) {\n const getName = key === 'indexes' ? getIndexName : getExcludeName;\n for (const x of arr) {\n keys.push(\n x.options.name\n ? `${schema}.${x.options.name}`\n : getName(table, x.columns),\n );\n }\n }\n};\n\nconst analyzeTableData = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n schema: string,\n table: string,\n keys: string[],\n deps: string[],\n data: TableData,\n) => {\n if (data.primaryKey) {\n const name = data.primaryKey.name;\n keys.push(name ? `${schema}.${name}` : `${table}_pkey`);\n }\n\n pushIndexesOrExcludesKeys(keys, schema, table, data, 'indexes');\n pushIndexesOrExcludesKeys(keys, schema, table, data, 'excludes');\n\n if (data.constraints) {\n for (const constraint of data.constraints) {\n keys.push(\n constraint.name\n ? `${schema}.${constraint.name}`\n : getConstraintName(table, constraint, config.snakeCase),\n );\n\n if (constraint.references) {\n const [s = currentSchema, t] = getForeignKeyTable(\n constraint.references.fnOrTable,\n );\n deps.push(`${s}.${t}`);\n }\n }\n }\n};\n","import { RakeDbAst } from '../ast';\nimport {\n ColumnType,\n referencesArgsToCode,\n TimestampTZColumn,\n TimestampColumn,\n primaryKeyInnerToCode,\n indexInnerToCode,\n constraintInnerToCode,\n TableData,\n pushTableDataCode,\n excludeInnerToCode,\n} from 'pqb';\nimport {\n addCode,\n backtickQuote,\n Code,\n codeToString,\n ColumnSchemaConfig,\n ColumnToCodeCtx,\n isRawSQL,\n quoteObjectKey,\n singleQuote,\n toArray,\n exhaustive,\n} from 'pqb';\nimport { quoteSchemaTable } from '../common';\nimport { AnyRakeDbConfig } from '../config';\nimport { astToGenerateItems } from './astToGenerateItems';\n\nexport const astToMigration = (\n currentSchema: string,\n config: AnyRakeDbConfig,\n asts: RakeDbAst[],\n): string | undefined => {\n const items = astToGenerateItems(config, asts, currentSchema);\n\n const toBeAdded = new Set<string>();\n const toBeDropped = new Set<string>();\n const remainingDeps = new Map<string, number>();\n const added = new Set<string>();\n const dropped = new Set<string>();\n const groups: RakeDbAst[][] = [[]];\n\n for (const item of items) {\n for (const add of item.add) {\n toBeAdded.add(add);\n }\n\n for (const drop of item.drop) {\n // `toBeDropped` contains only those items that are dropped and added in separate asts.\n // Skip it from `toBeDropped` if, for example, primary key is dropped and added inside a single table change.\n if (!item.add.has(drop)) {\n toBeDropped.add(drop);\n }\n }\n\n for (const dep of item.deps) {\n remainingDeps.set(dep, (remainingDeps.get(dep) ?? 0) + 1);\n }\n }\n\n let len = items.length;\n if (!len) return;\n\n for (;;) {\n const cycleAdd = new Set<string>();\n const cycleDrop = new Set<string>();\n const cycleDeps = new Map<string, number>();\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n let satisfied = true;\n for (const dep of item.deps) {\n if (toBeAdded.has(dep) && !added.has(dep) && !item.add.has(dep)) {\n satisfied = false;\n break;\n }\n }\n\n if (satisfied) {\n for (const dep of item.drop) {\n const selfRef = item.deps.has(dep);\n const depsLeft = remainingDeps.get(dep);\n if (depsLeft && depsLeft > (selfRef ? 1 : 0)) {\n satisfied = false;\n break;\n }\n }\n }\n\n if (satisfied) {\n // When the same thing is dropped and then added in a single migration,\n // make it to first drop and then add at a separate section to preserve the correct `down` order.\n for (const key of item.add) {\n if (toBeDropped.has(key) && !dropped.has(key)) {\n satisfied = false;\n break;\n }\n }\n }\n\n if (satisfied) {\n for (const key of item.add) {\n cycleAdd.add(key);\n }\n\n for (const key of item.drop) {\n cycleDrop.add(key);\n }\n\n for (const key of item.deps) {\n cycleDeps.set(key, (cycleDeps.get(key) ?? 0) + 1);\n }\n\n items.splice(i, 1);\n i--;\n groups[groups.length - 1].push(item.ast);\n }\n }\n\n if (len === items.length) {\n throw Object.assign(\n new Error(\n `Cannot satisfy migration dependencies: ${JSON.stringify(\n items.map((item) => ({\n ast: item.ast,\n add: [...item.add.values()],\n drop: [...item.drop.values()],\n deps: [...item.deps.values()],\n })),\n null,\n 2,\n )}`,\n ),\n );\n }\n\n for (const add of cycleAdd) {\n added.add(add);\n }\n\n for (const drop of cycleDrop) {\n dropped.add(drop);\n }\n\n for (const [key, num] of cycleDeps) {\n const set = (remainingDeps.get(key) ?? num) - num;\n if (set) remainingDeps.set(key, set);\n else remainingDeps.delete(key);\n }\n\n len = items.length;\n if (!len) break;\n\n groups.push([]);\n }\n\n if (!groups[0].length) return;\n\n let code = '';\n for (const group of groups) {\n code += `\nchange(async (db) => {\n${group\n .map((ast) =>\n codeToString(\n (\n astEncoders as {\n [K: string]: (\n ast: RakeDbAst,\n config: AnyRakeDbConfig,\n currentSchema: string,\n ) => Code;\n }\n )[ast.type](ast, config, currentSchema),\n ' ',\n ' ',\n ),\n )\n .join('\\n\\n')}\n});\n`;\n }\n\n return code;\n};\n\nconst astEncoders: {\n [K in RakeDbAst['type']]: (\n ast: RakeDbAst & { type: K },\n config: AnyRakeDbConfig,\n currentSchema: string,\n ) => Code;\n} = {\n table(ast, config, currentSchema) {\n let code: Code[] = [];\n const result = code;\n\n const hasOptions = Boolean(ast.comment || ast.noPrimaryKey === 'ignore');\n const hasTableData = Boolean(\n ast.primaryKey ||\n ast.indexes?.length ||\n ast.excludes?.length ||\n ast.constraints?.length,\n );\n const isShifted = hasOptions || hasTableData;\n\n if (isShifted) {\n addCode(code, `await db.${ast.action}Table(`);\n\n const inner: Code[] = [`${quoteSchemaTable(ast)},`];\n code.push(inner);\n code = inner;\n\n if (hasOptions) {\n const options: string[] = [];\n if (ast.comment)\n options.push(`comment: ${JSON.stringify(ast.comment)},`);\n if (ast.noPrimaryKey === 'ignore') options.push(`noPrimaryKey: true,`);\n\n code.push('{', options, '},');\n }\n\n code.push('(t) => ({');\n } else {\n addCode(\n code,\n `await db.${ast.action}Table(${quoteSchemaTable(ast)}, (t) => ({`,\n );\n }\n\n const timestamps = getHasTimestamps(\n ast.shape.createdAt,\n ast.shape.updatedAt,\n );\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in ast.shape) {\n if (\n timestamps.hasAnyTimestamps &&\n (key === 'createdAt' || key === 'updatedAt')\n )\n continue;\n\n const line: Code[] = [`${quoteObjectKey(key, config.snakeCase)}: `];\n const columnCode = ast.shape[key].toCode(toCodeCtx, key);\n for (const part of columnCode) {\n addCode(line, part);\n }\n addCode(line, ',');\n code.push(line);\n }\n\n if (timestamps.hasAnyTimestamps) {\n code.push([`...${timestampsToCode(timestamps)},`]);\n }\n\n if (isShifted) {\n addCode(code, '}),');\n\n if (hasTableData) pushTableDataCode(code, ast);\n\n addCode(result, ');');\n } else {\n addCode(result, '}));');\n }\n\n return result;\n },\n changeTable(ast, config, currentSchema) {\n let code: Code[] = [];\n const result = code;\n\n const schemaTable = quoteSchemaTable({\n schema: ast.schema === currentSchema ? undefined : ast.schema,\n name: ast.name,\n });\n\n const { comment } = ast;\n if (comment !== undefined) {\n addCode(code, `await db.changeTable(`);\n\n const inner: Code[] = [\n `${schemaTable},`,\n `{ comment: ${JSON.stringify(ast.comment)} },`,\n '(t) => ({',\n ];\n code.push(inner);\n code = inner;\n } else {\n addCode(code, `await db.changeTable(${schemaTable}, (t) => ({`);\n }\n\n const [addTimestamps, dropTimestamps] = (['add', 'drop'] as const).map(\n (type) =>\n getHasTimestamps(\n ast.shape.createdAt &&\n 'type' in ast.shape.createdAt &&\n ast.shape.createdAt?.type === type\n ? ast.shape.createdAt.item\n : undefined,\n ast.shape.updatedAt &&\n 'type' in ast.shape.updatedAt &&\n ast.shape.updatedAt?.type === type\n ? ast.shape.updatedAt.item\n : undefined,\n ),\n );\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in ast.shape) {\n const changes = toArray(ast.shape[key]);\n for (const change of changes) {\n if (change.type === 'add' || change.type === 'drop') {\n if (\n (addTimestamps.hasAnyTimestamps ||\n dropTimestamps.hasAnyTimestamps) &&\n (key === 'createdAt' || key === 'updatedAt')\n )\n continue;\n\n const recreate = changes.length > 1;\n const line: Code[] = [\n recreate\n ? `...t.${change.type}(t.name(${singleQuote(\n change.item.data.name ?? key,\n )})`\n : `${quoteObjectKey(key, config.snakeCase)}: t.${change.type}(`,\n ];\n\n const columnCode = change.item.toCode(toCodeCtx, key);\n\n for (let i = 0; i < columnCode.length; i++) {\n let part = columnCode[i];\n if (recreate && !i) part = part.slice(1);\n addCode(line, part);\n }\n addCode(line, '),');\n code.push(line);\n } else if (change.type === 'change') {\n if (!change.from.column || !change.to.column) continue;\n\n const line: Code[] = [\n `${quoteObjectKey(key, config.snakeCase)}: t${\n change.name ? `.name(${singleQuote(change.name)})` : ''\n }.change(`,\n ];\n\n const fromCode = change.from.column.toCode(\n {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n },\n key,\n );\n for (const part of fromCode) {\n addCode(line, part);\n }\n\n addCode(line, ', ');\n\n const toCode = change.to.column.toCode(toCodeCtx, key);\n for (const part of toCode) {\n addCode(line, part);\n }\n\n if (change.using) {\n addCode(line, ', {');\n const u: string[] = [];\n if (change.using.usingUp) {\n u.push(`usingUp: ${change.using.usingUp.toCode('t')},`);\n }\n if (change.using.usingDown) {\n u.push(`usingDown: ${change.using.usingDown.toCode('t')},`);\n }\n addCode(line, u);\n addCode(line, '}');\n }\n\n addCode(line, '),');\n code.push(line);\n } else if (change.type === 'rename') {\n code.push([\n `${quoteObjectKey(key, config.snakeCase)}: t.rename(${singleQuote(\n change.name,\n )}),`,\n ]);\n } else {\n exhaustive(change.type);\n }\n }\n }\n\n for (const key of ['drop', 'add'] as const) {\n const timestamps = key === 'add' ? addTimestamps : dropTimestamps;\n if (timestamps.hasAnyTimestamps) {\n addCode(code, [`...t.${key}(${timestampsToCode(timestamps)}),`]);\n }\n\n const { primaryKey, indexes, excludes, constraints } = ast[key];\n\n if (primaryKey) {\n addCode(code, [\n `...t.${key}(${primaryKeyInnerToCode(primaryKey, 't')}),`,\n ]);\n }\n\n if (indexes) {\n for (const item of indexes) {\n addCode(code, [`...t.${key}(`, indexInnerToCode(item, 't'), '),']);\n }\n }\n\n if (excludes) {\n for (const item of excludes) {\n addCode(code, [`...t.${key}(`, excludeInnerToCode(item, 't'), '),']);\n }\n }\n\n if (constraints) {\n for (const item of constraints) {\n addCode(code, [\n `...t.${key}(`,\n constraintInnerToCode(item, 't', true),\n '),',\n ]);\n }\n }\n }\n\n if (ast.comment !== undefined) {\n addCode(code, '}),');\n addCode(result, ');');\n } else {\n addCode(result, '}));');\n }\n\n return result;\n },\n renameType(ast, _, currentSchema) {\n const code: Code[] = [];\n const kind = ast.kind === 'TABLE' ? 'Table' : 'Type';\n\n if (ast.from === ast.to) {\n addCode(\n code,\n `await db.change${kind}Schema(${singleQuote(ast.to)}, ${singleQuote(\n ast.fromSchema ?? currentSchema,\n )}, ${singleQuote(ast.toSchema ?? currentSchema)});`,\n );\n } else {\n addCode(\n code,\n `await db.rename${kind}(${quoteSchemaTable({\n schema: ast.fromSchema === currentSchema ? undefined : ast.fromSchema,\n name: ast.from,\n })}, ${quoteSchemaTable({\n schema: ast.toSchema === currentSchema ? undefined : ast.toSchema,\n name: ast.to,\n })});`,\n );\n }\n\n return code;\n },\n schema(ast) {\n return `await db.${\n ast.action === 'create' ? 'createSchema' : 'dropSchema'\n }(${singleQuote(ast.name)});`;\n },\n renameSchema(ast) {\n return `await db.renameSchema(${singleQuote(ast.from)}, ${singleQuote(\n ast.to,\n )});`;\n },\n extension(ast) {\n const code: Code[] = [\n `await db.${ast.action}Extension(${quoteSchemaTable(ast)}`,\n ];\n if (ast.version) {\n addCode(code, ', {');\n code.push([`version: ${singleQuote(ast.version)},`], '}');\n }\n addCode(code, ');');\n return code;\n },\n enum(ast, _, currentSchema) {\n return `await db.${\n ast.action === 'create' ? 'createEnum' : 'dropEnum'\n }(${quoteSchemaTable(ast, currentSchema)}, [${ast.values\n .map(singleQuote)\n .join(', ')}]);`;\n },\n enumValues(ast, _, currentSchema) {\n return `await db.${ast.action}EnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, [${ast.values.map(singleQuote).join(', ')}]);`;\n },\n renameEnumValues(ast, config, currentSchema) {\n return `await db.renameEnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, { ${Object.entries(ast.values)\n .map(\n ([from, to]) =>\n `${quoteObjectKey(from, config.snakeCase)}: ${singleQuote(to)}`,\n )\n .join(', ')} });`;\n },\n changeEnumValues(ast, _, currentSchema) {\n return `await db.changeEnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, [${ast.fromValues.map(singleQuote).join(', ')}], [${ast.toValues\n .map(singleQuote)\n .join(', ')}]);`;\n },\n domain(ast, _, currentSchema) {\n return `await db.${ast.action}Domain(${quoteSchemaTable(\n ast,\n )}, (t) => ${ast.baseType.toCode(\n { t: 't', table: ast.name, currentSchema },\n ast.baseType.data.name ?? '',\n )});`;\n },\n collation(ast) {\n const params: string[] = [];\n if (ast.locale) params.push(`locale: '${ast.locale}',`);\n if (ast.lcCollate) params.push(`lcCollate: '${ast.lcCollate}',`);\n if (ast.lcCType) params.push(`lcCType: '${ast.lcCType}',`);\n if (ast.provider) params.push(`provider: '${ast.provider}',`);\n if (ast.deterministic) params.push(`deterministic: ${ast.deterministic},`);\n if (ast.version) params.push(`version: '${ast.version}',`);\n\n return [\n `await db.createCollation(${quoteSchemaTable(ast)}, {`,\n params,\n '});',\n ];\n },\n constraint(ast) {\n const table = quoteSchemaTable({\n schema: ast.tableSchema,\n name: ast.tableName,\n });\n\n if (ast.references) {\n return [\n `await db.addForeignKey(`,\n [`${table},`, ...referencesArgsToCode(ast.references, ast.name, true)],\n ');',\n ];\n }\n\n const check = ast.check as TableData.Check;\n\n return [\n `await db.addCheck(${table}, ${check.toCode('t')}${\n ast.name ? `, ${singleQuote(ast.name)}` : ''\n });`,\n ];\n },\n renameTableItem(ast) {\n return [\n `await db.rename${\n ast.kind === 'INDEX' ? 'Index' : 'Constraint'\n }(${quoteSchemaTable({\n schema: ast.tableSchema,\n name: ast.tableName,\n })}, ${singleQuote(ast.from)}, ${singleQuote(ast.to)});`,\n ];\n },\n view(ast) {\n const code: Code[] = [`await db.createView(${quoteSchemaTable(ast)}`];\n\n const options: Code[] = [];\n if (ast.options.recursive) options.push('recursive: true,');\n\n const w = ast.options.with;\n if (w?.checkOption) options.push(`checkOption: '${w.checkOption}',`);\n if (w?.securityBarrier)\n options.push(`securityBarrier: ${w.securityBarrier},`);\n if (w?.securityInvoker)\n options.push(`securityInvoker: ${w.securityInvoker},`);\n\n if (options.length) {\n addCode(code, ', {');\n code.push(options, '}');\n }\n\n addCode(code, ', ');\n\n if (!ast.sql._values) {\n const raw = ast.sql._sql;\n let sql;\n if (typeof raw === 'string') {\n sql = raw;\n } else {\n sql = '';\n const parts = raw[0];\n const last = parts.length - 1;\n for (let i = 0; i < last; i++) {\n sql += parts[i] + `\\${${raw[i + 1]}}`;\n }\n sql += parts[last];\n }\n\n addCode(code, backtickQuote(sql));\n } else {\n addCode(code, ast.sql.toCode('db'));\n }\n\n addCode(code, ');');\n return code;\n },\n};\n\nconst isTimestamp = (\n column: ColumnType | undefined,\n type:\n | typeof TimestampTZColumn<ColumnSchemaConfig>\n | typeof TimestampColumn<ColumnSchemaConfig>,\n): boolean => {\n if (!column) return false;\n\n const { default: def } = column.data;\n return Boolean(\n column instanceof type &&\n !column.data.isNullable &&\n def &&\n typeof def === 'object' &&\n isRawSQL(def) &&\n (typeof def._sql === 'object' ? def._sql[0][0] : def._sql) === 'now()',\n );\n};\n\ninterface AnyTimestampsInfo {\n hasTZTimestamps: boolean;\n hasAnyTimestamps: boolean;\n}\n\nconst getHasTimestamps = (\n createdAt: ColumnType | undefined,\n updatedAt: ColumnType | undefined,\n): AnyTimestampsInfo => {\n const timestamps = getTimestampsInfo(createdAt, updatedAt, TimestampTZColumn);\n const timestampsNoTZ = getTimestampsInfo(\n createdAt,\n updatedAt,\n TimestampColumn,\n );\n\n return {\n hasTZTimestamps: timestamps,\n hasAnyTimestamps: timestamps || timestampsNoTZ,\n };\n};\n\nconst getTimestampsInfo = (\n createdAt: ColumnType | undefined,\n updatedAt: ColumnType | undefined,\n type:\n | typeof TimestampTZColumn<ColumnSchemaConfig>\n | typeof TimestampColumn<ColumnSchemaConfig>,\n): boolean => {\n return (\n isTimestamp(createdAt, type) &&\n isTimestamp(updatedAt, type) &&\n (!createdAt?.data.name || createdAt?.data.name === 'created_at') &&\n (!updatedAt?.data.name || updatedAt?.data.name === 'updated_at')\n );\n};\n\nconst timestampsToCode = ({ hasTZTimestamps }: AnyTimestampsInfo): string => {\n const key = hasTZTimestamps ? 'timestamps' : 'timestampsNoTZ';\n return `t.${key}()`;\n};\n","import { structureToAst, makeStructureToAstCtx } from './structureToAst';\nimport { astToMigration } from './astToMigration';\nimport { makeFileVersion, writeMigrationFile } from '../commands/newMigration';\nimport { saveMigratedVersion } from '../migration/manageMigratedVersions';\nimport { AdapterBase, ColumnSchemaConfig } from 'pqb';\nimport { RakeDbConfig } from '../config';\n\nexport const pullDbStructure = async <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n adapter: AdapterBase,\n config: RakeDbConfig<SchemaConfig, CT>,\n): Promise<void> => {\n const currentSchema = adapter.schema || 'public';\n\n const ctx = makeStructureToAstCtx(config, currentSchema);\n\n const ast = await structureToAst(ctx, adapter, config);\n\n const result = astToMigration(currentSchema, config, ast);\n if (!result) return;\n\n const version = await makeFileVersion({}, config);\n await writeMigrationFile(config, version, 'pull', result);\n\n const silentQueries = Object.assign(adapter, {\n silentQuery: adapter.query,\n silentArrays: adapter.arrays,\n });\n await saveMigratedVersion(silentQueries, version, 'pull', config);\n\n const unsupportedEntries = Object.entries(ctx.unsupportedTypes);\n const len = unsupportedEntries.length;\n if (len) {\n let count = 0;\n config.logger?.warn(\n `Found unsupported types:\\n${unsupportedEntries\n .map(([type, columns]) => {\n count += columns.length;\n return `- ${type} is used for column${\n columns.length > 1 ? 's' : ''\n } ${columns.join(', ')}`;\n })\n .join('\\n')}\\nAppend \\`as\\` method manually to ${\n count > 1 ? 'these' : 'this'\n } column${count > 1 ? 's' : ''} to treat ${\n count > 1 ? 'them' : 'it'\n } as other column type`,\n );\n }\n\n config.logger?.log('Database pulled successfully');\n};\n","import { AnyRakeDbConfig } from '../config';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { getMigrations, MigrationItem } from '../migration/migrationsSet';\nimport { getMigratedVersionsMap } from '../migration/manageMigratedVersions';\nimport { RakeDbCtx } from '../common';\nimport { AdapterBase, RecordOptionalString, colors } from 'pqb';\nimport { redo } from './migrateOrRollback';\nimport { promptSelect } from '../prompt';\n\ninterface RebaseFile extends MigrationItem {\n name: string;\n serial: number;\n}\n\nexport const rebase = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n) => {\n if (config.migrations) {\n throw new Error('Cannot rebase migrations defined in the config');\n }\n\n if (config.migrationId === 'timestamp') {\n throw new Error(\n `Cannot rebase when the 'migrationId' is set to 'timestamp' in the config`,\n );\n }\n\n const ctx: RakeDbCtx = {};\n\n const [set, ...versionMaps] = await Promise.all([\n await getMigrations(ctx, config, true, true),\n ...adapters.map((adapter) => getMigratedVersionsMap(ctx, adapter, config)),\n ]);\n\n const files: RebaseFile[] = set.migrations.map((file) => ({\n ...file,\n name: path.basename(file.path),\n serial: +file.version,\n }));\n if (!files.length) return;\n\n const start = files.findIndex(\n (file, i) => i !== 0 && file.serial === files[i - 1].serial,\n );\n if (start === -1) return;\n\n const combinedVersionsMap: RecordOptionalString = {};\n for (const versions of versionMaps) {\n Object.assign(combinedVersionsMap, versions.map);\n }\n\n type Rename = [path: string, version: number];\n const renames: Rename[] = [];\n const renamesMap: Record<string, Rename> = {};\n\n let minVersionToMigrate =\n files.find((file) => !combinedVersionsMap[file.version])?.serial ??\n Infinity;\n\n const migratedFiles: RebaseFile[] = [];\n let maxNewVersion = 0;\n\n let move = 0;\n for (let i = start; i < files.length; i++) {\n const prev = files[i - 1];\n const file = files[i];\n\n let moveFile: RebaseFile | undefined;\n\n const migratedName = combinedVersionsMap[file.version];\n\n if (prev.serial === file.serial) {\n if (migratedName) {\n if (prev.name === migratedName) {\n moveFile = prev;\n } else if (file.name === migratedName) {\n moveFile = file;\n }\n }\n\n if (moveFile) {\n if (moveFile.serial < minVersionToMigrate) {\n minVersionToMigrate = moveFile.serial;\n }\n\n migratedFiles.push(moveFile);\n } else if (!moveFile) {\n move++;\n\n const result = await promptSelect({\n message: 'Which should go first?',\n options: [prev.name, file.name],\n active: (s) => `${colors.yellow('❯')} ${colors.yellow(s)}`,\n });\n\n moveFile = result ? file : prev;\n }\n }\n\n let newVersion = file.serial;\n\n if (move) {\n newVersion += move;\n\n if (moveFile === prev && !renamesMap[prev.path]) newVersion--;\n\n if (file.serial !== newVersion) {\n if (newVersion < minVersionToMigrate) minVersionToMigrate = newVersion;\n\n const values = [file.path, newVersion] as Rename;\n renames.push(values);\n renamesMap[file.path] = values;\n }\n\n if (moveFile === prev) {\n if (prev.serial < minVersionToMigrate)\n minVersionToMigrate = prev.serial;\n\n newVersion = prev.serial + move;\n\n let item = [prev.path, newVersion] as Rename;\n\n if (renamesMap[prev.path]) {\n renamesMap[prev.path] = item;\n\n for (let i = renames.length - 1; i >= 0; i--) {\n const rename = renames[i];\n rename[1]--;\n\n renames[i] = item;\n\n if (rename[0] === prev.path) break;\n\n renamesMap[item[0]] = item;\n item = rename;\n }\n } else {\n renames.push(item);\n renamesMap[prev.path] = item;\n }\n }\n }\n\n if (file.name !== migratedName && newVersion > maxNewVersion) {\n maxNewVersion = newVersion;\n }\n }\n\n if (!renames.length && !migratedFiles.length) return;\n\n maxNewVersion++;\n\n renames.push(\n ...migratedFiles.map((file, i) => {\n const rename = [file.path, maxNewVersion + i] as Rename;\n renamesMap[file.path] = rename;\n return rename;\n }),\n );\n\n if (!renames.length) return;\n\n const migrationsDown = files.filter(\n (file) =>\n combinedVersionsMap[file.version] === file.name &&\n file.serial >= minVersionToMigrate,\n );\n\n const migrationsUp = files\n .reduce<MigrationItem[]>((files, file) => {\n const rename = renamesMap[file.path];\n if (rename) {\n const version = String(rename[1]).padStart(4, '0');\n files.push({\n ...file,\n path: path.join(\n path.dirname(rename[0]),\n version + path.basename(rename[0]).slice(version.length),\n ),\n version,\n });\n } else if (\n !combinedVersionsMap[file.version] ||\n file.serial >= minVersionToMigrate\n ) {\n files.push(file);\n }\n return files;\n }, [])\n .sort((a, b) => +b.version - +a.version);\n\n set.migrations = migrationsDown;\n\n const redoConfig = {\n ...config,\n async afterRollback() {\n set.migrations = migrationsUp;\n },\n async afterMigrate() {\n set.migrations = migrationsDown;\n },\n };\n\n for (const adapter of adapters) {\n await redo({\n ctx,\n adapter,\n config: redoConfig,\n });\n }\n\n for (let i = renames.length - 1; i >= 0; i--) {\n const [from, version] = renames[i];\n const prefix = String(version).padStart(4, '0');\n await fs.rename(\n from,\n path.join(\n path.dirname(from),\n prefix + path.basename(from).slice(prefix.length),\n ),\n );\n }\n};\n","import { RakeDbCtx } from '../common';\nimport path from 'path';\nimport { getMigratedVersionsMap } from '../migration/manageMigratedVersions';\nimport { pathToFileURL } from 'node:url';\nimport { AnyRakeDbConfig } from '../config';\nimport { getMigrations } from '../migration/migrationsSet';\nimport { AdapterBase, colors } from 'pqb';\n\nexport const listMigrationsStatuses = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n args: string[],\n) => {\n const ctx: RakeDbCtx = {};\n\n const [{ migrations }, ...migrated] = await Promise.all([\n getMigrations(ctx, config, true),\n ...adapters.map((adapter) => getMigratedVersionsMap(ctx, adapter, config)),\n ]);\n\n const map: {\n [K: string]: {\n databases: string[];\n migrations: {\n up: boolean;\n version: string;\n name: string;\n url: URL;\n }[];\n };\n } = {};\n\n let maxVersionLength = 12;\n let maxNameLength = 4;\n\n for (let i = 0; i < adapters.length; i++) {\n const list = migrated[i];\n const key = Object.entries(list.map)\n .map(([version, up]) => `${version}${up ? 't' : 'f'}`)\n .join('');\n\n const database = adapters[i].getDatabase();\n\n if (map[key]) {\n map[key].databases.push(database);\n continue;\n }\n\n map[key] = {\n databases: [database],\n migrations: migrations.map((item) => {\n if (item.version.length > maxVersionLength) {\n maxVersionLength = item.version.length;\n }\n\n const name = path\n .parse(item.path)\n .name.slice(item.version.length + 1)\n .replace(\n /([a-z])([A-Z])/g,\n (_, a, b) => `${a} ${b.toLocaleLowerCase()}`,\n )\n .replace(/[-_](.)/g, (_, char) => ` ${char.toLocaleLowerCase()}`)\n .replace(/^\\w/, (match) => match.toLocaleUpperCase());\n\n if (name.length > maxNameLength) {\n maxNameLength = name.length;\n }\n\n return {\n up: !!list.map[item.version],\n version: item.version,\n name,\n url: pathToFileURL(item.path),\n };\n }),\n };\n }\n\n const showUrl = args.includes('p') || args.includes('path');\n\n const asIs = (s: string) => s;\n\n const c =\n typeof config.log === 'object' && config.log.colors === false\n ? {\n yellow: asIs,\n green: asIs,\n red: asIs,\n blue: asIs,\n }\n : colors;\n\n const log = Object.values(map)\n .map(({ databases, migrations }) => {\n let log = ` ${c.yellow('Database:')} ${databases.join(', ')}`;\n\n if (migrations.length === 0) {\n return log + `\\n\\nNo migrations available`;\n }\n\n const lineSeparator = c.yellow(\n makeChars(14 + maxVersionLength + maxNameLength, '-'),\n );\n const columnSeparator = c.yellow('|');\n\n log +=\n '\\n\\n ' +\n c.yellow(\n `Status | Migration ID${makeChars(\n maxVersionLength - 12,\n ' ',\n )} | Name\\n${lineSeparator}`,\n );\n\n for (const migration of migrations) {\n log += `\\n ${\n migration.up ? ` ${c.green('Up')} ` : c.red('Down')\n } ${columnSeparator} ${c.blue(migration.version)}${makeChars(\n maxVersionLength - migration.version.length,\n ' ',\n )} ${columnSeparator} ${migration.name}`;\n\n if (showUrl) {\n log += `\\n${migration.url}\\n`;\n }\n }\n\n return (log += showUrl ? lineSeparator : `\\n${lineSeparator}`);\n })\n .join('\\n\\n');\n\n (config.logger ?? console).log(log);\n\n await Promise.all(adapters.map((adapter) => adapter.close()));\n};\n\nconst makeChars = (count: number, char: string) => {\n let chars = '';\n\n for (let i = 0; i < count; i++) {\n chars += char;\n }\n\n return chars;\n};\n","import {\n AdapterBase,\n ColumnSchemaConfig,\n MaybePromise,\n RecordOptionalString,\n RecordString,\n} from 'pqb';\nimport { AnyRakeDbConfig, RakeDbConfig } from './config';\nimport { createDb, dropDb, resetDb } from './commands/createOrDrop';\nimport { runRecurrentMigrations } from './commands/recurrent';\nimport {\n migrateCommand,\n redoCommand,\n rollbackCommand,\n} from './commands/migrateOrRollback';\nimport { pullDbStructure } from './generate/pull';\nimport { newMigration } from './commands/newMigration';\nimport { rebase } from './commands/rebase';\nimport { changeIds } from './commands/changeIds';\nimport { listMigrationsStatuses } from './commands/listMigrationsStatuses';\nimport { RakeDbResult } from './rake-db';\n\nexport const rakeDbAliases: RecordOptionalString = {\n migrate: 'up',\n rollback: 'down',\n s: 'status',\n rec: 'recurrent',\n};\n\nexport const runCommand = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[] = process.argv.slice(2),\n): Promise<RakeDbResult> => {\n let arg = args[0]?.split(':')[0];\n if (rakeDbAliases[arg]) {\n args = [...args]; // to not mutate given arguments\n arg = args[0] = rakeDbAliases[arg] as string;\n }\n\n args.shift();\n\n const command = rakeDbCommands[arg]?.run ?? config.commands[arg];\n if (command) {\n await command(adapters, config, args);\n } else if (config.logger) {\n type HelpBlock = [key: string, help: string, helpArguments?: RecordString];\n\n const commandsHelp: HelpBlock[] = [];\n\n let max = 0;\n let maxArgs = 0;\n\n const addedCommands = new Map<RakeDbCommand, HelpBlock>();\n for (let key in rakeDbCommands) {\n const command = rakeDbCommands[key];\n const added = addedCommands.get(command);\n if (added) key = added[0] += `, ${key}`;\n\n if (key.length > max) max = key.length;\n\n if (added) continue;\n\n if (command.helpArguments) {\n maxArgs = Math.max(\n maxArgs,\n ...Object.keys(command.helpArguments).map((key) => key.length + 5),\n );\n }\n\n const helpBlock: HelpBlock = [key, command.help, command.helpArguments];\n addedCommands.set(command, helpBlock);\n\n if (command.helpAfter) {\n const i = commandsHelp.findIndex(([key]) => key === command.helpAfter);\n if (i === -1) {\n throw new Error(\n `${command.helpAfter} command is required for ${key} but is not found`,\n );\n }\n commandsHelp.splice(i + 1, 0, helpBlock);\n } else {\n commandsHelp.push(helpBlock);\n }\n }\n\n config.logger.log(`Usage: rake-db [command] [arguments]\n\nSee documentation at:\nhttps://orchid-orm.netlify.app/guide/migration-commands.html\n\nCommands:\n\n${commandsHelp\n .map(([key, help, helpArguments]) => {\n let result = `${key} ${help.padStart(max - key.length + help.length)}`;\n\n if (helpArguments) {\n result += `\\n arguments:\\n${Object.entries(helpArguments)\n .map(\n ([arg, help]) =>\n ` ${arg} ${` ${help}`.padStart(\n maxArgs - arg.length - 5 + help.length + 2,\n )}`,\n )\n .join('\\n')}`;\n }\n\n return result;\n })\n .join('\\n\\n')}\n`);\n }\n\n return {\n adapters,\n config,\n args,\n };\n};\n\ninterface RakeDbCommand {\n run(\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n args: string[],\n ): MaybePromise<unknown>;\n\n help: string;\n helpArguments?: RecordString;\n helpAfter?: string;\n}\n\ninterface RakeDbCommands {\n [K: string]: RakeDbCommand;\n}\n\nconst close = (adapters: AdapterBase[]) =>\n Promise.all(adapters.map((adapter) => adapter.close()));\n\nconst upCommand: RakeDbCommand = {\n run: (adapters, config, args) =>\n migrateCommand(adapters, config, args)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'migrate pending migrations',\n helpArguments: {\n 'no arguments': 'migrate all pending',\n 'a number': 'run a specific number of pending migrations',\n force: 'enforce migrating a pending file in the middle',\n },\n};\n\nconst downCommand: RakeDbCommand = {\n run: (adapters, config, args) =>\n rollbackCommand(adapters, config, args).then(() => close(adapters)),\n help: 'rollback migrated migrations',\n helpArguments: {\n 'no arguments': 'rollback one last migration',\n 'a number': 'rollback a specified number',\n all: 'rollback all migrations',\n },\n};\n\nconst statusCommand: RakeDbCommand = {\n run: listMigrationsStatuses,\n help: 'list migrations statuses',\n helpArguments: {\n 'no arguments': `does not print file paths`,\n 'p, path': 'also print file paths',\n },\n};\n\nconst recurrentCommand: RakeDbCommand = {\n run: (adapters, config) =>\n runRecurrentMigrations(adapters, config).then(() => close(adapters)),\n help: 'run recurrent migrations',\n};\n\nexport const rakeDbCommands: RakeDbCommands = {\n create: {\n run: createDb,\n help: 'create databases',\n },\n drop: {\n run: dropDb,\n help: 'drop databases',\n },\n reset: {\n run: (adapters, config) =>\n resetDb(adapters, config)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'drop, create and migrate databases',\n },\n up: upCommand,\n migrate: upCommand,\n down: downCommand,\n rollback: downCommand,\n redo: {\n run: (adapters, config, args) =>\n redoCommand(adapters, config, args)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'rollback and migrate, run recurrent',\n },\n pull: {\n run: ([adapter], config) =>\n pullDbStructure(adapter, config).then(() => close([adapter])),\n help: 'generate a combined migration for an existing database',\n },\n new: {\n run: (_, config, args) => newMigration(config, args),\n help: 'create new migration file',\n },\n s: statusCommand,\n status: statusCommand,\n rec: recurrentCommand,\n recurrent: recurrentCommand,\n rebase: {\n run: (adapters, config) =>\n rebase(adapters, config).then(() => close(adapters)),\n help: 'move local migrations below the new ones from upstream',\n },\n 'change-ids': {\n run: changeIds,\n help: 'change migrations ids format',\n helpArguments: {\n serial: 'change ids to 4 digit serial',\n 'serial *number*': 'change ids to serial number of custom length',\n timestamp: 'change ids to timestamps',\n },\n },\n};\n","import {\n DefaultColumnTypes,\n DefaultSchemaConfig,\n AdapterBase,\n ColumnSchemaConfig,\n} from 'pqb';\nimport { RakeDbError } from './errors';\nimport {\n ChangeCallback,\n MigrationChange,\n pushChange,\n} from './migration/change';\nimport {\n AnyRakeDbConfig,\n InputRakeDbConfig,\n processRakeDbConfig,\n RakeDbConfig,\n} from './config';\nimport { runCommand } from './commands';\n\n/**\n * Type of {@link rakeDbWithAdapters} function\n */\nexport interface RakeDbFn<Options> {\n <\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n >(\n options: Options,\n partialConfig: InputRakeDbConfig<SchemaConfig, CT>,\n args?: string[],\n ): RakeDbChangeFnWithPromise<CT>;\n\n /**\n * Unlike the original `rakeDb` that executes immediately,\n * `rakeDb.lazy` returns the `run` function to be later called programmatically.\n *\n * @param options - array of connection adapters for migrating multiple dbs\n * @param config - {@link RakeDbConfig}\n * @returns `change` is to be used in migrations, `run` takes an array cli args to execute a command\n */\n lazy<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n >(\n options: Options,\n config: InputRakeDbConfig<SchemaConfig, CT>,\n ): {\n change: RakeDbChangeFn<CT>;\n run(\n args: string[],\n config?: Partial<RakeDbConfig<SchemaConfig, CT>>,\n ): Promise<RakeDbResult>;\n };\n}\n\nexport interface RakeDbResult {\n // database connection adapters\n adapters: AdapterBase[];\n // rake-db config\n config: AnyRakeDbConfig;\n // command and arguments passed to `rakeDb.lazy` or taken from process.argv\n args: string[];\n}\n\n/**\n * Function to use in migrations to wrap database changes\n * Saves the given callback to an internal queue,\n * and also returns the callback in case you want to export it from migration.\n */\nexport interface RakeDbChangeFn<CT> {\n (fn: ChangeCallback<CT>): MigrationChange;\n}\n\nexport interface RakeDbChangeFnWithPromise<CT> extends RakeDbChangeFn<CT> {\n promise: Promise<RakeDbResult>;\n}\n\n/**\n * Function to configure and run `rakeDb`.\n *\n * @param options - {@link NodePostgresAdapterOptions} or an array of such options to migrate multiple dbs\n * @param config - {@link RakeDbConfig}\n * @param args - optionally provide an array of cli args. Default is `process.argv.slice(2)`.\n */\nexport const rakeDbWithAdapters = ((\n adapters,\n partialConfig,\n args = process.argv.slice(2),\n) => {\n const config = processRakeDbConfig(partialConfig, args);\n const promise = runCommand(\n adapters,\n config as unknown as RakeDbConfig<ColumnSchemaConfig>,\n args,\n ).catch((err) => {\n if (err instanceof RakeDbError) {\n config.logger?.error(err.message);\n process.exit(1);\n }\n throw err;\n });\n\n return Object.assign(makeChange(config), {\n promise,\n });\n}) as RakeDbFn<AdapterBase[]>;\n\nrakeDbWithAdapters.lazy = ((\n adapters: AdapterBase[],\n partialConfig: InputRakeDbConfig<ColumnSchemaConfig, unknown>,\n) => {\n const config = processRakeDbConfig(partialConfig);\n\n return {\n change: makeChange(config),\n run(\n args: string[],\n conf: Partial<RakeDbConfig<DefaultSchemaConfig, unknown>>,\n ) {\n return runCommand(adapters, conf ? { ...config, ...conf } : config, args);\n },\n };\n}) as never;\n\nexport const makeChange =\n (config: RakeDbConfig<ColumnSchemaConfig, unknown>) =>\n (fn: ChangeCallback<unknown>) => {\n const change: MigrationChange = { fn, config };\n pushChange(change);\n return change;\n };\n","import { clearChanges } from '../change';\nimport {\n getChanges,\n migrateAndClose,\n MigrateFnConfig,\n runMigration,\n} from '../../commands/migrateOrRollback';\nimport {\n AdapterBase,\n QueryBase,\n defaultSchemaConfig,\n makeColumnTypes as defaultColumnTypes,\n Query,\n} from 'pqb';\nimport {\n ensureMigrationsPath,\n migrationConfigDefaults,\n ensureBasePathAndDbScript,\n} from '../../config';\n\ninterface OrmParam {\n $qb: QueryBase;\n}\n\ntype UnknownPromiseFns = (() => Promise<unknown>)[];\n\nexport const migrateFiles = async (db: OrmParam, files: UnknownPromiseFns) => {\n const qb = db.$qb as Query;\n\n await qb.ensureTransaction(async () => {\n const adapter = qb.internal.transactionStorage.getStore()\n ?.adapter as AdapterBase;\n\n for (const load of files) {\n clearChanges();\n\n const changes = await getChanges({ load });\n const config = changes[0]?.config;\n\n await runMigration(adapter, true, changes, config);\n }\n });\n};\n\nexport const makeMigrateAdapter = (\n config?: Partial<MigrateFnConfig>,\n): ((\n adapter: AdapterBase,\n params?: { count?: number; force?: boolean },\n) => Promise<void>) => {\n const conf = ensureMigrationsPath(ensureBasePathAndDbScript(config || {}));\n\n return async (adapter, params) => {\n await migrateAndClose({\n adapter,\n ...params,\n config: {\n ...conf,\n columnTypes:\n conf.columnTypes || defaultColumnTypes(defaultSchemaConfig),\n migrationId: conf.migrationId || migrationConfigDefaults.migrationId,\n migrationsTable:\n conf.migrationsTable || migrationConfigDefaults.migrationsTable,\n import: conf.import || migrationConfigDefaults.import,\n transaction: conf.transaction || 'single',\n },\n });\n };\n};\n"],"names":["DomainColumn","toSnakeCase","isRawSQL","escapeForMigration","ArrayColumn","toCamelCase","short","sql","toArray","EnumColumn","defaultSchemaConfig","emptyObject","snakeCaseKey","getColumnTypes","parseTableData","makeAst","astToQueries","escapeString","consumeColumnName","ColumnType","ColumnTypeBase","key","parseTableDataInput","UnknownColumn","add","tableDataMethods","setCurrentColumnName","setDefaultLanguage","changeTableData","name","deepCompare","drop","raw","singleQuote","logParamToLogObject","createDbWithAdapter","quotedName","mkdir","getImportPath","writeFile","pathToLog","version","readdir","pathToFileURL","redo","migrations","emptyArray","getStackTrace","fileURLToPath","defaultColumnTypes","rows","clear","colors","value","params","readFile","path","join","stat","makeColumnsByType","RawSQL","CustomTypeColumn","assignDbDataToColumn","PostgisGeographyPointColumn","exhaustive","codeToString","addCode","quoteObjectKey","pushTableDataCode","primaryKeyInnerToCode","indexInnerToCode","excludeInnerToCode","constraintInnerToCode","referencesArgsToCode","backtickQuote","TimestampTZColumn","TimestampColumn","i","files","log","command","arg","help"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/errors.ts","../src/migration/change.ts","../src/migration/migration.utils.ts","../src/migration/tableMethods.ts","../src/migration/createTable.ts","../src/migration/changeTable.ts","../src/migration/createView.ts","../src/migration/migration.ts","../src/commands/newMigration.ts","../src/commands/changeIds.ts","../src/migration/migrationsSet.ts","../src/migration/manageMigratedVersions.ts","../src/migration/migrationsTable.ts","../src/commands/migrateOrRollback.ts","../src/common.ts","../src/config.ts","../src/prompt.ts","../src/commands/createOrDrop.ts","../src/commands/recurrent.ts","../src/generate/dbStructure.ts","../src/generate/structureToAst.ts","../src/generate/astToGenerateItems.ts","../src/generate/astToMigration.ts","../src/generate/pull.ts","../src/commands/rebase.ts","../src/commands/listMigrationsStatuses.ts","../src/commands.ts","../src/rake-db.ts","../src/migration/migrate/migrate.ts"],"sourcesContent":["export class RakeDbError extends Error {}\n\nexport class NoPrimaryKey extends RakeDbError {}\n","import { DbMigration } from './migration';\nimport { RakeDbConfig } from '../config';\nimport { ColumnSchemaConfig } from 'pqb';\n\nexport interface MigrationChange {\n fn: ChangeCallback<unknown>;\n config: RakeDbConfig<ColumnSchemaConfig, unknown>;\n}\n\nlet currentChanges: MigrationChange[] = [];\n\nexport type ChangeCallback<CT> = (\n db: DbMigration<CT>,\n up: boolean,\n) => Promise<void>;\n\nexport const clearChanges = () => {\n currentChanges = [];\n};\n\nexport const getCurrentChanges = () => currentChanges;\nexport const pushChange = (change: MigrationChange) =>\n currentChanges.push(change);\n","import {\n ArrayColumn,\n Column,\n DomainColumn,\n escapeForMigration,\n TableData,\n isRawSQL,\n RawSQLBase,\n SingleSql,\n toArray,\n toCamelCase,\n toSnakeCase,\n} from 'pqb';\nimport { ColumnComment } from './migration';\nimport {\n getSchemaAndTableFromName,\n joinColumns,\n quoteCustomType,\n quoteNameFromString,\n quoteTable,\n quoteWithSchema,\n} from '../common';\nimport { AnyRakeDbConfig } from '../config';\nimport { TableQuery } from './createTable';\n\nexport const versionToString = (\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n version: number,\n) =>\n config.migrationId === 'timestamp'\n ? `${version}`\n : `${version}`.padStart(config.migrationId.serial, '0');\n\nexport const columnTypeToSql = (item: Column.Pick.Data) => {\n return item.data.isOfCustomType\n ? item instanceof DomainColumn\n ? quoteNameFromString(item.dataType)\n : quoteCustomType((item as Column).toSQL())\n : (item as Column).toSQL();\n};\n\nexport const getColumnName = (\n item: { data: { name?: string } },\n key: string,\n snakeCase: boolean | undefined,\n) => {\n return item.data.name || (snakeCase ? toSnakeCase(key) : key);\n};\n\nexport const columnToSql = (\n name: string,\n item: Column,\n values: unknown[],\n hasMultiplePrimaryKeys: boolean,\n snakeCase: boolean | undefined,\n): string => {\n const line = [`\"${name}\" ${columnTypeToSql(item)}`];\n\n if (item.data.compression) {\n line.push(`COMPRESSION ${item.data.compression}`);\n }\n\n if (item.data.collate) {\n line.push(`COLLATE ${quoteNameFromString(item.data.collate)}`);\n }\n\n if (item.data.identity) {\n line.push(identityToSql(item.data.identity));\n } else if (item.data.generated) {\n line.push(\n `GENERATED ALWAYS AS (${item.data.generated.toSQL({\n values,\n snakeCase,\n })}) STORED`,\n );\n }\n\n if (item.data.primaryKey && !hasMultiplePrimaryKeys) {\n if (item.data.primaryKey !== (true as never)) {\n line.push(`CONSTRAINT \"${item.data.primaryKey}\"`);\n }\n line.push('PRIMARY KEY');\n } else if (!item.data.isNullable) {\n line.push('NOT NULL');\n }\n\n if (item.data.checks) {\n line.push(\n item.data.checks\n .map(\n (check) =>\n (check.name ? `CONSTRAINT \"${check.name}\" ` : '') +\n checkToSql(check.sql, values),\n )\n .join(', '),\n );\n }\n\n const def = encodeColumnDefault(item.data.default, values, item);\n if (def !== null) line.push(`DEFAULT ${def}`);\n\n const { foreignKeys } = item.data;\n if (foreignKeys) {\n for (const foreignKey of foreignKeys) {\n if (foreignKey.options?.name) {\n line.push(`CONSTRAINT \"${foreignKey.options?.name}\"`);\n }\n\n line.push(\n referencesToSql(\n {\n columns: [name],\n ...foreignKey,\n },\n snakeCase,\n ),\n );\n }\n }\n\n return line.join(' ');\n};\n\nexport const encodeColumnDefault = (\n def: unknown,\n values: unknown[],\n column?: Column.Pick.Data,\n): string | null => {\n if (def !== undefined && def !== null && typeof def !== 'function') {\n if (isRawSQL(def)) {\n return def.toSQL({ values });\n } else {\n return escapeForMigration(\n column instanceof ArrayColumn && Array.isArray(def)\n ? '{' +\n (column.data.item.data.encode\n ? def.map((x) => column.data.item.data.encode(x))\n : def\n ).join(',') +\n '}'\n : column?.data.encode\n ? column.data.encode(def)\n : def,\n );\n }\n }\n\n return null;\n};\n\nexport const identityToSql = (identity: TableData.Identity) => {\n const options = sequenceOptionsToSql(identity);\n return `GENERATED ${identity.always ? 'ALWAYS' : 'BY DEFAULT'} AS IDENTITY${\n options ? ` (${options})` : ''\n }`;\n};\n\nconst sequenceOptionsToSql = (item: TableData.SequenceOptions) => {\n const line: string[] = [];\n if (item.dataType) line.push(`AS ${item.dataType}`);\n if (item.increment !== undefined) line.push(`INCREMENT BY ${item.increment}`);\n if (item.min !== undefined) line.push(`MINVALUE ${item.min}`);\n if (item.max !== undefined) line.push(`MAXVALUE ${item.max}`);\n if (item.start !== undefined) line.push(`START WITH ${item.start}`);\n if (item.cache !== undefined) line.push(`CACHE ${item.cache}`);\n if (item.cycle) line.push(`CYCLE`);\n if (item.ownedBy) {\n const [schema, table] = getSchemaAndTableFromName(item.ownedBy);\n line.push(`OWNED BY ${quoteTable(schema, table)}`);\n }\n return line.join(' ');\n};\n\nexport const addColumnIndex = (\n indexes: TableData.Index[],\n name: string,\n item: Column,\n) => {\n if (item.data.indexes) {\n indexes.push(\n ...item.data.indexes.map((index) => ({\n columns: [{ ...index.options, column: name }],\n ...index,\n })),\n );\n }\n};\n\nexport const addColumnExclude = (\n excludes: TableData.Exclude[],\n name: string,\n item: Column,\n) => {\n if (item.data.excludes) {\n excludes.push(\n ...item.data.excludes.map(({ with: w, ...exclude }) => ({\n columns: [{ ...exclude.options, column: name, with: w }],\n ...exclude,\n })),\n );\n }\n};\n\nexport const addColumnComment = (\n comments: ColumnComment[],\n name: string,\n item: Column,\n) => {\n if (item.data.comment) {\n comments.push({ column: name, comment: item.data.comment });\n }\n};\n\nexport const getForeignKeyTable = (\n fnOrTable: (() => Column.ForeignKey.TableParam) | 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 getConstraintName = (\n table: string,\n constraint: {\n references?: { columns: string[] };\n check?: unknown;\n identity?: unknown;\n },\n snakeCase: boolean | undefined,\n) => {\n if (constraint.references) {\n let { columns } = constraint.references;\n if (snakeCase) {\n columns = columns.map(toSnakeCase);\n }\n return makeConstraintName(table, columns, 'fkey');\n }\n if (constraint.check) return `${table}_check`;\n if (constraint.identity) return `${table}_identity`;\n return `${table}_constraint`;\n};\n\nexport const constraintToSql = (\n { name }: { schema?: string; name: string },\n up: boolean,\n constraint: TableData.Constraint,\n values: unknown[],\n snakeCase: boolean | undefined,\n) => {\n const constraintName =\n constraint.name || getConstraintName(name, constraint, snakeCase);\n\n if (!up) {\n const { dropMode } = constraint;\n return `CONSTRAINT \"${constraintName}\"${dropMode ? ` ${dropMode}` : ''}`;\n }\n\n const sql = [`CONSTRAINT \"${constraintName}\"`];\n\n if (constraint.references) {\n sql.push(foreignKeyToSql(constraint.references, snakeCase));\n }\n\n if (constraint.check) {\n sql.push(checkToSql(constraint.check, values));\n }\n\n return sql.join(' ');\n};\n\nconst checkToSql = (check: RawSQLBase, values: unknown[]) => {\n return `CHECK (${check.toSQL({ values })})`;\n};\n\nconst foreignKeyToSql = (item: TableData.References, snakeCase?: boolean) => {\n return `FOREIGN KEY (${joinColumns(\n snakeCase ? item.columns.map(toSnakeCase) : item.columns,\n )}) ${referencesToSql(item, snakeCase)}`;\n};\n\nexport const referencesToSql = (\n references: TableData.References,\n snakeCase: boolean | undefined,\n) => {\n const [schema, table] = getForeignKeyTable(references.fnOrTable);\n\n const sql: string[] = [\n `REFERENCES ${quoteTable(schema, table)}(${joinColumns(\n snakeCase\n ? references.foreignColumns.map(toSnakeCase)\n : references.foreignColumns,\n )})`,\n ];\n\n const { options } = references;\n if (options?.match) {\n sql.push(`MATCH ${options?.match.toUpperCase()}`);\n }\n\n if (options?.onDelete) {\n sql.push(`ON DELETE ${options?.onDelete.toUpperCase()}`);\n }\n\n if (options?.onUpdate) {\n sql.push(`ON UPDATE ${options?.onUpdate.toUpperCase()}`);\n }\n\n return sql.join(' ');\n};\n\nconst MAX_CONSTRAINT_NAME_LEN = 63;\nconst makeConstraintName = (\n table: string,\n columns: string[],\n suffix: string,\n) => {\n const long = `${table}_${columns.join('_')}_${suffix}`;\n if (long.length <= MAX_CONSTRAINT_NAME_LEN) return long;\n\n for (let partLen = 3; partLen > 0; partLen--) {\n const shorter = `${toCamelCase(\n toSnakeCase(table)\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n )}_${columns\n .map((c) =>\n toCamelCase(\n c\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n ),\n )\n .join('_')}_${suffix}`;\n\n if (shorter.length <= MAX_CONSTRAINT_NAME_LEN) return shorter;\n }\n\n const short = `${table}_${columns.length}columns_${suffix}`;\n if (short.length <= MAX_CONSTRAINT_NAME_LEN) return short;\n\n for (let partLen = 3; partLen > 0; partLen--) {\n const short = `${toCamelCase(\n toSnakeCase(table)\n .split('_')\n .map((p) => p.slice(0, partLen))\n .join('_'),\n )}_${columns.length}columns_${suffix}`;\n\n if (short.length <= MAX_CONSTRAINT_NAME_LEN) return short;\n }\n\n return `long_ass_table_${suffix}`;\n};\n\nconst getIndexOrExcludeName = (\n table: string,\n columns: ({ column?: string } | { expression: string })[],\n suffix: string,\n): string =>\n makeConstraintName(\n table,\n columns.map((it) =>\n 'column' in it ? (it.column as string) : 'expression',\n ),\n suffix,\n );\n\nexport interface GetIndexOrExcludeName {\n (\n table: string,\n columns: ({ column?: string } | { expression: string })[],\n ): string;\n}\n\nexport const getIndexName: GetIndexOrExcludeName = (table, columns) =>\n getIndexOrExcludeName(table, columns, 'idx');\n\nexport const getExcludeName: GetIndexOrExcludeName = (table, columns) =>\n getIndexOrExcludeName(table, columns, 'exclude');\n\nexport const indexesToQuery = (\n up: boolean,\n { schema, name: tableName }: { schema?: string; name: string },\n indexes: TableData.Index[],\n snakeCase: boolean | undefined,\n language?: string,\n): SingleSql[] => {\n return indexes.map((index) => {\n const { options } = index;\n\n const { columns, include, name } = getIndexOrExcludeMainOptions(\n tableName,\n index,\n getIndexName,\n snakeCase,\n );\n\n if (!up) {\n return {\n text: `DROP INDEX \"${name}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n };\n }\n\n const values: unknown[] = [];\n\n const sql: string[] = ['CREATE'];\n\n if (options.unique) {\n sql.push('UNIQUE');\n }\n\n sql.push(`INDEX \"${name}\" ON ${quoteTable(schema, tableName)}`);\n\n const u = options.using || (options.tsVector && 'GIN');\n if (u) {\n sql.push(`USING ${u}`);\n }\n\n const lang =\n options.tsVector && options.languageColumn\n ? `\"${options.languageColumn}\"`\n : options.language\n ? `'${options.language}'`\n : `'${language || 'english'}'`;\n\n let hasWeight =\n options.tsVector && columns.some((column) => !!column.weight);\n\n const columnsSql = columns.map((column) => {\n let sql = [\n 'expression' in column\n ? `(${column.expression})`\n : `\"${column.column}\"`,\n column.collate && `COLLATE ${quoteNameFromString(column.collate)}`,\n column.opclass,\n column.order,\n ]\n .filter((x): x is string => !!x)\n .join(' ');\n\n if (hasWeight) {\n sql = `to_tsvector(${lang}, coalesce(${sql}, ''))`;\n\n if (column.weight) {\n hasWeight = true;\n sql = `setweight(${sql}, '${column.weight}')`;\n }\n }\n\n return sql;\n });\n\n let columnList;\n if (hasWeight) {\n columnList = `(${columnsSql.join(' || ')})`;\n } else if (options.tsVector) {\n columnList = `to_tsvector(${lang}, ${columnsSql.join(\" || ' ' || \")})`;\n } else {\n columnList = columnsSql.join(', ');\n }\n\n sql.push(`(${columnList})`);\n\n if (include && include.length) {\n sql.push(\n `INCLUDE (${include.map((column) => `\"${column}\"`).join(', ')})`,\n );\n }\n\n if (options.nullsNotDistinct) {\n sql.push(`NULLS NOT DISTINCT`);\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 isRawSQL(options.where)\n ? options.where.toSQL({ values })\n : options.where\n }`,\n );\n }\n\n return { text: sql.join(' '), values };\n });\n};\n\nexport const excludesToQuery = (\n up: boolean,\n { schema, name: tableName }: { schema?: string; name: string },\n excludes: TableData.Exclude[],\n snakeCase: boolean | undefined,\n): SingleSql[] => {\n return excludes.map((exclude) => {\n const { options } = exclude;\n\n const { columns, include, name } = getIndexOrExcludeMainOptions(\n tableName,\n exclude,\n getExcludeName,\n snakeCase,\n );\n\n if (!up) {\n return {\n text: `ALTER TABLE ${quoteTable(\n schema,\n tableName,\n )} DROP CONSTRAINT \"${name}\"${\n options.dropMode ? ` ${options.dropMode}` : ''\n }`,\n };\n }\n\n const columnList = columns\n .map((column) =>\n [\n 'expression' in column\n ? `(${column.expression})`\n : `\"${column.column}\"`,\n column.collate && `COLLATE ${quoteNameFromString(column.collate)}`,\n column.opclass,\n column.order,\n `WITH ${column.with}`,\n ]\n .filter((x): x is string => !!x)\n .join(' '),\n )\n .join(', ');\n\n const values: unknown[] = [];\n\n const text = [\n `ALTER TABLE ${quoteTable(\n schema,\n tableName,\n )} ADD CONSTRAINT \"${name}\" EXCLUDE`,\n options.using && `USING ${options.using}`,\n `(${columnList})`,\n include?.length &&\n `INCLUDE (${include.map((column) => `\"${column}\"`).join(', ')})`,\n options.with && `WITH (${options.with})`,\n options.tablespace && `USING INDEX TABLESPACE ${options.tablespace}`,\n options.where &&\n `WHERE ${\n isRawSQL(options.where)\n ? options.where.toSQL({ values })\n : options.where\n }`,\n ]\n .filter((x): x is string => !!x)\n .join(' ');\n\n return { text, values };\n });\n};\n\nconst getIndexOrExcludeMainOptions = <\n T extends TableData.Index | TableData.Exclude,\n>(\n tableName: string,\n item: T,\n getName: GetIndexOrExcludeName,\n snakeCase?: boolean,\n): { columns: T['columns']; include?: string[]; name: string } => {\n let include = item.options.include\n ? toArray(item.options.include)\n : undefined;\n\n let { columns } = item;\n if (snakeCase) {\n columns = columns.map((c) =>\n 'column' in c ? { ...c, column: toSnakeCase(c.column) } : c,\n );\n if (include) include = include.map(toSnakeCase);\n }\n\n return {\n columns,\n include,\n name: item.options?.name || getName(tableName, columns),\n };\n};\n\nexport const commentsToQuery = (\n schemaTable: { schema?: string; name: string },\n comments: ColumnComment[],\n): SingleSql[] => {\n return comments.map(({ column, comment }) => ({\n text: `COMMENT ON COLUMN ${quoteWithSchema(\n schemaTable,\n )}.\"${column}\" IS ${escapeForMigration(comment)}`,\n values: [],\n }));\n};\n\nexport const primaryKeyToSql = (\n primaryKey: Exclude<TableData['primaryKey'], undefined>,\n) => {\n return `${\n primaryKey.name ? `CONSTRAINT \"${primaryKey.name}\" ` : ''\n }PRIMARY KEY (${joinColumns(primaryKey.columns)})`;\n};\n\nexport const interpolateSqlValues = ({ text, values }: TableQuery): string => {\n return values?.length\n ? text.replace(/\\$(\\d+)/g, (_, n) => {\n const i = +n - 1;\n return escapeForMigration(values[i]);\n })\n : text;\n};\n\nexport interface ColumnNamedCheck extends Column.Data.Check {\n name: string;\n}\n\nexport const nameColumnChecks = (\n table: string,\n column: string,\n checks: Column.Data.Check[],\n): ColumnNamedCheck[] =>\n checks.map((check, i) => ({\n ...check,\n name: check.name || `${table}_${column}_check${i === 0 ? '' : i}`,\n }));\n\nexport const cmpRawSql = (a: RawSQLBase, b: RawSQLBase) => {\n const values: unknown[] = [];\n\n const aSql = a.makeSQL({ values });\n const aValues = JSON.stringify(values);\n\n values.length = 0;\n\n const bSql = b.makeSQL({ values });\n const bValues = JSON.stringify(values);\n\n return aSql === bSql && aValues === bValues;\n};\n","import { EnumColumn, defaultSchemaConfig } from 'pqb';\n\nexport const tableMethods = {\n enum(name: string) {\n // empty array will be filled during the migration by querying db\n return new EnumColumn(\n defaultSchemaConfig,\n name,\n [] as unknown as [string, ...string[]],\n undefined,\n );\n },\n};\n","import {\n ColumnsShape,\n Db,\n EnumColumn,\n getColumnTypes,\n NoPrimaryKeyOption,\n parseTableData,\n escapeString,\n TableData,\n TableDataFn,\n TableDataItem,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n RecordUnknown,\n snakeCaseKey,\n} from 'pqb';\nimport {\n ColumnComment,\n ColumnsShapeCallback,\n DbMigration,\n Migration,\n TableOptions,\n} from './migration';\nimport {\n addColumnComment,\n addColumnExclude,\n addColumnIndex,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n excludesToQuery,\n getColumnName,\n indexesToQuery,\n interpolateSqlValues,\n primaryKeyToSql,\n} from './migration.utils';\nimport {\n getSchemaAndTableFromName,\n makePopulateEnumQuery,\n quoteWithSchema,\n} from '../common';\nimport { RakeDbAst } from '../ast';\nimport { tableMethods } from './tableMethods';\nimport { NoPrimaryKey } from '../errors';\n\nexport interface TableQuery {\n text: string;\n values?: unknown[];\n then?(result: QueryArraysResult): void;\n}\n\nexport interface CreateTableResult<\n Table extends string,\n Shape extends ColumnsShape,\n> {\n table: Db<Table, Shape>;\n}\n\nexport const createTable = async <\n CT,\n Table extends string,\n Shape extends ColumnsShape,\n>(\n migration: Migration<CT>,\n up: boolean,\n tableName: Table,\n first?: TableOptions | ColumnsShapeCallback<CT, Shape>,\n second?:\n | ColumnsShapeCallback<CT, Shape>\n | TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>,\n third?: TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>,\n): Promise<CreateTableResult<Table, Shape>> => {\n let options: TableOptions;\n let fn: ColumnsShapeCallback<CT, Shape> | undefined;\n let dataFn: TableDataFn<RecordUnknown, MaybeArray<TableDataItem>> | undefined;\n if (typeof first === 'object') {\n options = first;\n fn = second as ColumnsShapeCallback<CT, Shape>;\n dataFn = third as TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>;\n } else {\n options = emptyObject;\n fn = first;\n dataFn = second as TableDataFn<RecordUnknown, MaybeArray<TableDataItem>>;\n }\n\n const snakeCase =\n 'snakeCase' in options ? options.snakeCase : migration.options.snakeCase;\n const language =\n 'language' in options ? options.language : migration.options.language;\n\n const types = Object.assign(\n Object.create(migration.columnTypes as object),\n tableMethods,\n );\n types[snakeCaseKey] = snakeCase;\n\n let shape: Shape;\n let tableData;\n if (fn) {\n shape = getColumnTypes(\n types,\n fn,\n migration.options.baseTable?.nowSQL,\n language,\n );\n tableData = parseTableData(dataFn);\n tableData.constraints?.forEach((x, i) => {\n if (x.name || !x.check) return;\n\n x.name = `${tableName}_check${i === 0 ? '' : i}`;\n });\n } else {\n shape = (tableData = emptyObject) as Shape;\n }\n\n const ast = makeAst(\n up,\n tableName,\n shape,\n tableData,\n options,\n migration.options.noPrimaryKey,\n );\n\n fn && validatePrimaryKey(ast);\n\n const queries = astToQueries(ast, snakeCase, language);\n for (const { then, ...query } of queries) {\n const result = await migration.adapter.arrays(interpolateSqlValues(query));\n then?.(result);\n }\n\n let table: Db<Table, Shape> | undefined;\n\n return {\n get table(): Db<Table, Shape> {\n return (table ??= (migration as unknown as DbMigration<unknown>)(\n tableName,\n shape,\n undefined,\n {\n noPrimaryKey: options.noPrimaryKey ? 'ignore' : undefined,\n snakeCase,\n },\n ) as unknown as Db<Table, Shape>);\n },\n };\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 const column = shape[key];\n if (column.data.primaryKey) {\n shapePKeys.push(key);\n }\n }\n\n const { primaryKey } = tableData;\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 ? {\n ...primaryKey,\n columns: [...new Set([...shapePKeys, ...primaryKey.columns])],\n }\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].data.primaryKey) {\n hasPrimaryKey = true;\n break;\n }\n }\n }\n\n if (!hasPrimaryKey) {\n const error = new NoPrimaryKey(\n `Table ${ast.name} has no primary key.\\nYou can suppress this error by setting { noPrimaryKey: true } after a table name.`,\n );\n if (ast.noPrimaryKey === 'error') {\n throw error;\n } else {\n console.warn(error.message);\n }\n }\n }\n};\n\nconst astToQueries = (\n ast: RakeDbAst.Table,\n snakeCase?: boolean,\n language?: string,\n): TableQuery[] => {\n const queries: TableQuery[] = [];\n const { shape } = ast;\n\n for (const key in shape) {\n const item = shape[key];\n if (!(item instanceof EnumColumn)) continue;\n\n queries.push(makePopulateEnumQuery(item));\n }\n\n if (ast.action === 'drop') {\n queries.push({\n text: `DROP TABLE${\n ast.dropIfExists ? ' IF EXISTS' : ''\n } ${quoteWithSchema(ast)}${ast.dropMode ? ` ${ast.dropMode}` : ''}`,\n });\n return queries;\n }\n\n const lines: string[] = [];\n const values: unknown[] = [];\n const indexes: TableData.Index[] = [];\n const excludes: TableData.Exclude[] = [];\n const comments: ColumnComment[] = [];\n\n for (const key in shape) {\n const item = shape[key];\n const name = getColumnName(item, key, snakeCase);\n addColumnIndex(indexes, name, item);\n addColumnExclude(excludes, name, item);\n addColumnComment(comments, name, item);\n lines.push(\n `\\n ${columnToSql(name, item, values, !!ast.primaryKey, snakeCase)}`,\n );\n }\n\n if (ast.primaryKey) {\n lines.push(\n `\\n ${primaryKeyToSql({\n name: ast.primaryKey.name,\n columns: ast.primaryKey.columns.map((key) =>\n getColumnName(shape[key], key, snakeCase),\n ),\n })}`,\n );\n }\n\n ast.constraints?.forEach((item) => {\n lines.push(\n `\\n ${constraintToSql(\n ast,\n true,\n {\n ...item,\n references: item.references\n ? {\n ...item.references,\n columns: item.references.columns.map((column) =>\n getColumnName(shape[column], column, snakeCase),\n ),\n }\n : undefined,\n },\n values,\n snakeCase,\n )}`,\n );\n });\n\n pushIndexesOrExcludesFromAst(indexes, ast.indexes, shape, snakeCase);\n pushIndexesOrExcludesFromAst(excludes, ast.excludes, shape, snakeCase);\n\n queries.push(\n {\n text: `CREATE TABLE${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } ${quoteWithSchema(ast)} (${lines.join(',')}\\n)`,\n values,\n },\n ...indexesToQuery(true, ast, indexes, snakeCase, language),\n ...excludesToQuery(true, ast, excludes, snakeCase),\n ...commentsToQuery(ast, comments),\n );\n\n if (ast.comment) {\n queries.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${escapeString(\n ast.comment,\n )}`,\n });\n }\n\n return queries;\n};\n\nconst pushIndexesOrExcludesFromAst = <\n T extends TableData.Index | TableData.Exclude,\n>(\n arr: T[],\n inAst: T[] | undefined,\n shape: ColumnsShape,\n snakeCase?: boolean,\n) => {\n arr.push(\n ...(inAst?.map((x) => ({\n ...x,\n columns: x.columns.map((item) => ({\n ...item,\n ...('column' in item\n ? {\n column: getColumnName(shape[item.column], item.column, snakeCase),\n }\n : {}),\n })),\n })) || []),\n );\n};\n","import {\n Column,\n EnumColumn,\n parseTableDataInput,\n escapeString,\n TableData,\n TableDataMethods,\n tableDataMethods,\n UnknownColumn,\n DomainColumn,\n ArrayColumn,\n consumeColumnName,\n deepCompare,\n EmptyObject,\n RawSQLBase,\n RecordKeyTrue,\n RecordUnknown,\n setCurrentColumnName,\n setDefaultLanguage,\n snakeCaseKey,\n toArray,\n toSnakeCase,\n} from 'pqb';\nimport {\n ChangeTableCallback,\n ChangeTableOptions,\n ColumnComment,\n DropMode,\n Migration,\n MigrationColumnTypes,\n} from './migration';\nimport { RakeDbAst } from '../ast';\nimport {\n getSchemaAndTableFromName,\n makePopulateEnumQuery,\n quoteCustomType,\n quoteNameFromString,\n quoteWithSchema,\n} from '../common';\nimport {\n addColumnComment,\n addColumnExclude,\n addColumnIndex,\n cmpRawSql,\n columnToSql,\n commentsToQuery,\n constraintToSql,\n encodeColumnDefault,\n excludesToQuery,\n getColumnName,\n identityToSql,\n indexesToQuery,\n interpolateSqlValues,\n nameColumnChecks,\n primaryKeyToSql,\n} from './migration.utils';\nimport { tableMethods } from './tableMethods';\nimport { TableQuery } from './createTable';\n\ninterface ChangeTableData {\n add: TableData;\n drop: TableData;\n}\n\nconst newChangeTableData = (): ChangeTableData => ({\n add: {},\n drop: {},\n});\n\nlet changeTableData = newChangeTableData();\n\nconst resetChangeTableData = () => {\n changeTableData = newChangeTableData();\n};\n\nconst addOrDropChanges: RakeDbAst.ChangeTableItem.Column[] = [];\n\n// add column\nfunction add(item: Column, options?: { dropMode?: DropMode }): SpecialChange;\n// add primary key, index, etc\nfunction add(emptyObject: EmptyObject): SpecialChange;\n// add timestamps\nfunction add(\n items: Record<string, Column>,\n options?: { dropMode?: DropMode },\n): Record<string, RakeDbAst.ChangeTableItem.Column>;\nfunction add(\n this: TableChangeMethods,\n item: Column | EmptyObject | Record<string, Column>,\n options?: { dropMode?: DropMode },\n): undefined | EmptyObject | Record<string, RakeDbAst.ChangeTableItem.Column> {\n consumeColumnName();\n setName(this, item);\n\n if (item instanceof Column) {\n const result = addOrDrop('add', item, options);\n if (result.type === 'change') return result;\n addOrDropChanges.push(result);\n return (addOrDropChanges.length - 1) as unknown as EmptyObject;\n }\n\n for (const key in item) {\n // ...t.timestamps() case\n if (\n (item as Record<string, RakeDbAst.ChangeTableItem.Column>)[key] instanceof\n Column\n ) {\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, Column>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n\n parseTableDataInput(changeTableData.add, item);\n break;\n }\n\n return undefined as never;\n}\n\nconst drop = function (this: TableChangeMethods, item, options) {\n consumeColumnName();\n setName(this, item);\n\n if (item instanceof Column) {\n const result = addOrDrop('drop', item, options);\n if (result.type === 'change') return result;\n addOrDropChanges.push(result);\n return addOrDropChanges.length - 1;\n }\n\n for (const key in item) {\n // ...t.timestamps() case\n if (\n (item as unknown as Record<string, RakeDbAst.ChangeTableItem.Column>)[\n key\n ] instanceof Column\n ) {\n const result: Record<string, RakeDbAst.ChangeTableItem.Column> = {};\n for (const key in item as any) {\n result[key] = {\n type: 'drop',\n item: (item as Record<string, Column>)[key],\n dropMode: options?.dropMode,\n };\n }\n return result;\n }\n\n parseTableDataInput(changeTableData.drop, item);\n break;\n }\n\n return undefined as never;\n} as typeof add;\n\nconst addOrDrop = (\n type: 'add' | 'drop',\n item: Column,\n options?: { dropMode?: DropMode },\n): RakeDbAst.ChangeTableItem.Column | RakeDbAst.ChangeTableItem.Change => {\n if (item instanceof UnknownColumn) {\n const empty = columnTypeToColumnChange({\n type: 'change',\n to: {},\n });\n const add = columnTypeToColumnChange({\n type: 'change',\n to: {\n checks: item.data.checks,\n },\n });\n\n return {\n type: 'change',\n from: type === 'add' ? empty : add,\n to: type === 'add' ? add : empty,\n ...options,\n };\n }\n\n return {\n type,\n item,\n dropMode: options?.dropMode,\n };\n};\n\ninterface Change extends RakeDbAst.ChangeTableItem.Change, ChangeOptions {}\n\ntype ChangeOptions = RakeDbAst.ChangeTableItem.ChangeUsing;\n\ninterface SpecialChange {\n type: SpecialChange;\n}\n\ninterface OneWayChange {\n type: 'change';\n name?: string;\n to: RakeDbAst.ColumnChange;\n using?: RakeDbAst.ChangeTableItem.ChangeUsing;\n}\n\nconst columnTypeToColumnChange = (\n item: Column | OneWayChange,\n name?: string,\n): RakeDbAst.ColumnChange => {\n if (item instanceof Column) {\n let column = item;\n const foreignKeys = column.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 if (name && !column.data.name) {\n column = Object.create(column);\n column.data = { ...column.data, name };\n }\n\n return {\n column: column,\n type: column.toSQL(),\n nullable: column.data.isNullable,\n ...column.data,\n primaryKey: column.data.primaryKey === undefined ? undefined : true,\n foreignKeys: foreignKeys as RakeDbAst.ColumnChange['foreignKeys'],\n };\n }\n\n return item.to;\n};\n\nconst nameKey = Symbol('name');\n\nconst setName = (\n self: TableChangeMethods,\n item: RakeDbAst.ColumnChange | Column,\n) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const name = (self as any)[nameKey];\n if (!name) return;\n\n if ('column' in item && item.column instanceof Column) {\n item.column.data.name ??= name;\n } else if (item instanceof Column) {\n item.data.name ??= name;\n } else {\n (item as RecordUnknown).name ??= name;\n }\n};\n\ntype TableChangeMethods = typeof tableChangeMethods;\nconst tableChangeMethods = {\n ...tableMethods,\n ...(tableDataMethods as TableDataMethods<string>),\n name(name: string) {\n setCurrentColumnName(name);\n const types = Object.create(this);\n types[nameKey] = name;\n return types;\n },\n add,\n drop,\n change(\n from: Column | OneWayChange,\n to: Column | OneWayChange,\n using?: ChangeOptions,\n ): Change {\n consumeColumnName();\n const f = columnTypeToColumnChange(from);\n const t = columnTypeToColumnChange(to);\n setName(this, f);\n setName(this, t);\n\n return {\n type: 'change',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: (this as any)[nameKey],\n from: f,\n to: t,\n using,\n };\n },\n default(value: unknown | RawSQLBase): OneWayChange {\n return { type: 'change', to: { default: value } };\n },\n nullable(): OneWayChange {\n return {\n type: 'change',\n to: { nullable: true },\n };\n },\n nonNullable(): OneWayChange {\n return {\n type: 'change',\n to: { nullable: false },\n };\n },\n comment(comment: string | null): OneWayChange {\n return { type: 'change', to: { comment } };\n },\n /**\n * Rename a column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTable('table', (t) => ({\n * oldColumnName: t.rename('newColumnName'),\n * }));\n * });\n * ```\n *\n * Note that the renaming `ALTER TABLE` is executed before the rest of alterations,\n * so if you're also adding a new constraint on this column inside the same `changeTable`,\n * refer to it with a new name.\n *\n * @param name\n */\n rename(name: string): RakeDbAst.ChangeTableItem.Rename {\n return { type: 'rename', name };\n },\n};\n\nexport type TableChanger<CT> = MigrationColumnTypes<CT> & TableChangeMethods;\n\nexport type TableChangeData = Record<\n string,\n | RakeDbAst.ChangeTableItem.Column\n | RakeDbAst.ChangeTableItem.Rename\n | Change\n | SpecialChange\n | Column.Pick.Data\n>;\n\nexport const changeTable = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback<CT>,\n): Promise<void> => {\n const snakeCase =\n 'snakeCase' in options ? options.snakeCase : migration.options.snakeCase;\n const language =\n 'language' in options ? options.language : migration.options.language;\n\n setDefaultLanguage(language);\n resetChangeTableData();\n\n const tableChanger = Object.create(\n migration.columnTypes as object,\n ) as TableChanger<CT>;\n Object.assign(tableChanger, tableChangeMethods);\n\n (tableChanger as { [snakeCaseKey]?: boolean })[snakeCaseKey] = snakeCase;\n\n addOrDropChanges.length = 0;\n const changeData = fn?.(tableChanger) || {};\n\n const ast = makeAst(up, tableName, changeData, changeTableData, options);\n\n const queries = astToQueries(ast, snakeCase, language);\n for (const query of queries) {\n const result = await migration.adapter.arrays(interpolateSqlValues(query));\n query.then?.(result);\n }\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: RakeDbAst.ChangeTableShape = {};\n const consumedChanges: RecordKeyTrue = {};\n for (const key in changeData) {\n let item = changeData[key] as\n | Change\n | RakeDbAst.ChangeTableItem.Rename\n | RakeDbAst.ChangeTableItem.Column;\n\n if (typeof item === 'number') {\n consumedChanges[item] = true;\n item = addOrDropChanges[item];\n } else if (item instanceof Column) {\n item = addOrDrop('add', item);\n }\n\n if ('type' in item) {\n if (up) {\n shape[key] = 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 ? {\n ...item,\n from: item.to,\n to: item.from,\n using: item.using && {\n usingUp: item.using.usingDown,\n usingDown: item.using.usingUp,\n },\n }\n : item;\n }\n }\n }\n }\n\n for (let i = 0; i < addOrDropChanges.length; i++) {\n if (consumedChanges[i]) continue;\n\n const change = addOrDropChanges[i];\n const name = change.item.data.name;\n if (!name) {\n throw new Error(`Column in ...t.${change.type}() must have a name`);\n }\n\n const arr = shape[name] ? toArray(shape[name]) : [];\n arr[up ? 'push' : 'unshift'](\n up ? change : { ...change, type: change.type === 'add' ? 'drop' : 'add' },\n );\n shape[name] = arr;\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\ninterface PrimaryKey extends TableData.PrimaryKey {\n change?: true;\n}\n\nconst astToQueries = (\n ast: RakeDbAst.ChangeTable,\n snakeCase?: boolean,\n language?: string,\n): TableQuery[] => {\n const queries: TableQuery[] = [];\n\n if (ast.comment !== undefined) {\n queries.push({\n text: `COMMENT ON TABLE ${quoteWithSchema(ast)} IS ${\n ast.comment === null\n ? 'NULL'\n : escapeString(\n typeof ast.comment === 'string' ? ast.comment : ast.comment[1],\n )\n }`,\n });\n }\n\n const addPrimaryKeys: PrimaryKey = {\n columns: [],\n };\n\n const dropPrimaryKeys: PrimaryKey = {\n columns: [],\n };\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n if (Array.isArray(item)) {\n for (const it of item) {\n handlePrerequisitesForTableItem(\n key,\n it,\n queries,\n addPrimaryKeys,\n dropPrimaryKeys,\n snakeCase,\n );\n }\n } else {\n handlePrerequisitesForTableItem(\n key,\n item,\n queries,\n addPrimaryKeys,\n dropPrimaryKeys,\n snakeCase,\n );\n }\n }\n\n if (ast.add.primaryKey) {\n addPrimaryKeys.name = ast.add.primaryKey.name;\n const { columns } = ast.add.primaryKey;\n addPrimaryKeys.columns.push(\n ...(snakeCase ? columns.map(toSnakeCase) : columns),\n );\n }\n\n if (ast.drop.primaryKey) {\n dropPrimaryKeys.name = ast.drop.primaryKey.name;\n const { columns } = ast.drop.primaryKey;\n dropPrimaryKeys.columns.push(\n ...(snakeCase ? columns.map(toSnakeCase) : columns),\n );\n }\n\n const alterTable: string[] = [];\n const renameItems: string[] = [];\n const values: unknown[] = [];\n const addIndexes = ast.add.indexes ?? [];\n const dropIndexes = ast.drop.indexes ?? [];\n const addExcludes = ast.add.excludes ?? [];\n const dropExcludes = ast.drop.excludes ?? [];\n const addConstraints = ast.add.constraints ?? [];\n const dropConstraints = ast.drop.constraints ?? [];\n\n const comments: ColumnComment[] = [];\n\n for (const key in ast.shape) {\n const item = ast.shape[key];\n if (Array.isArray(item)) {\n for (const it of item) {\n handleTableItemChange(\n key,\n it,\n ast,\n alterTable,\n renameItems,\n values,\n addPrimaryKeys,\n addIndexes,\n dropIndexes,\n addExcludes,\n dropExcludes,\n addConstraints,\n dropConstraints,\n comments,\n snakeCase,\n );\n }\n } else {\n handleTableItemChange(\n key,\n item,\n ast,\n alterTable,\n renameItems,\n values,\n addPrimaryKeys,\n addIndexes,\n dropIndexes,\n addExcludes,\n dropExcludes,\n addConstraints,\n dropConstraints,\n comments,\n snakeCase,\n );\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.name || `${ast.name}_pkey`;\n prependAlterTable.push(`DROP CONSTRAINT \"${name}\"`);\n }\n\n prependAlterTable.push(\n ...dropConstraints.map(\n (foreignKey) =>\n `\\n DROP ${constraintToSql(ast, false, foreignKey, values, snakeCase)}`,\n ),\n );\n\n alterTable.unshift(...prependAlterTable);\n\n if (\n ast.add.primaryKey ||\n addPrimaryKeys.change ||\n addPrimaryKeys.columns.length > 1\n ) {\n addPrimaryKeys.columns = [...new Set(addPrimaryKeys.columns)];\n\n alterTable.push(\n `ADD ${primaryKeyToSql(\n snakeCase\n ? {\n name: addPrimaryKeys.name,\n columns: addPrimaryKeys.columns.map(toSnakeCase),\n }\n : addPrimaryKeys,\n )}`,\n );\n }\n\n alterTable.push(\n ...addConstraints.map(\n (foreignKey) =>\n `\\n ADD ${constraintToSql(ast, true, foreignKey, values, snakeCase)}`,\n ),\n );\n\n const tableName = quoteWithSchema(ast);\n if (renameItems.length) {\n queries.push(\n ...renameItems.map((sql) => ({\n text: `ALTER TABLE ${tableName}\n ${sql}`,\n values,\n })),\n );\n }\n\n if (alterTable.length) {\n queries.push(alterTableSql(tableName, alterTable, values));\n }\n\n queries.push(...indexesToQuery(false, ast, dropIndexes, snakeCase, language));\n queries.push(...indexesToQuery(true, ast, addIndexes, snakeCase, language));\n queries.push(...excludesToQuery(false, ast, dropExcludes, snakeCase));\n queries.push(...excludesToQuery(true, ast, addExcludes, snakeCase));\n queries.push(...commentsToQuery(ast, comments));\n\n return queries;\n};\n\nconst alterTableSql = (\n tableName: string,\n lines: string[],\n values: unknown[],\n) => ({\n text: `ALTER TABLE ${tableName}\n ${lines.join(',\\n ')}`,\n values,\n});\n\nconst handlePrerequisitesForTableItem = (\n key: string,\n item: RakeDbAst.ChangeTableItem,\n queries: TableQuery[],\n addPrimaryKeys: PrimaryKey,\n dropPrimaryKeys: PrimaryKey,\n snakeCase?: boolean,\n) => {\n if ('item' in item) {\n const { item: column } = item;\n if (column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(column));\n }\n }\n\n if (item.type === 'add') {\n if (item.item.data.primaryKey) {\n addPrimaryKeys.columns.push(getColumnName(item.item, key, snakeCase));\n }\n } else if (item.type === 'drop') {\n if (item.item.data.primaryKey) {\n dropPrimaryKeys.columns.push(getColumnName(item.item, key, snakeCase));\n }\n } else if (item.type === 'change') {\n if (item.from.column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(item.from.column));\n }\n\n if (item.to.column instanceof EnumColumn) {\n queries.push(makePopulateEnumQuery(item.to.column));\n }\n\n if (item.from.primaryKey) {\n dropPrimaryKeys.columns.push(\n item.from.column\n ? getColumnName(item.from.column, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key,\n );\n dropPrimaryKeys.change = true;\n }\n\n if (item.to.primaryKey) {\n addPrimaryKeys.columns.push(\n item.to.column\n ? getColumnName(item.to.column, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key,\n );\n addPrimaryKeys.change = true;\n }\n }\n};\n\nconst handleTableItemChange = (\n key: string,\n item: RakeDbAst.ChangeTableItem,\n ast: RakeDbAst.ChangeTable,\n alterTable: string[],\n renameItems: string[],\n values: unknown[],\n addPrimaryKeys: PrimaryKey,\n addIndexes: TableData.Index[],\n dropIndexes: TableData.Index[],\n addExcludes: TableData.Exclude[],\n dropExcludes: TableData.Exclude[],\n addConstraints: TableData.Constraint[],\n dropConstraints: TableData.Constraint[],\n comments: ColumnComment[],\n snakeCase?: boolean,\n) => {\n if (item.type === 'add') {\n const column = item.item;\n const name = getColumnName(column, key, snakeCase);\n addColumnIndex(addIndexes, name, column);\n addColumnExclude(addExcludes, name, column);\n addColumnComment(comments, name, column);\n\n alterTable.push(\n `ADD COLUMN ${columnToSql(\n name,\n column,\n values,\n addPrimaryKeys.columns.length > 1,\n snakeCase,\n )}`,\n );\n } else if (item.type === 'drop') {\n const name = getColumnName(item.item, key, snakeCase);\n\n alterTable.push(\n `DROP COLUMN \"${name}\"${item.dropMode ? ` ${item.dropMode}` : ''}`,\n );\n } else if (item.type === 'change') {\n const { from, to } = item;\n const name = getChangeColumnName('to', item, key, snakeCase);\n const fromName = getChangeColumnName('from', item, key, snakeCase);\n\n if (fromName !== name) {\n renameItems.push(renameColumnSql(fromName, name));\n }\n\n let changeType = false;\n if (to.type && (from.type !== to.type || from.collate !== to.collate)) {\n changeType = true;\n\n const type =\n !to.column || to.column.data.isOfCustomType\n ? to.column && to.column instanceof DomainColumn\n ? quoteNameFromString(to.type)\n : quoteCustomType(to.type)\n : to.type;\n\n const using = item.using?.usingUp\n ? ` USING ${item.using.usingUp.toSQL({ values })}`\n : to.column instanceof EnumColumn\n ? ` USING \"${name}\"::text::${type}`\n : to.column instanceof ArrayColumn\n ? ` USING \"${name}\"::text[]::${type}`\n : '';\n\n alterTable.push(\n `ALTER COLUMN \"${name}\" TYPE ${type}${\n to.collate ? ` COLLATE ${quoteNameFromString(to.collate)}` : ''\n }${using}`,\n );\n }\n\n if (\n typeof from.identity !== typeof to.identity ||\n !deepCompare(from.identity, to.identity)\n ) {\n if (from.identity) {\n alterTable.push(`ALTER COLUMN \"${name}\" DROP IDENTITY`);\n }\n\n if (to.identity) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" ADD ${identityToSql(to.identity)}`,\n );\n }\n }\n\n if (from.default !== to.default) {\n const value = encodeColumnDefault(to.default, values, to.column);\n\n // when changing type, need to first drop an existing default before setting a new one\n if (changeType && value !== null) {\n alterTable.push(`ALTER COLUMN \"${name}\" DROP DEFAULT`);\n }\n\n const expr = value === null ? 'DROP DEFAULT' : `SET DEFAULT ${value}`;\n\n alterTable.push(`ALTER COLUMN \"${name}\" ${expr}`);\n }\n\n if (from.nullable !== to.nullable) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" ${to.nullable ? 'DROP' : 'SET'} NOT NULL`,\n );\n }\n\n if (from.compression !== to.compression) {\n alterTable.push(\n `ALTER COLUMN \"${name}\" SET COMPRESSION ${to.compression || 'DEFAULT'}`,\n );\n }\n\n const fromChecks =\n from.checks && nameColumnChecks(ast.name, fromName, from.checks);\n const toChecks = to.checks && nameColumnChecks(ast.name, name, to.checks);\n\n fromChecks?.forEach((fromCheck) => {\n if (!toChecks?.some((toCheck) => cmpRawSql(fromCheck.sql, toCheck.sql))) {\n alterTable.push(`DROP CONSTRAINT \"${fromCheck.name}\"`);\n }\n });\n\n toChecks?.forEach((toCheck) => {\n if (\n !fromChecks?.some((fromCheck) => cmpRawSql(fromCheck.sql, toCheck.sql))\n ) {\n alterTable.push(\n `ADD CONSTRAINT \"${toCheck.name}\"\\n CHECK (${toCheck.sql.toSQL({\n values,\n })})`,\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.options?.name !== toFkey.options?.name ||\n fromFkey.options?.match !== toFkey.options?.match ||\n fromFkey.options?.onUpdate !== toFkey.options?.onUpdate ||\n fromFkey.options?.onDelete !== toFkey.options?.onDelete ||\n fromFkey.options?.dropMode !== toFkey.options?.dropMode ||\n (fromFkey.fnOrTable as string) !== (toFkey.fnOrTable as string))\n ) {\n if (fromFkey) {\n dropConstraints.push({\n name: fromFkey.options?.name,\n dropMode: fromFkey.options?.dropMode,\n references: {\n columns: [name],\n ...fromFkey,\n foreignColumns: snakeCase\n ? fromFkey.foreignColumns.map(toSnakeCase)\n : fromFkey.foreignColumns,\n },\n });\n }\n\n if (toFkey) {\n addConstraints.push({\n name: toFkey.options?.name,\n dropMode: toFkey.options?.dropMode,\n references: {\n columns: [name],\n ...toFkey,\n foreignColumns: snakeCase\n ? toFkey.foreignColumns.map(toSnakeCase)\n : toFkey.foreignColumns,\n },\n });\n }\n }\n }\n\n pushIndexesOrExcludes('indexes', from, to, name, addIndexes, dropIndexes);\n pushIndexesOrExcludes(\n 'excludes',\n from,\n to,\n name,\n addExcludes,\n dropExcludes,\n );\n\n if (from.comment !== to.comment) {\n comments.push({ column: name, comment: to.comment || null });\n }\n } else if (item.type === 'rename') {\n renameItems.push(\n snakeCase\n ? renameColumnSql(toSnakeCase(key), toSnakeCase(item.name))\n : renameColumnSql(key, item.name),\n );\n }\n};\n\nconst pushIndexesOrExcludes = <T extends TableData.Index | TableData.Exclude>(\n key: 'indexes' | 'excludes',\n from: RakeDbAst.ColumnChange,\n to: RakeDbAst.ColumnChange,\n name: string,\n add: T[],\n drop: T[],\n) => {\n const len = Math.max(from[key]?.length || 0, to[key]?.length || 0);\n for (let i = 0; i < len; i++) {\n const fromItem = from[key]?.[i];\n const toItem = to[key]?.[i];\n\n if (\n (fromItem || toItem) &&\n (!fromItem || !toItem || !deepCompare(fromItem, toItem))\n ) {\n if (fromItem) {\n drop.push({\n ...fromItem,\n columns: [\n {\n column: name,\n ...fromItem.options,\n with: (fromItem as TableData.ColumnExclude).with,\n },\n ],\n } as T);\n }\n\n if (toItem) {\n add.push({\n ...toItem,\n columns: [\n {\n column: name,\n ...toItem.options,\n with: (toItem as TableData.ColumnExclude).with,\n },\n ],\n } as T);\n }\n }\n }\n};\n\nconst getChangeColumnName = (\n what: 'from' | 'to',\n change: RakeDbAst.ChangeTableItem.Change,\n key: string,\n snakeCase?: boolean,\n) => {\n return (\n change.name ||\n (change[what].column\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n getColumnName(change[what].column!, key, snakeCase)\n : snakeCase\n ? toSnakeCase(key)\n : key)\n );\n};\n\nconst renameColumnSql = (from: string, to: string) => {\n return `RENAME COLUMN \"${from}\" TO \"${to}\"`;\n};\n","import { Migration } from './migration';\nimport { RawSQLBase, singleQuote, SingleSql, raw } from 'pqb';\nimport { RakeDbAst } from '../ast';\nimport { interpolateSqlValues } from './migration.utils';\n\nexport const createView = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n): Promise<void> => {\n const ast = makeAst(up, name, options, sql);\n const query = astToQuery(ast);\n\n await migration.adapter.arrays(interpolateSqlValues(query));\n};\n\nconst makeAst = (\n up: boolean,\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n): RakeDbAst.View => {\n if (typeof sql === 'string') {\n sql = raw({ raw: sql });\n }\n\n return {\n type: 'view',\n action: up ? 'create' : 'drop',\n name,\n shape: {},\n sql,\n options,\n deps: [],\n };\n};\n\nconst astToQuery = (ast: RakeDbAst.View): SingleSql => {\n const values: unknown[] = [];\n const sql: string[] = [];\n const { options } = ast;\n\n if (ast.action === 'create') {\n sql.push('CREATE');\n\n if (options?.createOrReplace) sql.push('OR REPLACE');\n if (options?.temporary) sql.push('TEMPORARY');\n if (options?.recursive) sql.push('RECURSIVE');\n\n sql.push(`VIEW \"${ast.name}\"`);\n\n if (options?.columns) {\n sql.push(\n `(${options.columns.map((column) => `\"${column}\"`).join(', ')})`,\n );\n }\n\n if (options?.with) {\n const list: string[] = [];\n if (options.with.checkOption)\n list.push(`check_option = ${singleQuote(options.with.checkOption)}`);\n if (options.with.securityBarrier) list.push(`security_barrier = true`);\n if (options.with.securityInvoker) list.push(`security_invoker = true`);\n sql.push(`WITH ( ${list.join(', ')} )`);\n }\n\n sql.push(`AS (${ast.sql.toSQL({ values })})`);\n } else {\n sql.push('DROP VIEW');\n\n if (options?.dropIfExists) sql.push(`IF EXISTS`);\n\n sql.push(`\"${ast.name}\"`);\n\n if (options?.dropMode) sql.push(options.dropMode);\n }\n\n return {\n text: sql.join(' '),\n values,\n };\n};\n","import {\n ColumnsShape,\n Column,\n createDbWithAdapter,\n DbDomainArg,\n DbResult,\n EnumColumn,\n logParamToLogObject,\n escapeForMigration,\n raw,\n TableData,\n TableDataFn,\n TableDataItem,\n AdapterBase,\n ColumnSchemaConfig,\n emptyObject,\n MaybeArray,\n QueryLogObject,\n QueryLogOptions,\n RawSQLBase,\n RecordString,\n RecordUnknown,\n singleQuote,\n toSnakeCase,\n} from 'pqb';\nimport { createTable, CreateTableResult } from './createTable';\nimport { changeTable, TableChangeData, TableChanger } from './changeTable';\nimport {\n getSchemaAndTableFromName,\n quoteNameFromString,\n quoteTable,\n quoteWithSchema,\n} from '../common';\nimport { RakeDbAst } from '../ast';\nimport {\n columnTypeToSql,\n encodeColumnDefault,\n interpolateSqlValues,\n} from './migration.utils';\nimport { createView } from './createView';\nimport { RakeDbConfig } from '../config';\n\n// Drop mode to use when dropping various database entities.\nexport type DropMode = 'CASCADE' | 'RESTRICT';\n\n// Options for creating a table.\nexport type TableOptions = {\n // create the table only if it not exists already\n createIfNotExists?: boolean;\n // drop the table only if it exists\n dropIfExists?: boolean;\n // Drop mode to use when dropping the table.\n dropMode?: DropMode;\n // Create a table with a database comment on it.\n comment?: string;\n // Ignore the absence of a primary key. Will throw otherwise.\n noPrimaryKey?: boolean;\n // Translate columns name into snake case\n snakeCase?: boolean;\n language?: string;\n};\n\n// Overridden column types to simplify and adapt some column types for a migration.\nexport type MigrationColumnTypes<CT> = Omit<CT, 'enum'> & {\n enum: (\n name: string,\n ) => EnumColumn<ColumnSchemaConfig, unknown, readonly string[]>;\n};\n\n// Create table callback\nexport type ColumnsShapeCallback<\n CT,\n Shape extends ColumnsShape = ColumnsShape,\n> = (t: MigrationColumnTypes<CT> & { raw: typeof raw }) => Shape;\n\n// Options for changing a table\nexport type ChangeTableOptions = {\n snakeCase?: boolean;\n language?: string;\n comment?: string | [string, string] | null;\n};\n\n// Callback for a table change\nexport type ChangeTableCallback<CT> = (t: TableChanger<CT>) => TableChangeData;\n\n// DTO for column comments\nexport type ColumnComment = { column: string; comment: string | null };\n\n// Database adapter methods to perform queries without logging\nexport type SilentQueries = {\n // Query without logging\n silentQuery: AdapterBase['query'];\n // Query arrays without logging\n silentArrays: AdapterBase['arrays'];\n};\n\n// Combined queryable database instance and a migration interface\nexport type DbMigration<CT> = DbResult<CT> &\n Migration<CT> & {\n // Add `SilentQueries` to an existing `adapter` type in the `DbResult`\n adapter: SilentQueries;\n };\n\nexport interface CreateMigrationInterfaceConfig<CT> extends QueryLogOptions {\n columnTypes: CT;\n}\n\n/**\n * Creates a new `db` instance that is an instance of `pqb` with mixed in migration methods from the `Migration` class.\n * It overrides `query` and `array` db adapter methods to intercept SQL for the logging.\n *\n * @param tx - database adapter that executes inside a transaction\n * @param up - migrate or rollback\n * @param config - config of `rakeDb`\n */\nexport const createMigrationInterface = <CT>(\n tx: AdapterBase,\n up: boolean,\n config: CreateMigrationInterfaceConfig<CT>,\n): DbMigration<CT> => {\n const adapter = Object.create(tx) as MigrationAdapter;\n adapter.schema = adapter.getSchema() ?? 'public';\n\n const { query, arrays } = adapter;\n const log = logParamToLogObject(config.logger || console, config.log);\n\n adapter.query = ((text, values) => {\n return wrapWithLog(log, text, values, () =>\n query.call(adapter, text, values),\n );\n }) as typeof adapter.query;\n\n adapter.arrays = ((text, values) => {\n return wrapWithLog(log, text, values, () =>\n arrays.call(adapter, text, values),\n );\n }) as typeof adapter.arrays;\n\n Object.assign(adapter, { silentQuery: query, silentArrays: arrays });\n\n const db = createDbWithAdapter({\n adapter,\n columnTypes: config.columnTypes,\n }) as unknown as DbMigration<CT>;\n\n const { prototype: proto } = Migration;\n for (const key of Object.getOwnPropertyNames(proto)) {\n (db as unknown as RecordUnknown)[key] = proto[key as keyof typeof proto];\n }\n\n return Object.assign(db, {\n adapter,\n log,\n up,\n options: config,\n });\n};\n\nexport interface MigrationAdapter extends AdapterBase {\n schema: string;\n}\n\n// Migration interface to use inside the `change` callback.\nexport class Migration<CT> {\n // Database adapter to perform queries with.\n public adapter!: MigrationAdapter;\n // The logger config.\n public log?: QueryLogObject;\n // Is migrating or rolling back.\n public up!: boolean;\n // `rakeDb` config.\n public options!: RakeDbConfig<ColumnSchemaConfig>;\n // Available column types that may be customized by a user.\n // They are pulled from a `baseTable` or a `columnTypes` option of the `rakeDb` config.\n public columnTypes!: CT;\n\n /**\n * `createTable` accepts a string for a table name, optional options, and a callback to specify columns.\n *\n * `dropTable` accepts the same arguments, it will drop the table when migrating and create a table when rolling back.\n *\n * To create an empty table, the callback with columns may be omitted.\n *\n * When creating a table within a specific schema, write the table name with schema name: `'schemaName.tableName'`.\n *\n * Returns object `{ table: TableInterface }` that allows to insert records right after creating a table.\n *\n * Options are:\n *\n * ```ts\n * type TableOptions = {\n * // create the table only if it not exists already\n * createIfNotExists?: boolean;\n *\n * // drop the table only if it exists\n * dropIfExists?: boolean;\n *\n * // used when reverting a `createTable`\n * dropMode?: 'CASCADE' | 'RESTRICT';\n *\n * // add a database comment on the table\n * comment?: string;\n *\n * // by default, it will throw an error when the table has no primary key\n * // set `noPrimaryKey` to `true` to bypass it\n * noPrimaryKey?: boolean;\n *\n * // override rakeDb `snakeCase` option for only this table\n * snakeCase?: boolean;\n * };\n * ```\n *\n * Example:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db, up) => {\n * // call `createTable` with options\n * await db.createTable(\n * 'table',\n * {\n * comment: 'Table comment',\n * dropMode: 'CASCADE',\n * noPrimaryKey: true,\n * },\n * (t) => ({\n * // ...\n * }),\n * );\n *\n * // call without options\n * const { table } = await db.createTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * email: t.text().unique(),\n * name: t.text(),\n * active: t.boolean().nullable(),\n * ...t.timestamps(),\n * }));\n *\n * // create records only when migrating up\n * if (up) {\n * // table is a db table interface, all query methods are available\n * await table.createMany([...data]);\n * }\n * });\n * ```\n *\n * @param tableName - name of the table to create\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n createTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n /**\n * See {@link createTable}\n *\n * @param tableName - name of the table to create\n * @param options - {@link TableOptions}\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n createTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n options: TableOptions,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n createTable(\n tableName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n first?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n second?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n third?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return createTable(this, this.up, tableName, first, second, third);\n }\n\n /**\n * Drop the table, create it on rollback. See {@link createTable}.\n *\n * @param tableName - name of the table to drop\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n dropTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n /**\n * Drop the table, create it on rollback. See {@link createTable}.\n *\n * @param tableName - name of the table to drop\n * @param options - {@link TableOptions}\n * @param fn - create table callback\n * @param dataFn - callback for creating composite indexes, primary keys, foreign keys\n */\n dropTable<Table extends string, Shape extends ColumnsShape>(\n tableName: Table,\n options: TableOptions,\n fn?: ColumnsShapeCallback<CT, Shape>,\n dataFn?: TableDataFn<Shape, MaybeArray<TableDataItem>>,\n ): Promise<CreateTableResult<Table, Shape>>;\n dropTable(\n tableName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n first?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n second?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n third?: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return createTable(this, !this.up, tableName, first, second, third);\n }\n\n /**\n * `changeTable` accepts a table name, optional options, and a special callback with column changes.\n *\n * When changing a table within a specific schema, write the table name with schema name: `'schemaName.tableName'`.\n *\n * Options are:\n *\n * ```ts\n * type ChangeTableOptions = {\n * comment?:\n * | // add a comment to the table on migrating, remove a comment on rollback\n * string // change comment from first to second on migrating, from second to first on rollback\n * | [string, string] // remove a comment on both migrate and rollback\n * | null;\n *\n * // override rakeDb `snakeCase` option for only this table\n * snakeCase?: boolean;\n * };\n * ```\n *\n * The callback of the `changeTable` is different from `createTable` in the way that it expects columns to be wrapped in change methods such as `add`, `drop`, and `change`.\n *\n * @param tableName - name of the table to change (ALTER)\n * @param fn - change table callback\n */\n changeTable(tableName: string, fn: ChangeTableCallback<CT>): Promise<void>;\n /**\n * See {@link changeTable}\n *\n * @param tableName - name of the table to change (ALTER)\n * @param options - change table options\n * @param fn - change table callback\n */\n changeTable(\n tableName: string,\n options: ChangeTableOptions,\n fn?: ChangeTableCallback<CT>,\n ): Promise<void>;\n changeTable(\n tableName: string,\n cbOrOptions: ChangeTableCallback<CT> | ChangeTableOptions,\n cb?: ChangeTableCallback<CT>,\n ): Promise<void> {\n const [fn, options] =\n typeof cbOrOptions === 'function' ? [cbOrOptions, {}] : [cb, cbOrOptions];\n\n return changeTable(this, this.up, tableName, options, fn);\n }\n\n /**\n * Rename a table:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameTable('oldTableName', 'newTableName');\n * });\n * ```\n *\n * Prefix table name with a schema to set a different schema:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameTable('fromSchema.oldTable', 'toSchema.newTable');\n * });\n * ```\n *\n * @param from - rename the table from\n * @param to - rename the table to\n */\n renameTable(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'TABLE');\n }\n\n /**\n * Set a different schema to the table:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTableSchema('tableName', 'fromSchema', 'toSchema');\n * });\n * ```\n *\n * @param table - table name\n * @param from - current table schema\n * @param to - desired table schema\n */\n changeTableSchema(table: string, from: string, to: string) {\n return this.renameTable(`${from}.${table}`, `${to}.${table}`);\n }\n\n /**\n * Add a column to the table on migrating, and remove it on rollback.\n *\n * `dropColumn` takes the same arguments, removes a column on migrate, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addColumn('tableName', 'columnName', (t) =>\n * t.integer().index().nullable(),\n * );\n * });\n * ```\n *\n * @param tableName - name of the table to add the column to\n * @param columnName - name of the column to add\n * @param fn - function returning a type of the column\n */\n addColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => Column,\n ): Promise<void> {\n return addColumn(this, this.up, tableName, columnName, fn);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addColumn}.\n *\n * @param tableName - name of the table to add the column to\n * @param columnName - name of the column to add\n * @param fn - function returning a type of the column\n */\n dropColumn(\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => Column,\n ): Promise<void> {\n return addColumn(this, !this.up, tableName, columnName, fn);\n }\n\n /**\n * Add an index to the table on migrating, and remove it on rollback.\n *\n * `dropIndex` takes the same arguments, removes the index on migrate, and adds it on rollback.\n *\n * The first argument is the table name, other arguments are the same as in [composite index](#composite-index).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addIndex(\n * 'tableName',\n * ['column1', { column: 'column2', order: 'DESC' }],\n * {\n * name: 'indexName',\n * },\n * );\n * });\n * ```\n *\n * @param tableName - name of the table to add the index for\n * @param columns - indexed columns\n * @param args - index options\n */\n addIndex(\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n ): Promise<void> {\n return addIndex(this, this.up, tableName, columns, ...args);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addIndex}.\n *\n * @param tableName - name of the table to add the index for\n * @param columns - indexed columns\n * @param args - index options\n */\n dropIndex(\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n ): Promise<void> {\n return addIndex(this, !this.up, tableName, columns, ...args);\n }\n\n /**\n * Rename index:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * // tableName can be prefixed with a schema\n * await db.renameIndex('tableName', 'oldIndexName', 'newIndexName');\n * });\n * ```\n *\n * @param tableName - table which this index belongs to\n * @param from - rename the index from\n * @param to - rename the index to\n */\n renameIndex(tableName: string, from: string, to: string): Promise<void> {\n return renameTableItem(this, tableName, from, to, 'INDEX');\n }\n\n /**\n * Add a foreign key to a table on migrating, and remove it on rollback.\n *\n * `dropForeignKey` takes the same arguments, removes the foreign key on migrate, and adds it on rollback.\n *\n * Arguments:\n *\n * - table name\n * - column names in the table\n * - other table name\n * - column names in the other table\n * - options:\n * - `name`: constraint name\n * - `match`: 'FULL', 'PARTIAL', or 'SIMPLE'\n * - `onUpdate` and `onDelete`: 'NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL', or 'SET DEFAULT'\n *\n * The first argument is the table name, other arguments are the same as in [composite foreign key](#composite-foreign-key).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addForeignKey(\n * 'tableName',\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * );\n * });\n * ```\n *\n * @param tableName - table name\n * @param columns - column names in the table\n * @param foreignTable - other table name\n * @param foreignColumns - column names in the other table\n * @param options - foreign key options\n */\n addForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): Promise<void> {\n return addForeignKey(\n this,\n this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addForeignKey}.\n *\n * @param tableName - table name\n * @param columns - column names in the table\n * @param foreignTable - other table name\n * @param foreignColumns - column names in the other table\n * @param options - foreign key options\n */\n dropForeignKey(\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): Promise<void> {\n return addForeignKey(\n this,\n !this.up,\n tableName,\n columns,\n foreignTable,\n foreignColumns,\n options,\n );\n }\n\n /**\n * Add a primary key to a table on migrate, and remove it on rollback.\n *\n * `dropPrimaryKey` takes the same arguments, removes the primary key on migrate, and adds it on rollback.\n *\n * First argument is a table name, second argument is an array of columns.\n * The optional third argument may have a name for the primary key constraint.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addPrimaryKey('tableName', ['id', 'name'], {\n * name: 'tablePkeyName',\n * });\n * });\n * ```\n *\n * @param tableName - name of the table\n * @param columns - array of the columns\n * @param name - optionally, set a primary key constraint name\n */\n addPrimaryKey(\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n ): Promise<void> {\n return addPrimaryKey(this, this.up, tableName, columns, name);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addPrimaryKey}.\n *\n * @param tableName - name of the table\n * @param columns - array of the columns\n * @param name - optionally, set a primary key constraint name\n */\n dropPrimaryKey(\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n ): Promise<void> {\n return addPrimaryKey(this, !this.up, tableName, columns, name);\n }\n\n /**\n * Add or drop a check for multiple columns.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addCheck('tableName', t.sql`column > 123`);\n * });\n * ```\n *\n * @param tableName - name of the table to add the check into\n * @param check - raw SQL for the check\n */\n addCheck(tableName: string, check: RawSQLBase): Promise<void> {\n return addCheck(this, this.up, tableName, check);\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link addCheck}.\n *\n * @param tableName - name of the table to add the check into\n * @param check - raw SQL for the check\n */\n dropCheck(tableName: string, check: RawSQLBase): Promise<void> {\n return addCheck(this, !this.up, tableName, check);\n }\n\n /**\n * Rename a table constraint such as a primary key or a database check.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameConstraint(\n * 'tableName', // may include schema: 'schema.table'\n * 'oldConstraintName',\n * 'newConstraintName',\n * );\n * });\n * ```\n *\n * @param tableName - name of the table containing the constraint, may include schema name, may include schema name\n * @param from - current name of the constraint\n * @param to - desired name\n */\n renameConstraint(tableName: string, from: string, to: string): Promise<void> {\n return renameTableItem(this, tableName, from, to, 'CONSTRAINT');\n }\n\n /**\n * Rename a column:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameColumn('tableName', 'oldColumnName', 'newColumnName');\n * });\n * ```\n *\n * @param tableName - name of the table to rename the column in\n * @param from - rename column from\n * @param to - rename column to\n */\n renameColumn(tableName: string, from: string, to: string): Promise<void> {\n return this.changeTable(tableName, (t) => ({\n [from]: t.rename(to),\n }));\n }\n\n /**\n * `createSchema` creates a database schema, and removes it on rollback.\n *\n * `dropSchema` takes the same arguments, removes schema on migration, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createSchema('schemaName');\n * });\n * ```\n *\n * @param schemaName - name of the schema\n */\n createSchema(schemaName: string): Promise<void> {\n return createSchema(this, this.up, schemaName);\n }\n\n /**\n * Renames a database schema, renames it backwards on roll back.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameSchema('from', 'to');\n * });\n * ```\n *\n * @param from - existing schema to rename\n * @param to - desired schema name\n */\n async renameSchema(from: string, to: string): Promise<void> {\n await this.adapter.query(\n `ALTER SCHEMA \"${this.up ? from : to}\" RENAME TO \"${\n this.up ? to : from\n }\"`,\n );\n }\n\n /**\n * Drop the schema, create it on rollback. See {@link createSchema}.\n *\n * @param schemaName - name of the schema\n */\n dropSchema(schemaName: string): Promise<void> {\n return createSchema(this, !this.up, schemaName);\n }\n\n /**\n * `createExtension` creates a database extension, and removes it on rollback.\n *\n * `dropExtension` takes the same arguments, removes the extension on migrate, and adds it on rollback.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createExtension('pg_trgm');\n * });\n * ```\n *\n * @param name - name of the extension\n * @param options - extension options\n */\n createExtension(\n name: string,\n options?: RakeDbAst.ExtensionArg,\n ): Promise<void> {\n return createExtension(this, this.up, name, options);\n }\n\n /**\n * Drop the extension, create it on rollback. See {@link createExtension}.\n *\n * @param name - name of the extension\n * @param options - extension options\n */\n dropExtension(name: string, options?: RakeDbAst.ExtensionArg): Promise<void> {\n return createExtension(this, !this.up, name, options);\n }\n\n /**\n * `createEnum` creates an enum on migrate, drops it on rollback.\n *\n * `dropEnum` does the opposite.\n *\n * Third argument for options is optional.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createEnum('number', ['one', 'two', 'three']);\n *\n * // use `schemaName.enumName` format to specify a schema\n * await db.createEnum('customSchema.mood', ['sad', 'ok', 'happy'], {\n * // following options are used when dropping enum\n * dropIfExists: true,\n * cascade: true,\n * });\n * });\n * ```\n *\n * @param name - name of the enum\n * @param values - possible enum values\n * @param options - enum options\n */\n createEnum(\n name: string,\n values: [string, ...string[]],\n options?: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n >,\n ): Promise<void> {\n return createEnum(this, this.up, name, values, options);\n }\n\n /**\n * Drop the enum, create it on rollback. See {@link createEnum}.\n *\n * @param name - name of the enum\n * @param values - possible enum values\n * @param options - enum options\n */\n dropEnum(\n name: string,\n values: [string, ...string[]],\n options?: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n >,\n ): Promise<void> {\n return createEnum(this, !this.up, name, values, options);\n }\n\n /**\n * Use these methods to add or drop one or multiple values from an existing enum.\n *\n * `addEnumValues` will drop values when rolling back the migration.\n *\n * Dropping a value internally acts in multiple steps:\n *\n * 1. Select all columns from the database that depends on the enum;\n * 2. Alter all these columns to have text type;\n * 3. Drop the enum;\n * 4. Re-create the enum without the value given;\n * 5. Alter all columns from the first step to have the enum type;\n *\n * In the case when the value is used by some table,\n * migrating `dropEnumValue` or rolling back `addEnumValue` will throw an error with a descriptive message,\n * in such case you'd need to manually resolve the issue by deleting rows with the value, or changing such values.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.addEnumValue('numbers', 'four');\n *\n * // you can pass options\n * await db.addEnumValue('numbers', 'three', {\n * // where to insert\n * before: 'four',\n * // skip if already exists\n * ifNotExists: true,\n * });\n *\n * // enum name can be prefixed with schema\n * await db.addEnumValue('public.numbers', 'five', {\n * after: 'four',\n * });\n * });\n * ```\n *\n * @param enumName - target enum name\n * @param values - array of values to add\n * @param options - optional object with options\n * @param options.before - insert before the specified value\n * @param options.after - insert after the specified value\n * @param options.ifNotExists - skip adding if already exists\n */\n addEnumValues(\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n ): Promise<void> {\n return addOrDropEnumValues(this, this.up, enumName, values, options);\n }\n\n /**\n * See {@link addEnumValues}\n */\n dropEnumValues(\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n ): Promise<void> {\n return addOrDropEnumValues(this, !this.up, enumName, values, options);\n }\n\n /**\n * Rename one or multiple enum values using this method:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * // rename value \"from\" to \"to\"\n * await db.rename('numbers', { from: 'to' });\n *\n * // enum name can be prefixed with schema\n * await db.rename('public.numbers', { from: 'to' });\n * });\n * ```\n *\n * @param enumName - target enum name, can be prefixed with schema\n * @param values - object where keys are for old names, values are for new names\n */\n async renameEnumValues(\n enumName: string,\n values: RecordString,\n ): Promise<void> {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n\n const ast: RakeDbAst.RenameEnumValues = {\n type: 'renameEnumValues',\n schema,\n name,\n values,\n };\n\n for (const pair of Object.entries(ast.values)) {\n const [from, to] = this.up ? pair : [pair[1], pair[0]];\n await this.adapter.query(\n `ALTER TYPE ${quoteTable(\n ast.schema,\n ast.name,\n )} RENAME VALUE \"${from}\" TO \"${to}\"`,\n );\n }\n }\n\n /**\n * Drops the enum and re-creates it with a new set of values.\n * Before dropping, changes all related column types to text, and after creating changes types back to the enum,\n * in the same way as [dropEnumValues](/guide/migration-writing.html#addenumvalues,-dropenumvalues) works.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeEnumValues(\n * // can be prefixed with schema: 'public.numbers'\n * 'numbers',\n * // change from:\n * ['one', 'two'],\n * // change to:\n * ['three', 'four'],\n * );\n * });\n * ```\n *\n * @param enumName - target enum name, can be prefixed with schema\n * @param fromValues - array of values before the change\n * @param toValues - array of values to set\n */\n changeEnumValues(\n enumName: string,\n fromValues: string[],\n toValues: string[],\n ): Promise<void> {\n return changeEnumValues(this, enumName, fromValues, toValues);\n }\n\n /**\n * Rename a type (such as enum):\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameType('oldTypeName', 'newTypeName');\n * });\n * ```\n *\n * Prefix the type name with a schema to set a different schema:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameType('fromSchema.oldType', 'toSchema.newType');\n * });\n * ```\n *\n * @param from - rename the type from\n * @param to - rename the type to\n */\n renameType(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'TYPE');\n }\n\n /**\n * Set a different schema to the type (such as enum):\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.changeTypeSchema('typeName', 'fromSchema', 'toSchema');\n * });\n * ```\n *\n * @param name - type name\n * @param from - current table schema\n * @param to - desired table schema\n */\n changeTypeSchema(name: string, from: string, to: string): Promise<void> {\n return this.renameType(`${from}.${name}`, `${to}.${name}`);\n }\n\n /**\n * Domain is a custom database type that is based on other type and can include `NOT NULL` and a `CHECK` (see [postgres tutorial](https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/)).\n *\n * Construct a column type in the function as the second argument.\n *\n * Specifiers [nullable](/guide/common-column-methods.html#nullable), [default](/guide/common-column-methods.html#default), [check](/guide/migration-column-methods.html#check), [collate](/guide/migration-column-methods.html#collate)\n * will be saved to the domain type on database level.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createDomain('domainName', (t) =>\n * t.integer().check(t.sql`value = 42`),\n * );\n *\n * // use `schemaName.domainName` format to specify a schema\n * await db.createDomain('schemaName.domainName', (t) =>\n * t\n * .text()\n * .nullable()\n * .collate('C')\n * .default('default text')\n * .check(t.sql`length(value) > 10`),\n * );\n * });\n * ```\n *\n * @param name - name of the domain\n * @param fn - function returning a column type. Options `nullable`, `collate`, `default`, `check` will be applied to domain\n */\n createDomain(name: string, fn: DbDomainArg<CT>): Promise<void> {\n return createDomain(this, this.up, name, fn);\n }\n\n /**\n * Drop the domain, create it on rollback. See {@link dropDomain}.\n *\n * @param name - name of the domain\n * @param fn - function returning a column type. Options `nullable`, `collate`, `default`, `check` will be applied to domain\n */\n dropDomain(name: string, fn: DbDomainArg<CT>): Promise<void> {\n return createDomain(this, !this.up, name, fn);\n }\n\n /**\n * To rename a domain:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.renameDomain('oldName', 'newName');\n *\n * // to move domain to a different schema\n * await db.renameDomain('oldSchema.domain', 'newSchema.domain');\n * });\n * ```\n *\n * @param from - old domain name (can include schema)\n * @param to - new domain name (can include schema)\n */\n renameDomain(from: string, to: string): Promise<void> {\n return renameType(this, from, to, 'DOMAIN');\n }\n\n /**\n * Create and drop a database collation, (see [Postgres docs](https://www.postgresql.org/docs/current/sql-createcollation.html)).\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('myCollation', {\n * // This is a shortcut for setting lcCollate and lcCType at once.\n * locale: 'en-u-kn-true',\n *\n * // set `lcType` and `lcCType` only if the `locale` is not set.\n * // lcType: 'C',\n * // lcCType: 'C',\n *\n * // provider can be 'icu' or 'libc'. 'libc' is a default.\n * provider: 'icu',\n *\n * // true by default, false is only supported with 'icu' provider.\n * deterministic: true,\n *\n * // Is intended to by used by `pg_upgrade`. Normally, it should be omitted.\n * version: '1.2.3',\n *\n * // For `CREATE IF NOT EXISTS` when creating.\n * createIfNotExists: true,\n *\n * // For `DROP IF EXISTS` when dropping.\n * dropIfExists: true,\n *\n * // For `DROP ... CASCADE` when dropping.\n * cascase: true,\n * });\n * });\n * ```\n *\n * Instead of specifying the collation options, you can specify a collation to copy options from.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('myCollation', {\n * fromExisting: 'otherCollation',\n * });\n * });\n * ```\n *\n * To create a collation withing a specific database schema, prepend it to the collation name:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createCollation('schemaName.myCollation', {\n * // `fromExisting` also can accept a collation name with a schema.\n * fromExisting: 'schemaName.otherCollation',\n * });\n * });\n * ```\n *\n * @param name - name of the collation, can contain a name of schema separated with a dot.\n * @param options - options to create and drop the collation.\n */\n createCollation(\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n ): Promise<void> {\n return createCollation(this, this.up, name, options);\n }\n\n /**\n * Drop the collation, create it on rollback. See {@link createCollation}.\n *\n * @param name - name of the collation, can contain a name of schema separated with a dot.\n * @param options - options to create and drop the collation.\n */\n dropCollation(\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n ): Promise<void> {\n return createCollation(this, !this.up, name, options);\n }\n\n /**\n * Create and drop database views.\n *\n * Provide SQL as a string or via `t.sql` that can accept variables.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createView(\n * 'simpleView',\n * `\n * SELECT a.one, b.two\n * FROM a\n * JOIN b ON b.\"aId\" = a.id\n * `,\n * );\n *\n * // view can accept t.sql with variables in such way:\n * const value = 'some value';\n * await db.createView(\n * 'viewWithVariables',\n * t.sql`\n * SELECT * FROM a WHERE key = ${value}\n * `,\n * );\n *\n * // view with options\n * await db.createView(\n * 'schemaName.recursiveView',\n * {\n * // createOrReplace has effect when creating the view\n * createOrReplace: true,\n *\n * // dropIfExists and dropMode have effect when dropping the view\n * dropIfExists: true,\n * dropMode: 'CASCADE',\n *\n * // for details, check Postgres docs for CREATE VIEW,\n * // these options are matching CREATE VIEW options\n * temporary: true,\n * recursive: true,\n * columns: ['n'],\n * with: {\n * checkOption: 'LOCAL', // or 'CASCADED'\n * securityBarrier: true,\n * securityInvoker: true,\n * },\n * },\n * `\n * VALUES (1)\n * UNION ALL\n * SELECT n + 1 FROM \"schemaName\".\"recursiveView\" WHERE n < 100;\n * `,\n * );\n * });\n * ```\n *\n * @param name - name of the view\n * @param options - view options\n * @param sql - SQL to create the view with\n */\n createView(\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n ): Promise<void>;\n /**\n * See {@link createView}\n *\n * @param name - name of the view\n * @param sql - SQL to create the view with\n */\n createView(name: string, sql: string | RawSQLBase): Promise<void>;\n createView(name: string, ...args: unknown[]): Promise<void> {\n const [options, sql] = args.length === 2 ? args : [emptyObject, args[0]];\n\n return createView(\n this,\n this.up,\n name,\n options as RakeDbAst.ViewOptions,\n sql as string | RawSQLBase,\n );\n }\n\n /**\n * Drop the view, create it on rollback. See {@link createView}.\n *\n * @param name - name of the view\n * @param options - view options\n * @param sql - SQL to create the view with\n */\n dropView(\n name: string,\n options: RakeDbAst.ViewOptions,\n sql: string | RawSQLBase,\n ): Promise<void>;\n /**\n * Drop the view, create it on rollback. See {@link createView}.\n *\n * @param name - name of the view\n * @param sql - SQL to create the view with\n */\n dropView(name: string, sql: string | RawSQLBase): Promise<void>;\n dropView(name: string, ...args: unknown[]): Promise<void> {\n const [options, sql] = args.length === 2 ? args : [emptyObject, args[0]];\n\n return createView(\n this,\n !this.up,\n name,\n options as RakeDbAst.ViewOptions,\n sql as string | RawSQLBase,\n );\n }\n\n /**\n * Returns boolean to know if table exists:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.tableExists('tableName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param tableName - name of the table\n */\n async tableExists(tableName: string): Promise<boolean> {\n return queryExists(this, {\n text: `SELECT 1 FROM \"information_schema\".\"tables\" WHERE \"table_name\" = $1`,\n values: [tableName],\n });\n }\n\n /**\n * Returns boolean to know if a column exists:\n *\n * Note that when `snakeCase` option is set to true, this method won't translate column to snake case, unlike other parts.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.columnExists('tableName', 'columnName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param tableName - name of the table to check for the column in\n * @param columnName - name of the column\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: [\n tableName,\n this.options.snakeCase ? toSnakeCase(columnName) : columnName,\n ],\n });\n }\n\n /**\n * Returns boolean to know if constraint exists:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * if (await db.constraintExists('constraintName')) {\n * // ...do something\n * }\n * });\n * ```\n *\n * @param constraintName - name of the constraint\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\n/**\n * If `log` object is specified, it will perform the query with logging.\n *\n * @param log - logger object\n * @param text - SQL text\n * @param values - SQL values\n * @param fn - function to call the original `query` or `arrays`\n */\nconst wrapWithLog = async <Result>(\n log: QueryLogObject | undefined,\n text: string,\n values: unknown[] | undefined,\n fn: () => Promise<Result>,\n): Promise<Result> => {\n if (!log) {\n return fn();\n } else {\n const sql = {\n text,\n values: values || [],\n };\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\n/**\n * See {@link Migration.prototype.addColumn}\n */\nconst addColumn = <CT>(\n migration: Migration<CT>,\n up: boolean,\n tableName: string,\n columnName: string,\n fn: (t: MigrationColumnTypes<CT>) => Column,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n [columnName]: t.add(fn(t)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addIndex}\n */\nconst addIndex = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n ...args: [options?: TableData.Index.OptionsArg]\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.index(columns, ...args)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addForeignKey}\n */\nconst addForeignKey = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: [string, ...string[]],\n foreignTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.foreignKey(columns, foreignTable, foreignColumns, options)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addPrimaryKey}\n */\nconst addPrimaryKey = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n columns: [string, ...string[]],\n name?: string,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.primaryKey(columns, name)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.addCheck}\n */\nconst addCheck = (\n migration: Migration<unknown>,\n up: boolean,\n tableName: string,\n check: RawSQLBase,\n): Promise<void> => {\n return changeTable(migration, up, tableName, {}, (t) => ({\n ...t.add(t.check(check)),\n }));\n};\n\n/**\n * See {@link Migration.prototype.createSchema}\n */\nconst createSchema = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n): Promise<void> => {\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\n/**\n * See {@link Migration.createExtension}\n */\nconst createExtension = async (\n migration: Migration<unknown>,\n up: boolean,\n fullName: string,\n options?: RakeDbAst.ExtensionArg,\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(fullName);\n\n const ast: RakeDbAst.Extension = {\n type: 'extension',\n action: up ? 'create' : 'drop',\n schema,\n name,\n ...options,\n };\n\n let query;\n if (ast.action === 'drop') {\n query = `DROP EXTENSION${ast.dropIfExists ? ' IF EXISTS' : ''} \"${\n ast.name\n }\"${ast.cascade ? ' CASCADE' : ''}`;\n } else {\n query = `CREATE EXTENSION${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } \"${ast.name}\"${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\n/**\n * See {@link Migration.prototype.createEnum}\n */\nconst createEnum = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n values: [string, ...string[]],\n options: Omit<\n RakeDbAst.Enum,\n 'type' | 'action' | 'name' | 'values' | 'schema'\n > = {},\n): Promise<void> => {\n const [schema, enumName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Enum = {\n type: 'enum',\n action: up ? 'create' : 'drop',\n schema,\n name: enumName,\n values,\n ...options,\n };\n\n let query;\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n query = `CREATE TYPE ${quotedName} AS ENUM (${values\n .map(escapeForMigration)\n .join(', ')})`;\n } else {\n query = `DROP TYPE${ast.dropIfExists ? ' IF EXISTS' : ''} ${quotedName}${\n ast.cascade ? ' CASCADE' : ''\n }`;\n }\n\n await migration.adapter.query(query);\n};\n\n/**\n * See {@link Migration.prototype.createDomain}\n */\nconst createDomain = async <CT>(\n migration: Migration<CT>,\n up: boolean,\n name: string,\n fn: DbDomainArg<CT>,\n): Promise<void> => {\n const [schema, domainName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Domain = {\n type: 'domain',\n action: up ? 'create' : 'drop',\n schema,\n name: domainName,\n baseType: fn(migration.columnTypes),\n };\n\n let query;\n const values: unknown[] = [];\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n const column = ast.baseType;\n query = `CREATE DOMAIN ${quotedName} AS ${columnTypeToSql(column)}${\n column.data.collate\n ? `\nCOLLATE \"${column.data.collate}\"`\n : ''\n }${\n column.data.default !== undefined\n ? `\nDEFAULT ${encodeColumnDefault(column.data.default, values)}`\n : ''\n }${!column.data.isNullable || column.data.checks ? '\\n' : ''}${[\n !column.data.isNullable && 'NOT NULL',\n column.data.checks\n ?.map((check) => `CHECK (${check.sql.toSQL({ values })})`)\n .join(' '),\n ]\n .filter(Boolean)\n .join(' ')}`;\n } else {\n query = `DROP DOMAIN ${quotedName}`;\n }\n\n await migration.adapter.query(\n interpolateSqlValues({\n text: query,\n values,\n }),\n );\n};\n\n/**\n * See {@link Migration.prototype.createCollation}\n */\nconst createCollation = async (\n migration: Migration<unknown>,\n up: boolean,\n name: string,\n options: Omit<RakeDbAst.Collation, 'type' | 'action' | 'schema' | 'name'>,\n): Promise<void> => {\n const [schema, collationName] = getSchemaAndTableFromName(name);\n\n const ast: RakeDbAst.Collation = {\n type: 'collation',\n action: up ? 'create' : 'drop',\n schema,\n name: collationName,\n ...options,\n };\n\n let query;\n const quotedName = quoteWithSchema(ast);\n if (ast.action === 'create') {\n query = `CREATE COLLATION${\n ast.createIfNotExists ? ' IF NOT EXISTS' : ''\n } ${quotedName} `;\n\n if (ast.fromExisting) {\n query += `FROM ${quoteNameFromString(ast.fromExisting)}`;\n } else {\n const config: string[] = [];\n if (ast.locale) config.push(`locale = '${ast.locale}'`);\n if (ast.lcCollate) config.push(`lc_collate = '${ast.lcCollate}'`);\n if (ast.lcCType) config.push(`lc_ctype = '${ast.lcCType}'`);\n if (ast.provider) config.push(`provider = ${ast.provider}`);\n if (ast.deterministic !== undefined)\n config.push(`deterministic = ${ast.deterministic}`);\n if (ast.version) config.push(`version = '${ast.version}'`);\n\n query += `(\\n ${config.join(',\\n ')}\\n)`;\n }\n } else {\n query = `DROP COLLATION${\n ast.dropIfExists ? ' IF EXISTS' : ''\n } ${quotedName}${ast.cascade ? ` CASCADE` : ''}`;\n }\n\n await migration.adapter.query(query);\n};\n\n/**\n * Run the query and check if it has rows.\n *\n * @param db - migration instance\n * @param sql - raw SQL object to execute\n */\nconst queryExists = (\n db: Migration<unknown>,\n sql: { text: string; values: unknown[] },\n): Promise<boolean> => {\n return db.adapter\n .query(sql.text, sql.values)\n .then(({ rowCount }) => rowCount > 0);\n};\n\nexport const renameType = async (\n migration: Migration<unknown>,\n from: string,\n to: string,\n kind: RakeDbAst.RenameType['kind'],\n): Promise<void> => {\n const [fromSchema, f] = getSchemaAndTableFromName(migration.up ? from : to);\n const [toSchema, t] = getSchemaAndTableFromName(migration.up ? to : from);\n const ast: RakeDbAst.RenameType = {\n type: 'renameType',\n kind,\n fromSchema,\n from: f,\n toSchema,\n to: t,\n };\n\n if (ast.from !== ast.to) {\n await migration.adapter.query(\n `ALTER ${ast.kind} ${quoteTable(ast.fromSchema, ast.from)} RENAME TO \"${\n ast.to\n }\"`,\n );\n }\n\n if (ast.fromSchema !== ast.toSchema) {\n await migration.adapter.query(\n `ALTER ${ast.kind} ${quoteTable(ast.fromSchema, ast.to)} SET SCHEMA \"${\n ast.toSchema ?? migration.adapter.schema\n }\"`,\n );\n }\n};\n\nconst renameTableItem = async (\n migration: Migration<unknown>,\n tableName: string,\n from: string,\n to: string,\n kind: RakeDbAst.RenameTableItem['kind'],\n) => {\n const [schema, table] = getSchemaAndTableFromName(tableName);\n const [f, t] = migration.up ? [from, to] : [to, from];\n await migration.adapter.query(\n kind === 'INDEX'\n ? `ALTER INDEX ${quoteTable(schema, f)} RENAME TO \"${t}\"`\n : `ALTER TABLE ${quoteTable(\n schema,\n table,\n )} RENAME CONSTRAINT \"${f}\" TO \"${t}\"`,\n );\n};\n\ninterface AddEnumValueOptions {\n // add only if not already exists\n ifNotExists?: boolean;\n // insert before other value\n before?: string;\n // insert after other value\n after?: string;\n}\n\nexport const addOrDropEnumValues = async (\n migration: Migration<unknown>,\n up: boolean,\n enumName: string,\n values: string[],\n options?: AddEnumValueOptions,\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n const quotedName = quoteTable(schema, name);\n\n const ast: RakeDbAst.EnumValues = {\n type: 'enumValues',\n action: up ? 'add' : 'drop',\n schema,\n name,\n values,\n place: options?.before ? 'before' : options?.after ? 'after' : undefined,\n relativeTo: options?.before ?? options?.after,\n ifNotExists: options?.ifNotExists,\n };\n\n if (ast.action === 'add') {\n await Promise.all(\n (ast.place === 'after' ? [...ast.values].reverse() : ast.values).map(\n (value) =>\n migration.adapter.query(\n `ALTER TYPE ${quoteTable(ast.schema, ast.name)} ADD VALUE${\n ast.ifNotExists ? ' IF NOT EXISTS' : ''\n } ${singleQuote(value)}${\n ast.place && ast.relativeTo\n ? ` ${ast.place.toUpperCase()} ${singleQuote(ast.relativeTo)}`\n : ''\n }`,\n ),\n ),\n );\n return;\n }\n\n const { rows: valuesRows } = await migration.adapter.query<{ value: string }>(\n `SELECT unnest(enum_range(NULL::${quotedName}))::text value`,\n );\n const existingValues = valuesRows.map((r) => r.value);\n\n await recreateEnum(\n migration,\n ast,\n existingValues.filter((v) => !ast.values.includes(v)),\n (quotedName, table, column) =>\n `Cannot drop ${quotedName} enum values [${ast.values\n .map(singleQuote)\n .join(\n ', ',\n )}]: table ${table} has a row with such value in the column \"${column}\"`,\n );\n};\n\nexport const changeEnumValues = async (\n migration: Migration<unknown>,\n enumName: string,\n fromValues: string[],\n toValues: string[],\n): Promise<void> => {\n const [schema, name] = getSchemaAndTableFromName(enumName);\n\n if (!migration.up) {\n const values = fromValues;\n fromValues = toValues;\n toValues = values;\n }\n\n const ast: RakeDbAst.ChangeEnumValues = {\n type: 'changeEnumValues',\n schema,\n name,\n fromValues,\n toValues,\n };\n\n await recreateEnum(\n migration,\n ast,\n ast.toValues,\n (quotedName, table, column) =>\n `Cannot change ${quotedName} enum values from [${fromValues\n .map(singleQuote)\n .join(', ')}] to [${toValues\n .map(singleQuote)\n .join(\n ', ',\n )}]: table ${table} has a row with removed value in the column \"${column}\"`,\n );\n};\n\nconst recreateEnum = async (\n migration: Migration<unknown>,\n { schema, name }: { schema?: string; name: string },\n values: string[],\n errorMessage: (quotedName: string, table: string, column: string) => string,\n) => {\n const defaultSchema = migration.adapter.schema;\n const quotedName = quoteTable(schema, name);\n\n const relKinds = ['r', 'm']; // r is for table, m is for materialized views, TODO: not sure if materialized views are needed here.\n const { rows: tables } = await migration.adapter.query<{\n schema: string;\n table: string;\n columns: { name: string; arrayDims: number }[];\n }>(\n `SELECT n.nspname AS \"schema\",\n c.relname AS \"table\",\n json_agg(\n json_build_object('name', a.attname, 'arrayDims', a.attndims)\n ORDER BY a.attnum\n ) AS \"columns\"\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nJOIN pg_type bt ON bt.typname = ${singleQuote(name)}\nJOIN pg_type t ON t.oid = bt.oid OR t.typelem = bt.oid\nJOIN pg_attribute a ON a.attrelid = c.oid AND a.atttypid = t.oid\nJOIN pg_namespace tn ON tn.oid = t.typnamespace AND tn.nspname = ${singleQuote(\n schema ?? defaultSchema,\n )}\nWHERE c.relkind IN (${relKinds.map((c) => `'${c}'`).join(', ')})\nGROUP BY n.nspname, c.relname`,\n );\n\n const sql = tables.map(\n (t) =>\n `ALTER TABLE ${quoteTable(t.schema, t.table)}\n ${t.columns\n .map(\n (c) =>\n ` ALTER COLUMN \"${c.name}\" TYPE text${'[]'.repeat(c.arrayDims)}`,\n )\n .join(',\\n')}`,\n );\n\n sql.push(\n `DROP TYPE ${quotedName}`,\n `CREATE TYPE ${quotedName} AS ENUM (${values.map(singleQuote).join(', ')})`,\n );\n\n await migration.adapter.query(sql.join(';\\n'));\n\n for (const t of tables) {\n const table = quoteTable(t.schema, t.table);\n for (const c of t.columns) {\n const type = quotedName + '[]'.repeat(c.arrayDims);\n\n try {\n await migration.adapter.query(\n `ALTER TABLE ${table}\n ALTER COLUMN \"${c.name}\" TYPE ${type} USING \"${c.name}\"::${type}`,\n );\n } catch (err) {\n if ((err as { code: string }).code === '22P02') {\n throw new Error(errorMessage(quotedName, table, c.name), {\n cause: err,\n });\n }\n throw err;\n }\n }\n }\n};\n","import {\n getFirstWordAndRest,\n getTextAfterFrom,\n getTextAfterTo,\n RakeDbCtx,\n} from '../common';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { getImportPath, pathToLog } from 'pqb';\nimport { AnyRakeDbConfig } from '../config';\nimport { getMigrations } from '../migration/migrationsSet';\n\nexport const writeMigrationFile = async (\n config: AnyRakeDbConfig,\n version: string,\n name: string,\n migrationCode: string,\n): Promise<void> => {\n await mkdir(config.migrationsPath, { recursive: true });\n\n const filePath = path.resolve(\n config.migrationsPath,\n `${version}_${name.replaceAll(' ', '-')}.ts`,\n );\n const importPath = getImportPath(\n filePath,\n path.join(config.basePath, config.dbScript),\n );\n\n await writeFile(\n filePath,\n `import { change } from '${importPath}';\\n${migrationCode}`,\n );\n\n config.logger?.log(`Created ${pathToLog(filePath)}`);\n};\n\nexport const newMigration = async (\n config: AnyRakeDbConfig,\n [name]: string[],\n): Promise<void> => {\n if (!name) throw new Error('Migration name is missing');\n\n const version = await makeFileVersion({}, config);\n await writeMigrationFile(config, version, name, makeContent(name));\n};\n\nexport const makeFileVersion = async (\n ctx: RakeDbCtx,\n config: AnyRakeDbConfig,\n) => {\n if (config.migrationId === 'timestamp') {\n return generateTimeStamp();\n } else {\n const {\n migrations: [first],\n } = await getMigrations(ctx, config, false);\n return first\n ? String(parseInt(first.version) + 1).padStart(4, '0')\n : '0001';\n }\n};\n\nexport const generateTimeStamp = () => {\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): string => {\n let content = `\\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 \\n }));`;\n } else if (first === 'change') {\n content += `\\n await db.changeTable('${rest}', (t) => ({\\n \\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 \\n }));`;\n }\n }\n\n return content + '\\n});\\n';\n};\n","import { AnyRakeDbConfig, PickMigrationsTable } from '../config';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { generateTimeStamp } from './newMigration';\nimport { getMigrations } from '../migration/migrationsSet';\nimport { AdapterBase } from 'pqb';\n\nexport const fileNamesToChangeMigrationId = {\n serial: '.rename-to-serial.json',\n timestamp: '.rename-to-timestamp.json',\n};\n\nexport const fileNamesToChangeMigrationIdMap = Object.fromEntries(\n Object.entries(fileNamesToChangeMigrationId).map(([_, name]) => [name, true]),\n);\n\nexport const changeIds = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n [arg, digitsArg]: string[],\n) => {\n if (arg !== 'serial' && arg !== 'timestamp') {\n throw new Error(\n `Pass \"serial\" or \"timestamp\" argument to the \"change-ids\" command`,\n );\n }\n\n let digits = digitsArg && parseInt(digitsArg);\n if (!digits || isNaN(digits)) digits = 4;\n\n const data = await getMigrations({}, config, true, false, (_, filePath) => {\n const fileName = path.basename(filePath);\n const match = fileName.match(/^(\\d+)\\D/);\n if (!match) {\n throw new Error(\n `Migration file name should start digits, received ${fileName}`,\n );\n }\n\n return match[1];\n });\n\n if (data.renameTo) {\n if (\n (arg === 'serial' &&\n typeof data.renameTo.to === 'object' &&\n digits === data.renameTo.to.serial) ||\n (arg === 'timestamp' && data.renameTo.to === 'timestamp')\n ) {\n config.logger?.log(\n config.migrations\n ? '`renameMigrations` setting is already set'\n : `${fileNamesToChangeMigrationId[arg]} already exists`,\n );\n return;\n }\n\n if (!config.migrations) {\n await fs.unlink(\n path.join(\n config.migrationsPath,\n fileNamesToChangeMigrationId[\n data.renameTo.to === 'timestamp' ? 'timestamp' : 'serial'\n ],\n ),\n );\n }\n }\n\n const version = arg === 'timestamp' ? parseInt(generateTimeStamp()) : 1;\n\n const rename: Record<string, number> = Object.fromEntries(\n data.migrations.map((item, i) => [path.basename(item.path), version + i]),\n );\n\n if (config.migrations) {\n const to = arg === 'timestamp' ? `'${arg}'` : `{ serial: ${digits} }`;\n config.logger?.log(\n `Save the following settings into your rake-db config under the \\`migrations\\` setting, it will instruct rake-db to rename migration entries during the next deploy:\\n${\n arg !== 'serial' || digits !== 4 ? `\\nmigrationId: ${to},` : ''\n }\\nrenameMigrations: {\\n to: ${to},\\n map: {\\n ` +\n Object.entries(rename)\n .map(([key, value]) => `\"${key}\": ${value},`)\n .join('\\n ') +\n '\\n },\\n},\\n\\n',\n );\n } else {\n await fs.writeFile(\n path.join(config.migrationsPath, fileNamesToChangeMigrationId[arg]),\n JSON.stringify(rename, null, 2),\n );\n }\n\n const values: RenameMigrationVersionsValue[] = data.migrations.map(\n (item, i) => {\n let newVersion = String(version + i);\n\n if (arg === 'serial') newVersion = newVersion.padStart(digits, '0');\n\n const name = path.basename(item.path).slice(item.version.length + 1);\n\n return [item.version, name, newVersion];\n },\n );\n if (!values.length) return;\n\n if (config.migrations) {\n config.logger?.log(\n `If your migrations are stored in files, navigate to migrations directory and run the following commands to rename them:\\n\\n${values\n .map(\n ([version, name, newVersion]) =>\n `mv \"${version}_${name}\" \"${newVersion}_${name}\"`,\n )\n .join(\n '\\n',\n )}\\n\\nAfter setting \\`renameMigrations\\` (see above) and renaming the files, run the db up command to rename migration entries in your database`,\n );\n return;\n }\n\n await Promise.all(\n data.migrations.map(async (item, i) => {\n const [, name, newVersion] = values[i];\n await fs.rename(\n item.path,\n path.join(path.dirname(item.path), `${newVersion}_${name}`),\n );\n }),\n );\n\n await Promise.all(\n adapters.map((adapter) => {\n renameMigrationVersionsInDb(config, adapter, values).then(() =>\n adapter.close(),\n );\n }),\n );\n\n config.logger?.log(\n `Migration files were renamed, a config file ${\n fileNamesToChangeMigrationId[arg]\n } for renaming migrations after deploy was created, and migrations in local db were renamed successfully.\\n\\n${\n arg === 'timestamp' || digits !== 4\n ? `Set \\`migrationId\\`: ${\n arg === 'timestamp' ? `'timestamp'` : `{ serial: ${digits} }`\n }`\n : `Remove \\`migrationId\\``\n } setting in the rake-db config`,\n );\n};\n\nexport type RenameMigrationVersionsValue = [\n oldVersion: string,\n name: string,\n newVersion: string | number,\n];\n\nexport const renameMigrationVersionsInDb = async (\n config: PickMigrationsTable,\n adapter: AdapterBase,\n values: RenameMigrationVersionsValue[],\n) => {\n await adapter.arrays(\n `UPDATE \"${\n config.migrationsTable\n }\" AS t SET version = v.version FROM (VALUES ${values\n .map(\n ([oldVersion, , newVersion], i) =>\n `('${oldVersion}', $${i + 1}, '${newVersion}')`,\n )\n .join(\n ', ',\n )}) v(oldVersion, name, version) WHERE t.version = v.oldVersion`,\n values.map(([, name]) => name),\n );\n};\n","import path from 'path';\nimport {\n AnyRakeDbConfig,\n RakeDbRenameMigrations,\n RakeDbRenameMigrationsMap,\n} from '../config';\nimport { RecordString } from 'pqb';\nimport { pathToFileURL } from 'node:url';\nimport { Dirent } from 'node:fs';\nimport { readdir } from 'fs/promises';\nimport { RakeDbCtx } from '../common';\nimport { fileNamesToChangeMigrationIdMap } from '../commands/changeIds';\nimport fs from 'fs/promises';\n\nexport interface MigrationItemHasLoad {\n path?: string;\n\n /**\n * Function that loads the migration content,\n * can store lazy import of a migration file.\n * Promise can return `{ default: x }` where `x` is a return of `change` or an array of such returns.\n */\n load(): Promise<unknown>;\n}\n\nexport interface MigrationItem extends MigrationItemHasLoad {\n path: string;\n version: string;\n}\n\nexport interface MigrationsSet {\n renameTo?: RakeDbRenameMigrations;\n migrations: MigrationItem[];\n}\n\n// If the config has a `migrations` object, it will be returned as array of migration items.\n// If `up` is false, will reverse the resulting array.\n// Otherwise, it will scan directory which is set in `migrationPath` and convert files into migration items.\n// `up` value determines sorting of files: `true` for ascending, `false` for descending.\nexport const getMigrations = async (\n ctx: RakeDbCtx,\n config: Pick<\n AnyRakeDbConfig,\n | 'migrationId'\n | 'renameMigrations'\n | 'migrations'\n | 'basePath'\n | 'import'\n | 'migrationsPath'\n >,\n up: boolean,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> => {\n return (ctx.migrationsPromise ??= config.migrations\n ? getMigrationsFromConfig(\n { ...config, migrations: config.migrations },\n allowDuplicates,\n getVersion,\n )\n : getMigrationsFromFiles(config, allowDuplicates, getVersion)).then(\n (data) =>\n up\n ? data\n : {\n renameTo: data.renameTo,\n migrations: [...data.migrations].reverse(),\n },\n );\n};\n\n// Converts user-provided migrations object into array of migration items.\nfunction getMigrationsFromConfig(\n config: Pick<\n AnyRakeDbConfig,\n 'migrationId' | 'renameMigrations' | 'migrations' | 'basePath'\n >,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> {\n const result: MigrationItem[] = [];\n const versions: RecordString = {};\n\n const { migrations, basePath } = config;\n for (const key in migrations) {\n const version = getVersion(config, path.basename(key));\n if (versions[version] && !allowDuplicates) {\n throw new Error(\n `Migration ${key} has the same version as ${versions[version]}`,\n );\n }\n\n versions[version] = key;\n\n result.push({\n path: path.resolve(basePath, key),\n version,\n load: migrations[key],\n });\n }\n\n const { renameMigrations } = config;\n return Promise.resolve({\n migrations: result,\n renameTo: renameMigrations\n ? { to: renameMigrations.to, map: () => renameMigrations.map }\n : undefined,\n });\n}\n\n// For sorting migration files in ascending sort.\nexport const sortMigrationsAsc = (\n a: { version: string },\n b: { version: string },\n) => +a.version - +b.version;\n\n// Scans files under `migrationsPath` to convert files into migration items.\nexport async function getMigrationsFromFiles(\n config: Pick<AnyRakeDbConfig, 'migrationId' | 'migrationsPath' | 'import'>,\n allowDuplicates?: boolean,\n getVersion = getMigrationVersionOrThrow,\n): Promise<MigrationsSet> {\n const { migrationsPath, import: imp } = config;\n\n const entries = await readdir(migrationsPath, { withFileTypes: true }).catch(\n () => [] as Dirent[],\n );\n\n const versions: RecordString = {};\n\n const result = entries.reduce<MigrationsSet>(\n (data, file) => {\n if (!file.isFile()) return data;\n\n if (fileNamesToChangeMigrationIdMap[file.name]) {\n if (data.renameTo) {\n throw new Error(\n `Both files for renaming to serial and timestamp found, only one must remain`,\n );\n }\n\n const isSerialFile = file.name === '.rename-to-serial.json';\n const isSerialConfig = config.migrationId !== 'timestamp';\n if (\n (isSerialFile && !isSerialConfig) ||\n (!isSerialFile && isSerialConfig)\n ) {\n throw new Error(\n `File ${\n file.name\n } to rename migrations does not match \\`migrationId\\` ${JSON.stringify(\n config.migrationId,\n )} set in config`,\n );\n }\n\n data.renameTo = {\n to: config.migrationId,\n map: () => renameMigrationsMap(config, file.name),\n };\n\n return data;\n } else {\n checkExt(file.name);\n }\n\n const version = getVersion(config, file.name);\n const filePath = path.resolve(migrationsPath, file.name);\n\n if (versions[version] && !allowDuplicates) {\n throw new Error(\n `Migration ${pathToFileURL(\n filePath,\n )} has the same version as ${pathToFileURL(\n versions[version],\n )}\\nRun \\`**db command** rebase\\` to reorganize files with duplicated versions.`,\n );\n }\n\n versions[version] = filePath;\n\n data.migrations.push({\n path: filePath,\n version,\n async load() {\n try {\n await imp(this.path);\n } catch (err) {\n // throw if unknown error\n if (\n (err as { code: string }).code !==\n 'ERR_UNSUPPORTED_ESM_URL_SCHEME'\n )\n throw err;\n\n // this error happens on windows in ESM mode, try import transformed url\n await imp(pathToFileURL(this.path).pathname);\n }\n },\n });\n\n return data;\n },\n { migrations: [] },\n );\n\n result.migrations.sort(sortMigrationsAsc);\n\n return result;\n}\n\nconst renameMigrationsMap = async (\n config: Pick<AnyRakeDbConfig, 'migrationsPath'>,\n fileName: string,\n): Promise<RakeDbRenameMigrationsMap> => {\n const filePath = path.join(config.migrationsPath, fileName);\n\n const json = await fs.readFile(filePath, 'utf-8');\n\n let data: RakeDbRenameMigrationsMap;\n try {\n data = JSON.parse(json);\n if (typeof data !== 'object')\n throw new Error('Config for renaming is not an object');\n } catch (err) {\n throw new Error(`Failed to read ${pathToFileURL(filePath)}`, {\n cause: err,\n });\n }\n\n return data;\n};\n\n// Restrict supported file extensions to `.ts`, `.js`, and `.mjs`.\nfunction checkExt(filePath: string): void {\n const ext = path.extname(filePath);\n if (ext !== '.ts' && ext !== '.js' && ext !== '.mjs') {\n throw new Error(\n `Only .ts, .js, and .mjs files are supported for migration, received: ${filePath}`,\n );\n }\n}\n\n// Extract a 14-chars long timestamp from a beginning of a file name.\nexport function getMigrationVersionOrThrow(\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n filePath: string,\n): string {\n const name = path.basename(filePath);\n const value = getMigrationVersion(config, name);\n if (value) return value;\n\n if (config.migrationId === 'timestamp') {\n throw new Error(\n `Migration file name should start with 14 digit timestamp, received ${name}`,\n );\n } else {\n throw new Error(\n `Migration file name should start with 4 digit serial number, received ${name}.\nYou can automatically change migration ids to serial by running \\`*db-command* change-ids serial\\`.\nTo keep using timestamp ids, set \\`migrationId\\` option of rake-db to 'timestamp'.`,\n );\n }\n}\n\nexport function getMigrationVersion(\n config: Pick<AnyRakeDbConfig, 'migrationId'>,\n name: string,\n) {\n return (\n config.migrationId === 'timestamp'\n ? name.match(/^(\\d{14})(_|\\b)/)\n : name.match(/^(\\d{4})(_|\\b)/)\n )?.[1];\n}\n\nexport function getDigitsPrefix(name: string) {\n const value = name.match(/^(\\d+)\\D/)?.[1];\n if (!value) {\n throw new Error(\n `Migration file should be prefixed with a serial number, received ${name}`,\n );\n }\n\n return value;\n}\n","import { RakeDbCtx } from '../common';\nimport { SilentQueries } from './migration';\nimport {\n AdapterBase,\n RecordOptionalString,\n RecordString,\n RecordUnknown,\n} from 'pqb';\nimport {\n PickBasePath,\n PickImport,\n PickMigrationId,\n PickMigrations,\n PickMigrationsPath,\n PickMigrationsTable,\n PickRenameMigrations,\n RakeDbRenameMigrations,\n} from '../config';\nimport path from 'path';\nimport {\n getDigitsPrefix,\n getMigrations,\n getMigrationVersion,\n} from './migrationsSet';\nimport {\n renameMigrationVersionsInDb,\n RenameMigrationVersionsValue,\n} from '../commands/changeIds';\n\nexport const saveMigratedVersion = async (\n db: SilentQueries,\n version: string,\n name: string,\n config: PickMigrationsTable,\n): Promise<void> => {\n await db.silentArrays(\n `INSERT INTO \"${config.migrationsTable}\"(version, name) VALUES ($1, $2)`,\n [version, name],\n );\n};\n\nexport const deleteMigratedVersion = async (\n db: SilentQueries,\n version: string,\n name: string,\n config: PickMigrationsTable,\n) => {\n const res = await db.silentArrays(\n `DELETE FROM \"${config.migrationsTable}\" WHERE version = $1 AND name = $2`,\n [version, name],\n );\n\n if (res.rowCount === 0) {\n throw new Error(`Migration ${version}_${name} was not found in db`);\n }\n};\n\nexport class NoMigrationsTableError extends Error {}\n\nexport type RakeDbAppliedVersions = {\n map: RecordOptionalString;\n sequence: number[];\n};\n\ninterface MigratedVersionsMapConfig\n extends PickMigrationId,\n PickMigrationsTable,\n PickRenameMigrations,\n PickMigrations,\n PickBasePath,\n PickImport,\n PickMigrationsPath {}\n\nexport const getMigratedVersionsMap = async (\n ctx: RakeDbCtx,\n adapter: AdapterBase,\n config: MigratedVersionsMapConfig,\n renameTo?: RakeDbRenameMigrations,\n): Promise<RakeDbAppliedVersions> => {\n try {\n const table = `\"${config.migrationsTable}\"`;\n\n const result = await adapter.arrays<[string, string]>(\n `SELECT * FROM ${table} ORDER BY version`,\n );\n\n if (!result.fields[1]) {\n const { migrations } = await getMigrations(ctx, config, true);\n\n const map: RecordString = {};\n for (const item of migrations) {\n const name = path.basename(item.path);\n map[item.version] = name.slice(getDigitsPrefix(name).length + 1);\n }\n\n for (const row of result.rows) {\n const [version] = row;\n const name = map[version];\n if (!name) {\n throw new Error(\n `Migration for version ${version} is stored in db but is not found among available migrations`,\n );\n }\n\n row[1] = name;\n }\n\n await adapter.arrays(`ALTER TABLE ${table} ADD COLUMN name TEXT`);\n\n await Promise.all(\n result.rows.map(([version, name]) =>\n adapter.arrays(`UPDATE ${table} SET name = $2 WHERE version = $1`, [\n version,\n name,\n ]),\n ),\n );\n\n await adapter.arrays(\n `ALTER TABLE ${table} ALTER COLUMN name SET NOT NULL`,\n );\n }\n\n let versions = Object.fromEntries(result.rows);\n\n if (renameTo) {\n versions = await renameMigrations(config, adapter, versions, renameTo);\n }\n\n return { map: versions, sequence: result.rows.map((row) => +row[0]) };\n } catch (err) {\n if ((err as RecordUnknown).code === '42P01') {\n throw new NoMigrationsTableError();\n } else {\n throw err;\n }\n }\n};\n\ninterface RenameMigrationsConfig extends PickMigrationId, PickMigrationsTable {}\n\nasync function renameMigrations(\n config: RenameMigrationsConfig,\n trx: AdapterBase,\n versions: RecordString,\n renameTo: RakeDbRenameMigrations,\n) {\n let first: string | undefined;\n for (const version in versions) {\n first = version;\n break;\n }\n\n if (!first || getMigrationVersion(config, first)) return versions;\n\n const values: RenameMigrationVersionsValue[] = [];\n\n const updatedVersions: RecordString = {};\n\n const data = await renameTo.map();\n\n for (const version in versions) {\n const name = versions[version];\n const key = `${version}_${name}`;\n let newVersion = data[key] as string | number;\n if (!newVersion) {\n throw new Error(\n `Failed to find an entry for the migrated ${key} in the renaming config`,\n );\n }\n\n if (typeof renameTo.to === 'object') {\n newVersion = String(newVersion).padStart(renameTo.to.serial, '0');\n }\n\n updatedVersions[newVersion] = name;\n values.push([version, name, newVersion]);\n }\n\n await renameMigrationVersionsInDb(config, trx, values);\n\n return updatedVersions;\n}\n","import { RakeDbConfig } from '../config';\nimport { AdapterBase, ColumnSchemaConfig, RecordUnknown } from 'pqb';\n\nexport const createMigrationsTable = async (\n db: AdapterBase,\n config: Pick<RakeDbConfig<ColumnSchemaConfig>, 'migrationsTable' | 'logger'>,\n) => {\n const { schema } = db;\n if (schema && schema !== 'public') {\n try {\n await db.query(`CREATE SCHEMA \"${schema}\"`);\n config.logger?.log(`Created schema ${schema}`);\n } catch (err) {\n if ((err as { code: string }).code !== '42P06') {\n throw err;\n }\n }\n }\n\n try {\n await db.query(\n `CREATE TABLE \"${config.migrationsTable}\" ( version TEXT NOT NULL, name TEXT NOT NULL )`,\n );\n config.logger?.log('Created versions table');\n } catch (err) {\n if ((err as RecordUnknown).code === '42P07') {\n config.logger?.log('Versions table exists');\n } else {\n throw err;\n }\n }\n};\n","import {\n createDbWithAdapter,\n DbResult,\n AdapterBase,\n ColumnSchemaConfig,\n emptyArray,\n MaybeArray,\n pathToLog,\n QueryLogOptions,\n toArray,\n} from 'pqb';\nimport { queryLock, RakeDbCtx, transaction } from '../common';\nimport {\n clearChanges,\n getCurrentChanges,\n MigrationChange,\n} from '../migration/change';\nimport {\n createMigrationInterface,\n CreateMigrationInterfaceConfig,\n SilentQueries,\n} from '../migration/migration';\nimport {\n getMigratedVersionsMap,\n NoMigrationsTableError,\n deleteMigratedVersion,\n saveMigratedVersion,\n RakeDbAppliedVersions,\n} from '../migration/manageMigratedVersions';\nimport { RakeDbError } from '../errors';\nimport {\n PickAfterChangeCommit,\n PickBasePath,\n PickForceDefaultExports,\n PickImport,\n PickMigrationCallbacks,\n PickMigrationId,\n PickMigrationsPath,\n PickMigrationsTable,\n PickTransactionSetting,\n RakeDbConfig,\n} from '../config';\nimport path from 'path';\nimport { createMigrationsTable } from '../migration/migrationsTable';\nimport {\n getMigrations,\n MigrationItem,\n MigrationItemHasLoad,\n MigrationsSet,\n} from '../migration/migrationsSet';\nimport { versionToString } from '../migration/migration.utils';\n\nexport const RAKE_DB_LOCK_KEY = '8582141715823621641';\n\nexport interface MigrateFnConfig\n extends MigrateOrRollbackConfig,\n PickAfterChangeCommit,\n PickBasePath,\n PickImport,\n PickMigrationsPath,\n PickTransactionSetting {}\n\ninterface MigrateFnParams {\n ctx?: RakeDbCtx;\n adapter: AdapterBase;\n config: MigrateFnConfig;\n count?: number;\n force?: boolean;\n}\n\ntype MigrateFn = (params: MigrateFnParams) => Promise<void>;\n\nconst transactionIfSingle = (\n params: MigrateFnParams,\n fn: (trx: AdapterBase) => Promise<void>,\n) => {\n return params.config.transaction === 'single'\n ? transaction(params.adapter, fn)\n : fn(params.adapter);\n};\n\nfunction makeMigrateFn(\n up: boolean,\n fn: (\n trx: AdapterBase,\n config: MigrateFnConfig,\n set: MigrationsSet,\n versions: RakeDbAppliedVersions,\n count: number,\n force: boolean,\n ) => Promise<MigrationItem[]>,\n): MigrateFn {\n return async (params): Promise<void> => {\n const ctx = params.ctx || {};\n const set = await getMigrations(ctx, params.config, up);\n const count = params.count ?? Infinity;\n const force = params.force ?? false;\n\n let migrations: MigrationItem[] | undefined;\n try {\n await transactionIfSingle(params, async (trx) => {\n const versions = await getMigratedVersionsMap(\n ctx,\n trx,\n params.config,\n set.renameTo,\n );\n\n migrations = await fn(trx, params.config, set, versions, count, force);\n });\n } catch (err) {\n if (err instanceof NoMigrationsTableError) {\n await transactionIfSingle(params, async (trx) => {\n await createMigrationsTable(trx, params.config);\n\n const versions = await getMigratedVersionsMap(\n ctx,\n trx,\n params.config,\n set.renameTo,\n );\n\n migrations = await fn(\n trx,\n params.config,\n set,\n versions,\n count,\n force,\n );\n });\n } else {\n throw err;\n }\n }\n\n params.config.afterChangeCommit?.({\n adapter: params.adapter,\n up,\n migrations: migrations as MigrationItem[],\n });\n };\n}\n\ntype MigrateCommand = (\n adapters: AdapterBase[],\n config: RakeDbConfig<ColumnSchemaConfig>,\n args: string[],\n) => Promise<void>;\n\nconst makeMigrateCommand = (\n migrateFn: MigrateFn,\n defaultCount: number,\n): MigrateCommand => {\n return async (adapters, config, args) => {\n const arg = args[0];\n let force = arg === 'force';\n let count = defaultCount;\n if (arg === 'force') {\n force = true;\n } else {\n force = false;\n const num = arg === 'all' ? Infinity : parseInt(arg || '');\n if (!isNaN(num)) {\n count = num;\n }\n }\n\n for (const adapter of adapters) {\n await migrateFn({ ctx: {}, adapter, config, count, force });\n }\n };\n};\n\n/**\n * Will run all pending yet migrations, sequentially in order,\n * will apply `change` functions top-to-bottom.\n *\n * @param options - options to construct db adapter with\n * @param config - specifies how to load migrations, callbacks, and logger\n * @param args - pass none or `all` to run all migrations, pass int for how many to migrate\n */\nexport const migrate: MigrateFn = makeMigrateFn(\n true,\n (trx, config, set, versions, count, force) =>\n migrateOrRollback(trx, config, set, versions, count, true, false, force),\n);\n\nexport const migrateAndClose: MigrateFn = async (params) => {\n await migrate(params);\n await params.adapter.close();\n};\n\nexport const migrateCommand = makeMigrateCommand(migrate, Infinity);\n\n/**\n * Will roll back one latest applied migration,\n * will apply `change` functions bottom-to-top.\n *\n * Takes the same options as {@link migrate}.\n */\nexport const rollback: MigrateFn = makeMigrateFn(\n false,\n (trx, config, set, versions, count, force) =>\n migrateOrRollback(trx, config, set, versions, count, false, false, force),\n);\n\nexport const rollbackCommand = makeMigrateCommand(rollback, 1);\n\n/**\n * Calls {@link rollback} and then {@link migrate}.\n *\n * Takes the same options as {@link migrate}.\n */\nexport const redo: MigrateFn = makeMigrateFn(\n true,\n async (trx, config, set, versions, count, force) => {\n set.migrations.reverse();\n\n await migrateOrRollback(trx, config, set, versions, count, false, true);\n\n set.migrations.reverse();\n\n return migrateOrRollback(\n trx,\n config,\n set,\n versions,\n count,\n true,\n true,\n force,\n true,\n );\n },\n);\n\nexport const redoCommand = makeMigrateCommand(redo, 1);\n\nconst getDb = (adapter: AdapterBase) =>\n createDbWithAdapter<ColumnSchemaConfig>({ adapter });\n\ninterface MigrateOrRollbackConfig\n extends PickMigrationCallbacks,\n PickMigrationId,\n QueryLogOptions,\n PickForceDefaultExports,\n PickMigrationsTable,\n PickTransactionSetting {\n columnTypes: unknown;\n}\n\nexport const migrateOrRollback = async (\n trx: AdapterBase,\n config: MigrateOrRollbackConfig,\n set: MigrationsSet,\n versions: RakeDbAppliedVersions,\n count: number,\n up: boolean,\n redo: boolean,\n force?: boolean,\n skipLock?: boolean,\n): Promise<MigrationItem[]> => {\n const { sequence, map: versionsMap } = versions;\n\n if (up) {\n const rollbackTo = checkMigrationOrder(config, set, versions, force);\n\n if (rollbackTo) {\n let i = sequence.length - 1;\n for (; i >= 0; i--) {\n if (rollbackTo >= sequence[i]) {\n i++;\n break;\n }\n }\n if (i < 0) i = 0;\n\n set.migrations.reverse();\n\n await migrateOrRollback(\n trx,\n config,\n set,\n versions,\n sequence.length - i,\n false,\n redo,\n );\n\n set.migrations.reverse();\n }\n }\n\n if (!skipLock) await queryLock(trx);\n\n let db: DbResult<unknown> | undefined;\n\n const beforeMigrate = config[up ? 'beforeMigrate' : 'beforeRollback'];\n if (beforeMigrate || config.beforeChange) {\n db ??= getDb(trx);\n const { migrations } = set;\n await beforeMigrate?.({ db, migrations });\n await config.beforeChange?.({ db, migrations, up, redo });\n }\n\n let loggedAboutStarting = false;\n\n let migrations: MigrationItem[] | undefined;\n\n const migrationRunner =\n config.transaction === 'single'\n ? runMigration\n : runMigrationInOwnTransaction;\n\n for (const file of set.migrations) {\n if (\n (up && versionsMap[file.version]) ||\n (!up && !versionsMap[file.version])\n ) {\n continue;\n }\n\n if (count-- <= 0) break;\n\n if (!loggedAboutStarting && (!redo || !up)) {\n loggedAboutStarting = true;\n config.logger?.log(\n `${\n redo ? 'Reapplying migrations for' : up ? 'Migrating' : 'Rolling back'\n } database ${trx.getDatabase()}\\n`,\n );\n }\n\n const changes = await getChanges(file, config);\n const adapter = await migrationRunner(trx, up, changes, config);\n await changeMigratedVersion(adapter, up, file, config);\n\n (migrations ??= []).push(file);\n\n if (up) {\n const name = path.basename(file.path);\n versionsMap[file.version] = name;\n sequence.push(+file.version);\n } else {\n versionsMap[file.version] = undefined;\n sequence.pop();\n }\n\n config.logger?.log(\n `${up ? 'Migrated' : 'Rolled back'} ${pathToLog(file.path)}\\n`,\n );\n }\n\n migrations ??= emptyArray;\n\n const afterMigrate = config[up ? 'afterMigrate' : 'afterRollback'];\n if (config.afterChange || afterMigrate) {\n db ??= getDb(trx);\n await config.afterChange?.({ db, up, redo, migrations });\n await afterMigrate?.({ db, migrations });\n }\n\n return migrations;\n};\n\nconst checkMigrationOrder = (\n config: PickMigrationId,\n set: MigrationsSet,\n { sequence, map }: RakeDbAppliedVersions,\n force?: boolean,\n) => {\n if (config.migrationId !== 'timestamp') {\n let prev: MigrationItem = set.migrations[0];\n for (let i = 1; i < set.migrations.length; i++) {\n const file = set.migrations[i];\n\n const version = +file.version;\n const prevVersion = +prev.version;\n if (version === prevVersion) {\n throw new Error(\n `Found migrations with the same number: ${prev.path} and ${file.path}`,\n );\n } else if (version - prevVersion > 1) {\n throw new Error(\n `There is a gap between migrations ${prev.path} and ${file.path}`,\n );\n }\n\n prev = file;\n }\n }\n\n const last = sequence[sequence.length - 1];\n if (last) {\n for (const file of set.migrations) {\n const version = +file.version;\n if (version > last || map[file.version]) continue;\n\n if (!force) {\n throw new Error(\n `Cannot migrate ${path.basename(\n file.path,\n )} because the higher position ${\n map[versionToString(config, last)]\n } was already migrated.\\nRun \\`**db command** up force\\` to rollback the above migrations and migrate all`,\n );\n }\n\n return version;\n }\n }\n return;\n};\n\n// Cache `change` functions of migrations. Key is a migration file name, value is array of `change` functions.\n// When migrating two or more databases, files are loaded just once due to this cache.\nexport const changeCache: Record<string, MigrationChange[] | undefined> = {};\n\nexport const getChanges = async (\n file: MigrationItemHasLoad,\n config?: PickForceDefaultExports,\n): Promise<MigrationChange[]> => {\n clearChanges();\n\n let changes = file.path ? changeCache[file.path] : undefined;\n if (!changes) {\n const module = (await file.load()) as\n | {\n default?: MaybeArray<MigrationChange>;\n }\n | undefined;\n\n const exported = module?.default && toArray(module.default);\n\n if (config?.forceDefaultExports && !exported) {\n throw new RakeDbError(\n `Missing a default export in ${file.path} migration`,\n );\n }\n\n changes = exported || getCurrentChanges();\n if (file.path) changeCache[file.path] = changes;\n }\n\n return changes;\n};\n\nexport const runMigrationInOwnTransaction: typeof runMigration = (\n adapter,\n ...rest\n) => {\n return transaction(adapter, (trx) => runMigration(trx, ...rest));\n};\n\n/**\n * Process one migration file.\n * It performs a db transaction, loads `change` functions from a file, executes them in order specified by `up` parameter.\n * After calling `change` functions successfully, will save new entry or delete one in case of `up: false` from the migrations table.\n */\nexport const runMigration = async <CT>(\n trx: AdapterBase,\n up: boolean,\n changes: MigrationChange[],\n config: CreateMigrationInterfaceConfig<CT>,\n): Promise<SilentQueries> => {\n const db = createMigrationInterface<CT>(trx, up, config);\n\n if (changes.length) {\n // when up: for (let i = 0; i !== changes.length - 1; i++)\n // when down: for (let i = changes.length - 1; i !== -1; i--)\n const from = up ? 0 : changes.length - 1;\n const to = up ? changes.length : -1;\n const step = up ? 1 : -1;\n for (let i = from; i !== to; i += step) {\n await changes[i].fn(db, up);\n }\n }\n\n return db.adapter;\n};\n\nconst changeMigratedVersion = async (\n adapter: SilentQueries,\n up: boolean,\n file: MigrationItem,\n config: PickMigrationsTable,\n) => {\n await (up ? saveMigratedVersion : deleteMigratedVersion)(\n adapter,\n file.version,\n path.basename(file.path).slice(file.version.length + 1),\n config,\n );\n};\n","import { EnumColumn, AdapterBase, ColumnSchemaConfig, singleQuote } from 'pqb';\nimport { TableQuery } from './migration/createTable';\nimport { RAKE_DB_LOCK_KEY } from './commands/migrateOrRollback';\nimport { MigrationsSet } from './migration/migrationsSet';\n\nexport interface RakeDbCtx {\n migrationsPromise?: Promise<MigrationsSet>;\n}\n\nexport const getFirstWordAndRest = (\n input: string,\n): [string] | [string, string] => {\n const i = input.search(/(?=[A-Z])|[-_ ]/);\n if (i !== -1) {\n const restStart =\n input[i] === '-' || input[i] === '_' || input[i] === ' ' ? i + 1 : i;\n const rest = input.slice(restStart);\n return [input.slice(0, i), 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 i = input.search(regex);\n if (i === -1) return;\n\n if (input[i] === '-' || input[i] === '_' || input[i] === ' ') i++;\n i += length;\n\n const start =\n input[i] == '-' || input[i] === '_' || input[i] === ' ' ? i + 1 : i;\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| to)[A-Z-_ ]/, 2);\n};\n\nexport const getTextAfterFrom = (input: string): string | undefined => {\n return getTextAfterRegExp(input, /(From|-from|_from| from)[A-Z-_ ]/, 4);\n};\n\n// Join array of strings into a camelCased string.\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}) => quoteTable(schema, name);\n\nexport const quoteTable = (schema: string | undefined, table: string) =>\n schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n\nexport const getSchemaAndTableFromName = (\n name: string,\n): [string | undefined, string] => {\n const i = name.indexOf('.');\n return i !== -1 ? [name.slice(0, i), name.slice(i + 1)] : [undefined, name];\n};\n\nexport const quoteNameFromString = (string: string) => {\n return quoteTable(...getSchemaAndTableFromName(string));\n};\n\n/**\n * Do not quote the type itself because it can be an expression like `geography(point)` for postgis.\n */\nexport const quoteCustomType = (s: string) => {\n const [schema, type] = getSchemaAndTableFromName(s);\n return schema ? '\"' + schema + '\".' + type : type;\n};\n\nexport const quoteSchemaTable = (\n arg: { schema?: string; name: string },\n excludeCurrentSchema?: string,\n) => {\n return singleQuote(concatSchemaAndName(arg, excludeCurrentSchema));\n};\n\nexport const concatSchemaAndName = (\n {\n schema,\n name,\n }: {\n schema?: string;\n name: string;\n },\n excludeCurrentSchema?: string,\n) => {\n return schema && schema !== excludeCurrentSchema ? `${schema}.${name}` : name;\n};\n\nexport const makePopulateEnumQuery = (\n item: EnumColumn<ColumnSchemaConfig, unknown, readonly string[]>,\n): TableQuery => {\n const [schema, name] = getSchemaAndTableFromName(item.enumName);\n return {\n text: `SELECT unnest(enum_range(NULL::${quoteTable(schema, name)}))::text`,\n then(result) {\n // populate empty options array with values from db\n (item.options as string[]).push(...result.rows.map(([value]) => value));\n },\n };\n};\n\nexport const transaction = <T>(\n adapter: AdapterBase,\n fn: (trx: AdapterBase) => Promise<T>,\n): Promise<T> => {\n return adapter.transaction<T>(undefined, fn);\n};\n\nexport const queryLock = (trx: AdapterBase) =>\n trx.query(`SELECT pg_advisory_xact_lock('${RAKE_DB_LOCK_KEY}')`);\n\nexport const getCliParam = (\n args: string[] | undefined,\n name: string,\n): string | undefined => {\n if (args) {\n const key = '--' + name;\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === key) return args[i + 1];\n else if (arg.startsWith(key)) return arg.slice(key.length + 1);\n }\n }\n return;\n};\n","import {\n DbResult,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n defaultSchemaConfig,\n makeColumnTypes as defaultColumnTypes,\n NoPrimaryKeyOption,\n AdapterBase,\n ColumnSchemaConfig,\n getStackTrace,\n MaybePromise,\n QueryLogOptions,\n} from 'pqb';\nimport path from 'path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationItem } from './migration/migrationsSet';\nimport { getCliParam } from './common';\n\nexport interface CommandFn<SchemaConfig extends ColumnSchemaConfig, CT> {\n (\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[],\n ): void | Promise<void>;\n}\n\nexport interface PickBasePath {\n basePath: string;\n}\n\nexport interface PickImport {\n import(path: string): Promise<unknown>;\n}\n\nexport interface PickMigrationId {\n migrationId: RakeDbMigrationId;\n}\n\nexport interface PickMigrations {\n migrations?: ModuleExportsRecord;\n}\n\nexport interface PickMigrationsPath {\n migrationsPath: string;\n}\n\nexport interface PickOptionalMigrationsPath {\n migrationsPath?: string;\n}\n\nexport interface PickRenameMigrations {\n renameMigrations?: RakeDbRenameMigrationsInput;\n}\n\nexport interface PickMigrationsTable {\n migrationsTable: string;\n}\n\nexport interface PickTransactionSetting {\n transaction: 'single' | 'per-migration';\n}\n\nexport interface PickMigrationCallbacks {\n beforeChange?: ChangeCallback;\n afterChange?: ChangeCallback;\n beforeMigrate?: MigrationCallback;\n afterMigrate?: MigrationCallback;\n beforeRollback?: MigrationCallback;\n afterRollback?: MigrationCallback;\n}\n\nexport interface PickAfterChangeCommit {\n afterChangeCommit?: ChangeCommitCallback;\n}\n\nexport interface PickForceDefaultExports {\n // throw if a migration doesn't have a default export\n forceDefaultExports?: boolean;\n}\n\ninterface RakeDbBaseConfig<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n> extends QueryLogOptions,\n PickImport,\n PickMigrationId,\n PickMigrationsPath,\n PickMigrations,\n PickRenameMigrations,\n PickMigrationsTable,\n PickMigrationCallbacks,\n PickForceDefaultExports,\n PickAfterChangeCommit {\n schemaConfig: SchemaConfig;\n snakeCase: boolean;\n language?: string;\n commands: Record<string, CommandFn<SchemaConfig, CT>>;\n noPrimaryKey?: NoPrimaryKeyOption;\n baseTable?: RakeDbBaseTable<CT>;\n}\n\nexport interface RakeDbConfig<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n> extends RakeDbBaseConfig<SchemaConfig, CT>,\n PickBasePath,\n PickTransactionSetting {\n columnTypes: CT;\n dbScript: string;\n recurrentPath: string;\n}\n\nexport interface InputRakeDbConfigBase<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends QueryLogOptions,\n PickOptionalMigrationsPath {\n columnTypes?: CT | ((t: DefaultColumnTypes<DefaultSchemaConfig>) => CT);\n baseTable?: RakeDbBaseTable<CT>;\n schemaConfig?: SchemaConfig;\n basePath?: string;\n dbScript?: string;\n migrationId?: 'serial' | RakeDbMigrationId;\n recurrentPath?: string;\n migrationsTable?: string;\n snakeCase?: boolean;\n language?: string;\n commands?: Record<\n string,\n (\n adapter: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[],\n ) => void | Promise<void>\n >;\n noPrimaryKey?: NoPrimaryKeyOption;\n forceDefaultExports?: boolean;\n /**\n * Is called once per db before migrating or rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.up - whether it's migrating up or down\n * @param arg.redo - whether it's migrating down and then up for `redo` command\n * @param arg.migrations - array of executed (up or down) migrations\n */\n beforeChange?: ChangeCallback;\n /**\n * Is called once per db after migrating or rolling back a set of migrations.\n * Runs inside the same transaction as migrations,\n * for running after commit use {@link afterChangeCommit}.\n *\n * @param arg.db - query builder\n * @param arg.up - whether it's migrating up or down\n * @param arg.redo - whether it's migrating down and then up for `redo` command\n * @param arg.migrations - array of executed (up or down) migrations\n */\n afterChange?: ChangeCallback;\n /**\n * Is called once per db after migrating or rolling back a set of migrations.\n * Runs **after** committing migrations transaction.\n *\n * @param arg.options - database connection options\n * @param arg.up - whether it's migrating up or down\n * @param arg.migrations - array of executed (up or down) migrations\n */\n afterChangeCommit?: ChangeCommitCallback;\n /**\n * Is called once per db before migrating (up) a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - applied migrations\n */\n beforeMigrate?: MigrationCallback;\n /**\n * Is called once per db after migrating (up) a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - applied migrations\n */\n afterMigrate?: MigrationCallback;\n /**\n * Is called once per db before rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - rolled back migrations\n */\n beforeRollback?: MigrationCallback;\n /**\n * Is called once per db before rolling back a set of migrations.\n *\n * @param arg.db - query builder\n * @param arg.migrations - rolled back migrations\n */\n afterRollback?: MigrationCallback;\n}\n\ninterface InputRakeDbConfigFileBased<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends InputRakeDbConfigBase<SchemaConfig, CT> {\n /**\n * It may look odd, but it's required for `tsx` and other bundlers to have such `import` config specified explicitly.\n */\n import(path: string): Promise<unknown>;\n}\n\ninterface InputRakeDbConfigCodeBased<\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n> extends InputRakeDbConfigBase<SchemaConfig, CT> {\n /**\n * To specify array of migrations explicitly, without loading them from files.\n */\n migrations: ModuleExportsRecord;\n renameMigrations?: RakeDbRenameMigrationsInput;\n /**\n * It may look odd, but it's required for `tsx` and other bundlers to have such `import` config specified explicitly.\n */\n import?(path: string): Promise<unknown>;\n}\n\nexport type InputRakeDbConfig<SchemaConfig extends ColumnSchemaConfig, CT> =\n | InputRakeDbConfigFileBased<SchemaConfig, CT>\n | InputRakeDbConfigCodeBased<SchemaConfig, CT>;\n\ninterface ChangeCallback {\n (arg: {\n db: DbResult<unknown>;\n up: boolean;\n redo: boolean;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\ninterface ChangeCommitCallback {\n (arg: {\n adapter: AdapterBase;\n up: boolean;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\ninterface MigrationCallback {\n (arg: {\n db: DbResult<unknown>;\n migrations: MigrationItem[];\n }): void | Promise<void>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRakeDbConfig = RakeDbConfig<any, any>;\n\nexport interface RakeDbBaseTable<CT> {\n exportAs: string;\n\n getFilePath(): string;\n\n nowSQL?: string;\n\n new (): {\n types: CT;\n snakeCase?: boolean;\n language?: string;\n };\n}\n\nexport interface ModuleExportsRecord {\n [K: string]: () => Promise<unknown>;\n}\n\nexport type RakeDbMigrationId = 'timestamp' | { serial: number };\n\nexport interface RakeDbRenameMigrationsMap {\n [K: string]: number;\n}\n\nexport interface RakeDbRenameMigrations {\n to: RakeDbMigrationId;\n map(): MaybePromise<RakeDbRenameMigrationsMap>;\n}\n\nexport interface RakeDbRenameMigrationsInput {\n to: RakeDbMigrationId;\n map: RakeDbRenameMigrationsMap;\n}\n\nexport const migrationConfigDefaults: RakeDbBaseConfig<ColumnSchemaConfig> = {\n schemaConfig: defaultSchemaConfig,\n migrationsPath: path.join('src', 'db', 'migrations'),\n migrationId: { serial: 4 },\n migrationsTable: 'schemaMigrations',\n snakeCase: false,\n commands: {},\n log: true,\n logger: console,\n import() {\n throw new Error(\n 'Add `import: (path) => import(path),` setting to `rakeDb` config',\n );\n },\n};\n\nexport const ensureMigrationsPath = <\n T extends {\n migrationsPath?: string;\n basePath: string;\n },\n>(\n config: T,\n): T & { migrationsPath: string } => {\n if (!config.migrationsPath) {\n config.migrationsPath = migrationConfigDefaults.migrationsPath;\n }\n\n if (!path.isAbsolute(config.migrationsPath)) {\n config.migrationsPath = path.resolve(\n config.basePath,\n config.migrationsPath,\n );\n }\n\n return config as never;\n};\n\nexport const ensureBasePathAndDbScript = <\n T extends {\n basePath?: string;\n dbScript?: string;\n },\n>(\n config: T,\n intermediateCallers = 0,\n): T & { basePath: string; dbScript: string } => {\n if (config.basePath && config.dbScript) return config as never;\n\n // 0 is getStackTrace file, 1 is this function, 2 is a caller in rakeDb.ts, 3 is the user db script file.\n // when called from processRakeDbConfig, 1 call is added.\n // bundlers can bundle all files into a single file, or change file structure, so this must rely only on the caller index.\n let filePath = getStackTrace()?.[3 + intermediateCallers]?.getFileName();\n if (!filePath) {\n throw new Error(\n 'Failed to determine path to db script. Please set basePath option of rakeDb',\n );\n }\n\n if (filePath.startsWith('file://')) {\n filePath = fileURLToPath(filePath);\n }\n\n const ext = path.extname(filePath);\n if (ext !== '.ts' && ext !== '.js' && ext !== '.mjs') {\n throw new Error(\n `Add a .ts suffix to the \"${path.basename(filePath)}\" when calling it`,\n );\n }\n\n config.basePath = path.dirname(filePath);\n config.dbScript = path.basename(filePath);\n return config as never;\n};\n\nexport const processRakeDbConfig = <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n config: InputRakeDbConfig<SchemaConfig, CT>,\n args?: string[],\n): RakeDbConfig<SchemaConfig, CT> => {\n const result = { ...migrationConfigDefaults, ...config } as RakeDbConfig<\n SchemaConfig,\n CT\n >;\n\n if (!result.log) {\n delete result.logger;\n }\n\n ensureBasePathAndDbScript(result, 1);\n ensureMigrationsPath(result);\n\n if (!result.recurrentPath) {\n result.recurrentPath = path.join(\n result.migrationsPath as string,\n 'recurrent',\n );\n }\n\n if ('recurrentPath' in result && !path.isAbsolute(result.recurrentPath)) {\n result.recurrentPath = path.resolve(result.basePath, result.recurrentPath);\n }\n\n if ('baseTable' in config && config.baseTable) {\n const { types, snakeCase, language } = config.baseTable.prototype;\n result.columnTypes = types || defaultColumnTypes(defaultSchemaConfig);\n if (snakeCase) result.snakeCase = true;\n if (language) result.language = language;\n } else {\n const ct = 'columnTypes' in config && config.columnTypes;\n result.columnTypes = ((typeof ct === 'function'\n ? (ct as (t: DefaultColumnTypes<ColumnSchemaConfig>) => CT)(\n defaultColumnTypes(defaultSchemaConfig),\n )\n : ct) || defaultColumnTypes(defaultSchemaConfig)) as CT;\n }\n\n if (config.migrationId === 'serial') {\n result.migrationId = { serial: 4 };\n }\n\n const transaction = getCliParam(args, 'transaction');\n if (transaction) {\n if (transaction !== 'single' && transaction !== 'per-migration') {\n throw new Error(\n `Unsupported transaction param ${transaction}, expected single or per-migration`,\n );\n }\n result.transaction = transaction;\n } else if (!result.transaction) {\n result.transaction = 'single';\n }\n\n return result as RakeDbConfig<SchemaConfig, CT>;\n};\n","import { colors } from 'pqb';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst cursorShow = `${CSI}?25h`;\nconst cursorHide = `${CSI}?25l`;\nconst { stdin, stdout } = process;\n\nconst visibleChars = (s: string) =>\n s.replace(\n // eslint-disable-next-line no-control-regex\n /[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))/g,\n '',\n ).length;\n\nconst clear = (text: string) => {\n const rows = text\n .split(/\\r?\\n/)\n .reduce(\n (rows, line) =>\n rows +\n 1 +\n Math.floor(Math.max(visibleChars(line) - 1, 0) / stdout.columns),\n 0,\n );\n\n let clear = '';\n for (let i = 0; i < rows; i++) {\n clear += `${CSI}2K`;\n if (i < rows - 1) {\n clear += `${CSI}${i < rows - 1 ? '1A' : 'G'}`;\n }\n }\n return clear;\n};\n\ninterface Ctx<T> {\n value: T;\n submitted: boolean;\n render: () => void;\n submit(value?: T): void;\n}\n\nconst prompt = async <T>({\n render,\n onKeyPress,\n validate,\n value,\n cursor: showCursor,\n}: {\n render(ctx: Ctx<T>): string;\n onKeyPress(ctx: Ctx<T>, s: string): void;\n validate?(ctx: Ctx<T>): boolean;\n value?: T;\n cursor?: boolean;\n}): Promise<T> => {\n stdin.resume();\n if (stdin.isTTY) stdin.setRawMode(true);\n stdin.setEncoding('utf-8');\n\n if (!showCursor) stdout.write(cursorHide);\n\n return new Promise<T>((res) => {\n let prevText: string | undefined;\n\n const ctx: Ctx<T> = {\n value: value as T,\n submitted: false,\n render() {\n let text =\n (ctx.submitted ? colors.greenBold('✔') : colors.yellowBold('?')) +\n ' ' +\n render(ctx);\n\n if (ctx.submitted) text += '\\n';\n\n stdout.write(prevText ? clear(prevText) + '\\r' + text : text);\n\n prevText = text;\n },\n submit(value) {\n if (value !== undefined) ctx.value = value;\n if (ctx.value === undefined || (validate && !validate?.(ctx))) return;\n\n ctx.submitted = true;\n ctx.render();\n close();\n res(ctx.value);\n },\n };\n\n const close = () => {\n if (!showCursor) stdout.write(cursorShow);\n if (stdin.isTTY) stdin.setRawMode(false);\n stdin.off('data', keypress);\n stdin.pause();\n };\n\n const keypress = (s: string) => {\n // ctrl-c, ctrl-d\n if (s === '\\u0003' || s === '\\u0004') {\n close?.();\n process.exit(0);\n }\n\n if (s === '\\r' || s === '\\n' || s === '\\r\\n') {\n ctx.submit();\n } else {\n onKeyPress(ctx, s);\n }\n };\n\n stdin.on('data', keypress);\n\n ctx.render();\n });\n};\n\nconst defaultActive = (s: string) => `${colors.blueBold('❯')} ${s}`;\nconst defaultInactive = (s: string) => ` ${s}`;\n\nexport const promptSelect = ({\n message,\n options,\n active = defaultActive,\n inactive = defaultInactive,\n}: {\n message: string;\n options: string[];\n active?: (s: string) => string;\n inactive?: (s: string) => string;\n}) =>\n prompt<number>({\n value: 0,\n render(ctx) {\n let text = `${message} ${colors.pale(\n 'Use arrows or jk. Press enter to submit.',\n )}\\n`;\n\n for (let i = 0; i < options.length; i++) {\n text += (ctx.value === i ? active : inactive)(options[i]) + '\\n';\n }\n\n return text;\n },\n onKeyPress(ctx, s) {\n ctx.value =\n s === '\\u001b[H' // home\n ? 0\n : s === '\\u001b[F' // end\n ? options.length - 1\n : s === '\\u001b[A' || s === 'k' // up\n ? ctx.value === 0\n ? options.length - 1\n : ctx.value - 1\n : s === '\\u001b[B' || s === 'j' || s === '\\t' // down\n ? ctx.value === options.length - 1\n ? 0\n : ctx.value + 1\n : ctx.value;\n\n ctx.render();\n },\n });\n\nexport const promptConfirm = ({\n message,\n}: {\n message: string;\n password?: boolean;\n}) =>\n prompt<boolean>({\n value: true,\n render(ctx) {\n return `${colors.bright(message)}\\n${\n ctx.submitted\n ? `> ${ctx.value ? colors.greenBold('Yes') : colors.yellowBold('No')}`\n : colors.pale(`> (Y/n)`)\n }\\n`;\n },\n onKeyPress(ctx, s) {\n let ok;\n if (s === 'y' || s === 'Y') ok = true;\n else if (s === 'n' || s === 'N') ok = false;\n\n if (ok !== undefined) {\n ctx.submit(ok);\n }\n },\n });\n\nexport const promptText = ({\n message,\n default: def = '',\n password,\n min,\n}: {\n message: string;\n default?: string;\n password?: boolean;\n min?: number;\n}) => {\n let showDefault = true;\n let x = 0;\n\n const renderValue = (ctx: Ctx<string>) =>\n password ? '*'.repeat(ctx.value.length) : ctx.value;\n\n return prompt<string>({\n value: def,\n cursor: true,\n validate: (ctx) => !min || ctx.value.length >= min,\n render(ctx) {\n let text = `${colors.bright(message)}\\n> ${\n ctx.submitted\n ? renderValue(ctx)\n : showDefault\n ? colors.pale(def) + '\\b'.repeat(def.length)\n : ctx.value\n }`;\n\n if (ctx.submitted) text += '\\n';\n\n return text;\n },\n onKeyPress(ctx, s) {\n let value = showDefault ? '' : ctx.value;\n if (s === '\\u001b[D' && x > 0) {\n // left\n x--;\n stdout.write('\\b');\n } else if (s === '\\u001b[C' && x < value.length) {\n // right\n stdout.write(value[x]);\n x++;\n }\n\n if (s !== '' && s !== '\\u001b[3~' && !visibleChars(s)) return;\n\n if (showDefault) {\n showDefault = false;\n stdout.write(' '.repeat(def.length) + '\\b'.repeat(def.length));\n }\n\n const prev = value;\n const prevX = x;\n\n if (s === '') {\n if (x > 0) {\n value = value.slice(0, x - 1) + value.slice(x);\n x--;\n }\n } else if (s === '\\u001b[3~') {\n if (x < value.length) {\n value = value.slice(0, x) + value.slice(x + 1);\n }\n } else {\n value = value.slice(0, x) + s + value.slice(x);\n x++;\n }\n\n ctx.value = value;\n\n const spaces = prev.length - value.length;\n stdout.write(\n '\\b'.repeat(prevX) +\n renderValue(ctx) +\n (spaces > 0 ? ' '.repeat(spaces) + '\\b'.repeat(spaces) : '') +\n '\\b'.repeat(value.length - x),\n );\n },\n });\n};\n","import { AdapterBase, ColumnSchemaConfig, RecordUnknown } from 'pqb';\nimport { migrate } from './migrateOrRollback';\nimport { RakeDbConfig } from '../config';\nimport { createMigrationsTable } from '../migration/migrationsTable';\nimport { promptConfirm, promptText } from '../prompt';\n\nconst execute = async (\n adapter: AdapterBase,\n sql: string,\n): Promise<\n 'ok' | 'already' | 'forbidden' | 'ssl required' | { error: unknown }\n> => {\n try {\n await adapter.query(sql);\n return 'ok';\n } catch (error) {\n const err = error as RecordUnknown;\n\n if (\n typeof err.message === 'string' &&\n err.message.includes('sslmode=require')\n ) {\n return 'ssl required';\n }\n\n if (err.code === '42P04' || err.code === '3D000') {\n return 'already';\n } else if (\n err.code === '42501' ||\n (typeof err.message === 'string' &&\n err.message.includes('password authentication failed'))\n ) {\n return 'forbidden';\n } else {\n return { error };\n }\n } finally {\n await adapter.close();\n }\n};\n\nconst createOrDrop = async (\n adapter: AdapterBase,\n adminAdapter: AdapterBase,\n config: Pick<RakeDbConfig<ColumnSchemaConfig>, 'migrationsTable' | 'logger'>,\n args: {\n sql(params: { database: string; user: string }): string;\n successMessage(params: { database: string }): string;\n alreadyMessage(params: { database: string }): string;\n create?: boolean;\n },\n) => {\n const params = {\n database: adapter.getDatabase(),\n user: adapter.getUser(),\n };\n\n const result = await execute(\n adminAdapter.reconfigure({ database: 'postgres' }),\n args.sql(params),\n );\n if (result === 'ok') {\n config.logger?.log(args.successMessage(params));\n } else if (result === 'already') {\n config.logger?.log(args.alreadyMessage(params));\n } else if (result === 'ssl required') {\n config.logger?.log(\n 'SSL is required: append ?ssl=true to the database url string',\n );\n return;\n } else if (result === 'forbidden') {\n let message = `Permission denied to ${\n args.create ? 'create' : 'drop'\n } database.`;\n\n const host = adminAdapter.getHost();\n\n const isLocal = host === 'localhost';\n if (!isLocal) {\n message += `\\nDon't use this command for database service providers, only for a local db.`;\n }\n\n config.logger?.log(message);\n\n const params = await askForAdminCredentials(args.create);\n if (!params) return;\n\n await createOrDrop(adapter, adminAdapter.reconfigure(params), config, args);\n return;\n } else {\n throw result.error;\n }\n\n if (!args.create) return;\n\n const newlyConnectedAdapter = adapter.reconfigure({});\n\n await createMigrationsTable(newlyConnectedAdapter, config);\n await newlyConnectedAdapter.close();\n};\n\nexport const createDb = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n for (const adapter of adapters) {\n await createOrDrop(adapter, adapter, config, {\n sql({ database, user }) {\n return `CREATE DATABASE \"${database}\"${user ? ` OWNER \"${user}\"` : ''}`;\n },\n successMessage({ database }) {\n return `Database ${database} successfully created`;\n },\n alreadyMessage({ database }) {\n return `Database ${database} already exists`;\n },\n create: true,\n });\n }\n};\n\nexport const dropDb = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n for (const adapter of adapters) {\n await createOrDrop(adapter, adapter, config, {\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 <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n) => {\n await dropDb(adapters, config);\n await createDb(adapters, config);\n for (const adapter of adapters) {\n await migrate({ adapter, config });\n }\n};\n\nexport const askForAdminCredentials = async (\n create?: boolean,\n): Promise<{ user: string; password?: string } | undefined> => {\n const ok = await promptConfirm({\n message: `Would you like to share admin credentials to ${\n create ? 'create' : 'drop'\n } a database?`,\n });\n\n if (!ok) {\n return;\n }\n\n const user = await promptText({\n message: 'Enter admin user:',\n default: 'postgres',\n min: 1,\n });\n\n const password = await promptText({\n message: 'Enter admin password:',\n password: true,\n });\n\n return {\n user,\n password: password || undefined,\n };\n};\n","import {\n AdapterBase,\n ColumnSchemaConfig,\n createDbWithAdapter,\n DbResult,\n} from 'pqb';\nimport { join } from 'path';\nimport { readdir, stat, readFile } from 'fs/promises';\nimport { RakeDbConfig } from '../config';\n\nexport const runRecurrentMigrations = async <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n): Promise<void> => {\n let dbs: DbResult<unknown>[] | undefined;\n let files = 0;\n\n await readdirRecursive(config.recurrentPath, async (path) => {\n files++;\n\n // init dbs lazily\n dbs ??= adapters.map((adapter) => createDbWithAdapter({ adapter }));\n\n const sql = await readFile(path, 'utf-8');\n await Promise.all(\n dbs.map(async (db) => {\n await db.adapter.arrays(sql);\n }),\n );\n });\n\n if (files > 0) {\n config.logger?.log(\n `Applied ${files} recurrent migration file${files > 1 ? 's' : ''}`,\n );\n }\n};\n\nconst readdirRecursive = async (\n dirPath: string,\n cb: (path: string) => Promise<void>,\n) => {\n const list = await readdir(dirPath).catch((err) => {\n if (err.code !== 'ENOENT') throw err;\n return;\n });\n\n if (!list) return;\n\n await Promise.all(\n list.map(async (item) => {\n const path = join(dirPath, item);\n const info = await stat(path);\n if (info.isDirectory()) {\n await readdirRecursive(path, cb);\n } else if (info.isFile() && path.endsWith('.sql')) {\n await cb(path);\n }\n }),\n );\n};\n","import { SearchWeight, AdapterBase, EmptyObject, RecordUnknown } from 'pqb';\nimport { RakeDbAst } from '../ast';\n\nexport namespace DbStructure {\n export interface TableNameAndSchemaName {\n schemaName: string;\n tableName: string;\n }\n\n export interface Table {\n schemaName: string;\n name: string;\n comment?: string;\n columns: Column[];\n }\n\n export interface View {\n schemaName: string;\n name: string;\n deps: RakeDbAst.View['deps'];\n isRecursive: boolean;\n with?: string[]; // ['check_option=LOCAL', 'security_barrier=true']\n columns: Column[];\n sql: string;\n }\n\n export interface 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 interface Column extends TableNameAndSchemaName {\n name: string;\n typeSchema: string;\n type: string;\n arrayDims: number;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n default?: string;\n isNullable: boolean;\n collate?: string;\n compression?: 'pglz' | 'lz4';\n comment?: string;\n identity?: {\n always: boolean;\n start: number;\n increment: number;\n min?: number;\n max?: number;\n cache: number;\n cycle: boolean;\n };\n extension?: string;\n typmod: number;\n }\n\n export interface Index extends TableNameAndSchemaName {\n name: string;\n using: string;\n unique: boolean;\n columns: (({ column: string } | { expression: string }) & {\n collate?: string;\n opclass?: string;\n order?: string;\n weight?: SearchWeight;\n })[];\n include?: string[];\n nullsNotDistinct?: boolean;\n with?: string;\n tablespace?: string;\n where?: string;\n tsVector?: boolean;\n language?: string;\n languageColumn?: string;\n }\n\n export interface Exclude extends Index {\n exclude: string[]; // array of operators for index columns and expressions\n }\n\n // FULL | PARTIAL | SIMPLE\n export type ForeignKeyMatch = 'f' | 'p' | 's';\n\n // a = no action, r = restrict, c = cascade, n = set null, d = set default\n export type ForeignKeyAction = 'a' | 'r' | 'c' | 'n' | 'd';\n\n export interface Constraint extends TableNameAndSchemaName {\n name: string;\n primaryKey?: string[];\n references?: References;\n check?: Check;\n }\n\n export interface References {\n foreignSchema: string;\n foreignTable: string;\n columns: string[];\n foreignColumns: string[];\n match: ForeignKeyMatch;\n onUpdate: ForeignKeyAction;\n onDelete: ForeignKeyAction;\n }\n\n export interface Check {\n columns?: string[];\n expression: string;\n }\n\n export interface Trigger extends TableNameAndSchemaName {\n triggerSchema: string;\n name: string;\n events: string[];\n activation: string;\n condition?: string;\n definition: string;\n }\n\n export interface Extension {\n schemaName: string;\n name: string;\n version?: string;\n }\n\n export interface Enum {\n schemaName: string;\n name: string;\n values: [string, ...string[]];\n }\n\n export interface Domain {\n schemaName: string;\n name: string;\n type: string;\n typeSchema: string;\n arrayDims: number;\n isNullable: boolean;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n collate?: string;\n default?: string;\n checks?: string[];\n }\n\n export interface Collation {\n schemaName: string;\n name: string;\n provider: string;\n deterministic: boolean;\n lcCollate?: string;\n lcCType?: string;\n locale?: string;\n version?: string;\n }\n}\n\nconst filterSchema = (table: string) =>\n `${table} !~ '^pg_' AND ${table} != 'information_schema'`;\n\nconst jsonAgg = (sql: string, as: string) =>\n `(SELECT coalesce(json_agg(t.*), '[]') FROM (${sql}) t) AS \"${as}\"`;\n\nconst columnsSql = ({\n schema,\n table,\n join = '',\n where,\n}: {\n schema: string;\n table: string;\n join?: string;\n where: string;\n}) => `SELECT\n ${schema}.nspname \"schemaName\",\n ${table}.relname \"tableName\",\n a.attname \"name\",\n t.typname \"type\",\n tn.nspname \"typeSchema\",\n a.attndims \"arrayDims\",\n information_schema._pg_char_max_length(tt.id, tt.mod) \"maxChars\",\n information_schema._pg_numeric_precision(tt.id, tt.mod) \"numericPrecision\",\n information_schema._pg_numeric_scale(tt.id,tt.mod) \"numericScale\",\n information_schema._pg_datetime_precision(tt.id,tt.mod) \"dateTimePrecision\",\n CAST(\n CASE WHEN a.attgenerated = ''\n THEN pg_get_expr(ad.adbin, ad.adrelid)\n END AS information_schema.character_data\n ) AS \"default\",\n NOT (a.attnotnull OR (t.typtype = 'd' AND t.typnotnull)) AS \"isNullable\",\n co.collname AS \"collate\",\n NULLIF(a.attcompression, '') AS compression,\n pgd.description AS \"comment\",\n (\n CASE WHEN a.attidentity IN ('a', 'd') THEN (\n json_build_object(\n 'always',\n a.attidentity = 'a',\n 'start',\n seq.seqstart,\n 'increment',\n seq.seqincrement,\n 'min',\n nullif(seq.seqmin, 1),\n 'max',\n nullif(seq.seqmax, (\n CASE t.typname\n WHEN 'int2' THEN 32767\n WHEN 'int4' THEN 2147483647\n WHEN 'int8' THEN 9223372036854775807\n ELSE NULL\n END\n )),\n 'cache',\n seq.seqcache,\n 'cycle',\n seq.seqcycle\n )\n ) END\n ) \"identity\",\n ext.extname \"extension\",\n a.atttypmod \"typmod\"\nFROM pg_attribute a\n${join}\nLEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum\nJOIN pg_type t\n ON t.oid = (\n CASE WHEN a.attndims = 0\n THEN a.atttypid\n ELSE (SELECT t.typelem FROM pg_type t WHERE t.oid = a.atttypid)\n END\n )\nJOIN LATERAL (\n SELECT\n CASE WHEN t.typtype = 'd' THEN t.typbasetype ELSE t.oid END id,\n CASE WHEN t.typtype = 'd' THEN t.typtypmod ELSE a.atttypmod END mod\n) tt ON true\nJOIN pg_namespace tn ON tn.oid = t.typnamespace\nLEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))\n ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')\nLEFT JOIN pg_catalog.pg_description pgd\n ON pgd.objoid = a.attrelid\n AND pgd.objsubid = a.attnum\nLEFT JOIN (pg_depend dep JOIN pg_sequence seq ON (dep.classid = 'pg_class'::regclass AND dep.objid = seq.seqrelid AND dep.deptype = 'i'))\n ON (dep.refclassid = 'pg_class'::regclass AND dep.refobjid = ${table}.oid AND dep.refobjsubid = a.attnum)\nLEFT JOIN pg_depend d ON d.objid = t.oid AND d.classid = 'pg_type'::regclass AND d.deptype = 'e'\nLEFT JOIN pg_extension ext ON ext.oid = d.refobjid\nWHERE a.attnum > 0\n AND NOT a.attisdropped\n AND ${where}\nORDER BY a.attnum`;\n\nconst schemasSql = `SELECT coalesce(json_agg(nspname ORDER BY nspname), '[]')\nFROM pg_catalog.pg_namespace n\nWHERE ${filterSchema('nspname')}`;\n\n// `relkind` r = regular table, p = partitioned table.\nconst tablesSql = `SELECT\n nspname AS \"schemaName\",\n relname AS \"name\",\n obj_description(c.oid) AS comment,\n (SELECT coalesce(json_agg(t), '[]') FROM (${columnsSql({\n schema: 'n',\n table: 'c',\n where: 'a.attrelid = c.oid',\n })}) t) AS \"columns\"\nFROM pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = relnamespace\nWHERE (relkind = 'r' OR relkind = 'p')\n AND ${filterSchema('nspname')}\nORDER BY relname`;\n\nconst viewsSql = `SELECT\n nc.nspname AS \"schemaName\",\n c.relname AS \"name\",\n (\n SELECT COALESCE(json_agg(t.*), '[]')\n FROM (\n SELECT\n ns.nspname AS \"schemaName\",\n obj.relname AS \"name\"\n FROM pg_class obj\n JOIN pg_depend dep ON dep.refobjid = obj.oid\n JOIN pg_rewrite rew ON rew.oid = dep.objid\n JOIN pg_namespace ns ON ns.oid = obj.relnamespace\n WHERE rew.ev_class = c.oid AND obj.oid <> c.oid\n ) t\n ) \"deps\",\n right(substring(r.ev_action from ':hasRecursive \\w'), 1)::bool AS \"isRecursive\",\n array_to_json(c.reloptions) AS \"with\",\n (SELECT coalesce(json_agg(t), '[]') FROM (${columnsSql({\n schema: 'nc',\n table: 'c',\n where: 'a.attrelid = c.oid',\n })}) t) AS \"columns\",\n pg_get_viewdef(c.oid) AS \"sql\"\nFROM pg_namespace nc\nJOIN pg_class c\n ON nc.oid = c.relnamespace\n AND c.relkind = 'v'\n AND c.relpersistence != 't'\nJOIN pg_rewrite r ON r.ev_class = c.oid\nWHERE ${filterSchema('nc.nspname')}\nORDER BY c.relname`;\n\nconst indexesSql = `SELECT\n n.nspname \"schemaName\",\n t.relname \"tableName\",\n ic.relname \"name\",\n am.amname AS \"using\",\n i.indisunique \"unique\",\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 (to_jsonb(i.*)->'indnullsnotdistinct')::bool AS \"nullsNotDistinct\",\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\",\n (\n CASE i.indisexclusion WHEN true\n THEN (\n SELECT json_agg(o.oprname)\n FROM pg_catalog.pg_constraint c, LATERAL unnest(c.conexclop) op_oid\n JOIN pg_operator o ON o.oid = op_oid\n WHERE c.conindid = ic.oid\n )\n END\n ) \"exclude\"\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\nconst constraintsSql = `SELECT\n s.nspname AS \"schemaName\",\n t.relname AS \"tableName\",\n c.conname AS \"name\",\n (\n SELECT json_agg(ccu.column_name)\n FROM information_schema.constraint_column_usage ccu\n WHERE contype = 'p'\n AND ccu.constraint_name = c.conname\n AND ccu.table_schema = s.nspname\n ) AS \"primaryKey\",\n (\n SELECT\n json_build_object(\n 'foreignSchema',\n fs.nspname,\n 'foreignTable',\n ft.relname,\n 'columns',\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 ),\n 'foreignColumns',\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 ),\n 'match',\n c.confmatchtype,\n 'onUpdate',\n c.confupdtype,\n 'onDelete',\n c.confdeltype\n )\n FROM pg_class ft\n JOIN pg_catalog.pg_namespace fs ON fs.oid = ft.relnamespace\n JOIN pg_catalog.pg_namespace cs ON cs.oid = c.connamespace\n WHERE contype = 'f' AND ft.oid = confrelid\n ) AS \"references\",\n (\n SELECT\n CASE conbin IS NULL\n WHEN false THEN\n json_build_object(\n 'columns',\n json_agg(ccu.column_name),\n 'expression',\n pg_get_expr(conbin, conrelid)\n )\n END\n FROM information_schema.constraint_column_usage ccu\n WHERE conbin IS NOT NULL\n AND ccu.constraint_name = c.conname\n AND ccu.table_schema = s.nspname\n ) AS \"check\"\nFROM pg_catalog.pg_constraint c\nJOIN pg_class t ON t.oid = conrelid\nJOIN pg_catalog.pg_namespace s\n ON s.oid = t.relnamespace\n AND contype IN ('p', 'f', 'c')\n AND ${filterSchema('s.nspname')}\nORDER BY c.conname`;\n\nconst triggersSql = `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\nconst extensionsSql = `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\nconst enumsSql = `SELECT\n n.nspname as \"schemaName\",\n t.typname as name,\n json_agg(e.enumlabel ORDER BY e.enumsortorder) as values\nFROM pg_type t\nJOIN pg_enum e ON t.oid = e.enumtypid\nJOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\nWHERE ${filterSchema('n.nspname')}\nGROUP BY n.nspname, t.typname`;\n\nconst domainsSql = `SELECT\n n.nspname AS \"schemaName\",\n d.typname AS \"name\",\n t.typname AS \"type\",\n s.nspname AS \"typeSchema\",\n NOT d.typnotnull AS \"isNullable\",\n d.typndims AS \"arrayDims\",\n character_maximum_length AS \"maxChars\",\n numeric_precision AS \"numericPrecision\",\n numeric_scale AS \"numericScale\",\n datetime_precision AS \"dateTimePrecision\",\n collation_name AS \"collate\",\n domain_default AS \"default\",\n (\n SELECT json_agg(pg_get_expr(conbin, conrelid))\n FROM pg_catalog.pg_constraint c\n WHERE c.contypid = d.oid\n ) AS \"checks\"\nFROM pg_catalog.pg_type d\nJOIN pg_catalog.pg_namespace n ON n.oid = d.typnamespace\nJOIN information_schema.domains i\n ON i.domain_schema = nspname\n AND i.domain_name = d.typname\nJOIN pg_catalog.pg_type t\n ON (\n CASE WHEN d.typcategory = 'A'\n THEN t.typarray\n ELSE t.oid\n END\n ) = d.typbasetype\nJOIN pg_catalog.pg_namespace s ON s.oid = t.typnamespace\nWHERE d.typtype = 'd' AND ${filterSchema('n.nspname')}`;\n\nconst collationsSql = (version: number) => `SELECT\n nspname \"schemaName\",\n collname \"name\",\n CASE WHEN collprovider = 'i' THEN 'icu' WHEN collprovider = 'c' THEN 'libc' ELSE collprovider::text END \"provider\",\n collisdeterministic \"deterministic\",\n collcollate \"lcCollate\",\n collctype \"lcCType\",\n ${version >= 17 ? 'colllocale' : 'colliculocale'} \"locale\",\n collversion \"version\"\nFROM pg_collation\nJOIN pg_namespace n on pg_collation.collnamespace = n.oid\nWHERE ${filterSchema('n.nspname')}`;\n\n// procedures\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\"\n// FROM pg_proc p\n// JOIN pg_namespace n ON p.pronamespace = n.oid\n// WHERE ${filterSchema('n.nspname')}`\n\nconst sql = (version: number) =>\n `SELECT (${schemasSql}) AS \"schemas\", ${jsonAgg(\n tablesSql,\n 'tables',\n )}, ${jsonAgg(viewsSql, 'views')}, ${jsonAgg(\n indexesSql,\n 'indexes',\n )}, ${jsonAgg(constraintsSql, 'constraints')}, ${jsonAgg(\n triggersSql,\n 'triggers',\n )}, ${jsonAgg(extensionsSql, 'extensions')}, ${jsonAgg(\n enumsSql,\n 'enums',\n )}, ${jsonAgg(domainsSql, 'domains')}, ${jsonAgg(\n collationsSql(version),\n 'collations',\n )}`;\n\nexport interface IntrospectedStructure {\n schemas: string[];\n tables: DbStructure.Table[];\n views: DbStructure.View[];\n indexes: DbStructure.Index[];\n excludes: DbStructure.Exclude[];\n constraints: DbStructure.Constraint[];\n triggers: DbStructure.Trigger[];\n extensions: DbStructure.Extension[];\n enums: DbStructure.Enum[];\n domains: DbStructure.Domain[];\n collations: DbStructure.Collation[];\n}\n\nexport async function introspectDbSchema(\n db: AdapterBase,\n): Promise<IntrospectedStructure> {\n const {\n rows: [{ version: versionString }],\n } = await db.query<{ version: string }>('SELECT version()');\n\n const version = +(versionString.match(/\\d+/) as string[])[0];\n\n const data = await db.query<IntrospectedStructure>(sql(version));\n const result = data.rows[0];\n\n for (const domain of result.domains) {\n domain.checks = domain.checks?.filter((check) => check);\n nullsToUndefined(domain);\n }\n\n for (const table of result.tables) {\n for (const column of table.columns) {\n nullsToUndefined(column);\n if (column.identity) nullsToUndefined(column.identity);\n if (column.compression) {\n column.compression =\n (column.compression as string) === 'p' ? 'pglz' : 'lz4';\n }\n }\n }\n\n const indexes: DbStructure.Index[] = [];\n const excludes: DbStructure.Exclude[] = [];\n\n for (const index of result.indexes) {\n nullsToUndefined(index);\n for (const column of index.columns) {\n if (!('expression' in column)) continue;\n\n const s = column.expression;\n const columnR = `\"?\\\\w+\"?`;\n const langR = `(${columnR}|'\\\\w+'::regconfig)`;\n const firstColumnR = `[(]*${columnR}`;\n const concatR = `\\\\|\\\\|`;\n const restColumnR = ` ${concatR} ' '::text\\\\) ${concatR} ${columnR}\\\\)`;\n const coalesceColumn = `COALESCE\\\\(${columnR}, ''::text\\\\)`;\n const tsVectorR = `to_tsvector\\\\(${langR}, (${firstColumnR}|${restColumnR}|${coalesceColumn})+\\\\)`;\n const weightR = `'\\\\w'::\"char\"`;\n const setWeightR = `setweight\\\\(${tsVectorR}, ${weightR}\\\\)`;\n const setWeightOrTsVectorR = `(${setWeightR}|${tsVectorR})`;\n\n const match = s.match(\n new RegExp(`^([\\\\(]*${setWeightOrTsVectorR}[\\\\)]*( ${concatR} )?)+$`),\n );\n if (!match) continue;\n\n let language: string | undefined;\n let languageColumn: string | undefined;\n const tokens = match[0]\n .match(\n new RegExp(\n `setweight\\\\(|to_tsvector\\\\(${langR}|[:']?${columnR}\\\\(?`,\n 'g',\n ),\n )\n ?.reduce<\n (\n | { kind: 'weight'; value: SearchWeight }\n | { kind: 'column'; value: string }\n )[]\n >((acc, token) => {\n if (\n token === 'setweight(' ||\n token === 'COALESCE(' ||\n token[0] === ':'\n )\n return acc;\n\n if (token.startsWith('to_tsvector(')) {\n if (token[12] === \"'\") {\n language = token.slice(13, -12);\n } else {\n languageColumn = token.slice(12);\n }\n } else if (token[0] === \"'\") {\n acc.push({ kind: 'weight', value: token[1] as SearchWeight });\n } else {\n if (token[0] === '\"') token = token.slice(1, -1);\n acc.push({ kind: 'column', value: token });\n }\n\n return acc;\n }, []);\n\n if (!tokens) continue;\n\n index.language = language;\n index.languageColumn = languageColumn;\n index.tsVector = true;\n index.columns = [];\n\n for (const token of tokens) {\n if (token.kind === 'column') {\n index.columns.push({\n column: token.value,\n });\n } else if (token.kind === 'weight') {\n index.columns[index.columns.length - 1].weight = token.value;\n }\n }\n }\n\n ((index as DbStructure.Exclude).exclude ? excludes : indexes).push(index);\n }\n\n result.indexes = indexes;\n result.excludes = excludes;\n\n return result;\n}\n\nconst nullsToUndefined = (obj: EmptyObject) => {\n for (const key in obj) {\n if ((obj as RecordUnknown)[key] === null)\n (obj as RecordUnknown)[key] = undefined;\n }\n};\n","import {\n DbStructure,\n introspectDbSchema,\n IntrospectedStructure,\n} from './dbStructure';\nimport { RakeDbAst } from '../ast';\nimport {\n ArrayColumn,\n assignDbDataToColumn,\n ColumnFromDbParams,\n ColumnsByType,\n ColumnsShape,\n Column,\n CustomTypeColumn,\n DbStructureDomainsMap,\n DomainColumn,\n EnumColumn,\n makeColumnsByType,\n PostgisGeographyPointColumn,\n raw,\n RawSQL,\n TableData,\n AdapterBase,\n ColumnSchemaConfig,\n singleQuote,\n TemplateLiteralArgs,\n toCamelCase,\n toSnakeCase,\n} from 'pqb';\nimport {\n getConstraintName,\n getExcludeName,\n getIndexName,\n} from '../migration/migration.utils';\nimport { AnyRakeDbConfig } from '../config';\n\nconst matchMap: Record<string, undefined | TableData.References.Match> = {\n s: undefined,\n f: 'FULL',\n p: 'PARTIAL',\n};\n\nconst fkeyActionMap: Record<string, undefined | TableData.References.Action> = {\n a: undefined, // default\n r: 'RESTRICT',\n c: 'CASCADE',\n n: 'SET NULL',\n d: 'SET DEFAULT',\n};\n\nexport interface StructureToAstCtx {\n snakeCase?: boolean;\n unsupportedTypes: Record<string, string[]>;\n currentSchema: string;\n columnSchemaConfig: ColumnSchemaConfig;\n columnsByType: ColumnsByType;\n}\n\nexport interface StructureToAstTableData {\n primaryKey?: TableData.PrimaryKey;\n indexes: DbStructure.Index[];\n excludes: DbStructure.Exclude[];\n constraints: DbStructure.Constraint[];\n}\n\nexport const makeStructureToAstCtx = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n): StructureToAstCtx => ({\n snakeCase: config.snakeCase,\n unsupportedTypes: {},\n currentSchema,\n columnSchemaConfig: config.schemaConfig,\n columnsByType: makeColumnsByType(config.schemaConfig),\n});\n\nexport const structureToAst = async (\n ctx: StructureToAstCtx,\n adapter: AdapterBase,\n config: AnyRakeDbConfig,\n): Promise<RakeDbAst[]> => {\n const ast: RakeDbAst[] = [];\n\n const data = await introspectDbSchema(adapter);\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 for (const it of data.collations) {\n ast.push({\n type: 'collation',\n action: 'create',\n ...it,\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n });\n }\n\n const domains = makeDomainsMap(ctx, data);\n\n for (const table of data.tables) {\n if (table.name === config.migrationsTable) continue;\n\n ast.push(tableToAst(ctx, data, table, 'create', domains));\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 === ctx.currentSchema ? undefined : it.schemaName,\n version: it.version,\n });\n }\n\n for (const it of data.enums) {\n ast.push({\n type: 'enum',\n action: 'create',\n name: it.name,\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n values: it.values,\n });\n }\n\n for (const it of data.domains) {\n ast.push({\n type: 'domain',\n action: 'create',\n schema: it.schemaName === ctx.currentSchema ? undefined : it.schemaName,\n name: it.name,\n baseType: domains[`${it.schemaName}.${it.name}`],\n });\n }\n\n for (const table of data.tables) {\n for (const fkey of data.constraints) {\n if (\n fkey.references &&\n fkey.tableName === table.name &&\n fkey.schemaName === table.schemaName &&\n checkIfIsOuterRecursiveFkey(data, table, fkey.references)\n ) {\n ast.push({\n ...constraintToAst(ctx, fkey),\n type: 'constraint',\n action: 'create',\n tableSchema:\n table.schemaName === ctx.currentSchema\n ? undefined\n : table.schemaName,\n tableName: fkey.tableName,\n });\n }\n }\n }\n\n for (const view of data.views) {\n ast.push(viewToAst(ctx, data, domains, view));\n }\n\n return ast;\n};\n\nexport const makeDomainsMap = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n): DbStructureDomainsMap => {\n const domains: DbStructureDomainsMap = {};\n\n for (const it of data.domains) {\n const column = instantiateDbColumn(ctx, data, domains, {\n schemaName: it.schemaName,\n name: it.name,\n type: it.type,\n typeSchema: it.typeSchema,\n arrayDims: it.arrayDims,\n tableName: '',\n isNullable: it.isNullable,\n collate: it.collate,\n default: it.default,\n typmod: -1,\n });\n\n if (it.checks) {\n column.data.checks = it.checks.map((check) => ({\n sql: new RawSQL([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n domains[`${it.schemaName}.${it.name}`] = column;\n }\n\n return domains;\n};\n\nconst getDbColumnIsSerial = (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\nexport const instantiateDbColumn = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n dbColumn: DbStructure.Column,\n) => {\n const isSerial = getDbColumnIsSerial(dbColumn);\n if (isSerial) {\n dbColumn = { ...dbColumn, default: undefined };\n }\n\n let column: Column;\n\n const col = instantiateColumnByDbType(ctx, dbColumn.type, isSerial, dbColumn);\n if (col) {\n column = col;\n } else {\n const { typeSchema, type: typeName } = dbColumn;\n const typeId =\n typeSchema === 'pg_catalog' ? typeName : `${typeSchema}.${typeName}`;\n const domainColumn = domains[typeId];\n if (domainColumn) {\n column = new DomainColumn(\n ctx.columnSchemaConfig,\n typeName,\n typeSchema,\n dbColumn.extension,\n ).as(domainColumn);\n } else {\n const enumType = data.enums.find(\n (x) => x.name === typeName && x.schemaName === typeSchema,\n );\n if (enumType) {\n column = new EnumColumn(\n ctx.columnSchemaConfig,\n typeSchema === ctx.currentSchema ? typeName : typeId,\n enumType.values,\n ctx.columnSchemaConfig.type,\n );\n } else {\n column = new CustomTypeColumn(\n ctx.columnSchemaConfig,\n typeName,\n typeSchema === 'pg_catalog' ? undefined : typeSchema,\n dbColumn.extension,\n );\n\n (ctx.unsupportedTypes[dbColumn.type] ??= []).push(\n `${dbColumn.schemaName}${\n dbColumn.tableName ? `.${dbColumn.tableName}` : ''\n }.${dbColumn.name}`,\n );\n }\n\n assignDbDataToColumn(column, dbColumn);\n }\n }\n\n column.data.name = undefined;\n if (!column.data.isNullable) column.data.isNullable = undefined;\n\n if (dbColumn.arrayDims) {\n const arr = new ArrayColumn(\n ctx.columnSchemaConfig,\n column,\n ctx.columnSchemaConfig.type,\n );\n arr.data.isNullable = dbColumn.isNullable as true;\n arr.data.arrayDims = dbColumn.arrayDims;\n column = arr;\n }\n\n return column;\n};\n\nconst instantiateColumnByDbType = (\n ctx: StructureToAstCtx,\n type: string,\n isSerial: boolean,\n params: ColumnFromDbParams,\n): Column | undefined => {\n let columnFn =\n ctx.columnsByType[\n !isSerial\n ? type\n : type === 'int2'\n ? 'smallserial'\n : type === 'int4'\n ? 'serial'\n : 'bigserial'\n ];\n\n if (\n !columnFn &&\n params.extension === 'postgis' &&\n type === 'geography' &&\n PostgisGeographyPointColumn.isDefaultPoint(params.typmod)\n ) {\n columnFn = ctx.columnsByType.geographyDefaultPoint;\n }\n\n return columnFn\n ? (assignDbDataToColumn(columnFn(), params) as Column)\n : undefined;\n};\n\nexport const tableToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n table: DbStructure.Table,\n action: 'create' | 'drop',\n domains: DbStructureDomainsMap,\n): RakeDbAst.Table => {\n const { schemaName, name: tableName } = table;\n\n const tableData = getDbStructureTableData(data, table);\n const { primaryKey, constraints } = tableData;\n\n return {\n type: 'table',\n action,\n schema: schemaName === ctx.currentSchema ? undefined : schemaName,\n comment: table.comment,\n name: tableName,\n shape: makeDbStructureColumnsShape(ctx, data, domains, table, tableData),\n noPrimaryKey: tableData.primaryKey ? 'error' : 'ignore',\n primaryKey:\n primaryKey && primaryKey.columns.length > 1\n ? { ...primaryKey, columns: primaryKey.columns.map(toCamelCase) }\n : undefined,\n indexes: indexesOrExcludesToAst<TableData.Index[]>(\n tableName,\n tableData,\n 'indexes',\n ),\n excludes: indexesOrExcludesToAst<TableData.Exclude[]>(\n tableName,\n tableData,\n 'excludes',\n ),\n constraints: constraints.reduce<TableData.Constraint[]>((acc, it) => {\n if (\n (it.check && it.references) ||\n (it.check && it.check.columns?.length !== 1) ||\n (it.references &&\n it.references.columns.length !== 1 &&\n !checkIfIsOuterRecursiveFkey(data, table, it.references))\n ) {\n acc.push(dbConstraintToTableConstraint(ctx, table, it));\n }\n\n return acc;\n }, []),\n };\n};\n\nconst indexesOrExcludesToAst = <T>(\n tableName: string,\n tableData: StructureToAstTableData,\n key: 'indexes' | 'excludes',\n): T => {\n return tableData[key].reduce<TableData.Index[]>((acc, item) => {\n if (\n item.columns.length > 1 ||\n item.columns.some((it) => 'expression' in it)\n ) {\n const options = makeIndexOrExcludeOptions(tableName, item, key);\n\n acc.push({\n columns: item.columns.map((it, i) => ({\n with: 'exclude' in item && item.exclude ? item.exclude[i] : undefined,\n ...('expression' in it\n ? { expression: it.expression }\n : { column: toCamelCase(it.column) }),\n collate: it.collate,\n opclass: it.opclass,\n order: it.order,\n })),\n options: {\n ...options,\n include: item.include?.map(toCamelCase),\n },\n });\n }\n return acc;\n }, []) as T;\n};\n\nexport const getDbStructureTableData = (\n data: IntrospectedStructure,\n { name, schemaName }: DbStructure.Table,\n): StructureToAstTableData => {\n const filterFn = filterByTableSchema(name, schemaName);\n\n const constraints = data.constraints.filter(filterFn);\n\n const primaryKey = constraints.find((c) => c.primaryKey);\n\n return {\n primaryKey: primaryKey?.primaryKey\n ? {\n columns: primaryKey.primaryKey,\n name:\n primaryKey.name === `${name}_pkey` ? undefined : primaryKey.name,\n }\n : undefined,\n indexes: data.indexes.filter(filterFn),\n excludes: data.excludes.filter(filterFn),\n constraints,\n };\n};\n\nconst filterByTableSchema =\n (tableName: string, schemaName: string) =>\n (x: DbStructure.TableNameAndSchemaName) =>\n x.tableName === tableName && x.schemaName === schemaName;\n\nconst constraintToAst = (\n ctx: StructureToAstCtx,\n item: DbStructure.Constraint,\n): TableData.Constraint => {\n const result: TableData.Constraint = {};\n\n const { references, check } = item;\n\n if (references) {\n const options: TableData.References.Options = {};\n result.references = {\n columns: references.columns,\n fnOrTable: getReferencesTable(ctx, references),\n foreignColumns: references.foreignColumns,\n options,\n };\n\n const match = matchMap[references.match];\n if (match) options.match = match;\n\n const onUpdate = fkeyActionMap[references.onUpdate];\n if (onUpdate) options.onUpdate = onUpdate;\n\n const onDelete = fkeyActionMap[references.onDelete];\n if (onDelete) options.onDelete = onDelete;\n }\n\n if (check) {\n result.check = raw({ raw: check.expression });\n }\n\n if (\n item.name &&\n item.name !== getConstraintName(item.tableName, result, ctx.snakeCase)\n ) {\n result.name = item.name;\n if (result.references?.options) {\n result.references.options.name = item.name;\n }\n }\n\n return result;\n};\n\nconst getReferencesTable = (\n ctx: StructureToAstCtx,\n references: DbStructure.References,\n) => {\n return references.foreignSchema !== ctx.currentSchema\n ? `${references.foreignSchema}.${references.foreignTable}`\n : references.foreignTable;\n};\n\nconst isColumnCheck = (\n it: DbStructure.Constraint,\n): it is DbStructure.Constraint & {\n check: DbStructure.Check & { columns: string[] };\n} => {\n return !it.references && it.check?.columns?.length === 1;\n};\n\nconst viewToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n view: DbStructure.View,\n): RakeDbAst.View => {\n const shape = makeDbStructureColumnsShape(ctx, data, domains, view);\n\n const options: RakeDbAst.ViewOptions = {};\n if (view.isRecursive) options.recursive = true;\n\n if (view.with) {\n const withOptions: Record<string, unknown> = {};\n options.with = withOptions;\n for (const pair of view.with) {\n const [key, value] = pair.split('=');\n withOptions[toCamelCase(key) as 'checkOption'] =\n value === 'true' ? true : value === 'false' ? false : value;\n }\n }\n\n return {\n type: 'view',\n action: 'create',\n schema: view.schemaName === ctx.currentSchema ? undefined : view.schemaName,\n name: view.name,\n shape,\n sql: raw({ raw: view.sql }),\n options,\n deps: view.deps,\n };\n};\n\nexport const makeDbStructureColumnsShape = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n table: DbStructure.Table | DbStructure.View,\n tableData?: StructureToAstTableData,\n): ColumnsShape => {\n const shape: ColumnsShape = {};\n const checks = tableData ? getDbTableColumnsChecks(tableData) : undefined;\n\n for (const item of table.columns) {\n const [key, column] = dbColumnToAst(\n ctx,\n data,\n domains,\n table.name,\n item,\n table,\n tableData,\n checks,\n );\n shape[key] = column;\n }\n\n return shape;\n};\n\nexport interface ColumnChecks {\n [K: string]: string[];\n}\n\nexport const getDbTableColumnsChecks = (tableData: StructureToAstTableData) =>\n tableData.constraints.reduce<ColumnChecks>((acc, item) => {\n if (isColumnCheck(item)) {\n (acc[item.check.columns[0]] ??= []).push(item.check.expression);\n }\n return acc;\n }, {});\n\nexport const dbColumnToAst = (\n ctx: StructureToAstCtx,\n data: IntrospectedStructure,\n domains: DbStructureDomainsMap,\n tableName: string,\n item: DbStructure.Column,\n table?: DbStructure.Table,\n tableData?: StructureToAstTableData,\n checks?: ColumnChecks,\n): [key: string, column: Column] => {\n let column = instantiateDbColumn(ctx, data, domains, item);\n column.data.name = item.name;\n\n if (item.identity) {\n column.data.identity = item.identity;\n if (!item.identity.always) delete column.data.identity?.always;\n }\n\n if (\n tableData?.primaryKey?.columns?.length === 1 &&\n tableData?.primaryKey?.columns[0] === item.name\n ) {\n column = column.primaryKey();\n }\n\n collectColumnIndexesOrExcludes(item, column, tableName, tableData, 'indexes');\n collectColumnIndexesOrExcludes(\n item,\n column,\n tableName,\n tableData,\n 'excludes',\n );\n\n if (table) {\n for (const it of data.constraints) {\n if (\n it.tableName !== table.name ||\n it.schemaName !== table.schemaName ||\n it.check ||\n it.references?.columns.length !== 1 ||\n it.references.columns[0] !== item.name ||\n checkIfIsOuterRecursiveFkey(data, table, it.references)\n ) {\n continue;\n }\n\n const c = dbConstraintToTableConstraint(ctx, table, it);\n\n column = column.foreignKey(\n c.references?.fnOrTable as string,\n it.references.foreignColumns[0],\n c.references?.options,\n );\n }\n }\n\n const columnChecks = checks?.[item.name];\n if (columnChecks) {\n column.data.checks = columnChecks.map((check) => ({\n sql: new RawSQL([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n const camelCaseName = toCamelCase(item.name);\n\n if (ctx.snakeCase) {\n const snakeCaseName = toSnakeCase(camelCaseName);\n\n if (snakeCaseName !== item.name) column.data.name = item.name;\n } else if (camelCaseName !== item.name) {\n column.data.name = item.name;\n }\n\n return [camelCaseName, column];\n};\n\nconst collectColumnIndexesOrExcludes = (\n dbColumn: DbStructure.Column,\n column: Column,\n tableName: string,\n tableData: StructureToAstTableData | undefined,\n key: 'indexes' | 'excludes',\n) => {\n const items = tableData?.[key];\n if (!items) return;\n\n const columnItems = items.filter(\n (it) =>\n it.columns.length === 1 &&\n 'column' in it.columns[0] &&\n it.columns[0].column === dbColumn.name,\n );\n for (const item of columnItems) {\n const columnOptions = item.columns[0];\n const { name, ...itemOptions } = makeIndexOrExcludeOptions(\n tableName,\n item,\n key,\n );\n (column.data[key] ??= []).push({\n with: ('exclude' in item && item.exclude\n ? (item as DbStructure.Exclude).exclude[0]\n : undefined) as never,\n options: {\n name,\n collate: columnOptions.collate,\n opclass: columnOptions.opclass,\n order: columnOptions.order,\n ...itemOptions,\n },\n });\n }\n};\n\nconst dbConstraintToTableConstraint = (\n ctx: StructureToAstCtx,\n table: DbStructure.Table,\n item: DbStructure.Constraint,\n) => {\n const { references, check } = item;\n\n const constraint: TableData.Constraint = {\n references: references\n ? {\n columns: references.columns,\n fnOrTable: getReferencesTable(ctx, references),\n foreignColumns: references.foreignColumns,\n options: {\n match: matchMap[references.match],\n onUpdate: fkeyActionMap[references.onUpdate],\n onDelete: fkeyActionMap[references.onDelete],\n },\n }\n : undefined,\n check: check ? raw({ raw: check.expression }) : undefined,\n };\n\n const name =\n item.name &&\n item.name !== getConstraintName(table.name, constraint, ctx.snakeCase)\n ? item.name\n : undefined;\n\n if (name) {\n constraint.name = name;\n if (constraint.references?.options) {\n constraint.references.options.name = name;\n }\n }\n\n return constraint;\n};\n\nconst makeIndexOrExcludeOptions = (\n tableName: string,\n index: DbStructure.Index,\n key: 'indexes' | 'excludes',\n) => {\n return {\n name:\n index.name !==\n (key === 'indexes' ? getIndexName : getExcludeName)(\n tableName,\n index.columns,\n )\n ? index.name\n : undefined,\n using: index.using === 'btree' ? undefined : index.using,\n unique: index.unique || undefined,\n include: index.include,\n nullsNotDistinct: index.nullsNotDistinct || undefined,\n with: index.with,\n tablespace: index.tablespace,\n where: index.where,\n };\n};\n\nconst checkIfIsOuterRecursiveFkey = (\n data: IntrospectedStructure,\n table: DbStructure.Table,\n references: DbStructure.References,\n) => {\n const referencesId = `${references.foreignSchema}.${references.foreignTable}`;\n const tableId = `${table.schemaName}.${table.name}`;\n for (const other of data.tables) {\n const id = `${other.schemaName}.${other.name}`;\n if (referencesId === id) {\n for (const c of data.constraints) {\n if (\n c.tableName === other.name &&\n c.schemaName === other.schemaName &&\n c.references?.foreignTable === table.name &&\n c.references.foreignSchema === table.schemaName &&\n tableId < id\n ) {\n return true;\n }\n }\n break;\n }\n }\n return false;\n};\n","import { RakeDbAst } from '../ast';\nimport {\n getConstraintName,\n getExcludeName,\n getForeignKeyTable,\n getIndexName,\n} from '../migration/migration.utils';\nimport {\n ArrayColumn,\n ArrayColumnValue,\n Column,\n EnumColumn,\n TableData,\n ColumnTypeSchemaArg,\n toArray,\n exhaustive,\n} from 'pqb';\nimport { getSchemaAndTableFromName } from '../common';\nimport { AnyRakeDbConfig } from 'rake-db';\n\nexport interface GenerateItem {\n ast: RakeDbAst;\n add: Set<string>;\n drop: Set<string>;\n deps: Set<string>;\n}\n\ntype TableColumn = [\n keys: string[],\n name: string,\n column: RakeDbAst.ColumnChange,\n];\n\nexport const astToGenerateItems = (\n config: AnyRakeDbConfig,\n asts: RakeDbAst[],\n currentSchema: string,\n): GenerateItem[] => {\n return asts.map((ast) => astToGenerateItem(config, ast, currentSchema));\n};\n\nexport const astToGenerateItem = (\n config: AnyRakeDbConfig,\n ast: RakeDbAst,\n currentSchema: string,\n): GenerateItem => {\n const add: string[] = [];\n const drop: string[] = [];\n const deps: string[] = [];\n const typeSchemaCache = new Map<string, string>();\n const resolveType = (type: string): string => {\n let dep = typeSchemaCache.get(type);\n if (!dep) {\n const [schema = currentSchema, name] = getSchemaAndTableFromName(type);\n dep = `${schema}.${name}`;\n typeSchemaCache.set(type, dep);\n }\n return dep;\n };\n\n switch (ast.type) {\n case 'table':\n case 'changeTable':\n case 'view': {\n const schema = ast.schema ?? currentSchema;\n const table = `${schema}.${ast.name}`;\n\n if (ast.type === 'table' || ast.type === 'view') {\n const keys = ast.action === 'create' ? add : drop;\n keys.push(table);\n deps.push(schema);\n\n const columns: TableColumn[] = Object.entries(ast.shape).map(\n ([name, column]) => [keys, name, { column }],\n );\n\n analyzeTableColumns(\n config,\n currentSchema,\n schema,\n table,\n deps,\n resolveType,\n columns,\n );\n\n if (ast.type === 'table') {\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n keys,\n deps,\n ast,\n );\n } else {\n deps.push(\n ...ast.deps.map(({ schemaName, name }) => `${schemaName}.${name}`),\n );\n }\n } else {\n deps.push(table);\n\n const columns: TableColumn[] = [];\n\n for (const name in ast.shape) {\n const arr = toArray(ast.shape[name]);\n for (const item of arr) {\n if (item.type === 'add') {\n columns.push([add, name, { column: item.item }]);\n } else if (item.type === 'drop') {\n columns.push([drop, name, { column: item.item }]);\n } else if (item.type === 'change') {\n columns.push([add, name, item.to]);\n columns.push([drop, name, item.from]);\n }\n }\n }\n\n analyzeTableColumns(\n config,\n currentSchema,\n schema,\n table,\n deps,\n resolveType,\n columns,\n );\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n add,\n deps,\n ast.add,\n );\n analyzeTableData(\n config,\n currentSchema,\n schema,\n table,\n drop,\n deps,\n ast.drop,\n );\n }\n break;\n }\n case 'renameType': {\n const { fromSchema = currentSchema, toSchema = currentSchema } = ast;\n add.push(`${toSchema}.${ast.to}`);\n drop.push(`${fromSchema}.${ast.from}`);\n deps.push(fromSchema, toSchema);\n break;\n }\n case 'schema': {\n (ast.action === 'create' ? add : drop).push(ast.name);\n break;\n }\n case 'renameSchema': {\n drop.push(ast.from);\n add.push(ast.to);\n break;\n }\n case 'enum':\n case 'collation':\n case 'extension': {\n const schema = ast.schema ?? currentSchema;\n (ast.action === 'create' ? add : drop).push(`${schema}.${ast.name}`);\n deps.push(schema);\n break;\n }\n case 'enumValues':\n case 'renameEnumValues':\n case 'changeEnumValues': {\n const schema = ast.schema ?? currentSchema;\n deps.push(schema, `${schema}.${ast.name}`);\n break;\n }\n case 'domain': {\n const schema = ast.schema ?? currentSchema;\n (ast.action === 'create' ? add : drop).push(`${schema}.${ast.name}`);\n const column = ast.baseType;\n deps.push(schema, resolveType(column.dataType));\n if (column.data.collate) deps.push(column.data.collate);\n break;\n }\n case 'constraint': {\n const { tableSchema = currentSchema, tableName } = ast;\n const name = `${tableSchema}.${\n ast.name ?? getConstraintName(tableName, ast, config.snakeCase)\n }`;\n (ast.action === 'create' ? add : drop).push(name);\n deps.push(tableSchema, `${tableSchema}.${tableName}`);\n break;\n }\n case 'renameTableItem': {\n const { tableSchema = currentSchema, tableName } = ast;\n drop.push(ast.from);\n add.push(ast.to);\n deps.push(tableSchema, `${tableSchema}.${tableName}`);\n break;\n }\n default:\n exhaustive(ast);\n }\n\n return {\n ast,\n add: new Set(add),\n drop: new Set(drop),\n deps: new Set(deps),\n };\n};\n\nconst analyzeTableColumns = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n schema: string,\n table: string,\n deps: string[],\n resolveType: (type: string) => string,\n columns: TableColumn[],\n) => {\n for (const [keys, name, change] of columns) {\n const { column } = change;\n if (column) {\n let c = column;\n\n while (c.dataType === 'array') {\n c = (\n column as ArrayColumn<\n ColumnTypeSchemaArg,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >\n ).data.item as Column;\n }\n\n let type: string;\n if (c.dataType === 'enum') {\n type = (\n c as EnumColumn<ColumnTypeSchemaArg, unknown, readonly string[]>\n ).enumName;\n } else {\n type = c.dataType;\n }\n\n deps.push(resolveType(type));\n } else if (change.type) {\n deps.push(resolveType(change.type));\n }\n\n const collate = change.column?.data.collate ?? change.collate;\n if (collate) deps.push(collate);\n\n const primaryKey = change.primaryKey || change.column?.data.primaryKey;\n if (primaryKey) {\n keys.push(`${table}_pkey`);\n }\n\n pushIndexOrExcludeKeys(change, keys, schema, table, name, 'indexes');\n pushIndexOrExcludeKeys(change, keys, schema, table, name, 'excludes');\n\n const foreignKeys = change.foreignKeys || change.column?.data.foreignKeys;\n if (foreignKeys) {\n for (const fkey of foreignKeys) {\n keys.push(\n fkey.options?.name\n ? `${schema}.${fkey.options.name}`\n : getConstraintName(\n table,\n {\n references: { columns: [change.column?.data.name ?? name] },\n },\n config.snakeCase,\n ),\n );\n\n const [s = currentSchema, t] = getForeignKeyTable(fkey.fnOrTable);\n const foreignTable = `${s}.${t}`;\n if (foreignTable !== table) {\n deps.push(foreignTable);\n }\n }\n }\n }\n};\n\nconst pushIndexOrExcludeKeys = (\n change: RakeDbAst.ColumnChange,\n keys: string[],\n schema: string,\n table: string,\n name: string,\n key: 'indexes' | 'excludes',\n) => {\n const items = change[key] || change.column?.data[key];\n if (items) {\n const getName = key === 'indexes' ? getIndexName : getExcludeName;\n for (const x of items) {\n keys.push(\n x.options.name\n ? `${schema}.${x.options.name}`\n : getName(table, [{ column: change.column?.data.name ?? name }]),\n );\n }\n }\n};\n\nconst pushIndexesOrExcludesKeys = (\n keys: string[],\n schema: string,\n table: string,\n data: TableData,\n key: 'indexes' | 'excludes',\n) => {\n const arr = data[key];\n if (arr) {\n const getName = key === 'indexes' ? getIndexName : getExcludeName;\n for (const x of arr) {\n keys.push(\n x.options.name\n ? `${schema}.${x.options.name}`\n : getName(table, x.columns),\n );\n }\n }\n};\n\nconst analyzeTableData = (\n config: AnyRakeDbConfig,\n currentSchema: string,\n schema: string,\n table: string,\n keys: string[],\n deps: string[],\n data: TableData,\n) => {\n if (data.primaryKey) {\n const name = data.primaryKey.name;\n keys.push(name ? `${schema}.${name}` : `${table}_pkey`);\n }\n\n pushIndexesOrExcludesKeys(keys, schema, table, data, 'indexes');\n pushIndexesOrExcludesKeys(keys, schema, table, data, 'excludes');\n\n if (data.constraints) {\n for (const constraint of data.constraints) {\n keys.push(\n constraint.name\n ? `${schema}.${constraint.name}`\n : getConstraintName(table, constraint, config.snakeCase),\n );\n\n if (constraint.references) {\n const [s = currentSchema, t] = getForeignKeyTable(\n constraint.references.fnOrTable,\n );\n deps.push(`${s}.${t}`);\n }\n }\n }\n};\n","import { RakeDbAst } from '../ast';\nimport {\n Column,\n referencesArgsToCode,\n TimestampTZColumn,\n TimestampColumn,\n primaryKeyInnerToCode,\n indexInnerToCode,\n constraintInnerToCode,\n TableData,\n pushTableDataCode,\n excludeInnerToCode,\n codeToString,\n addCode,\n Code,\n backtickQuote,\n ColumnSchemaConfig,\n ColumnToCodeCtx,\n isRawSQL,\n quoteObjectKey,\n singleQuote,\n toArray,\n exhaustive,\n} from 'pqb';\nimport { quoteSchemaTable } from '../common';\nimport { AnyRakeDbConfig } from '../config';\nimport { astToGenerateItems } from './astToGenerateItems';\n\nexport const astToMigration = (\n currentSchema: string,\n config: AnyRakeDbConfig,\n asts: RakeDbAst[],\n): string | undefined => {\n const items = astToGenerateItems(config, asts, currentSchema);\n\n const toBeAdded = new Set<string>();\n const toBeDropped = new Set<string>();\n const remainingDeps = new Map<string, number>();\n const added = new Set<string>();\n const dropped = new Set<string>();\n const groups: RakeDbAst[][] = [[]];\n\n for (const item of items) {\n for (const add of item.add) {\n toBeAdded.add(add);\n }\n\n for (const drop of item.drop) {\n // `toBeDropped` contains only those items that are dropped and added in separate asts.\n // Skip it from `toBeDropped` if, for example, primary key is dropped and added inside a single table change.\n if (!item.add.has(drop)) {\n toBeDropped.add(drop);\n }\n }\n\n for (const dep of item.deps) {\n remainingDeps.set(dep, (remainingDeps.get(dep) ?? 0) + 1);\n }\n }\n\n let len = items.length;\n if (!len) return;\n\n for (;;) {\n const cycleAdd = new Set<string>();\n const cycleDrop = new Set<string>();\n const cycleDeps = new Map<string, number>();\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n let satisfied = true;\n for (const dep of item.deps) {\n if (toBeAdded.has(dep) && !added.has(dep) && !item.add.has(dep)) {\n satisfied = false;\n break;\n }\n }\n\n if (satisfied) {\n for (const dep of item.drop) {\n const selfRef = item.deps.has(dep);\n const depsLeft = remainingDeps.get(dep);\n if (depsLeft && depsLeft > (selfRef ? 1 : 0)) {\n satisfied = false;\n break;\n }\n }\n }\n\n if (satisfied) {\n // When the same thing is dropped and then added in a single migration,\n // make it to first drop and then add at a separate section to preserve the correct `down` order.\n for (const key of item.add) {\n if (toBeDropped.has(key) && !dropped.has(key)) {\n satisfied = false;\n break;\n }\n }\n }\n\n if (satisfied) {\n for (const key of item.add) {\n cycleAdd.add(key);\n }\n\n for (const key of item.drop) {\n cycleDrop.add(key);\n }\n\n for (const key of item.deps) {\n cycleDeps.set(key, (cycleDeps.get(key) ?? 0) + 1);\n }\n\n items.splice(i, 1);\n i--;\n groups[groups.length - 1].push(item.ast);\n }\n }\n\n if (len === items.length) {\n throw Object.assign(\n new Error(\n `Cannot satisfy migration dependencies: ${JSON.stringify(\n items.map((item) => ({\n ast: item.ast,\n add: [...item.add.values()],\n drop: [...item.drop.values()],\n deps: [...item.deps.values()],\n })),\n null,\n 2,\n )}`,\n ),\n );\n }\n\n for (const add of cycleAdd) {\n added.add(add);\n }\n\n for (const drop of cycleDrop) {\n dropped.add(drop);\n }\n\n for (const [key, num] of cycleDeps) {\n const set = (remainingDeps.get(key) ?? num) - num;\n if (set) remainingDeps.set(key, set);\n else remainingDeps.delete(key);\n }\n\n len = items.length;\n if (!len) break;\n\n groups.push([]);\n }\n\n if (!groups[0].length) return;\n\n let code = '';\n for (const group of groups) {\n code += `\nchange(async (db) => {\n${group\n .map((ast) =>\n codeToString(\n (\n astEncoders as {\n [K: string]: (\n ast: RakeDbAst,\n config: AnyRakeDbConfig,\n currentSchema: string,\n ) => Code;\n }\n )[ast.type](ast, config, currentSchema),\n ' ',\n ' ',\n ),\n )\n .join('\\n\\n')}\n});\n`;\n }\n\n return code;\n};\n\nconst astEncoders: {\n [K in RakeDbAst['type']]: (\n ast: RakeDbAst & { type: K },\n config: AnyRakeDbConfig,\n currentSchema: string,\n ) => Code;\n} = {\n table(ast, config, currentSchema) {\n let code: Code[] = [];\n const result = code;\n\n const hasOptions = Boolean(ast.comment || ast.noPrimaryKey === 'ignore');\n const hasTableData = Boolean(\n ast.primaryKey ||\n ast.indexes?.length ||\n ast.excludes?.length ||\n ast.constraints?.length,\n );\n const isShifted = hasOptions || hasTableData;\n\n if (isShifted) {\n addCode(code, `await db.${ast.action}Table(`);\n\n const inner: Code[] = [`${quoteSchemaTable(ast)},`];\n code.push(inner);\n code = inner;\n\n if (hasOptions) {\n const options: string[] = [];\n if (ast.comment)\n options.push(`comment: ${JSON.stringify(ast.comment)},`);\n if (ast.noPrimaryKey === 'ignore') options.push(`noPrimaryKey: true,`);\n\n code.push('{', options, '},');\n }\n\n code.push('(t) => ({');\n } else {\n addCode(\n code,\n `await db.${ast.action}Table(${quoteSchemaTable(ast)}, (t) => ({`,\n );\n }\n\n const timestamps = getHasTimestamps(\n ast.shape.createdAt,\n ast.shape.updatedAt,\n );\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in ast.shape) {\n if (\n timestamps.hasAnyTimestamps &&\n (key === 'createdAt' || key === 'updatedAt')\n )\n continue;\n\n const line: Code[] = [`${quoteObjectKey(key, config.snakeCase)}: `];\n const columnCode = ast.shape[key].toCode(toCodeCtx, key);\n for (const part of columnCode) {\n addCode(line, part);\n }\n addCode(line, ',');\n code.push(line);\n }\n\n if (timestamps.hasAnyTimestamps) {\n code.push([`...${timestampsToCode(timestamps)},`]);\n }\n\n if (isShifted) {\n addCode(code, '}),');\n\n if (hasTableData) pushTableDataCode(code, ast);\n\n addCode(result, ');');\n } else {\n addCode(result, '}));');\n }\n\n return result;\n },\n changeTable(ast, config, currentSchema) {\n let code: Code[] = [];\n const result = code;\n\n const schemaTable = quoteSchemaTable({\n schema: ast.schema === currentSchema ? undefined : ast.schema,\n name: ast.name,\n });\n\n const { comment } = ast;\n if (comment !== undefined) {\n addCode(code, `await db.changeTable(`);\n\n const inner: Code[] = [\n `${schemaTable},`,\n `{ comment: ${JSON.stringify(ast.comment)} },`,\n '(t) => ({',\n ];\n code.push(inner);\n code = inner;\n } else {\n addCode(code, `await db.changeTable(${schemaTable}, (t) => ({`);\n }\n\n const [addTimestamps, dropTimestamps] = (['add', 'drop'] as const).map(\n (type) =>\n getHasTimestamps(\n ast.shape.createdAt &&\n 'type' in ast.shape.createdAt &&\n ast.shape.createdAt?.type === type\n ? ast.shape.createdAt.item\n : undefined,\n ast.shape.updatedAt &&\n 'type' in ast.shape.updatedAt &&\n ast.shape.updatedAt?.type === type\n ? ast.shape.updatedAt.item\n : undefined,\n ),\n );\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in ast.shape) {\n const changes = toArray(ast.shape[key]);\n for (const change of changes) {\n if (change.type === 'add' || change.type === 'drop') {\n if (\n (addTimestamps.hasAnyTimestamps ||\n dropTimestamps.hasAnyTimestamps) &&\n (key === 'createdAt' || key === 'updatedAt')\n )\n continue;\n\n const recreate = changes.length > 1;\n const line: Code[] = [\n recreate\n ? `...t.${change.type}(t.name(${singleQuote(\n change.item.data.name ?? key,\n )})`\n : `${quoteObjectKey(key, config.snakeCase)}: t.${change.type}(`,\n ];\n\n const columnCode = change.item.toCode(toCodeCtx, key);\n\n for (let i = 0; i < columnCode.length; i++) {\n let part = columnCode[i];\n if (recreate && !i) part = part.slice(1);\n addCode(line, part);\n }\n addCode(line, '),');\n code.push(line);\n } else if (change.type === 'change') {\n if (!change.from.column || !change.to.column) continue;\n\n const line: Code[] = [\n `${quoteObjectKey(key, config.snakeCase)}: t${\n change.name ? `.name(${singleQuote(change.name)})` : ''\n }.change(`,\n ];\n\n const fromCode = change.from.column.toCode(\n {\n t: 't',\n table: ast.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n },\n key,\n );\n for (const part of fromCode) {\n addCode(line, part);\n }\n\n addCode(line, ', ');\n\n const toCode = change.to.column.toCode(toCodeCtx, key);\n for (const part of toCode) {\n addCode(line, part);\n }\n\n if (change.using) {\n addCode(line, ', {');\n const u: string[] = [];\n if (change.using.usingUp) {\n u.push(`usingUp: ${change.using.usingUp.toCode('t')},`);\n }\n if (change.using.usingDown) {\n u.push(`usingDown: ${change.using.usingDown.toCode('t')},`);\n }\n addCode(line, u);\n addCode(line, '}');\n }\n\n addCode(line, '),');\n code.push(line);\n } else if (change.type === 'rename') {\n code.push([\n `${quoteObjectKey(key, config.snakeCase)}: t.rename(${singleQuote(\n change.name,\n )}),`,\n ]);\n } else {\n exhaustive(change.type);\n }\n }\n }\n\n for (const key of ['drop', 'add'] as const) {\n const timestamps = key === 'add' ? addTimestamps : dropTimestamps;\n if (timestamps.hasAnyTimestamps) {\n addCode(code, [`...t.${key}(${timestampsToCode(timestamps)}),`]);\n }\n\n const { primaryKey, indexes, excludes, constraints } = ast[key];\n\n if (primaryKey) {\n addCode(code, [\n `...t.${key}(${primaryKeyInnerToCode(primaryKey, 't')}),`,\n ]);\n }\n\n if (indexes) {\n for (const item of indexes) {\n addCode(code, [`...t.${key}(`, indexInnerToCode(item, 't'), '),']);\n }\n }\n\n if (excludes) {\n for (const item of excludes) {\n addCode(code, [`...t.${key}(`, excludeInnerToCode(item, 't'), '),']);\n }\n }\n\n if (constraints) {\n for (const item of constraints) {\n addCode(code, [\n `...t.${key}(`,\n constraintInnerToCode(item, 't', true),\n '),',\n ]);\n }\n }\n }\n\n if (ast.comment !== undefined) {\n addCode(code, '}),');\n addCode(result, ');');\n } else {\n addCode(result, '}));');\n }\n\n return result;\n },\n renameType(ast, _, currentSchema) {\n const code: Code[] = [];\n const kind = ast.kind === 'TABLE' ? 'Table' : 'Type';\n\n if (ast.from === ast.to) {\n addCode(\n code,\n `await db.change${kind}Schema(${singleQuote(ast.to)}, ${singleQuote(\n ast.fromSchema ?? currentSchema,\n )}, ${singleQuote(ast.toSchema ?? currentSchema)});`,\n );\n } else {\n addCode(\n code,\n `await db.rename${kind}(${quoteSchemaTable({\n schema: ast.fromSchema === currentSchema ? undefined : ast.fromSchema,\n name: ast.from,\n })}, ${quoteSchemaTable({\n schema: ast.toSchema === currentSchema ? undefined : ast.toSchema,\n name: ast.to,\n })});`,\n );\n }\n\n return code;\n },\n schema(ast) {\n return `await db.${\n ast.action === 'create' ? 'createSchema' : 'dropSchema'\n }(${singleQuote(ast.name)});`;\n },\n renameSchema(ast) {\n return `await db.renameSchema(${singleQuote(ast.from)}, ${singleQuote(\n ast.to,\n )});`;\n },\n extension(ast) {\n const code: Code[] = [\n `await db.${ast.action}Extension(${quoteSchemaTable(ast)}`,\n ];\n if (ast.version) {\n addCode(code, ', {');\n code.push([`version: ${singleQuote(ast.version)},`], '}');\n }\n addCode(code, ');');\n return code;\n },\n enum(ast, _, currentSchema) {\n return `await db.${\n ast.action === 'create' ? 'createEnum' : 'dropEnum'\n }(${quoteSchemaTable(ast, currentSchema)}, [${ast.values\n .map(singleQuote)\n .join(', ')}]);`;\n },\n enumValues(ast, _, currentSchema) {\n return `await db.${ast.action}EnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, [${ast.values.map(singleQuote).join(', ')}]);`;\n },\n renameEnumValues(ast, config, currentSchema) {\n return `await db.renameEnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, { ${Object.entries(ast.values)\n .map(\n ([from, to]) =>\n `${quoteObjectKey(from, config.snakeCase)}: ${singleQuote(to)}`,\n )\n .join(', ')} });`;\n },\n changeEnumValues(ast, _, currentSchema) {\n return `await db.changeEnumValues(${quoteSchemaTable(\n ast,\n currentSchema,\n )}, [${ast.fromValues.map(singleQuote).join(', ')}], [${ast.toValues\n .map(singleQuote)\n .join(', ')}]);`;\n },\n domain(ast, _, currentSchema) {\n return `await db.${ast.action}Domain(${quoteSchemaTable(\n ast,\n )}, (t) => ${ast.baseType.toCode(\n { t: 't', table: ast.name, currentSchema },\n ast.baseType.data.name ?? '',\n )});`;\n },\n collation(ast) {\n const params: string[] = [];\n if (ast.locale) params.push(`locale: '${ast.locale}',`);\n if (ast.lcCollate) params.push(`lcCollate: '${ast.lcCollate}',`);\n if (ast.lcCType) params.push(`lcCType: '${ast.lcCType}',`);\n if (ast.provider) params.push(`provider: '${ast.provider}',`);\n if (ast.deterministic) params.push(`deterministic: ${ast.deterministic},`);\n if (ast.version) params.push(`version: '${ast.version}',`);\n\n return [\n `await db.createCollation(${quoteSchemaTable(ast)}, {`,\n params,\n '});',\n ];\n },\n constraint(ast) {\n const table = quoteSchemaTable({\n schema: ast.tableSchema,\n name: ast.tableName,\n });\n\n if (ast.references) {\n return [\n `await db.addForeignKey(`,\n [`${table},`, ...referencesArgsToCode(ast.references, ast.name, true)],\n ');',\n ];\n }\n\n const check = ast.check as TableData.Check;\n\n return [\n `await db.addCheck(${table}, ${check.toCode('t')}${\n ast.name ? `, ${singleQuote(ast.name)}` : ''\n });`,\n ];\n },\n renameTableItem(ast) {\n return [\n `await db.rename${\n ast.kind === 'INDEX' ? 'Index' : 'Constraint'\n }(${quoteSchemaTable({\n schema: ast.tableSchema,\n name: ast.tableName,\n })}, ${singleQuote(ast.from)}, ${singleQuote(ast.to)});`,\n ];\n },\n view(ast) {\n const code: Code[] = [`await db.createView(${quoteSchemaTable(ast)}`];\n\n const options: Code[] = [];\n if (ast.options.recursive) options.push('recursive: true,');\n\n const w = ast.options.with;\n if (w?.checkOption) options.push(`checkOption: '${w.checkOption}',`);\n if (w?.securityBarrier)\n options.push(`securityBarrier: ${w.securityBarrier},`);\n if (w?.securityInvoker)\n options.push(`securityInvoker: ${w.securityInvoker},`);\n\n if (options.length) {\n addCode(code, ', {');\n code.push(options, '}');\n }\n\n addCode(code, ', ');\n\n if (!ast.sql._values) {\n const raw = ast.sql._sql;\n let sql;\n if (typeof raw === 'string') {\n sql = raw;\n } else {\n sql = '';\n const parts = raw[0];\n const last = parts.length - 1;\n for (let i = 0; i < last; i++) {\n sql += parts[i] + `\\${${raw[i + 1]}}`;\n }\n sql += parts[last];\n }\n\n addCode(code, backtickQuote(sql));\n } else {\n addCode(code, ast.sql.toCode('db'));\n }\n\n addCode(code, ');');\n return code;\n },\n};\n\nconst isTimestamp = (\n column: Column | undefined,\n type:\n | typeof TimestampTZColumn<ColumnSchemaConfig>\n | typeof TimestampColumn<ColumnSchemaConfig>,\n): boolean => {\n if (!column) return false;\n\n const { default: def } = column.data;\n return Boolean(\n column instanceof type &&\n !column.data.isNullable &&\n def &&\n typeof def === 'object' &&\n isRawSQL(def) &&\n (typeof def._sql === 'object' ? def._sql[0][0] : def._sql) === 'now()',\n );\n};\n\ninterface AnyTimestampsInfo {\n hasTZTimestamps: boolean;\n hasAnyTimestamps: boolean;\n}\n\nconst getHasTimestamps = (\n createdAt: Column | undefined,\n updatedAt: Column | undefined,\n): AnyTimestampsInfo => {\n const timestamps = getTimestampsInfo(createdAt, updatedAt, TimestampTZColumn);\n const timestampsNoTZ = getTimestampsInfo(\n createdAt,\n updatedAt,\n TimestampColumn,\n );\n\n return {\n hasTZTimestamps: timestamps,\n hasAnyTimestamps: timestamps || timestampsNoTZ,\n };\n};\n\nconst getTimestampsInfo = (\n createdAt: Column | undefined,\n updatedAt: Column | undefined,\n type:\n | typeof TimestampTZColumn<ColumnSchemaConfig>\n | typeof TimestampColumn<ColumnSchemaConfig>,\n): boolean => {\n return (\n isTimestamp(createdAt, type) &&\n isTimestamp(updatedAt, type) &&\n (!createdAt?.data.name || createdAt?.data.name === 'created_at') &&\n (!updatedAt?.data.name || updatedAt?.data.name === 'updated_at')\n );\n};\n\nconst timestampsToCode = ({ hasTZTimestamps }: AnyTimestampsInfo): string => {\n const key = hasTZTimestamps ? 'timestamps' : 'timestampsNoTZ';\n return `t.${key}()`;\n};\n","import { structureToAst, makeStructureToAstCtx } from './structureToAst';\nimport { astToMigration } from './astToMigration';\nimport { makeFileVersion, writeMigrationFile } from '../commands/newMigration';\nimport { saveMigratedVersion } from '../migration/manageMigratedVersions';\nimport { AdapterBase, ColumnSchemaConfig } from 'pqb';\nimport { RakeDbConfig } from '../config';\n\nexport const pullDbStructure = async <\n SchemaConfig extends ColumnSchemaConfig,\n CT,\n>(\n adapter: AdapterBase,\n config: RakeDbConfig<SchemaConfig, CT>,\n): Promise<void> => {\n const currentSchema = adapter.schema || 'public';\n\n const ctx = makeStructureToAstCtx(config, currentSchema);\n\n const ast = await structureToAst(ctx, adapter, config);\n\n const result = astToMigration(currentSchema, config, ast);\n if (!result) return;\n\n const version = await makeFileVersion({}, config);\n await writeMigrationFile(config, version, 'pull', result);\n\n const silentQueries = Object.assign(adapter, {\n silentQuery: adapter.query,\n silentArrays: adapter.arrays,\n });\n await saveMigratedVersion(silentQueries, version, 'pull', config);\n\n const unsupportedEntries = Object.entries(ctx.unsupportedTypes);\n const len = unsupportedEntries.length;\n if (len) {\n let count = 0;\n config.logger?.warn(\n `Found unsupported types:\\n${unsupportedEntries\n .map(([type, columns]) => {\n count += columns.length;\n return `- ${type} is used for column${\n columns.length > 1 ? 's' : ''\n } ${columns.join(', ')}`;\n })\n .join('\\n')}\\nAppend \\`as\\` method manually to ${\n count > 1 ? 'these' : 'this'\n } column${count > 1 ? 's' : ''} to treat ${\n count > 1 ? 'them' : 'it'\n } as other column type`,\n );\n }\n\n config.logger?.log('Database pulled successfully');\n};\n","import { AnyRakeDbConfig } from '../config';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { getMigrations, MigrationItem } from '../migration/migrationsSet';\nimport { getMigratedVersionsMap } from '../migration/manageMigratedVersions';\nimport { RakeDbCtx } from '../common';\nimport { AdapterBase, RecordOptionalString, colors } from 'pqb';\nimport { redo } from './migrateOrRollback';\nimport { promptSelect } from '../prompt';\n\ninterface RebaseFile extends MigrationItem {\n name: string;\n serial: number;\n}\n\nexport const rebase = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n) => {\n if (config.migrations) {\n throw new Error('Cannot rebase migrations defined in the config');\n }\n\n if (config.migrationId === 'timestamp') {\n throw new Error(\n `Cannot rebase when the 'migrationId' is set to 'timestamp' in the config`,\n );\n }\n\n const ctx: RakeDbCtx = {};\n\n const [set, ...versionMaps] = await Promise.all([\n await getMigrations(ctx, config, true, true),\n ...adapters.map((adapter) => getMigratedVersionsMap(ctx, adapter, config)),\n ]);\n\n const files: RebaseFile[] = set.migrations.map((file) => ({\n ...file,\n name: path.basename(file.path),\n serial: +file.version,\n }));\n if (!files.length) return;\n\n const start = files.findIndex(\n (file, i) => i !== 0 && file.serial === files[i - 1].serial,\n );\n if (start === -1) return;\n\n const combinedVersionsMap: RecordOptionalString = {};\n for (const versions of versionMaps) {\n Object.assign(combinedVersionsMap, versions.map);\n }\n\n type Rename = [path: string, version: number];\n const renames: Rename[] = [];\n const renamesMap: Record<string, Rename> = {};\n\n let minVersionToMigrate =\n files.find((file) => !combinedVersionsMap[file.version])?.serial ??\n Infinity;\n\n const migratedFiles: RebaseFile[] = [];\n let maxNewVersion = 0;\n\n let move = 0;\n for (let i = start; i < files.length; i++) {\n const prev = files[i - 1];\n const file = files[i];\n\n let moveFile: RebaseFile | undefined;\n\n const migratedName = combinedVersionsMap[file.version];\n\n if (prev.serial === file.serial) {\n if (migratedName) {\n if (prev.name === migratedName) {\n moveFile = prev;\n } else if (file.name === migratedName) {\n moveFile = file;\n }\n }\n\n if (moveFile) {\n if (moveFile.serial < minVersionToMigrate) {\n minVersionToMigrate = moveFile.serial;\n }\n\n migratedFiles.push(moveFile);\n } else if (!moveFile) {\n move++;\n\n const result = await promptSelect({\n message: 'Which should go first?',\n options: [prev.name, file.name],\n active: (s) => `${colors.yellow('❯')} ${colors.yellow(s)}`,\n });\n\n moveFile = result ? file : prev;\n }\n }\n\n let newVersion = file.serial;\n\n if (move) {\n newVersion += move;\n\n if (moveFile === prev && !renamesMap[prev.path]) newVersion--;\n\n if (file.serial !== newVersion) {\n if (newVersion < minVersionToMigrate) minVersionToMigrate = newVersion;\n\n const values = [file.path, newVersion] as Rename;\n renames.push(values);\n renamesMap[file.path] = values;\n }\n\n if (moveFile === prev) {\n if (prev.serial < minVersionToMigrate)\n minVersionToMigrate = prev.serial;\n\n newVersion = prev.serial + move;\n\n let item = [prev.path, newVersion] as Rename;\n\n if (renamesMap[prev.path]) {\n renamesMap[prev.path] = item;\n\n for (let i = renames.length - 1; i >= 0; i--) {\n const rename = renames[i];\n rename[1]--;\n\n renames[i] = item;\n\n if (rename[0] === prev.path) break;\n\n renamesMap[item[0]] = item;\n item = rename;\n }\n } else {\n renames.push(item);\n renamesMap[prev.path] = item;\n }\n }\n }\n\n if (file.name !== migratedName && newVersion > maxNewVersion) {\n maxNewVersion = newVersion;\n }\n }\n\n if (!renames.length && !migratedFiles.length) return;\n\n maxNewVersion++;\n\n renames.push(\n ...migratedFiles.map((file, i) => {\n const rename = [file.path, maxNewVersion + i] as Rename;\n renamesMap[file.path] = rename;\n return rename;\n }),\n );\n\n if (!renames.length) return;\n\n const migrationsDown = files.filter(\n (file) =>\n combinedVersionsMap[file.version] === file.name &&\n file.serial >= minVersionToMigrate,\n );\n\n const migrationsUp = files\n .reduce<MigrationItem[]>((files, file) => {\n const rename = renamesMap[file.path];\n if (rename) {\n const version = String(rename[1]).padStart(4, '0');\n files.push({\n ...file,\n path: path.join(\n path.dirname(rename[0]),\n version + path.basename(rename[0]).slice(version.length),\n ),\n version,\n });\n } else if (\n !combinedVersionsMap[file.version] ||\n file.serial >= minVersionToMigrate\n ) {\n files.push(file);\n }\n return files;\n }, [])\n .sort((a, b) => +b.version - +a.version);\n\n set.migrations = migrationsDown;\n\n const redoConfig = {\n ...config,\n async afterRollback() {\n set.migrations = migrationsUp;\n },\n async afterMigrate() {\n set.migrations = migrationsDown;\n },\n };\n\n for (const adapter of adapters) {\n await redo({\n ctx,\n adapter,\n config: redoConfig,\n });\n }\n\n for (let i = renames.length - 1; i >= 0; i--) {\n const [from, version] = renames[i];\n const prefix = String(version).padStart(4, '0');\n await fs.rename(\n from,\n path.join(\n path.dirname(from),\n prefix + path.basename(from).slice(prefix.length),\n ),\n );\n }\n};\n","import { RakeDbCtx } from '../common';\nimport path from 'path';\nimport { getMigratedVersionsMap } from '../migration/manageMigratedVersions';\nimport { pathToFileURL } from 'node:url';\nimport { AnyRakeDbConfig } from '../config';\nimport { getMigrations } from '../migration/migrationsSet';\nimport { AdapterBase, colors } from 'pqb';\n\nexport const listMigrationsStatuses = async (\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n args: string[],\n) => {\n const ctx: RakeDbCtx = {};\n\n const [{ migrations }, ...migrated] = await Promise.all([\n getMigrations(ctx, config, true),\n ...adapters.map((adapter) => getMigratedVersionsMap(ctx, adapter, config)),\n ]);\n\n const map: {\n [K: string]: {\n databases: string[];\n migrations: {\n up: boolean;\n version: string;\n name: string;\n url: URL;\n }[];\n };\n } = {};\n\n let maxVersionLength = 12;\n let maxNameLength = 4;\n\n for (let i = 0; i < adapters.length; i++) {\n const list = migrated[i];\n const key = Object.entries(list.map)\n .map(([version, up]) => `${version}${up ? 't' : 'f'}`)\n .join('');\n\n const database = adapters[i].getDatabase();\n\n if (map[key]) {\n map[key].databases.push(database);\n continue;\n }\n\n map[key] = {\n databases: [database],\n migrations: migrations.map((item) => {\n if (item.version.length > maxVersionLength) {\n maxVersionLength = item.version.length;\n }\n\n const name = path\n .parse(item.path)\n .name.slice(item.version.length + 1)\n .replace(\n /([a-z])([A-Z])/g,\n (_, a, b) => `${a} ${b.toLocaleLowerCase()}`,\n )\n .replace(/[-_](.)/g, (_, char) => ` ${char.toLocaleLowerCase()}`)\n .replace(/^\\w/, (match) => match.toLocaleUpperCase());\n\n if (name.length > maxNameLength) {\n maxNameLength = name.length;\n }\n\n return {\n up: !!list.map[item.version],\n version: item.version,\n name,\n url: pathToFileURL(item.path),\n };\n }),\n };\n }\n\n const showUrl = args.includes('p') || args.includes('path');\n\n const asIs = (s: string) => s;\n\n const c =\n typeof config.log === 'object' && config.log.colors === false\n ? {\n yellow: asIs,\n green: asIs,\n red: asIs,\n blue: asIs,\n }\n : colors;\n\n const log = Object.values(map)\n .map(({ databases, migrations }) => {\n let log = ` ${c.yellow('Database:')} ${databases.join(', ')}`;\n\n if (migrations.length === 0) {\n return log + `\\n\\nNo migrations available`;\n }\n\n const lineSeparator = c.yellow(\n makeChars(14 + maxVersionLength + maxNameLength, '-'),\n );\n const columnSeparator = c.yellow('|');\n\n log +=\n '\\n\\n ' +\n c.yellow(\n `Status | Migration ID${makeChars(\n maxVersionLength - 12,\n ' ',\n )} | Name\\n${lineSeparator}`,\n );\n\n for (const migration of migrations) {\n log += `\\n ${\n migration.up ? ` ${c.green('Up')} ` : c.red('Down')\n } ${columnSeparator} ${c.blue(migration.version)}${makeChars(\n maxVersionLength - migration.version.length,\n ' ',\n )} ${columnSeparator} ${migration.name}`;\n\n if (showUrl) {\n log += `\\n${migration.url}\\n`;\n }\n }\n\n return (log += showUrl ? lineSeparator : `\\n${lineSeparator}`);\n })\n .join('\\n\\n');\n\n (config.logger ?? console).log(log);\n\n await Promise.all(adapters.map((adapter) => adapter.close()));\n};\n\nconst makeChars = (count: number, char: string) => {\n let chars = '';\n\n for (let i = 0; i < count; i++) {\n chars += char;\n }\n\n return chars;\n};\n","import {\n AdapterBase,\n ColumnSchemaConfig,\n MaybePromise,\n RecordOptionalString,\n RecordString,\n} from 'pqb';\nimport { AnyRakeDbConfig, RakeDbConfig } from './config';\nimport { createDb, dropDb, resetDb } from './commands/createOrDrop';\nimport { runRecurrentMigrations } from './commands/recurrent';\nimport {\n migrateCommand,\n redoCommand,\n rollbackCommand,\n} from './commands/migrateOrRollback';\nimport { pullDbStructure } from './generate/pull';\nimport { newMigration } from './commands/newMigration';\nimport { rebase } from './commands/rebase';\nimport { changeIds } from './commands/changeIds';\nimport { listMigrationsStatuses } from './commands/listMigrationsStatuses';\nimport { RakeDbResult } from './rake-db';\n\nexport const rakeDbAliases: RecordOptionalString = {\n migrate: 'up',\n rollback: 'down',\n s: 'status',\n rec: 'recurrent',\n};\n\nexport const runCommand = async <SchemaConfig extends ColumnSchemaConfig, CT>(\n adapters: AdapterBase[],\n config: RakeDbConfig<SchemaConfig, CT>,\n args: string[] = process.argv.slice(2),\n): Promise<RakeDbResult> => {\n let arg = args[0]?.split(':')[0];\n if (rakeDbAliases[arg]) {\n args = [...args]; // to not mutate given arguments\n arg = args[0] = rakeDbAliases[arg] as string;\n }\n\n args.shift();\n\n const command = rakeDbCommands[arg]?.run ?? config.commands[arg];\n if (command) {\n await command(adapters, config, args);\n } else if (config.logger) {\n type HelpBlock = [key: string, help: string, helpArguments?: RecordString];\n\n const commandsHelp: HelpBlock[] = [];\n\n let max = 0;\n let maxArgs = 0;\n\n const addedCommands = new Map<RakeDbCommand, HelpBlock>();\n for (let key in rakeDbCommands) {\n const command = rakeDbCommands[key];\n const added = addedCommands.get(command);\n if (added) key = added[0] += `, ${key}`;\n\n if (key.length > max) max = key.length;\n\n if (added) continue;\n\n if (command.helpArguments) {\n maxArgs = Math.max(\n maxArgs,\n ...Object.keys(command.helpArguments).map((key) => key.length + 5),\n );\n }\n\n const helpBlock: HelpBlock = [key, command.help, command.helpArguments];\n addedCommands.set(command, helpBlock);\n\n if (command.helpAfter) {\n const i = commandsHelp.findIndex(([key]) => key === command.helpAfter);\n if (i === -1) {\n throw new Error(\n `${command.helpAfter} command is required for ${key} but is not found`,\n );\n }\n commandsHelp.splice(i + 1, 0, helpBlock);\n } else {\n commandsHelp.push(helpBlock);\n }\n }\n\n config.logger.log(`Usage: rake-db [command] [arguments]\n\nSee documentation at:\nhttps://orchid-orm.netlify.app/guide/migration-commands.html\n\nCommands:\n\n${commandsHelp\n .map(([key, help, helpArguments]) => {\n let result = `${key} ${help.padStart(max - key.length + help.length)}`;\n\n if (helpArguments) {\n result += `\\n arguments:\\n${Object.entries(helpArguments)\n .map(\n ([arg, help]) =>\n ` ${arg} ${` ${help}`.padStart(\n maxArgs - arg.length - 5 + help.length + 2,\n )}`,\n )\n .join('\\n')}`;\n }\n\n return result;\n })\n .join('\\n\\n')}\n`);\n }\n\n return {\n adapters,\n config,\n args,\n };\n};\n\ninterface RakeDbCommand {\n run(\n adapters: AdapterBase[],\n config: AnyRakeDbConfig,\n args: string[],\n ): MaybePromise<unknown>;\n\n help: string;\n helpArguments?: RecordString;\n helpAfter?: string;\n}\n\ninterface RakeDbCommands {\n [K: string]: RakeDbCommand;\n}\n\nconst close = (adapters: AdapterBase[]) =>\n Promise.all(adapters.map((adapter) => adapter.close()));\n\nconst upCommand: RakeDbCommand = {\n run: (adapters, config, args) =>\n migrateCommand(adapters, config, args)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'migrate pending migrations',\n helpArguments: {\n 'no arguments': 'migrate all pending',\n 'a number': 'run a specific number of pending migrations',\n force: 'enforce migrating a pending file in the middle',\n },\n};\n\nconst downCommand: RakeDbCommand = {\n run: (adapters, config, args) =>\n rollbackCommand(adapters, config, args).then(() => close(adapters)),\n help: 'rollback migrated migrations',\n helpArguments: {\n 'no arguments': 'rollback one last migration',\n 'a number': 'rollback a specified number',\n all: 'rollback all migrations',\n },\n};\n\nconst statusCommand: RakeDbCommand = {\n run: listMigrationsStatuses,\n help: 'list migrations statuses',\n helpArguments: {\n 'no arguments': `does not print file paths`,\n 'p, path': 'also print file paths',\n },\n};\n\nconst recurrentCommand: RakeDbCommand = {\n run: (adapters, config) =>\n runRecurrentMigrations(adapters, config).then(() => close(adapters)),\n help: 'run recurrent migrations',\n};\n\nexport const rakeDbCommands: RakeDbCommands = {\n create: {\n run: createDb,\n help: 'create databases',\n },\n drop: {\n run: dropDb,\n help: 'drop databases',\n },\n reset: {\n run: (adapters, config) =>\n resetDb(adapters, config)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'drop, create and migrate databases',\n },\n up: upCommand,\n migrate: upCommand,\n down: downCommand,\n rollback: downCommand,\n redo: {\n run: (adapters, config, args) =>\n redoCommand(adapters, config, args)\n .then(() => runRecurrentMigrations(adapters, config))\n .then(() => close(adapters)),\n help: 'rollback and migrate, run recurrent',\n },\n pull: {\n run: ([adapter], config) =>\n pullDbStructure(adapter, config).then(() => close([adapter])),\n help: 'generate a combined migration for an existing database',\n },\n new: {\n run: (_, config, args) => newMigration(config, args),\n help: 'create new migration file',\n },\n s: statusCommand,\n status: statusCommand,\n rec: recurrentCommand,\n recurrent: recurrentCommand,\n rebase: {\n run: (adapters, config) =>\n rebase(adapters, config).then(() => close(adapters)),\n help: 'move local migrations below the new ones from upstream',\n },\n 'change-ids': {\n run: changeIds,\n help: 'change migrations ids format',\n helpArguments: {\n serial: 'change ids to 4 digit serial',\n 'serial *number*': 'change ids to serial number of custom length',\n timestamp: 'change ids to timestamps',\n },\n },\n};\n","import {\n DefaultColumnTypes,\n DefaultSchemaConfig,\n AdapterBase,\n ColumnSchemaConfig,\n} from 'pqb';\nimport { RakeDbError } from './errors';\nimport {\n ChangeCallback,\n MigrationChange,\n pushChange,\n} from './migration/change';\nimport {\n AnyRakeDbConfig,\n InputRakeDbConfig,\n processRakeDbConfig,\n RakeDbConfig,\n} from './config';\nimport { runCommand } from './commands';\n\n/**\n * Type of {@link rakeDbWithAdapters} function\n */\nexport interface RakeDbFn<Options> {\n <\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n >(\n options: Options,\n partialConfig: InputRakeDbConfig<SchemaConfig, CT>,\n args?: string[],\n ): RakeDbChangeFnWithPromise<CT>;\n\n /**\n * Unlike the original `rakeDb` that executes immediately,\n * `rakeDb.lazy` returns the `run` function to be later called programmatically.\n *\n * @param options - array of connection adapters for migrating multiple dbs\n * @param config - {@link RakeDbConfig}\n * @returns `change` is to be used in migrations, `run` takes an array cli args to execute a command\n */\n lazy<\n SchemaConfig extends ColumnSchemaConfig,\n CT = DefaultColumnTypes<DefaultSchemaConfig>,\n >(\n options: Options,\n config: InputRakeDbConfig<SchemaConfig, CT>,\n ): {\n change: RakeDbChangeFn<CT>;\n run(\n args: string[],\n config?: Partial<RakeDbConfig<SchemaConfig, CT>>,\n ): Promise<RakeDbResult>;\n };\n}\n\nexport interface RakeDbResult {\n // database connection adapters\n adapters: AdapterBase[];\n // rake-db config\n config: AnyRakeDbConfig;\n // command and arguments passed to `rakeDb.lazy` or taken from process.argv\n args: string[];\n}\n\n/**\n * Function to use in migrations to wrap database changes\n * Saves the given callback to an internal queue,\n * and also returns the callback in case you want to export it from migration.\n */\nexport interface RakeDbChangeFn<CT> {\n (fn: ChangeCallback<CT>): MigrationChange;\n}\n\nexport interface RakeDbChangeFnWithPromise<CT> extends RakeDbChangeFn<CT> {\n promise: Promise<RakeDbResult>;\n}\n\n/**\n * Function to configure and run `rakeDb`.\n *\n * @param options - {@link NodePostgresAdapterOptions} or an array of such options to migrate multiple dbs\n * @param config - {@link RakeDbConfig}\n * @param args - optionally provide an array of cli args. Default is `process.argv.slice(2)`.\n */\nexport const rakeDbWithAdapters = ((\n adapters,\n partialConfig,\n args = process.argv.slice(2),\n) => {\n const config = processRakeDbConfig(partialConfig, args);\n const promise = runCommand(\n adapters,\n config as unknown as RakeDbConfig<ColumnSchemaConfig>,\n args,\n ).catch((err) => {\n if (err instanceof RakeDbError) {\n config.logger?.error(err.message);\n process.exit(1);\n }\n throw err;\n });\n\n return Object.assign(makeChange(config), {\n promise,\n });\n}) as RakeDbFn<AdapterBase[]>;\n\nrakeDbWithAdapters.lazy = ((\n adapters: AdapterBase[],\n partialConfig: InputRakeDbConfig<ColumnSchemaConfig, unknown>,\n) => {\n const config = processRakeDbConfig(partialConfig);\n\n return {\n change: makeChange(config),\n run(\n args: string[],\n conf: Partial<RakeDbConfig<DefaultSchemaConfig, unknown>>,\n ) {\n return runCommand(adapters, conf ? { ...config, ...conf } : config, args);\n },\n };\n}) as never;\n\nexport const makeChange =\n (config: RakeDbConfig<ColumnSchemaConfig, unknown>) =>\n (fn: ChangeCallback<unknown>) => {\n const change: MigrationChange = { fn, config };\n pushChange(change);\n return change;\n };\n","import { clearChanges } from '../change';\nimport {\n getChanges,\n migrateAndClose,\n MigrateFnConfig,\n runMigration,\n} from '../../commands/migrateOrRollback';\nimport {\n AdapterBase,\n QueryBase,\n defaultSchemaConfig,\n makeColumnTypes as defaultColumnTypes,\n Query,\n} from 'pqb';\nimport {\n ensureMigrationsPath,\n migrationConfigDefaults,\n ensureBasePathAndDbScript,\n} from '../../config';\n\ninterface OrmParam {\n $qb: QueryBase;\n}\n\ntype UnknownPromiseFns = (() => Promise<unknown>)[];\n\nexport const migrateFiles = async (db: OrmParam, files: UnknownPromiseFns) => {\n const qb = db.$qb as Query;\n\n await qb.ensureTransaction(async () => {\n const adapter = qb.internal.transactionStorage.getStore()\n ?.adapter as AdapterBase;\n\n for (const load of files) {\n clearChanges();\n\n const changes = await getChanges({ load });\n const config = changes[0]?.config;\n\n await runMigration(adapter, true, changes, config);\n }\n });\n};\n\nexport const makeMigrateAdapter = (\n config?: Partial<MigrateFnConfig>,\n): ((\n adapter: AdapterBase,\n params?: { count?: number; force?: boolean },\n) => Promise<void>) => {\n const conf = ensureMigrationsPath(ensureBasePathAndDbScript(config || {}));\n\n return async (adapter, params) => {\n await migrateAndClose({\n adapter,\n ...params,\n config: {\n ...conf,\n columnTypes:\n conf.columnTypes || defaultColumnTypes(defaultSchemaConfig),\n migrationId: conf.migrationId || migrationConfigDefaults.migrationId,\n migrationsTable:\n conf.migrationsTable || migrationConfigDefaults.migrationsTable,\n import: conf.import || migrationConfigDefaults.import,\n transaction: conf.transaction || 'single',\n },\n });\n };\n};\n"],"names":["DomainColumn","toSnakeCase","isRawSQL","escapeForMigration","ArrayColumn","toCamelCase","short","sql","toArray","EnumColumn","defaultSchemaConfig","emptyObject","snakeCaseKey","getColumnTypes","parseTableData","makeAst","astToQueries","escapeString","consumeColumnName","Column","key","parseTableDataInput","UnknownColumn","add","tableDataMethods","setCurrentColumnName","setDefaultLanguage","changeTableData","name","deepCompare","drop","raw","singleQuote","logParamToLogObject","createDbWithAdapter","quotedName","mkdir","getImportPath","writeFile","pathToLog","version","readdir","pathToFileURL","redo","migrations","emptyArray","getStackTrace","fileURLToPath","defaultColumnTypes","rows","clear","colors","value","params","readFile","path","join","stat","makeColumnsByType","RawSQL","CustomTypeColumn","assignDbDataToColumn","PostgisGeographyPointColumn","exhaustive","codeToString","addCode","quoteObjectKey","pushTableDataCode","primaryKeyInnerToCode","indexInnerToCode","excludeInnerToCode","constraintInnerToCode","referencesArgsToCode","backtickQuote","TimestampTZColumn","TimestampColumn","i","files","log","command","arg","help"],"mappings":"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"}