orchid-orm 1.67.0 → 1.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/migrations/generate/generators/generators.utils.ts","../../src/migrations/generate/generators/schemas.generator.ts","../../src/migrations/generate/generators/extensions.generator.ts","../../src/migrations/generate/generators/columns.generator.ts","../../src/migrations/generate/generators/domains.generator.ts","../../src/migrations/generate/generators/enums.generator.ts","../../src/migrations/generate/generators/primaryKey.generator.ts","../../src/migrations/generate/generators/indexesAndExcludes.generator.ts","../../src/migrations/generate/generators/foreignKeys.generator.ts","../../src/migrations/generate/generators/checks.generator.ts","../../src/migrations/generate/generators/tables.generator.ts","../../src/migrations/generate/generators/roles.generator.ts","../../src/migrations/generate/generators/default-privilege.generator.ts","../../src/migrations/generate/composeMigration.ts","../../src/migrations/generate/verify-migration.ts","../../src/migrations/generate/reportGeneratedMigration.ts","../../src/migrations/generate/generate.ts","../../src/migrations/pull/appCodeGenerators/tables.appCodeGenerator.ts","../../src/migrations/pull/appCodeGenerators/dbFile.appCodeGenerator.ts","../../src/migrations/pull/pull.ts","../../src/migrations/patchRakeDb.ts"],"sourcesContent":["import { RakeDbAst, promptSelect } from 'rake-db';\nimport { RawSqlBase, QueryResult, AdapterBase, colors } from 'pqb/internal';\nimport { AbortSignal } from '../generate';\n\nexport interface CompareExpression {\n compare: {\n inDb: string;\n inCode: (string | RawSqlBase)[];\n }[];\n\n handle(i?: number): void;\n}\n\nexport interface TableExpression extends CompareExpression {\n source: string;\n}\n\nexport const compareSqlExpressions = async (\n tableExpressions: TableExpression[],\n adapter: AdapterBase,\n) => {\n if (!tableExpressions.length) return;\n\n let id = 1;\n for (const { source, compare, handle } of tableExpressions) {\n const viewName = `orchidTmpView${id++}`;\n const values: unknown[] = [];\n\n // It is important to run `CREATE TEMPORARY VIEW` and `DROP VIEW` on the same db connection,\n // that's why SQLs are combined into a single query.\n const combinedQueries = [\n `CREATE TEMPORARY VIEW ${viewName} AS (SELECT ${compare\n .map(\n ({ inDb, inCode }, i): string =>\n `${inDb} AS \"*inDb-${i}*\", ${inCode\n .map(\n (s, j) =>\n `(${\n typeof s === 'string' ? s : s.toSQL({ values })\n }) \"*inCode-${i}-${j}*\"`,\n )\n .join(', ')}`,\n )\n .join(', ')} FROM ${source})`,\n `SELECT pg_get_viewdef('${viewName}') v`,\n `DROP VIEW ${viewName}`,\n ].join('; ');\n\n const result = await adapter.query(combinedQueries, values, viewName).then(\n (res) => (res as unknown as QueryResult[])[1],\n async (err) => {\n // ignore the \"type ... does not exist\" because the type may be added in the same migration,\n // but throw on other errors\n if (err.code !== '42704') {\n throw err;\n }\n },\n );\n\n if (!result) {\n handle();\n return;\n }\n\n const match = compareSqlExpressionResult(\n result.rows[0].v,\n compare[0].inCode,\n );\n handle(match);\n }\n};\n\nexport const compareSqlExpressionResult = (\n resultSql: string,\n inCode: unknown[],\n) => {\n let pos = 7;\n const rgx = /\\s+AS\\s+\"\\*(inDb-\\d+|inCode-\\d+-\\d+)\\*\",?/g;\n let match;\n let inDb = '';\n let codeI = 0;\n const matches = inCode.map(() => true);\n while ((match = rgx.exec(resultSql))) {\n const sql = resultSql.slice(pos, rgx.lastIndex - match[0].length).trim();\n const arr = match[1].split('-');\n if (arr.length === 2) {\n inDb = sql;\n codeI = 0;\n } else {\n if (\n inDb !== sql &&\n // Comparing `(sql) = sql` and `sql = (sql)` below.\n // Could not reproduce this case in integration tests, but it was reported in #494.\n !(\n inDb.startsWith('(') &&\n inDb.endsWith(')') &&\n inDb.slice(1, -1) === sql\n ) &&\n !(sql.startsWith('(') && sql.endsWith(')') && sql.slice(1, -1) === inDb)\n ) {\n matches[codeI] = false;\n }\n codeI++;\n }\n pos = rgx.lastIndex;\n }\n\n const firstMatching = matches.indexOf(true);\n return firstMatching === -1 ? undefined : firstMatching;\n};\n\nexport const promptCreateOrRename = (\n kind: string,\n name: string,\n drop: string[],\n verifying: boolean | undefined,\n): Promise<number> => {\n if (verifying) throw new AbortSignal();\n\n let hintPos = name.length + 4;\n for (const from of drop) {\n const value = from.length + 8 + name.length;\n if (value > hintPos) hintPos = value;\n }\n\n let max = 0;\n const add = name.length + 3;\n for (const name of drop) {\n if (name.length + add > max) {\n max = name.length + add;\n }\n }\n\n const renameMessage = `rename ${kind}`;\n\n return promptSelect({\n message: `Create or rename ${colors.blueBold(\n name,\n )} ${kind} from another ${kind}?`,\n options: [\n `${colors.greenBold('+')} ${name} ${colors.pale(\n `create ${kind}`.padStart(\n hintPos + renameMessage.length - name.length - 4,\n ' ',\n ),\n )}`,\n ...drop.map(\n (d) =>\n `${colors.yellowBold('~')} ${d} ${colors.yellowBold(\n '=>',\n )} ${name} ${colors.pale(\n renameMessage.padStart(\n hintPos + renameMessage.length - d.length - name.length - 8,\n ' ',\n ),\n )}`,\n ),\n ],\n });\n};\n\nexport const checkForColumnAddOrDrop = (\n shape: RakeDbAst.ChangeTableShape,\n key: string,\n) => {\n const item = shape[key];\n if (item) {\n return (\n item &&\n (Array.isArray(item) || item.type === 'add' || item.type === 'drop')\n );\n }\n\n for (const k in shape) {\n const item = shape[k];\n if (\n Array.isArray(item)\n ? item.some(\n (item) =>\n (item.type === 'add' || item.type === 'drop') &&\n item.item.data.name === key,\n )\n : (item.type === 'add' || item.type === 'drop') &&\n item.item.data.name === key\n ) {\n return true;\n }\n }\n\n return false;\n};\n","import { RakeDbAst, IntrospectedStructure } from 'rake-db';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ComposeMigrationParams } from '../composeMigration';\n\nexport const processSchemas = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n codeItems: { schemas },\n verifying,\n internal: { generatorIgnore },\n currentSchema,\n }: ComposeMigrationParams,\n): Promise<void> => {\n const createSchemas: string[] = [];\n const dropSchemas: string[] = [];\n\n for (const schema of schemas) {\n if (!dbStructure.schemas.includes(schema)) {\n createSchemas.push(schema);\n }\n }\n\n for (const schema of dbStructure.schemas) {\n if (\n !schemas.has(schema) &&\n schema !== 'public' &&\n schema !== currentSchema &&\n !generatorIgnore?.schemas?.includes(schema)\n ) {\n dropSchemas.push(schema);\n }\n }\n\n for (const schema of createSchemas) {\n if (dropSchemas.length) {\n const i = await promptCreateOrRename(\n 'schema',\n schema,\n dropSchemas,\n verifying,\n );\n if (i) {\n const from = dropSchemas[i - 1];\n dropSchemas.splice(i - 1, 1);\n\n renameSchemaInStructures(dbStructure.tables, from, schema);\n renameSchemaInStructures(dbStructure.views, from, schema);\n renameSchemaInStructures(dbStructure.indexes, from, schema);\n renameSchemaInStructures(dbStructure.excludes, from, schema);\n renameSchemaInStructures(dbStructure.constraints, from, schema);\n renameSchemaInStructures(dbStructure.triggers, from, schema);\n renameSchemaInStructures(dbStructure.enums, from, schema);\n renameSchemaInStructures(dbStructure.domains, from, schema);\n renameSchemaInStructures(dbStructure.collations, from, schema);\n\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.typeSchema === from) {\n column.typeSchema = schema;\n }\n }\n }\n\n ast.push({\n type: 'renameSchema',\n from,\n to: schema,\n });\n continue;\n }\n }\n\n ast.push({\n type: 'schema',\n action: 'create',\n name: schema,\n });\n }\n\n for (const schema of dropSchemas) {\n ast.push({\n type: 'schema',\n action: 'drop',\n name: schema,\n });\n }\n};\n\nconst renameSchemaInStructures = (\n items: { schemaName: string }[],\n from: string,\n to: string,\n) => {\n for (const item of items) {\n if (item.schemaName === from) {\n item.schemaName = to;\n }\n }\n};\n","import {\n RakeDbAst,\n IntrospectedStructure,\n getSchemaAndTableFromName,\n} from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\n\ninterface Extension {\n schema?: string;\n name: string;\n version?: string;\n}\n\nexport const processExtensions = (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n currentSchema,\n internal: { extensions, generatorIgnore },\n }: ComposeMigrationParams,\n) => {\n const codeExtensions = extensions?.map((ext): Extension => {\n const [schema, name] = getSchemaAndTableFromName(currentSchema, ext.name);\n return { schema, name, version: ext.version };\n });\n\n for (const dbExt of dbStructure.extensions) {\n if (\n generatorIgnore?.schemas?.includes(dbExt.schemaName) ||\n generatorIgnore?.extensions?.includes(dbExt.name)\n ) {\n continue;\n }\n\n if (codeExtensions) {\n let found = false;\n for (let i = 0; i < codeExtensions.length; i++) {\n const codeExt = codeExtensions[i];\n if (\n dbExt.name === codeExt.name &&\n dbExt.schemaName === (codeExt.schema ?? currentSchema) &&\n (!codeExt.version || codeExt.version === dbExt.version)\n ) {\n found = true;\n codeExtensions.splice(i, 1);\n break;\n }\n }\n\n if (found) continue;\n }\n\n ast.push({\n type: 'extension',\n action: 'drop',\n schema: dbExt.schemaName === currentSchema ? undefined : dbExt.schemaName,\n name: dbExt.name,\n version: dbExt.version,\n });\n }\n\n if (codeExtensions?.length) {\n ast.push(\n ...codeExtensions.map((ext) => ({\n type: 'extension' as const,\n action: 'create' as const,\n ...ext,\n })),\n );\n }\n};\n","import {\n RakeDbAst,\n dbColumnToAst,\n getDbTableColumnsChecks,\n instantiateDbColumn,\n StructureToAstCtx,\n DbStructure,\n IntrospectedStructure,\n encodeColumnDefault,\n concatSchemaAndName,\n getSchemaAndTableFromName,\n promptSelect,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport {\n ArrayColumn,\n DbStructureDomainsMap,\n EnumColumn,\n getColumnBaseType,\n deepCompare,\n RecordUnknown,\n toSnakeCase,\n AdapterBase,\n colors,\n} from 'pqb/internal';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ChangeTableData, CompareSql } from './tables.generator';\nimport { AbortSignal } from '../generate';\n\nexport interface TypeCastsCache {\n value?: Map<string, Set<string>>;\n}\n\ntype ColumnsToChange = Map<\n string,\n { key: string; dbName: string; column: Column }\n>;\n\nexport const processColumns = async (\n adapter: AdapterBase,\n config: RakeDbConfig,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n changeTableData: ChangeTableData,\n ast: RakeDbAst[],\n currentSchema: string,\n compareSql: CompareSql,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n const { dbTable } = changeTableData;\n const dbColumns = Object.fromEntries(\n dbTable.columns.map((column) => [column.name, column]),\n );\n\n const { columnsToAdd, columnsToDrop, columnsToChange } = groupColumns(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbColumns,\n changeTableData,\n );\n\n await addOrRenameColumns(\n config,\n dbStructure,\n changeTableData,\n columnsToAdd,\n columnsToDrop,\n columnsToChange,\n verifying,\n );\n\n await changeColumns(\n adapter,\n config,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n dbColumns,\n columnsToChange,\n compareSql,\n changeTableData,\n typeCastsCache,\n verifying,\n );\n\n dropColumns(changeTableData, columnsToDrop);\n};\n\ntype KeyAndColumn = { key: string; column: Column };\n\nconst groupColumns = (\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n dbColumns: { [K: string]: DbStructure.Column },\n changeTableData: ChangeTableData,\n): {\n columnsToAdd: KeyAndColumn[];\n columnsToDrop: KeyAndColumn[];\n columnsToChange: ColumnsToChange;\n} => {\n const columnsToAdd: { key: string; column: Column }[] = [];\n const columnsToDrop: { key: string; column: Column }[] = [];\n const columnsToChange: ColumnsToChange = new Map();\n const columnsToChangeByDbName = new Map<string, true>();\n\n const { codeTable, dbTable, dbTableData } = changeTableData;\n const checks = getDbTableColumnsChecks(changeTableData.dbTableData);\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n // skip virtual columns\n if (!column.dataType) continue;\n\n const name = column.data.name ?? key;\n if (dbColumns[name]) {\n columnsToChange.set(key, { key, dbName: name, column });\n columnsToChangeByDbName.set(name, true);\n } else {\n columnsToAdd.push({ key, column });\n }\n }\n\n for (const name in dbColumns) {\n if (columnsToChangeByDbName.has(name)) continue;\n\n const [key, column] = dbColumnToAst(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbTable.name,\n dbColumns[name],\n dbTable,\n dbTableData,\n checks,\n );\n\n columnsToDrop.push({ key, column });\n }\n\n return {\n columnsToAdd,\n columnsToDrop,\n columnsToChange,\n };\n};\n\nconst addOrRenameColumns = async (\n config: RakeDbConfig,\n dbStructure: IntrospectedStructure,\n {\n dbTableData,\n schema,\n changeTableAst: { name: tableName, shape },\n }: ChangeTableData,\n columnsToAdd: KeyAndColumn[],\n columnsToDrop: KeyAndColumn[],\n columnsToChange: ColumnsToChange,\n verifying: boolean | undefined,\n) => {\n for (const { key, column } of columnsToAdd) {\n if (columnsToDrop.length) {\n const codeName = column.data.name ?? key;\n const i = await promptCreateOrRename(\n 'column',\n codeName,\n columnsToDrop.map((x) => x.key),\n verifying,\n );\n if (i) {\n const drop = columnsToDrop[i - 1];\n columnsToDrop.splice(i - 1, 1);\n\n const from = drop.column.data.name ?? drop.key;\n columnsToChange.set(from, {\n key,\n dbName: from,\n column: column.name(codeName),\n });\n\n const to = config.snakeCase ? toSnakeCase(key) : key;\n\n if (dbTableData.primaryKey) {\n renameColumn(dbTableData.primaryKey.columns, from, to);\n }\n\n for (const index of dbTableData.indexes) {\n for (const column of index.columns) {\n if ('column' in column && column.column === from) {\n column.column = to;\n }\n }\n }\n\n for (const exclude of dbTableData.excludes) {\n for (const column of exclude.columns) {\n if ('column' in column && column.column === from) {\n column.column = to;\n }\n }\n }\n\n for (const c of dbTableData.constraints) {\n if (c.check?.columns) {\n renameColumn(c.check.columns, from, to);\n }\n if (c.references) {\n renameColumn(c.references.columns, from, to);\n }\n }\n\n for (const c of dbStructure.constraints) {\n if (\n c.references &&\n c.references.foreignSchema === schema &&\n c.references.foreignTable === tableName\n ) {\n renameColumn(c.references.foreignColumns, from, to);\n }\n }\n\n continue;\n }\n }\n\n shape[key] = {\n type: 'add',\n item: column,\n };\n }\n};\n\nconst dropColumns = (\n { changeTableAst: { shape } }: ChangeTableData,\n columnsToDrop: KeyAndColumn[],\n) => {\n for (const { key, column } of columnsToDrop) {\n shape[key] = {\n type: 'drop',\n item: column,\n };\n }\n};\n\nconst changeColumns = async (\n adapter: AdapterBase,\n config: RakeDbConfig,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n dbColumns: { [K: string]: DbStructure.Column },\n columnsToChange: ColumnsToChange,\n compareSql: CompareSql,\n changeTableData: ChangeTableData,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n for (const [\n key,\n { key: codeKey, dbName, column: codeColumn },\n ] of columnsToChange) {\n const dbColumnStructure = dbColumns[dbName];\n\n const dbColumn = instantiateDbColumn(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbColumnStructure,\n );\n\n const action = await compareColumns(\n adapter,\n domainsMap,\n ast,\n currentSchema,\n compareSql,\n changeTableData,\n typeCastsCache,\n verifying,\n key,\n dbName,\n dbColumn,\n codeColumn,\n );\n\n if (action === 'change') {\n changeColumn(changeTableData, key, dbName, dbColumn, codeColumn);\n } else if (action === 'recreate') {\n changeTableData.changeTableAst.shape[key] = [\n {\n type: 'drop',\n item: dbColumn,\n },\n {\n type: 'add',\n item: codeColumn,\n },\n ];\n } else if (action !== 'recreate') {\n const to = codeColumn.data.name ?? codeKey;\n if (dbName !== to) {\n changeTableData.changeTableAst.shape[\n config.snakeCase\n ? dbName === toSnakeCase(codeKey)\n ? codeKey\n : dbName\n : dbName\n ] = {\n type: 'rename',\n name: config.snakeCase\n ? to === toSnakeCase(codeKey)\n ? codeKey\n : to\n : to,\n };\n }\n }\n }\n};\n\nconst compareColumns = async (\n adapter: AdapterBase,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n compareSql: CompareSql,\n changeTableData: ChangeTableData,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n key: string,\n dbName: string,\n dbColumn: Column,\n codeColumn: Column,\n): Promise<'change' | 'recreate' | undefined> => {\n if (dbColumn instanceof ArrayColumn && codeColumn instanceof ArrayColumn) {\n dbColumn = dbColumn.data.item;\n codeColumn = codeColumn.data.item;\n }\n\n const dbType = getColumnDbType(dbColumn, currentSchema);\n const codeType = getColumnDbType(codeColumn, currentSchema);\n\n if (dbType !== codeType) {\n const typeCasts = await getTypeCasts(adapter, typeCastsCache);\n\n const dbBaseType = getColumnBaseType(dbColumn, domainsMap, dbType);\n const codeBaseType = getColumnBaseType(codeColumn, domainsMap, codeType);\n\n if (!typeCasts.get(dbBaseType)?.has(codeBaseType)) {\n if (\n !(dbColumn instanceof EnumColumn) ||\n !(codeColumn instanceof EnumColumn) ||\n !deepCompare(dbColumn.options, codeColumn.options)\n ) {\n if (verifying) throw new AbortSignal();\n\n const tableName = concatSchemaAndName(changeTableData.changeTableAst);\n const abort = await promptSelect({\n message: `Cannot cast type of ${tableName}'s column ${key} from ${dbType} to ${codeType}`,\n options: [\n `${colors.yellowBold(\n `-/+`,\n )} recreate the column, existing data will be ${colors.red(\n 'lost',\n )}`,\n `write migration manually`,\n ],\n });\n if (abort) {\n throw new AbortSignal();\n }\n\n dbColumn.data.name = codeColumn.data.name;\n return 'recreate';\n }\n }\n\n return 'change';\n }\n\n const dbData = dbColumn.data as unknown as RecordUnknown;\n const codeData = codeColumn.data as unknown as RecordUnknown;\n\n for (const key of ['isNullable', 'comment']) {\n if (dbData[key] !== codeData[key]) {\n return 'change';\n }\n }\n\n for (const key of [\n 'maxChars',\n 'collation',\n 'compression',\n 'numericPrecision',\n 'numericScale',\n 'dateTimePrecision',\n ]) {\n // Check if key in codeData so that default precision/scale values for such columns as integer aren't counted.\n // If column supports precision/scale, it should have it listed in the data, even if it's undefined.\n if (key in codeData && dbData[key] !== codeData[key]) {\n return 'change';\n }\n }\n\n if (dbColumn.data.isOfCustomType) {\n const { typmod } = dbColumn.data;\n if (typmod !== undefined && typmod !== -1) {\n const i = codeColumn.dataType.indexOf('(');\n if (i === -1 || codeColumn.dataType.slice(i + 1, -1) !== `${typmod}`) {\n return 'change';\n }\n }\n }\n\n if (\n !deepCompare(\n dbData.identity,\n codeData.identity\n ? {\n always: false,\n start: 1,\n increment: 1,\n cache: 1,\n cycle: false,\n ...(codeData.identity ?? {}),\n }\n : undefined,\n )\n ) {\n return 'change';\n }\n\n if (dbData.default !== undefined && codeData.default !== undefined) {\n const valuesBeforeLen = compareSql.values.length;\n const dbDefault = encodeColumnDefault(\n dbData.default,\n compareSql.values,\n dbColumn,\n ) as string;\n const dbValues = compareSql.values.slice(valuesBeforeLen);\n\n const codeDefault = encodeColumnDefault(\n codeData.default,\n compareSql.values,\n codeColumn,\n );\n const codeValues = compareSql.values.slice(valuesBeforeLen);\n\n if (\n dbValues.length !== codeValues.length ||\n (dbValues.length &&\n JSON.stringify(dbValues) !== JSON.stringify(codeValues))\n ) {\n compareSql.values.length = valuesBeforeLen;\n return 'change';\n } else if (dbDefault !== codeDefault && dbDefault !== `(${codeDefault})`) {\n const change = () => {\n changeColumn(changeTableData, key, dbName, dbColumn, codeColumn);\n if (!changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n };\n\n compareSql.expressions.push({\n inDb: dbDefault,\n inCode: codeDefault,\n change,\n });\n }\n }\n\n return;\n};\n\nconst getTypeCasts = async (\n adapter: AdapterBase,\n typeCastsCache: TypeCastsCache,\n) => {\n let typeCasts = typeCastsCache.value;\n if (!typeCasts) {\n const { rows } = await adapter.arrays(`SELECT s.typname, t.typname\nFROM pg_cast\nJOIN pg_type AS s ON s.oid = castsource\nJOIN pg_type AS t ON t.oid = casttarget`);\n\n const directTypeCasts = new Map<string, Set<string>>();\n for (const [source, target] of rows) {\n const set = directTypeCasts.get(source);\n if (set) {\n set.add(target);\n } else {\n directTypeCasts.set(source, new Set([target]));\n }\n }\n\n typeCasts = new Map<string, Set<string>>();\n for (const [type, directSet] of directTypeCasts.entries()) {\n const set = new Set<string>(directSet);\n typeCasts.set(type, set);\n\n for (const subtype of directSet) {\n const subset = directTypeCasts.get(subtype);\n if (subset) {\n for (const type of subset) {\n set.add(type);\n }\n }\n }\n }\n\n typeCastsCache.value = typeCasts;\n }\n\n return typeCasts;\n};\n\nconst changeColumn = (\n changeTableData: ChangeTableData,\n key: string,\n dbName: string,\n dbColumn: Column,\n codeColumn: Column,\n) => {\n dbColumn.data.as = codeColumn.data.as = undefined;\n\n const simpleCodeColumn = Object.create(codeColumn);\n simpleCodeColumn.data = {\n ...codeColumn.data,\n primaryKey: undefined,\n indexes: undefined,\n excludes: undefined,\n foreignKeys: undefined,\n check: undefined,\n };\n\n changeTableData.changingColumns[dbName] = {\n from: dbColumn,\n to: simpleCodeColumn,\n };\n\n changeTableData.changeTableAst.shape[key] = {\n type: 'change',\n from: { column: dbColumn },\n to: { column: simpleCodeColumn },\n };\n};\n\nexport const getColumnDbType = (\n column: Column.Pick.DataAndDataType,\n currentSchema: string,\n) => {\n if (column instanceof EnumColumn) {\n const [schema = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n column.enumName,\n );\n return `${schema}.${name}`;\n } else if (column instanceof ArrayColumn) {\n const { item } = column.data;\n let type = item instanceof EnumColumn ? item.enumName : item.dataType;\n\n type = type.startsWith(currentSchema + '.')\n ? type.slice(currentSchema.length + 1)\n : type;\n\n return type + '[]'.repeat(column.data.arrayDims);\n } else if (column.data.isOfCustomType) {\n let type = column.dataType;\n\n const i = type.indexOf('(');\n if (i !== -1) {\n type = type.slice(0, i);\n }\n\n return type.includes('.') ? type : currentSchema + '.' + type;\n } else {\n return column.dataType;\n }\n};\n\nconst renameColumn = (columns: string[], from: string, to: string) => {\n for (let i = 0; i < columns.length; i++) {\n if (columns[i] === from) {\n columns[i] = to;\n }\n }\n};\n","import { Column, RawSql } from 'pqb/internal';\nimport {\n ArrayColumn,\n DbStructureDomainsMap,\n AdapterBase,\n deepCompare,\n emptyArray,\n TemplateLiteralArgs,\n} from 'pqb/internal';\nimport {\n RakeDbAst,\n getSchemaAndTableFromName,\n DbStructure,\n IntrospectedStructure,\n instantiateDbColumn,\n} from 'rake-db';\nimport { getColumnDbType } from './columns.generator';\nimport {\n CompareExpression,\n compareSqlExpressions,\n TableExpression,\n} from './generators.utils';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\ninterface ComparableDomainCompare extends Omit<\n DbStructure.Domain,\n 'schemaName' | 'name'\n> {\n hasDefault: boolean;\n hasChecks: boolean;\n}\n\ninterface ComparableDomain {\n schemaName: string;\n name: string;\n column: Column;\n compare: ComparableDomainCompare;\n}\n\nexport interface CodeDomain {\n schemaName: string;\n name: string;\n column: Column;\n}\n\nexport const processDomains = async (\n ast: RakeDbAst[],\n adapter: AdapterBase,\n domainsMap: DbStructureDomainsMap,\n dbStructure: IntrospectedStructure,\n {\n codeItems: { domains },\n structureToAstCtx,\n currentSchema,\n internal: { generatorIgnore },\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n) => {\n const codeDomains: ComparableDomain[] = [];\n if (domains) {\n for (const { schemaName, name, column } of domains) {\n codeDomains.push(\n makeComparableDomain(currentSchema, schemaName, name, column),\n );\n }\n }\n\n const tableExpressions: TableExpression[] = [];\n const holdCodeDomains = new Set<ComparableDomain>();\n\n for (const domain of dbStructure.domains) {\n if (\n generatorIgnore?.schemas?.includes(domain.schemaName) ||\n generatorIgnore?.domains?.includes(domain.name)\n ) {\n continue;\n }\n\n const dbColumn = instantiateDbColumn(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n {\n // not destructuring `domain` because need to ignore `numericPrecision`, `numericScale`, etc.,\n // that are loaded from db, but not defined in the code\n schemaName: domain.typeSchema,\n tableName: 'N/A',\n name: domain.name,\n typeSchema: domain.typeSchema,\n type: domain.type,\n arrayDims: domain.arrayDims,\n default: domain.default,\n isNullable: domain.isNullable,\n collate: domain.collate,\n maxChars: domain.maxChars,\n typmod: -1,\n },\n );\n\n if (domain.checks) {\n dbColumn.data.checks = domain.checks.map((check) => ({\n sql: new RawSql([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n const dbDomain = makeComparableDomain(\n currentSchema,\n domain.schemaName,\n domain.name,\n dbColumn,\n );\n\n const found = codeDomains.filter((codeDomain) =>\n deepCompare(dbDomain.compare, codeDomain.compare),\n );\n\n if ((domain.default || domain.checks?.length) && found.length) {\n for (const codeDomain of found) {\n holdCodeDomains.add(codeDomain);\n }\n\n const compare: CompareExpression['compare'] = [];\n pushCompareDefault(compare, domain, found);\n pushCompareChecks(compare, domain, found);\n\n const source = `(VALUES (NULL::${getColumnDbType(\n dbColumn,\n currentSchema,\n )})) t(value)`;\n\n tableExpressions.push({\n compare,\n source,\n handle(i) {\n const codeDomain = i === undefined ? undefined : found[i];\n if (!codeDomain) {\n ast.push(dropAst(dbDomain));\n } else {\n holdCodeDomains.delete(codeDomain);\n }\n },\n });\n } else if (found.length) {\n let i = codeDomains.findIndex(\n (codeDomain) =>\n codeDomain.name === dbDomain.name &&\n codeDomain.schemaName === dbDomain.schemaName,\n );\n if (i === -1) {\n i = 0;\n const first = found[0];\n ast.push({\n type: 'renameType',\n kind: 'DOMAIN',\n fromSchema: dbDomain.schemaName,\n from: dbDomain.name,\n toSchema: first.schemaName,\n to: first.name,\n });\n pendingDbTypes.add(first.schemaName, first.name);\n }\n\n codeDomains.splice(i, 1);\n } else {\n ast.push(dropAst(dbDomain));\n }\n }\n\n for (const codeDomain of codeDomains) {\n if (!holdCodeDomains.has(codeDomain)) {\n ast.push(createAst(codeDomain));\n pendingDbTypes.add(codeDomain.schemaName, codeDomain.name);\n }\n }\n\n if (tableExpressions.length) {\n await compareSqlExpressions(tableExpressions, adapter);\n\n if (holdCodeDomains.size) {\n for (const codeDomain of holdCodeDomains.keys()) {\n ast.push(createAst(codeDomain));\n pendingDbTypes.add(codeDomain.schemaName, codeDomain.name);\n }\n }\n }\n};\n\nconst makeComparableDomain = (\n currentSchema: string,\n schemaName: string,\n name: string,\n column: Column,\n): ComparableDomain => {\n let arrayDims = 0;\n const isNullable = column.data.isNullable ?? false;\n let inner = column;\n while (inner instanceof ArrayColumn) {\n inner = inner.data.item;\n arrayDims++;\n }\n const fullType = getColumnDbType(inner, currentSchema);\n const [typeSchema = 'pg_catalog', type] = getSchemaAndTableFromName(\n currentSchema,\n fullType,\n );\n\n return {\n schemaName,\n name,\n column,\n compare: {\n type,\n typeSchema,\n arrayDims,\n isNullable,\n maxChars: inner.data.maxChars,\n numericPrecision: inner.data.numericPrecision,\n numericScale: inner.data.numericScale,\n dateTimePrecision: inner.data.dateTimePrecision,\n collate: column.data.collate,\n hasDefault: column.data.default !== undefined,\n hasChecks: !!column.data.checks?.length,\n },\n };\n};\n\nconst pushCompareDefault = (\n compare: CompareExpression['compare'],\n domain: DbStructure.Domain,\n found: ComparableDomain[],\n) => {\n if (domain.default) {\n compare.push({\n inDb: domain.default,\n inCode: found.map((codeDomain) => {\n const value = codeDomain.column.data.default;\n if ('sql' in (value as Column.Data.Check)) {\n return (value as Column.Data.Check).sql;\n }\n return value as string;\n }),\n });\n }\n};\n\nconst pushCompareChecks = (\n compare: CompareExpression['compare'],\n domain: DbStructure.Domain,\n found: ComparableDomain[],\n) => {\n if (domain.checks?.length) {\n const inCode = found.flatMap(\n (codeDomain) =>\n codeDomain.column.data.checks?.map((check) =>\n typeof check === 'string' ? check : check.sql,\n ) || emptyArray,\n );\n\n compare.push(\n ...domain.checks.map((check) => ({\n inDb: check,\n inCode,\n })),\n );\n }\n};\n\nconst dropAst = (dbDomain: ComparableDomain): RakeDbAst.Domain => ({\n type: 'domain',\n action: 'drop',\n schema: dbDomain.schemaName,\n name: dbDomain.name,\n baseType: dbDomain.column,\n});\n\nconst createAst = (codeDomain: ComparableDomain): RakeDbAst.Domain => ({\n type: 'domain',\n action: 'create',\n schema: codeDomain.schemaName,\n name: codeDomain.name,\n baseType: codeDomain.column,\n});\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\nexport interface EnumItem {\n schema?: string;\n name: string;\n values: [string, ...string[]];\n}\n\nexport const processEnums = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n codeItems: { enums },\n currentSchema,\n verifying,\n internal: { generatorIgnore },\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const createEnums: EnumItem[] = [];\n const dropEnums: DbStructure.Enum[] = [];\n\n for (const [, codeEnum] of enums) {\n const { schema = currentSchema, name } = codeEnum;\n const dbEnum = dbStructure.enums.find(\n (x) => x.schemaName === schema && x.name === name,\n );\n if (!dbEnum) {\n createEnums.push(codeEnum);\n }\n }\n\n for (const dbEnum of dbStructure.enums) {\n if (\n generatorIgnore?.schemas?.includes(dbEnum.schemaName) ||\n generatorIgnore?.enums?.includes(dbEnum.name)\n ) {\n continue;\n }\n\n const codeEnum = enums.get(`${dbEnum.schemaName}.${dbEnum.name}`);\n if (codeEnum) {\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n continue;\n }\n\n const i = createEnums.findIndex((x) => x.name === dbEnum.name);\n if (i !== -1) {\n const codeEnum = createEnums[i];\n createEnums.splice(i, 1);\n const fromSchema = dbEnum.schemaName;\n const toSchema = codeEnum.schema ?? currentSchema;\n\n renameColumnsTypeSchema(dbStructure, fromSchema, toSchema);\n\n ast.push({\n type: 'renameType',\n kind: 'TYPE',\n fromSchema,\n from: dbEnum.name,\n toSchema,\n to: dbEnum.name,\n });\n pendingDbTypes.add(toSchema, dbEnum.name);\n\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n\n continue;\n }\n\n dropEnums.push(dbEnum);\n }\n\n for (const codeEnum of createEnums) {\n if (dropEnums.length) {\n const i = await promptCreateOrRename(\n 'enum',\n codeEnum.name,\n dropEnums.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbEnum = dropEnums[i - 1];\n dropEnums.splice(i - 1, 1);\n\n const fromSchema = dbEnum.schemaName;\n const from = dbEnum.name;\n const toSchema = codeEnum.schema ?? currentSchema;\n const to = codeEnum.name;\n\n if (fromSchema !== toSchema) {\n renameColumnsTypeSchema(dbStructure, fromSchema, toSchema);\n }\n\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.type === from) {\n column.type = to;\n }\n }\n }\n\n ast.push({\n type: 'renameType',\n kind: 'TYPE',\n fromSchema,\n from,\n toSchema,\n to,\n });\n pendingDbTypes.add(toSchema, to);\n\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n\n continue;\n }\n }\n\n ast.push({\n type: 'enum',\n action: 'create',\n ...codeEnum,\n });\n pendingDbTypes.add(codeEnum.schema, codeEnum.name);\n }\n\n for (const dbEnum of dropEnums) {\n ast.push({\n type: 'enum',\n action: 'drop',\n schema: dbEnum.schemaName,\n name: dbEnum.name,\n values: dbEnum.values,\n });\n }\n};\n\nconst changeEnum = (\n ast: RakeDbAst[],\n dbEnum: DbStructure.Enum,\n codeEnum: EnumItem,\n pendingDbTypes: PendingDbTypes,\n) => {\n const { values: dbValues } = dbEnum;\n const { values: codeValues, schema, name } = codeEnum;\n\n if (dbValues.length < codeValues.length) {\n if (!dbValues.some((value) => !codeValues.includes(value))) {\n ast.push({\n type: 'enumValues',\n action: 'add',\n schema,\n name,\n values: codeValues.filter((value) => !dbValues.includes(value)),\n });\n pendingDbTypes.add(schema, name);\n return;\n }\n } else if (dbValues.length > codeValues.length) {\n if (!codeValues.some((value) => !dbValues.includes(value))) {\n ast.push({\n type: 'enumValues',\n action: 'drop',\n schema,\n name,\n values: dbValues.filter((value) => !codeValues.includes(value)),\n });\n pendingDbTypes.add(schema, name);\n return;\n }\n } else if (!dbValues.some((value) => !codeValues.includes(value))) {\n return;\n }\n\n ast.push({\n type: 'changeEnumValues',\n schema,\n name,\n fromValues: dbValues,\n toValues: codeValues,\n });\n pendingDbTypes.add(schema, name);\n};\n\nconst renameColumnsTypeSchema = (\n dbStructure: IntrospectedStructure,\n from: string,\n to: string,\n) => {\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.typeSchema === from) {\n column.typeSchema = to;\n }\n }\n }\n};\n","import { Column } from 'pqb/internal';\nimport { toArray, toSnakeCase } from 'pqb/internal';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop } from './generators.utils';\nimport { RakeDbConfig } from 'rake-db';\n\nexport const processPrimaryKey = (\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n) => {\n const { codeTable } = changeTableData;\n\n const columnsPrimaryKey: { key: string; name: string }[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (column.data.primaryKey) {\n columnsPrimaryKey.push({ key, name: column.data.name ?? key });\n }\n }\n\n changePrimaryKey(config, columnsPrimaryKey, changeTableData);\n renamePrimaryKey(changeTableData);\n};\n\nconst changePrimaryKey = (\n config: RakeDbConfig,\n columnsPrimaryKey: { key: string; name: string }[],\n {\n codeTable,\n dbTableData: { primaryKey: dbPrimaryKey },\n changeTableAst: { shape, add, drop },\n changingColumns,\n }: ChangeTableData,\n) => {\n const tablePrimaryKey = codeTable.internal.tableData.primaryKey;\n const primaryKey = [\n ...new Set([\n ...columnsPrimaryKey,\n ...((config.snakeCase\n ? tablePrimaryKey?.columns.map((key) => ({\n key,\n name: toSnakeCase(key),\n }))\n : tablePrimaryKey?.columns.map((key) => ({ key, name: key }))) ?? []),\n ]),\n ];\n\n if (\n dbPrimaryKey &&\n primaryKey.length === dbPrimaryKey.columns.length &&\n !primaryKey.some(\n ({ name }) => !dbPrimaryKey.columns.some((dbName) => name === dbName),\n )\n ) {\n if (primaryKey.length === 1) {\n const { key } = primaryKey[0];\n const changes = shape[key] && toArray(shape[key]);\n if (changes) {\n for (const change of changes) {\n if (change.type !== 'change') continue;\n\n if (change.from.column) {\n change.from.column.data.primaryKey = undefined;\n }\n\n if (change.to.column) {\n const column = Object.create(change.to.column);\n column.data = { ...column.data, primaryKey: undefined };\n change.to.column = column;\n }\n }\n }\n }\n return;\n }\n\n const toDrop = dbPrimaryKey?.columns.filter(\n (key) => !checkForColumnAddOrDrop(shape, key),\n );\n if (toDrop?.length) {\n if (toDrop.length === 1 && changingColumns[toDrop[0]]) {\n const column = changingColumns[toDrop[0]];\n column.from.data.primaryKey =\n dbPrimaryKey?.name ?? (true as unknown as string);\n } else {\n drop.primaryKey = { columns: toDrop, name: dbPrimaryKey?.name };\n }\n }\n\n const toAdd = primaryKey.filter(\n ({ key }) => !checkForColumnAddOrDrop(shape, key),\n );\n if (toAdd.length) {\n if (toAdd.length === 1 && changingColumns[toAdd[0].name]) {\n const column = changingColumns[toAdd[0].name];\n column.to.data.primaryKey =\n tablePrimaryKey?.name ?? (true as unknown as string);\n } else {\n add.primaryKey = {\n columns: toAdd.map((c) => c.key),\n name: tablePrimaryKey?.name,\n };\n }\n }\n};\n\nconst renamePrimaryKey = ({\n codeTable,\n dbTableData: { primaryKey: dbPrimaryKey },\n schema,\n delayedAst,\n}: ChangeTableData) => {\n const tablePrimaryKey = codeTable.internal.tableData.primaryKey;\n if (\n dbPrimaryKey &&\n tablePrimaryKey &&\n dbPrimaryKey?.name !== tablePrimaryKey?.name\n ) {\n delayedAst.push({\n type: 'renameTableItem',\n kind: 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbPrimaryKey.name ?? `${codeTable.table}_pkey`,\n to: tablePrimaryKey.name ?? `${codeTable}_pkey`,\n });\n }\n};\n","import {\n RakeDbAst,\n getIndexName,\n DbStructure,\n getExcludeName,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport {\n TableData,\n deepCompare,\n MaybeArray,\n RecordUnknown,\n toArray,\n toSnakeCase,\n SearchWeight,\n} from 'pqb/internal';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop, CompareExpression } from './generators.utils';\nimport { CodeTable } from '../generate';\n\ninterface CodeItem {\n columnKeys: TableData.Index.ColumnOrExpressionOptions[];\n includeKeys?: MaybeArray<string>;\n}\n\ninterface CodeIndex extends TableData.Index, CodeItem {}\ninterface CodeExclude extends TableData.Exclude, CodeItem {}\n\ninterface CodeItems {\n indexes: CodeIndex[];\n excludes: CodeExclude[];\n}\n\ninterface ComparableIndexColumn {\n column?: string;\n collate?: string;\n opclass?: string;\n order?: string;\n weight?: SearchWeight;\n hasExpression: boolean;\n}\n\ninterface ComparableIndex {\n name?: string;\n using?: string;\n unique?: boolean;\n include?: string[];\n nullsNotDistinct?: boolean;\n tablespace?: string;\n tsVector?: boolean;\n language?: string;\n languageColumn?: string;\n columns: ComparableIndexColumn[];\n hasWith: boolean;\n hasWhere: boolean;\n hasExpression: boolean;\n columnKeys?: string[];\n includeKeys?: string[];\n}\n\ninterface ComparableExcludeColumn extends ComparableIndexColumn {\n with: string;\n}\n\ninterface ComparableExclude extends ComparableIndex {\n columns: ComparableExcludeColumn[];\n}\n\ninterface ComparableItems {\n indexes: ComparableIndex[];\n excludes: ComparableExclude[];\n}\n\ninterface SkipCodeItems {\n indexes: Map<number, boolean>;\n excludes: Map<number, boolean>;\n}\n\ninterface HoldCodeItems {\n indexes: Map<TableData.Index, boolean>;\n excludes: Map<TableData.Exclude, boolean>;\n}\n\ninterface Wait {\n indexes: number;\n excludes: number;\n}\n\ninterface ProcessParams {\n config: RakeDbConfig;\n changeTableData: ChangeTableData;\n codeComparableItems: ComparableItems;\n codeItems: CodeItems;\n skipCodeItems: SkipCodeItems;\n holdCodeItems: HoldCodeItems;\n wait: Wait;\n ast: RakeDbAst[];\n compareExpressions: CompareExpression[];\n}\n\nexport const processIndexesAndExcludes = (\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n ast: RakeDbAst[],\n compareExpressions: CompareExpression[],\n) => {\n const codeItems = collectCodeIndexes(config, changeTableData);\n const codeComparableItems = collectCodeComparableItems(config, codeItems);\n\n // to skip indexes without SQL from being added when they are matched with already existing indexes\n const skipCodeItems: SkipCodeItems = {\n indexes: new Map(),\n excludes: new Map(),\n };\n\n // to skip indexes with SQL from being added while their SQL is being asynchronously compared with existing indexes\n const holdCodeItems: HoldCodeItems = {\n indexes: new Map(),\n excludes: new Map(),\n };\n\n const processParams: ProcessParams = {\n config,\n changeTableData,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n // counter for async SQL comparisons that are in progress\n wait: { indexes: 0, excludes: 0 },\n ast,\n compareExpressions,\n };\n\n processItems(processParams, 'indexes');\n processItems(processParams, 'excludes');\n\n addMainItems(\n changeTableData,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n 'indexes',\n );\n addMainItems(\n changeTableData,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n 'excludes',\n );\n};\n\nconst processItems = (\n {\n config,\n changeTableData,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n wait,\n ast,\n compareExpressions,\n }: ProcessParams,\n key: 'indexes' | 'excludes',\n) => {\n const {\n changeTableAst: { shape },\n } = changeTableData;\n\n const dbItems = changeTableData.dbTableData[key];\n\n for (const dbItem of dbItems) {\n const hasAddedOrDroppedColumn = dbItem.columns.some(\n (column) =>\n 'column' in column && checkForColumnAddOrDrop(shape, column.column),\n );\n if (hasAddedOrDroppedColumn) continue;\n\n normalizeItem(dbItem);\n\n const { found, rename, foundAndHasSql } = findMatchingItem(\n dbItem,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n changeTableData.codeTable.table,\n config,\n key,\n );\n\n const { columns: dbColumns } = dbItem;\n\n if (!foundAndHasSql) {\n handleItemChange(\n changeTableData,\n dbItem,\n dbColumns,\n found[0],\n rename[0],\n key,\n );\n continue;\n }\n\n for (const codeItem of found) {\n holdCodeItems[key].set(codeItem as never, true);\n }\n\n const compare: CompareExpression['compare'] = [];\n for (let i = 0; i < dbItem.columns.length; i++) {\n const column = dbItem.columns[i];\n if (!('expression' in column)) continue;\n\n compare.push({\n inDb: column.expression,\n inCode: found.map(\n (x) => (x.columns[i] as { expression: string }).expression,\n ),\n });\n }\n\n if (dbItem.with) {\n compare.push({\n inDb: dbItem.with,\n inCode: found.map((x) => x.options.with as string),\n });\n }\n\n if (dbItem.where) {\n compare.push({\n inDb: dbItem.where,\n inCode: found.map((x) => x.options.where as string),\n });\n }\n\n wait[key]++;\n compareExpressions.push({\n compare,\n handle(i) {\n const codeItem = i === undefined ? undefined : found[i];\n\n handleItemChange(\n changeTableData,\n dbItem,\n dbColumns,\n codeItem,\n i === undefined ? undefined : rename[i],\n key,\n );\n\n if (codeItem) {\n holdCodeItems[key].delete(codeItem as never);\n }\n\n if (!--wait[key] && holdCodeItems[key].size) {\n addItems(changeTableData, [...holdCodeItems[key].keys()], key);\n\n if (!changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n }\n },\n });\n }\n};\n\nconst collectCodeIndexes = (\n config: RakeDbConfig,\n { codeTable, changeTableAst: { shape } }: ChangeTableData,\n): CodeItems => {\n const codeItems: CodeItems = { indexes: [], excludes: [] };\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.indexes && !column.data.excludes) continue;\n\n const name = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, name)) continue;\n\n pushCodeColumnItems(config, codeItems, key, name, column, 'indexes');\n pushCodeColumnItems(config, codeItems, key, name, column, 'excludes');\n }\n\n pushCodeCompositeItems(config, codeTable, codeItems, 'indexes');\n pushCodeCompositeItems(config, codeTable, codeItems, 'excludes');\n\n return codeItems;\n};\n\nconst pushCodeColumnItems = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n columnKey: string,\n name: string,\n column: Column,\n key: 'indexes' | 'excludes',\n) => {\n const items = column.data[key];\n if (!items) return;\n\n codeItems[key].push(\n ...(items as TableData.ColumnExclude[]).map(\n ({\n options: { collate, opclass, order, weight, ...options },\n with: wi,\n ...index\n }) => {\n const w = key === 'excludes' ? wi : (undefined as never);\n return {\n columns: [\n {\n collate,\n opclass,\n order,\n weight,\n column: name,\n with: w,\n },\n ],\n ...index,\n options: options.include\n ? config.snakeCase\n ? {\n ...options,\n include: toArray(options.include).map(toSnakeCase),\n }\n : options\n : options,\n columnKeys: [\n {\n collate,\n opclass,\n order,\n weight,\n column: columnKey,\n with: w,\n },\n ],\n includeKeys: options.include,\n };\n },\n ),\n );\n};\n\nconst pushCodeCompositeItems = (\n config: RakeDbConfig,\n codeTable: CodeTable,\n codeItems: CodeItems,\n key: 'indexes' | 'excludes',\n) => {\n const items = codeTable.internal.tableData[key];\n if (!items) return;\n\n codeItems[key].push(\n ...(items as TableData.Exclude[]).map((x) => ({\n ...x,\n columns: config.snakeCase\n ? x.columns.map((c) =>\n 'column' in c ? { ...c, column: toSnakeCase(c.column) } : c,\n )\n : x.columns,\n columnKeys: x.columns,\n options:\n x.options.include && config.snakeCase\n ? {\n ...x.options,\n include: toArray(x.options.include).map(toSnakeCase),\n }\n : x.options,\n includeKeys: x.options.include,\n })),\n );\n};\n\nconst collectCodeComparableItems = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n): ComparableItems => {\n return {\n indexes: collectCodeComparableItemsType(config, codeItems, 'indexes'),\n excludes: collectCodeComparableItemsType(config, codeItems, 'excludes'),\n };\n};\n\nconst collectCodeComparableItemsType = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n key: 'indexes' | 'excludes',\n): ComparableExclude[] => {\n return codeItems[key].map((codeItem) => {\n normalizeItem(codeItem.options as never);\n\n return itemToComparable({\n ...codeItem.options,\n include:\n codeItem.options.include === undefined\n ? undefined\n : config.snakeCase\n ? toArray(codeItem.options.include).map(toSnakeCase)\n : toArray(codeItem.options.include),\n columns: codeItem.columns,\n name: codeItem.options.name,\n columnKeys: codeItem.columnKeys,\n includeKeys: codeItem.includeKeys,\n });\n }) as never;\n};\n\nconst normalizeItem = (item: {\n using?: string;\n unique?: boolean;\n nullsNotDistinct?: boolean;\n columns: RecordUnknown[];\n exclude?: string[];\n}) => {\n if (item.using) item.using = item.using.toLowerCase();\n if (item.using === 'btree') item.using = undefined;\n if (!item.unique) item.unique = undefined;\n if (item.nullsNotDistinct === false) item.nullsNotDistinct = undefined;\n if (item.exclude) {\n for (let i = 0; i < item.columns.length; i++) {\n item.columns[i].with = item.exclude[i];\n }\n }\n};\n\nconst itemToComparable = (\n index: TableData.Index.Options & {\n columns: DbStructure.Index['columns'];\n name?: string;\n columnKeys?: TableData.Index.ColumnOrExpressionOptions[];\n includeKeys?: MaybeArray<string>;\n },\n) => {\n let hasExpression = false;\n const columns = index.columns.map((column) => {\n const result = {\n ...column,\n expression: undefined,\n hasExpression: 'expression' in column,\n };\n if (result.hasExpression) hasExpression = true;\n return result;\n });\n\n return {\n ...index,\n schemaName: undefined,\n tableName: undefined,\n with: undefined,\n hasWith: !!index.with,\n where: undefined,\n hasWhere: !!index.where,\n columns,\n hasExpression,\n } as ComparableIndex;\n};\n\ninterface ItemChange {\n found: TableData.Index[] | TableData.Exclude[];\n rename: (string | undefined)[];\n}\n\nconst findMatchingItem = (\n dbItem: DbStructure.Index | DbStructure.Exclude,\n codeComparableItems: ComparableItems,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n tableName: string,\n config: RakeDbConfig,\n key: 'indexes' | 'excludes',\n) => {\n const dbComparableItem = itemToComparable(\n key === 'indexes'\n ? dbItem\n : {\n ...dbItem,\n exclude: undefined as never,\n columns: dbItem.columns.map((column, i) => ({\n ...column,\n with: (dbItem as DbStructure.Exclude).exclude[i],\n })),\n },\n );\n\n const { found, rename } = findMatchingItemWithoutSql(\n dbComparableItem,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n tableName,\n config,\n key,\n );\n\n const foundAndHasSql = found.length && checkIfItemHasSql(dbComparableItem);\n\n return { found, rename, foundAndHasSql };\n};\n\nconst findMatchingItemWithoutSql = (\n dbItem: ComparableIndex | ComparableExclude,\n codeComparableItems: ComparableItems,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n tableName: string,\n config: RakeDbConfig,\n key: 'indexes' | 'excludes',\n): ItemChange => {\n const found: (TableData.Index | TableData.Exclude)[] = [];\n const rename: (string | undefined)[] = [];\n\n const { columns: dbColumns, ...dbItemWithoutColumns } = dbItem;\n\n for (let i = 0; i < codeComparableItems[key].length; i++) {\n if (skipCodeItems[key].has(i)) continue;\n\n const { columns: codeColumns, ...codeItem } = codeComparableItems[key][i];\n if (\n dbColumns.length === codeColumns.length &&\n !dbColumns.some((dbColumn, i) => !deepCompare(dbColumn, codeColumns[i]))\n ) {\n let a: RecordUnknown = dbItemWithoutColumns;\n let b = codeItem;\n const codeName =\n b.name ??\n (key === 'indexes' ? getIndexName : getExcludeName)(\n tableName,\n dbColumns,\n );\n if (a.name !== b.name) {\n a = { ...a, name: undefined };\n b = {\n ...b,\n name: undefined,\n columnKeys: undefined,\n includeKeys: undefined,\n };\n if (a.language && !b.language) {\n b.language = config.language ?? 'english';\n }\n\n if (deepCompare(a, b)) {\n found.push(codeItems[key][i]);\n rename.push(\n dbItemWithoutColumns.name !== codeName ? codeName : undefined,\n );\n }\n } else {\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n columnKeys,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n includeKeys,\n ...codeItemWithoutKeys\n } = codeItem;\n\n if (deepCompare(dbItemWithoutColumns, codeItemWithoutKeys)) {\n found.push(codeItems[key][i]);\n rename.push(undefined);\n }\n }\n\n if (found.length && !checkIfItemHasSql(codeItem)) {\n skipCodeItems[key].set(i, true);\n }\n }\n }\n\n return { found, rename };\n};\n\nconst checkIfItemHasSql = (\n x: Pick<ComparableIndex, 'hasWith' | 'hasWhere' | 'hasExpression'>,\n) => x.hasWith || x.hasWhere || x.hasExpression;\n\nconst handleItemChange = (\n {\n changeTableAst,\n schema,\n codeTable,\n changingColumns,\n delayedAst,\n }: ChangeTableData,\n dbItem: DbStructure.Index | DbStructure.Exclude,\n dbColumns: DbStructure.Index['columns'],\n found: TableData.Index | TableData.Exclude | undefined,\n rename: string | undefined,\n key: 'indexes' | 'excludes',\n) => {\n if (!found) {\n const name =\n dbItem.name ===\n (key === 'indexes' ? getIndexName : getExcludeName)(\n changeTableAst.name,\n dbColumns,\n )\n ? undefined\n : dbItem.name;\n\n if (dbColumns.length === 1 && 'column' in dbColumns[0]) {\n const dbColumn = dbColumns[0];\n const column = changingColumns[dbColumn.column];\n if (column) {\n (column.from.data[key] ??= []).push({\n options: { ...dbItem, name },\n with: (key === 'indexes'\n ? undefined\n : (dbColumn as unknown as { with: string }).with) as never,\n });\n return;\n }\n }\n\n (changeTableAst.drop[key] ??= []).push({\n columns: dbColumns,\n options: { ...dbItem, name },\n });\n } else if (rename) {\n delayedAst.push({\n type: 'renameTableItem',\n kind: key === 'indexes' ? 'INDEX' : 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbItem.name,\n to: rename,\n });\n }\n};\n\ninterface IndexWithMaybeColumnNames extends TableData.Index {\n columnNames?: TableData.Index.ColumnOrExpressionOptions[];\n}\n\nconst addMainItems = (\n changeTableData: ChangeTableData,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n holdCodeItems: HoldCodeItems,\n key: 'indexes' | 'excludes',\n) => {\n const itemsToAdd = codeItems[key].filter(\n (item, i) =>\n !skipCodeItems[key].has(i) && !holdCodeItems[key].has(item as never),\n );\n if (itemsToAdd.length) {\n addItems(\n changeTableData,\n itemsToAdd.map((x) => ({\n ...x,\n columns: x.columnKeys,\n columnNames: x.columns,\n options: x.options.include\n ? { ...x.options, include: x.includeKeys }\n : x.options,\n })),\n key,\n );\n }\n};\n\nconst addItems = (\n { changeTableAst, changingColumns }: ChangeTableData,\n add: IndexWithMaybeColumnNames[],\n key: 'indexes' | 'excludes',\n) => {\n const items = (changeTableAst.add[key] ??= []);\n for (const item of add) {\n if (item.columns.length === 1 && 'column' in item.columns[0]) {\n const column =\n changingColumns[\n ((item.columnNames || item.columns)[0] as { column: string }).column\n ];\n if (column) {\n (column.to.data[key] ??= []).push(\n key === 'indexes'\n ? item\n : ({\n ...item,\n with: (item as TableData.Exclude).columns[0].with,\n } as never),\n );\n continue;\n }\n }\n\n items.push(item);\n }\n};\n","import {\n RakeDbAst,\n DbStructure,\n concatSchemaAndName,\n getSchemaAndTableFromName,\n getConstraintName,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport { TableData, deepCompare, toSnakeCase } from 'pqb/internal';\nimport { ChangeTableData, TableShapes } from './tables.generator';\nimport { checkForColumnAddOrDrop } from './generators.utils';\n\ninterface Constraint extends TableData.Constraint {\n references: TableData.References;\n}\n\ninterface CodeForeignKey {\n references: DbStructure.References;\n codeConstraint: Constraint;\n}\n\ninterface ReferencesWithStringTable extends TableData.References {\n fnOrTable: string;\n}\n\nconst mapMatchToDb: {\n [K in TableData.References.Match]: DbStructure.ForeignKeyMatch;\n} = {\n FULL: 'f',\n PARTIAL: 'p',\n SIMPLE: 's',\n};\n\nconst mapMatchToCode = {} as {\n [K in DbStructure.ForeignKeyMatch]: TableData.References.Match;\n};\nfor (const key in mapMatchToDb) {\n mapMatchToCode[\n mapMatchToDb[\n key as TableData.References.Match\n ] as DbStructure.ForeignKeyMatch\n ] = key as TableData.References.Match;\n}\n\nconst mapActionToDb: {\n [K in TableData.References.Action]: DbStructure.ForeignKeyAction;\n} = {\n 'NO ACTION': 'a',\n RESTRICT: 'r',\n CASCADE: 'c',\n 'SET NULL': 'n',\n 'SET DEFAULT': 'd',\n};\n\nconst mapActionToCode = {} as {\n [K in DbStructure.ForeignKeyAction]: TableData.References.Action;\n};\nfor (const key in mapActionToDb) {\n mapActionToCode[\n mapActionToDb[\n key as TableData.References.Action\n ] as DbStructure.ForeignKeyAction\n ] = key as TableData.References.Action;\n}\n\nexport const processForeignKeys = (\n config: RakeDbConfig,\n ast: RakeDbAst[],\n changeTables: ChangeTableData[],\n currentSchema: string,\n tableShapes: TableShapes,\n): void => {\n for (const changeTableData of changeTables) {\n const codeForeignKeys = collectCodeFkeys(\n config,\n changeTableData,\n currentSchema,\n );\n\n const { codeTable, dbTableData, changeTableAst, schema, changingColumns } =\n changeTableData;\n const { shape, add, drop } = changeTableAst;\n let changed = false;\n\n for (const dbConstraint of dbTableData.constraints) {\n const { references: dbReferences } = dbConstraint;\n if (!dbReferences) continue;\n\n const hasChangedColumn = dbReferences.columns.some((column) =>\n checkForColumnAddOrDrop(shape, column),\n );\n if (hasChangedColumn) continue;\n\n const foreignShape =\n tableShapes[\n `${dbReferences.foreignSchema}.${dbReferences.foreignTable}`\n ];\n const hasForeignChangedColumn =\n foreignShape &&\n dbReferences.foreignColumns.some((column) => {\n return checkForColumnAddOrDrop(foreignShape, column);\n });\n if (hasForeignChangedColumn) continue;\n\n let found = false;\n let rename: string | undefined;\n for (let i = 0; i < codeForeignKeys.length; i++) {\n const codeForeignKey = codeForeignKeys[i];\n const codeReferences = codeForeignKey.references;\n if (deepCompare(dbReferences, codeReferences)) {\n found = true;\n codeForeignKeys.splice(i, 1);\n\n const codeName =\n codeForeignKey.codeConstraint.name ??\n getConstraintName(\n codeTable.table,\n codeForeignKey,\n config.snakeCase,\n );\n if (codeName !== dbConstraint.name) {\n rename = codeName;\n }\n }\n }\n\n if (!found) {\n const foreignKey = dbForeignKeyToCodeForeignKey(\n config,\n dbConstraint,\n dbReferences,\n );\n\n if (\n dbReferences.columns.length === 1 &&\n changingColumns[dbReferences.columns[0]]\n ) {\n const column = changingColumns[dbReferences.columns[0]];\n (column.from.data.foreignKeys ??= []).push({\n fnOrTable: foreignKey.references.fnOrTable,\n foreignColumns: foreignKey.references.foreignColumns,\n options: foreignKey.references.options,\n });\n } else {\n (drop.constraints ??= []).push(foreignKey);\n }\n\n changed = true;\n } else if (rename) {\n ast.push({\n type: 'renameTableItem',\n kind: 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbConstraint.name,\n to: rename,\n });\n }\n }\n\n if (codeForeignKeys.length) {\n const constraints = (add.constraints ??= []);\n for (const { codeConstraint, references } of codeForeignKeys) {\n if (\n references.columns.length === 1 &&\n changingColumns[references.columns[0]]\n ) {\n const column = changingColumns[references.columns[0]];\n (column.to.data.foreignKeys ??= []).push({\n fnOrTable: references.foreignTable,\n foreignColumns: codeConstraint.references.foreignColumns,\n options: codeConstraint.references.options,\n });\n } else {\n constraints.push(codeConstraint);\n }\n }\n\n changed = true;\n }\n\n if (changed && !changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n }\n};\n\nconst collectCodeFkeys = (\n config: RakeDbConfig,\n { codeTable, changeTableAst: { shape } }: ChangeTableData,\n currentSchema: string,\n): CodeForeignKey[] => {\n const codeForeignKeys: CodeForeignKey[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.foreignKeys) continue;\n\n const name = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, name)) continue;\n\n codeForeignKeys.push(\n ...column.data.foreignKeys.map((x) => {\n const columns = [name];\n\n const fnOrTable = fnOrTableToString(x.fnOrTable);\n\n return parseForeignKey(\n config,\n {\n name: x.options?.name,\n references: {\n columns: [name],\n fnOrTable,\n foreignColumns: x.foreignColumns,\n options: x.options,\n },\n },\n {\n columns,\n fnOrTable,\n foreignColumns: x.foreignColumns,\n options: x.options,\n },\n currentSchema,\n );\n }),\n );\n }\n\n if (codeTable.internal.tableData.constraints) {\n for (const tableConstraint of codeTable.internal.tableData.constraints) {\n const { references: refs } = tableConstraint;\n if (!refs) continue;\n\n const fnOrTable = fnOrTableToString(refs.fnOrTable);\n\n codeForeignKeys.push(\n parseForeignKey(\n config,\n {\n ...tableConstraint,\n references: {\n ...refs,\n fnOrTable,\n },\n },\n {\n ...refs,\n fnOrTable,\n columns: config.snakeCase\n ? refs.columns.map(toSnakeCase)\n : refs.columns,\n foreignColumns: config.snakeCase\n ? refs.foreignColumns.map(toSnakeCase)\n : refs.foreignColumns,\n },\n currentSchema,\n ),\n );\n }\n }\n\n return codeForeignKeys;\n};\n\nexport const fnOrTableToString = (\n fnOrTable: TableData.References['fnOrTable'],\n) => {\n if (typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = concatSchemaAndName({ schema, name: table });\n }\n return fnOrTable;\n};\n\nconst parseForeignKey = (\n config: RakeDbConfig,\n codeConstraint: Constraint,\n references: ReferencesWithStringTable,\n currentSchema: string,\n): CodeForeignKey => {\n const { fnOrTable, columns, foreignColumns, options } = references;\n const [schema, table] = getSchemaAndTableFromName(currentSchema, fnOrTable);\n\n return {\n references: {\n foreignSchema: schema ?? currentSchema,\n foreignTable: table,\n columns,\n foreignColumns: config.snakeCase\n ? foreignColumns.map(toSnakeCase)\n : foreignColumns,\n match: mapMatchToDb[options?.match || 'SIMPLE'],\n onUpdate: mapActionToDb[options?.onUpdate || 'NO ACTION'],\n onDelete: mapActionToDb[options?.onDelete || 'NO ACTION'],\n },\n codeConstraint,\n };\n};\n\nconst dbForeignKeyToCodeForeignKey = (\n config: RakeDbConfig,\n dbConstraint: DbStructure.Constraint,\n dbReferences: DbStructure.References,\n): { name?: string; references: TableData.References } => ({\n name:\n dbConstraint.name ===\n getConstraintName(\n dbConstraint.tableName,\n { references: dbReferences },\n config.snakeCase,\n )\n ? undefined\n : dbConstraint.name,\n references: {\n columns: dbReferences.columns,\n fnOrTable: `${dbReferences.foreignSchema}.${dbReferences.foreignTable}`,\n foreignColumns: dbReferences.foreignColumns,\n options: {\n match:\n dbReferences.match === 's'\n ? undefined\n : mapMatchToCode[dbReferences.match],\n onUpdate:\n dbReferences.onUpdate === 'a'\n ? undefined\n : mapActionToCode[dbReferences.onUpdate],\n onDelete:\n dbReferences.onDelete === 'a'\n ? undefined\n : mapActionToCode[dbReferences.onDelete],\n },\n },\n});\n","import { Column, RawSql } from 'pqb/internal';\nimport { getFreeSetAlias, TemplateLiteralArgs, TableData } from 'pqb/internal';\nimport { DbStructure, RakeDbAst } from 'rake-db';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop, CompareExpression } from './generators.utils';\n\ninterface CodeCheck {\n check: Column.Data.Check;\n name: string;\n column?: string;\n}\n\nexport const processChecks = (\n ast: RakeDbAst[],\n changeTableData: ChangeTableData,\n compareExpressions: CompareExpression[],\n): void => {\n const codeChecks = collectCodeChecks(changeTableData);\n const {\n dbTableData,\n changeTableAst: { add, shape },\n } = changeTableData;\n\n const hasDbChecks = dbTableData.constraints.some((c) => c.check);\n if (!hasDbChecks) {\n if (codeChecks.length) {\n const constraints = (add.constraints ??= []);\n for (const codeCheck of codeChecks) {\n if (\n !codeCheck.column ||\n !changeTableData.changingColumns[codeCheck.column]\n ) {\n constraints.push({\n check: codeCheck.check.sql,\n name: codeCheck.name,\n });\n }\n }\n }\n return;\n }\n\n let wait = 0;\n const foundCodeChecks = new Set<number>();\n for (const dbConstraint of dbTableData.constraints) {\n const { check: dbCheck, name } = dbConstraint;\n if (!dbCheck) continue;\n\n const hasChangedColumn = dbCheck.columns?.some((column) =>\n checkForColumnAddOrDrop(shape, column),\n );\n if (hasChangedColumn) continue;\n\n if (codeChecks.length) {\n wait++;\n compareExpressions.push({\n compare: [\n {\n inDb: dbCheck.expression,\n inCode: codeChecks.map(({ check }) => check.sql),\n },\n ],\n handle(i) {\n if (i !== undefined) {\n foundCodeChecks.add(i);\n } else {\n dropCheck(changeTableData, dbCheck, name);\n }\n\n if (--wait !== 0) return;\n\n const checksToAdd: TableData.Constraint[] = [];\n\n codeChecks.forEach((check, i) => {\n if (foundCodeChecks.has(i)) {\n if (!check.column) return;\n\n const change = changeTableData.changingColumns[check.column];\n if (!change) return;\n\n const columnChecks = change.to.data.checks;\n if (!columnChecks) return;\n\n const i = columnChecks.indexOf(check.check);\n if (i !== -1) {\n columnChecks.splice(i, 1);\n }\n return;\n }\n\n checksToAdd.push({\n name: check.name,\n check: check.check.sql,\n });\n });\n\n if (checksToAdd.length) {\n (add.constraints ??= []).push(...checksToAdd);\n }\n\n if (\n !changeTableData.pushedAst &&\n (changeTableData.changeTableAst.drop.constraints?.length ||\n add.constraints?.length)\n ) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n },\n });\n } else {\n dropCheck(changeTableData, dbCheck, name);\n }\n }\n};\n\nconst collectCodeChecks = ({\n codeTable,\n changeTableAst: { shape },\n}: ChangeTableData): CodeCheck[] => {\n const names = new Set<string>();\n\n const codeChecks: CodeCheck[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.checks) continue;\n\n const columnName = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, columnName)) continue;\n\n const baseName = `${codeTable.table}_${columnName}_check`;\n\n codeChecks.push(\n ...column.data.checks.map((check) => {\n const name = check.name || getFreeSetAlias(names, baseName, 1);\n names.add(name);\n\n return {\n check,\n name,\n column: columnName,\n };\n }),\n );\n }\n\n if (codeTable.internal.tableData.constraints) {\n for (const constraint of codeTable.internal.tableData.constraints) {\n const { check } = constraint;\n if (check) {\n const baseName = `${codeTable.table}_check`;\n const name = constraint.name || getFreeSetAlias(names, baseName, 1);\n names.add(name);\n\n codeChecks.push({\n check: { sql: check, name: constraint.name },\n name,\n });\n }\n }\n }\n\n return codeChecks;\n};\n\nconst dropCheck = (\n { changeTableAst: { drop }, changingColumns }: ChangeTableData,\n dbCheck: DbStructure.Check,\n name: string,\n) => {\n const sql = new RawSql([\n [dbCheck.expression],\n ] as unknown as TemplateLiteralArgs);\n\n if (dbCheck.columns?.length === 1 && changingColumns[dbCheck.columns[0]]) {\n const column = changingColumns[dbCheck.columns[0]];\n column.from.data.name = 'i_d';\n (column.from.data.checks ??= []).push({\n name,\n sql,\n });\n } else {\n (drop.constraints ??= []).push({\n name,\n check: sql,\n });\n }\n};\n","import { Column } from 'pqb/internal';\nimport {\n ArrayColumn,\n ColumnsShape,\n DbStructureDomainsMap,\n AdapterBase,\n EnumColumn,\n GeneratorIgnore,\n VirtualColumn,\n} from 'pqb/internal';\nimport {\n DbStructure,\n IntrospectedStructure,\n RakeDbAst,\n getDbStructureTableData,\n StructureToAstCtx,\n StructureToAstTableData,\n tableToAst,\n getSchemaAndTableFromName,\n getMigrationsSchemaAndTable,\n RakeDbConfig,\n} from 'rake-db';\nimport {\n CompareExpression,\n compareSqlExpressions,\n promptCreateOrRename,\n TableExpression,\n} from './generators.utils';\nimport { processPrimaryKey } from './primaryKey.generator';\nimport { processIndexesAndExcludes } from './indexesAndExcludes.generator';\nimport { processColumns, TypeCastsCache } from './columns.generator';\nimport { processForeignKeys } from './foreignKeys.generator';\nimport { processChecks } from './checks.generator';\nimport { CodeTable } from '../generate';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\nexport interface CompareSql {\n values: unknown[];\n expressions: {\n inDb: string;\n inCode: string | null;\n change(): void;\n }[];\n}\n\nexport interface ChangeTableSchemaData {\n codeTable: CodeTable;\n dbTable: DbStructure.Table;\n}\n\nexport interface ChangeTableData extends ChangeTableSchemaData {\n dbTableData: StructureToAstTableData;\n schema: string;\n changeTableAst: RakeDbAst.ChangeTable;\n pushedAst: boolean;\n changingColumns: ChangingColumns;\n delayedAst: RakeDbAst[];\n}\n\ninterface ChangingColumns {\n [dbName: string]: ChangingColumnsPair;\n}\n\nexport interface ChangingColumnsPair {\n from: Column;\n to: Column;\n}\n\nexport interface TableShapes {\n [K: string]: RakeDbAst.ChangeTableShape;\n}\n\nexport const processTables = async (\n ast: RakeDbAst[],\n domainsMap: DbStructureDomainsMap,\n adapter: AdapterBase,\n dbStructure: IntrospectedStructure,\n config: RakeDbConfig,\n {\n structureToAstCtx,\n codeItems: { tables },\n currentSchema,\n internal: { generatorIgnore },\n verifying,\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const createTables: CodeTable[] = collectCreateTables(\n tables,\n dbStructure,\n currentSchema,\n );\n const compareSql: CompareSql = { values: [], expressions: [] };\n const tableExpressions: TableExpression[] = [];\n const { changeTables, changeTableSchemas, dropTables, tableShapes } =\n collectChangeAndDropTables(\n adapter,\n config,\n tables,\n dbStructure,\n currentSchema,\n createTables,\n generatorIgnore,\n );\n\n applyChangeTableSchemas(changeTableSchemas, currentSchema, ast);\n\n await applyCreateOrRenameTables(\n dbStructure,\n createTables,\n dropTables,\n changeTables,\n tableShapes,\n currentSchema,\n ast,\n verifying,\n );\n\n await applyChangeTables(\n adapter,\n changeTables,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n config,\n compareSql,\n tableExpressions,\n verifying,\n pendingDbTypes,\n );\n\n processForeignKeys(config, ast, changeTables, currentSchema, tableShapes);\n\n await Promise.all([\n applyCompareSql(compareSql, adapter),\n compareSqlExpressions(tableExpressions, adapter),\n ]);\n\n for (const dbTable of dropTables) {\n ast.push(\n tableToAst(structureToAstCtx, dbStructure, dbTable, 'drop', domainsMap),\n );\n }\n};\n\nconst collectCreateTables = (\n tables: CodeTable[],\n dbStructure: IntrospectedStructure,\n currentSchema: string,\n): CodeTable[] => {\n return tables.reduce<CodeTable[]>((acc, codeTable) => {\n const tableSchema = codeTable.q.schema ?? currentSchema;\n const hasDbTable = dbStructure.tables.some(\n (t) => t.name === codeTable.table && t.schemaName === tableSchema,\n );\n if (!hasDbTable) {\n acc.push(codeTable);\n }\n return acc;\n }, []);\n};\n\nconst collectChangeAndDropTables = (\n adapter: AdapterBase,\n config: RakeDbConfig,\n tables: CodeTable[],\n dbStructure: IntrospectedStructure,\n currentSchema: string,\n createTables: CodeTable[],\n generatorIgnore: GeneratorIgnore | undefined,\n): {\n changeTables: ChangeTableData[];\n changeTableSchemas: ChangeTableSchemaData[];\n dropTables: DbStructure.Table[];\n tableShapes: TableShapes;\n} => {\n const changeTables: ChangeTableData[] = [];\n const changeTableSchemas: ChangeTableSchemaData[] = [];\n const dropTables: DbStructure.Table[] = [];\n const tableShapes: TableShapes = {};\n const ignoreTables = generatorIgnore?.tables?.map((name) => {\n const [schema = currentSchema, table] = getSchemaAndTableFromName(\n currentSchema,\n name,\n );\n return { schema, table };\n });\n\n const { schema: migrationsSchema = 'public', table: migrationsTable } =\n getMigrationsSchemaAndTable(adapter, config);\n for (const dbTable of dbStructure.tables) {\n if (\n (dbTable.name === migrationsTable &&\n dbTable.schemaName === migrationsSchema) ||\n generatorIgnore?.schemas?.includes(dbTable.schemaName) ||\n ignoreTables?.some(\n ({ schema, table }) =>\n table === dbTable.name && schema === dbTable.schemaName,\n )\n )\n continue;\n\n const codeTable = tables.find(\n (t) =>\n t.table === dbTable.name &&\n (t.q.schema ?? currentSchema) === dbTable.schemaName,\n );\n if (codeTable) {\n addChangeTable(\n dbStructure,\n changeTables,\n tableShapes,\n currentSchema,\n dbTable,\n codeTable,\n );\n continue;\n }\n\n const i = createTables.findIndex((t) => t.table === dbTable.name);\n if (i !== -1) {\n const codeTable = createTables[i];\n createTables.splice(i, 1);\n changeTableSchemas.push({ codeTable, dbTable });\n continue;\n }\n\n dropTables.push(dbTable);\n }\n\n return { changeTables, changeTableSchemas, dropTables, tableShapes };\n};\n\nconst applyChangeTableSchemas = (\n changeTableSchemas: ChangeTableSchemaData[],\n currentSchema: string,\n ast: RakeDbAst[],\n) => {\n for (const { codeTable, dbTable } of changeTableSchemas) {\n const fromSchema = dbTable.schemaName;\n const toSchema = codeTable.q.schema ?? currentSchema;\n\n ast.push({\n type: 'renameType',\n kind: 'TABLE',\n fromSchema,\n from: dbTable.name,\n toSchema,\n to: dbTable.name,\n });\n }\n};\n\nconst applyChangeTables = async (\n adapter: AdapterBase,\n changeTables: ChangeTableData[],\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n config: RakeDbConfig,\n compareSql: CompareSql,\n tableExpressions: TableExpression[],\n verifying: boolean | undefined,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const compareExpressions: CompareExpression[] = [];\n const typeCastsCache: TypeCastsCache = {};\n\n for (const changeTableData of changeTables) {\n compareExpressions.length = 0;\n\n await processTableChange(\n adapter,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n config,\n changeTableData,\n compareSql,\n compareExpressions,\n typeCastsCache,\n verifying,\n );\n\n if (compareExpressions.length) {\n const { codeTable } = changeTableData;\n const names: string[] = [];\n const types: string[] = [];\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n // skip virtual columns\n if (!column.dataType) continue;\n\n const name = column.data.name ?? key;\n const type = getColumnDbTypeForComparison(column, currentSchema);\n if (!pendingDbTypes.set.has(type)) {\n names.push(name);\n types.push(type);\n }\n }\n\n const tableName = codeTable.table;\n const source = `(VALUES (${types\n .map((x) => `NULL::${x}`)\n .join(', ')})) \"${tableName}\"(${names\n .map((x) => `\"${x}\"`)\n .join(', ')})`;\n\n tableExpressions.push(\n ...compareExpressions.map((x) => ({ ...x, source })),\n );\n }\n }\n};\n\nconst getColumnDbTypeForComparison = (\n column: Column.Pick.DataAndDataType,\n currentSchema: string,\n): string => {\n if (column instanceof ArrayColumn) {\n return (\n getColumnDbTypeForComparison(column.data.item, currentSchema) +\n '[]'.repeat(column.data.arrayDims)\n );\n }\n\n let type = column instanceof EnumColumn ? column.enumName : column.dataType;\n\n const i = type.indexOf('(');\n let append = '';\n if (i !== -1) {\n type = type.slice(0, i);\n append = type.slice(i);\n }\n\n const j = type.indexOf('.');\n if (j === -1) {\n let result = `\"${type}\"${append}`;\n if (column.data.isOfCustomType || column instanceof EnumColumn) {\n result = `\"${currentSchema}\".${result}`;\n }\n return result;\n } else {\n return `\"${type.slice(j)}\".\"${type.slice(0, j)}\"${append}`;\n }\n};\n\n// https://github.com/romeerez/orchid-orm/issues/647\n// two clock_timestamp() statements aren't equal to each other, confusing SQL comparator.\n// adding 0.1ms to keep clock_timestamp() different from now(), so user can migrate from now() to clock_timestamp().\nconst freezeSqlClock = (sql: string) =>\n sql.replaceAll('clock_timestamp()', `'0.1ms'::interval + now()`);\n\nconst applyCompareSql = async (\n compareSql: CompareSql,\n adapter: AdapterBase,\n) => {\n if (compareSql.expressions.length) {\n const {\n rows: [results],\n } = await adapter.arrays(\n 'SELECT ' +\n compareSql.expressions\n .map(\n (x) =>\n `${freezeSqlClock(x.inDb)} = (${\n x.inCode && freezeSqlClock(x.inCode)\n })`,\n )\n .join(', '),\n compareSql.values,\n );\n\n for (let i = 0; i < results.length; i++) {\n if (!results[i]) {\n compareSql.expressions[i].change();\n }\n }\n }\n};\n\nconst applyCreateOrRenameTables = async (\n dbStructure: IntrospectedStructure,\n createTables: CodeTable[],\n dropTables: DbStructure.Table[],\n changeTables: ChangeTableData[],\n tableShapes: TableShapes,\n currentSchema: string,\n ast: RakeDbAst[],\n verifying: boolean | undefined,\n) => {\n for (const codeTable of createTables) {\n if (dropTables.length) {\n const i = await promptCreateOrRename(\n 'table',\n codeTable.table,\n dropTables.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbTable = dropTables[i - 1];\n dropTables.splice(i - 1, 1);\n\n ast.push({\n type: 'renameType',\n kind: 'TABLE',\n fromSchema: dbTable.schemaName,\n from: dbTable.name,\n toSchema: codeTable.q.schema ?? currentSchema,\n to: codeTable.table,\n });\n\n addChangeTable(\n dbStructure,\n changeTables,\n tableShapes,\n currentSchema,\n dbTable,\n codeTable,\n );\n\n continue;\n }\n }\n\n ast.push(createTableAst(currentSchema, codeTable));\n }\n};\n\nconst addChangeTable = (\n dbStructure: IntrospectedStructure,\n changeTables: ChangeTableData[],\n tableShapes: TableShapes,\n currentSchema: string,\n dbTable: DbStructure.Table,\n codeTable: CodeTable,\n) => {\n const shape = {};\n const schema = codeTable.q.schema ?? currentSchema;\n\n changeTables.push({\n codeTable: cloneCodeTableForChange(codeTable),\n dbTable,\n dbTableData: getDbStructureTableData(dbStructure, dbTable),\n schema,\n changeTableAst: {\n type: 'changeTable',\n schema,\n name: codeTable.table,\n shape: shape,\n add: {},\n drop: {},\n },\n pushedAst: false,\n changingColumns: {},\n delayedAst: [],\n });\n\n tableShapes[`${schema}.${codeTable.table}`] = shape;\n};\n\nconst cloneCodeTableForChange = (codeTable: CodeTable) => ({\n ...codeTable,\n // codeTable is a class instance and not all props can be cloned with `...`\n table: codeTable.table,\n shape: Object.fromEntries(\n Object.entries(codeTable.shape).map(([key, column]) => {\n const cloned = Object.create(column as Column);\n cloned.data = {\n ...cloned.data,\n checks: cloned.data.checks && [...cloned.data.checks],\n };\n\n return [key, cloned];\n }),\n ),\n});\n\nconst createTableAst = (\n currentSchema: string,\n table: CodeTable,\n): RakeDbAst.Table => {\n return {\n type: 'table',\n action: 'create',\n schema: table.q.schema === currentSchema ? undefined : table.q.schema,\n comment: table.internal.comment,\n name: table.table,\n shape: makeTableShape(table),\n noPrimaryKey: table.internal.noPrimaryKey ? 'ignore' : 'error',\n ...table.internal.tableData,\n };\n};\n\nconst makeTableShape = (table: CodeTable): ColumnsShape => {\n const shape: ColumnsShape = {};\n for (const key in table.shape) {\n const column = table.shape[key];\n if (!(column instanceof VirtualColumn)) {\n shape[key] = column as Column;\n }\n }\n return shape;\n};\n\nconst processTableChange = async (\n adapter: AdapterBase,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n compareSql: CompareSql,\n compareExpressions: CompareExpression[],\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n await processColumns(\n adapter,\n config,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n changeTableData,\n ast,\n currentSchema,\n compareSql,\n typeCastsCache,\n verifying,\n );\n\n processPrimaryKey(config, changeTableData);\n\n processIndexesAndExcludes(config, changeTableData, ast, compareExpressions);\n\n processChecks(ast, changeTableData, compareExpressions);\n\n const { changeTableAst } = changeTableData;\n if (\n Object.keys(changeTableAst.shape).length ||\n Object.keys(changeTableAst.add).length ||\n Object.keys(changeTableAst.drop).length\n ) {\n changeTableData.pushedAst = true;\n ast.push(changeTableAst);\n }\n\n if (changeTableData.delayedAst.length) {\n ast.push(...changeTableData.delayedAst);\n }\n};\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\nimport { deepCompare } from 'pqb/internal';\nimport { promptCreateOrRename } from './generators.utils';\n\nconst defaults = {\n super: false,\n inherit: false,\n createRole: false,\n createDb: false,\n canLogin: false,\n replication: false,\n connLimit: -1,\n bypassRls: false,\n};\n\nexport const processRoles = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n { verifying, internal: { roles } }: ComposeMigrationParams,\n) => {\n if (!dbStructure.roles || !roles) return;\n\n const codeRoles = roles.map((role): DbStructure.Role => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { defaultPrivileges: _, ...roleWithoutPrivileges } = role;\n return {\n ...defaults,\n ...roleWithoutPrivileges,\n };\n });\n\n const found = new Set<string>();\n const dropRoles: DbStructure.Role[] = [];\n\n for (const dbRole of dbStructure.roles) {\n // Strip defaultPrivileges from dbRole for comparison\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n defaultPrivileges: _,\n ...dbRoleWithoutPrivileges\n } = dbRole as DbStructure.Role & { defaultPrivileges?: unknown };\n\n const codeRole = codeRoles.find(\n (codeRole) => dbRole.name === codeRole.name,\n );\n if (codeRole) {\n found.add(dbRole.name);\n\n if (!deepCompare(dbRoleWithoutPrivileges, codeRole)) {\n ast.push({\n type: 'changeRole',\n name: dbRole.name,\n from: dbRoleWithoutPrivileges,\n to: codeRole,\n });\n }\n\n continue;\n }\n\n dropRoles.push(dbRole);\n }\n\n for (const codeRole of codeRoles) {\n if (found.has(codeRole.name)) continue;\n\n if (dropRoles.length) {\n const i = await promptCreateOrRename(\n 'table',\n codeRole.name,\n dropRoles.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbRole = dropRoles[i - 1];\n dropRoles.splice(i - 1, 1);\n\n ast.push(makeRenameOrChangeAst(dbRole, codeRole));\n\n continue;\n }\n }\n\n ast.push({\n type: 'role',\n action: 'create',\n ...codeRole,\n });\n }\n\n for (const dbRole of dropRoles) {\n ast.push({\n type: 'role',\n action: 'drop',\n ...dbRole,\n });\n }\n};\n\nconst makeRenameOrChangeAst = (\n dbRole: DbStructure.Role,\n codeRole: DbStructure.Role,\n): RakeDbAst.RenameRole | RakeDbAst.ChangeRole => {\n const { name: dbRoleName, ...dbRoleRest } = dbRole;\n const { name: codeRoleName, ...codeRoleRest } = codeRole;\n if (deepCompare(dbRoleRest, codeRoleRest) && dbRoleName !== codeRoleName) {\n return {\n type: 'renameRole',\n from: dbRoleName,\n to: codeRoleName,\n };\n } else {\n return {\n type: 'changeRole',\n name: dbRole.name,\n from: dbRole,\n to: codeRole,\n };\n }\n};\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\nimport { getSupportedDefaultPrivileges, DefaultPrivileges } from 'pqb/internal';\n\nconst ALL_OBJECT_TYPES: DbStructure.DefaultPrivilegeObjectConfig['object'][] = [\n 'TABLES',\n 'SEQUENCES',\n 'FUNCTIONS',\n 'TYPES',\n 'SCHEMAS',\n 'LARGE_OBJECTS',\n];\n\n// Create object configs for all object types with given isGrantable flag\nconst createAllObjectConfigs = (\n isGrantable: boolean,\n schema: string | undefined,\n supportedPrivileges: DefaultPrivileges.SupportedDefaultPrivileges,\n): DbStructure.DefaultPrivilegeObjectConfig[] => {\n let types: DbStructure.DefaultPrivilegeObjectConfig['object'][];\n if (schema) {\n types = ALL_OBJECT_TYPES.filter(\n (t) => t !== 'SCHEMAS' && t !== 'LARGE_OBJECTS',\n );\n } else {\n types = ALL_OBJECT_TYPES.filter((t) => {\n if (t === 'LARGE_OBJECTS') {\n return supportedPrivileges.PRIVILEGES.LARGE_OBJECT !== undefined;\n }\n return true;\n });\n }\n return types.map((object) => ({\n object,\n privilegeConfigs: [{ privilege: 'ALL', isGrantable }],\n }));\n};\n\n// Map object type to the corresponding grant/revoke key\nconst objectTypeToKey: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n 'tables' | 'sequences' | 'functions' | 'types' | 'schemas' | 'largeObjects'\n> = {\n TABLES: 'tables',\n SEQUENCES: 'sequences',\n FUNCTIONS: 'functions',\n TYPES: 'types',\n SCHEMAS: 'schemas',\n LARGE_OBJECTS: 'largeObjects',\n};\n\n// Split privilege configs into regular and grantable privilege names\nconst splitPrivilegeConfigs = (\n configs: DbStructure.DefaultPrivilegeConfig[],\n): { regular: string[]; grantable: string[] } => {\n const regular: string[] = [];\n const grantable: string[] = [];\n for (const p of configs) {\n if (p.isGrantable) {\n grantable.push(p.privilege);\n } else {\n regular.push(p.privilege);\n }\n }\n return { regular, grantable };\n};\n\n// Create a setting object from regular and grantable privilege arrays\nconst createPrivilegeSetting = (\n regular: string[],\n grantable: string[],\n): { privileges?: string[]; grantablePrivileges?: string[] } => {\n const setting: { privileges?: string[]; grantablePrivileges?: string[] } = {};\n if (regular.length) setting.privileges = regular;\n if (grantable.length) setting.grantablePrivileges = grantable;\n return setting;\n};\n\n// Collapse privilege configs into ALL if all expected privileges are present.\n// Mutates newPrivilegeConfigs by pushing the result.\nconst collapsePrivileges = (\n privs: DbStructure.DefaultPrivilegeConfig[],\n newPrivilegeConfigs: DbStructure.DefaultPrivilegeConfig[],\n expectedPrivs: string[],\n isGrantable: boolean,\n): void => {\n const hasAll = privs.some((p) => p.privilege === 'ALL');\n const allPresent =\n hasAll ||\n (privs.length > 0 &&\n privs.length === expectedPrivs.length &&\n expectedPrivs.every((priv) => privs.some((p) => p.privilege === priv)));\n\n if (allPresent) {\n newPrivilegeConfigs.push({ privilege: 'ALL', isGrantable });\n } else if (privs.length > 0) {\n newPrivilegeConfigs.push(...privs);\n }\n};\n\n// Collapse privileges into ALL when all non-ALL privileges are present.\n// Returns a new DefaultPrivilege with collapsed privileges.\nconst collapsePrivilegesToAll = (\n privilege: DbStructure.DefaultPrivilege,\n objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >,\n): DbStructure.DefaultPrivilege => {\n const collapsedObjectConfigs = privilege.objectConfigs.map(\n (objConfig): DbStructure.DefaultPrivilegeObjectConfig => {\n const allPrivileges = objectTypeToAllPrivileges[objConfig.object];\n const expectedPrivs = allPrivileges.filter((p) => p !== 'ALL');\n\n // Group privilege configs by isGrantable using imperative loop\n const regularPrivs: DbStructure.DefaultPrivilegeConfig[] = [];\n const grantablePrivs: DbStructure.DefaultPrivilegeConfig[] = [];\n for (const p of objConfig.privilegeConfigs) {\n if (p.isGrantable) {\n grantablePrivs.push(p);\n } else {\n regularPrivs.push(p);\n }\n }\n\n const newPrivilegeConfigs: DbStructure.DefaultPrivilegeConfig[] = [];\n\n // Collapse regular privileges to ALL if all are present\n collapsePrivileges(\n regularPrivs,\n newPrivilegeConfigs,\n expectedPrivs,\n false,\n );\n\n // Collapse grantable privileges to ALL if all are present\n collapsePrivileges(\n grantablePrivs,\n newPrivilegeConfigs,\n expectedPrivs,\n true,\n );\n\n return {\n object: objConfig.object,\n privilegeConfigs: newPrivilegeConfigs,\n };\n },\n );\n\n return {\n owner: privilege.owner,\n grantee: privilege.grantee,\n schema: privilege.schema,\n objectConfigs: collapsedObjectConfigs,\n };\n};\n\n// Check if two privilege configs match, considering ALL expansion\nconst privilegeConfigsMatch = (\n a: DbStructure.DefaultPrivilegeConfig,\n b: DbStructure.DefaultPrivilegeConfig,\n objectType: DbStructure.DefaultPrivilegeObjectConfig['object'],\n objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >,\n): boolean => {\n // Exact match\n if (a.privilege === b.privilege && a.isGrantable === b.isGrantable) {\n return true;\n }\n\n const allPrivileges = objectTypeToAllPrivileges[objectType];\n const expectedPrivs = allPrivileges.filter((p) => p !== 'ALL');\n\n // Check if a is ALL and b has all expected privileges (or vice versa)\n if (a.privilege === 'ALL' && a.isGrantable === b.isGrantable) {\n // Check if b has all expected privileges\n return expectedPrivs.includes(b.privilege);\n }\n if (b.privilege === 'ALL' && a.isGrantable === b.isGrantable) {\n // Check if a has all expected privileges\n return expectedPrivs.includes(a.privilege);\n }\n\n return false;\n};\n\n// Normalize role name by stripping quotes that may come from database introspection\nconst normalizeRoleName = (name: string): string => {\n if (name.startsWith('\"') && name.endsWith('\"')) {\n return name.slice(1, -1);\n }\n return name;\n};\n\n// Process privilege config (tables, sequences, functions, types) into object configs\nconst processPrivilegeConfig = (\n config: { privileges?: string[]; grantablePrivileges?: string[] } | undefined,\n objectType: DbStructure.DefaultPrivilegeObjectConfig['object'],\n): DbStructure.DefaultPrivilegeObjectConfig | undefined => {\n if (!config) return;\n\n const privilegeConfigs: DbStructure.DefaultPrivilegeConfig[] = [];\n if (config.privileges) {\n for (const p of config.privileges) {\n privilegeConfigs.push({ privilege: p, isGrantable: false });\n }\n }\n if (config.grantablePrivileges) {\n for (const p of config.grantablePrivileges) {\n privilegeConfigs.push({ privilege: p, isGrantable: true });\n }\n }\n if (privilegeConfigs.length) {\n return { object: objectType, privilegeConfigs };\n }\n return;\n};\n\n// Check if a default privilege object config has any privileges set\nconst hasAnyPrivilege = (\n obj: RakeDbAst.DefaultPrivilegeObjectConfig | undefined,\n): boolean => {\n if (!obj) return false;\n for (const key of ALL_OBJECT_TYPES) {\n const setting = obj[objectTypeToKey[key]];\n if (setting?.privileges?.length || setting?.grantablePrivileges?.length) {\n return true;\n }\n }\n return false;\n};\n\nexport const processDefaultPrivileges = (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n { internal: { roles } }: ComposeMigrationParams,\n) => {\n if (!dbStructure.defaultPrivileges || !roles) return;\n\n const supportedPrivileges = getSupportedDefaultPrivileges(\n dbStructure.version,\n );\n\n const objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n > = {} as Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >;\n\n objectTypeToAllPrivileges.TABLES = supportedPrivileges.PRIVILEGES.TABLE;\n objectTypeToAllPrivileges.SEQUENCES = supportedPrivileges.PRIVILEGES.SEQUENCE;\n objectTypeToAllPrivileges.FUNCTIONS = supportedPrivileges.PRIVILEGES.FUNCTION;\n objectTypeToAllPrivileges.TYPES = supportedPrivileges.PRIVILEGES.TYPE;\n objectTypeToAllPrivileges.SCHEMAS = supportedPrivileges.PRIVILEGES.SCHEMA;\n\n if (supportedPrivileges.PRIVILEGES.LARGE_OBJECT) {\n objectTypeToAllPrivileges.LARGE_OBJECTS =\n supportedPrivileges.PRIVILEGES.LARGE_OBJECT;\n }\n\n // Collect default privileges from code roles\n const codePrivileges: Map<string, DbStructure.DefaultPrivilege> = new Map();\n\n for (const role of roles) {\n if (!role.defaultPrivileges) continue;\n\n for (const privilege of role.defaultPrivileges) {\n const key = `${role.name}.${privilege.schema}`;\n\n const objectConfigs: DbStructure.DefaultPrivilegeObjectConfig[] = [];\n\n // Start with allGrantable or all base config\n if (privilege.allGrantable) {\n objectConfigs.push(\n ...createAllObjectConfigs(\n true,\n privilege.schema,\n supportedPrivileges,\n ),\n );\n } else if (privilege.all) {\n objectConfigs.push(\n ...createAllObjectConfigs(\n false,\n privilege.schema,\n supportedPrivileges,\n ),\n );\n }\n\n for (const objectType of ALL_OBJECT_TYPES) {\n if (\n privilege.schema &&\n (objectType === 'SCHEMAS' || objectType === 'LARGE_OBJECTS')\n ) {\n continue;\n }\n if (\n objectType === 'LARGE_OBJECTS' &&\n !supportedPrivileges.PRIVILEGES.LARGE_OBJECT\n ) {\n continue;\n }\n const key = objectTypeToKey[objectType];\n if (key in privilege) {\n const config = privilege[key as keyof typeof privilege];\n const processed = processPrivilegeConfig(config as never, objectType);\n if (processed) {\n const existingIndex = objectConfigs.findIndex(\n (o) => o.object === objectType,\n );\n if (existingIndex >= 0) {\n objectConfigs[existingIndex] = processed;\n } else {\n objectConfigs.push(processed);\n }\n }\n }\n }\n\n if (objectConfigs.length) {\n // Store code privileges as-is (don't collapse - preserve user intent)\n codePrivileges.set(key, {\n owner: undefined,\n grantee: role.name,\n schema: privilege.schema,\n objectConfigs,\n });\n }\n }\n }\n\n // Compare with database privileges and generate AST items\n const found = new Set<string>();\n\n for (const dbPrivilege of dbStructure.defaultPrivileges) {\n // Normalize grantee to handle quotes from database\n const grantee = normalizeRoleName(dbPrivilege.grantee);\n if (grantee === 'postgres') continue;\n\n const key = `${grantee}.${dbPrivilege.schema}`;\n const codePrivilege = codePrivileges.get(key);\n\n if (codePrivilege) {\n found.add(key);\n\n const grant: RakeDbAst.DefaultPrivilege['grant'] = {};\n const revoke: RakeDbAst.DefaultPrivilege['revoke'] = {};\n\n // Compare object configs for each object type\n for (const objectType of ALL_OBJECT_TYPES) {\n if (\n objectType === 'LARGE_OBJECTS' &&\n !supportedPrivileges.PRIVILEGES.LARGE_OBJECT\n ) {\n continue;\n }\n\n const dbObj = dbPrivilege.objectConfigs.find(\n (o) => o.object === objectType,\n );\n const codeObj = codePrivilege.objectConfigs.find(\n (o) => o.object === objectType,\n );\n\n const dbPrivs = dbObj?.privilegeConfigs ?? [];\n const codePrivs = codeObj?.privilegeConfigs ?? [];\n\n // Collapse db privileges for comparison (but keep original for output)\n const collapsedDbPrivilege: DbStructure.DefaultPrivilege = {\n owner: dbPrivilege.owner,\n grantee: dbPrivilege.grantee,\n schema: dbPrivilege.schema,\n objectConfigs: [{ object: objectType, privilegeConfigs: dbPrivs }],\n };\n const collapsedDbObj = collapsePrivilegesToAll(\n collapsedDbPrivilege,\n objectTypeToAllPrivileges,\n ).objectConfigs[0];\n const collapsedDbPrivs = collapsedDbObj?.privilegeConfigs ?? [];\n\n // Find privileges to grant (in code but not in collapsed db)\n const toGrant = codePrivs.filter(\n (cp) =>\n !collapsedDbPrivs.some((dp) =>\n privilegeConfigsMatch(\n cp,\n dp,\n objectType,\n objectTypeToAllPrivileges,\n ),\n ),\n );\n\n // Find privileges to revoke (in db but not in code)\n // Use original dbPrivs for output, but collapsed for comparison\n const toRevoke = dbPrivs.filter(\n (dp) =>\n !codePrivs.some((cp) =>\n privilegeConfigsMatch(\n cp,\n dp,\n objectType,\n objectTypeToAllPrivileges,\n ),\n ),\n );\n\n if (toGrant.length) {\n const { regular, grantable } = splitPrivilegeConfigs(toGrant);\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n grant[objectTypeToKey[objectType]] = setting;\n }\n }\n\n if (toRevoke.length) {\n const { regular, grantable } = splitPrivilegeConfigs(toRevoke);\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n revoke[objectTypeToKey[objectType]] = setting;\n }\n }\n }\n\n const hasGrant = hasAnyPrivilege(grant);\n const hasRevoke = hasAnyPrivilege(revoke);\n\n if (hasGrant || hasRevoke) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: grantee,\n schema: dbPrivilege.schema,\n grant: hasGrant ? grant : undefined,\n revoke: hasRevoke ? revoke : undefined,\n });\n }\n } else {\n // Revoke all existing privileges\n const revoke: RakeDbAst.DefaultPrivilege['revoke'] = {};\n\n for (const obj of dbPrivilege.objectConfigs) {\n const { regular, grantable } = splitPrivilegeConfigs(\n obj.privilegeConfigs,\n );\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n revoke[objectTypeToKey[obj.object]] = setting;\n }\n }\n\n if (hasAnyPrivilege(revoke)) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: grantee,\n schema: dbPrivilege.schema,\n revoke,\n });\n }\n }\n }\n\n // Grant privileges that are in code but not in db\n for (const [key, codePrivilege] of codePrivileges) {\n if (found.has(key)) continue;\n\n const grant: RakeDbAst.DefaultPrivilege['grant'] = {};\n\n for (const obj of codePrivilege.objectConfigs) {\n const { regular, grantable } = splitPrivilegeConfigs(\n obj.privilegeConfigs,\n );\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n grant[objectTypeToKey[obj.object]] = setting;\n }\n }\n\n if (hasAnyPrivilege(grant)) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: codePrivilege.grantee,\n schema: codePrivilege.schema,\n grant,\n });\n }\n }\n};\n","import { QueryInternal, AdapterBase } from 'pqb/internal';\nimport {\n RakeDbAst,\n IntrospectedStructure,\n makeDomainsMap,\n StructureToAstCtx,\n astToMigration,\n} from 'rake-db';\nimport { processSchemas } from './generators/schemas.generator';\nimport { processExtensions } from './generators/extensions.generator';\nimport { processDomains } from './generators/domains.generator';\nimport { processEnums } from './generators/enums.generator';\nimport { processTables } from './generators/tables.generator';\nimport { CodeItems } from './generate';\nimport { RakeDbConfig } from 'rake-db';\nimport { processRoles } from './generators/roles.generator';\nimport { processDefaultPrivileges } from './generators/default-privilege.generator';\n\nexport interface ComposeMigrationParams {\n structureToAstCtx: StructureToAstCtx;\n codeItems: CodeItems;\n currentSchema: string;\n internal: QueryInternal;\n verifying?: boolean;\n}\n\n/**\n * This is needed to compare SQLs of table expressions.\n * Need to exclude table columns of pending types, such as enums or domains,\n * that aren't created yet from the SQL comparison.\n * Otherwise, the comparison fails because of the unknown types.\n */\nexport class PendingDbTypes {\n set = new Set<string>();\n add(schemaName: string | undefined = 'public', name: string) {\n this.set.add(`\"${schemaName}\".\"${name}\"`);\n }\n}\n\nexport const composeMigration = async (\n adapter: AdapterBase,\n config: RakeDbConfig,\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n params: ComposeMigrationParams,\n): Promise<string | undefined> => {\n const { structureToAstCtx, currentSchema } = params;\n\n await processRoles(ast, dbStructure, params);\n\n processDefaultPrivileges(ast, dbStructure, params);\n\n const domainsMap = makeDomainsMap(structureToAstCtx, dbStructure);\n\n await processSchemas(ast, dbStructure, params);\n processExtensions(ast, dbStructure, params);\n\n const pendingDbTypes = new PendingDbTypes();\n\n await processDomains(\n ast,\n adapter,\n domainsMap,\n dbStructure,\n params,\n pendingDbTypes,\n );\n await processEnums(ast, dbStructure, params, pendingDbTypes);\n\n await processTables(\n ast,\n domainsMap,\n adapter,\n dbStructure,\n config,\n params,\n pendingDbTypes,\n );\n\n return astToMigration(currentSchema, config, ast);\n};\n","import { AdapterBase } from 'pqb/internal';\nimport {\n createMigrationInterface,\n ChangeCallback,\n introspectDbSchema,\n RakeDbConfig,\n} from 'rake-db';\nimport { composeMigration, ComposeMigrationParams } from './composeMigration';\nimport { AbortSignal } from './generate';\n\nconst rollbackErr = new Error('Rollback');\n\nexport const verifyMigration = async (\n adapter: AdapterBase,\n config: RakeDbConfig,\n migrationCode: string,\n generateMigrationParams: ComposeMigrationParams,\n roles?: { whereSql?: string },\n defaultPrivileges?: { loadDefaultPrivileges?: boolean },\n): Promise<string | false | undefined> => {\n const migrationFn = new Function('change', migrationCode);\n\n let code: string | false | undefined;\n\n try {\n await adapter.transaction(async (trx) => {\n const changeFns: ChangeCallback<unknown>[] = [];\n migrationFn((changeCb: ChangeCallback<unknown>) => {\n changeFns.push(changeCb);\n });\n\n const { log } = config;\n config.log = false;\n\n const db = createMigrationInterface(trx, true, config).getDb(\n config.columnTypes,\n );\n\n config.log = log;\n\n for (const changeFn of changeFns) {\n await changeFn(db, true);\n }\n\n const dbStructure = await introspectDbSchema(trx, {\n roles,\n loadDefaultPrivileges: defaultPrivileges?.loadDefaultPrivileges,\n });\n generateMigrationParams.verifying = true;\n\n try {\n code = await composeMigration(\n trx,\n config,\n [],\n dbStructure,\n generateMigrationParams,\n );\n } catch (err) {\n if (err instanceof AbortSignal) {\n code = false;\n throw rollbackErr;\n }\n throw err;\n }\n\n throw rollbackErr;\n });\n } catch (err) {\n if (err !== rollbackErr) {\n throw err;\n }\n }\n\n return code;\n};\n","import { RakeDbConfig, RakeDbAst, getSchemaAndTableFromName } from 'rake-db';\nimport {\n exhaustive,\n pluralize,\n addCode,\n Code,\n codeToString,\n ColumnToCodeCtx,\n toArray,\n toCamelCase,\n colors,\n} from 'pqb/internal';\nimport { getColumnDbType } from './generators/columns.generator';\nimport { fnOrTableToString } from './generators/foreignKeys.generator';\n\nexport const report = (\n ast: RakeDbAst[],\n config: RakeDbConfig,\n currentSchema: string,\n) => {\n if (!config.logger) return;\n\n const code: Code[] = [];\n\n let green, red, yellow, pale;\n if (typeof config.log === 'object' && config.log.colors === false) {\n green = red = yellow = pale = (s: string) => s;\n } else {\n ({ green, red, yellow, pale } = colors);\n }\n\n for (const a of ast) {\n switch (a.type) {\n case 'table': {\n let hasPrimaryKey = !!a.primaryKey;\n const counters = {\n column: 0,\n index: a.indexes?.length ?? 0,\n exclude: a.excludes?.length ?? 0,\n 'foreign key':\n a.constraints?.reduce<number>(\n (sum, c) => (c.references ? sum + 1 : sum),\n 0,\n ) ?? 0,\n check:\n a.constraints?.reduce<number>(\n (sum, c) => (c.check ? sum + 1 : sum),\n 0,\n ) ?? 0,\n };\n for (const key in a.shape) {\n counters.column++;\n\n const column = a.shape[key];\n if (column.data.primaryKey) {\n hasPrimaryKey = true;\n }\n\n if (column.data.indexes) {\n counters.index += column.data.indexes.length;\n }\n\n if (column.data.excludes) {\n counters.exclude += column.data.excludes.length;\n }\n\n if (column.data.foreignKeys) {\n counters['foreign key'] += column.data.foreignKeys.length;\n }\n\n if (column.data.checks) {\n counters.check += column.data.checks.length;\n }\n }\n\n const summary: string[] = [];\n\n for (const key in counters) {\n const value = counters[key as keyof typeof counters];\n if (value || key === 'column') {\n summary.push(\n `${value} ${pluralize(key, value, key === 'index' ? 'es' : 's')}`,\n );\n }\n }\n\n if (!hasPrimaryKey) {\n summary.push('no primary key');\n }\n\n code.push(\n `${\n a.action === 'create'\n ? green('+ create table')\n : red('- drop table')\n } ${dbItemName(a, currentSchema)} (${summary.join(', ')})`,\n );\n break;\n }\n case 'changeTable': {\n const inner: Code[] = [];\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: a.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in a.shape) {\n const changes = toArray(a.shape[key]);\n for (const change of changes) {\n if (change.type === 'add' || change.type === 'drop') {\n const column = change.item;\n const { primaryKey, indexes, excludes, foreignKeys, checks } =\n column.data;\n\n inner.push(\n `${\n change.type === 'add'\n ? green('+ add column')\n : red('- drop column')\n } ${key} ${\n column.data.alias ?? getColumnDbType(column, currentSchema)\n }${column.data.isNullable ? ' nullable' : ''}${\n primaryKey ? ' primary key' : ''\n }${\n foreignKeys\n ? ` references ${foreignKeys\n .map((fk) => {\n return `${fnOrTableToString(\n fk.fnOrTable,\n )}(${fk.foreignColumns.join(', ')})`;\n })\n .join(', ')}`\n : ''\n }${\n indexes?.length\n ? indexes.length === 1\n ? ', has index'\n : `, has ${indexes.length} indexes`\n : ''\n }${\n excludes?.length\n ? excludes.length === 1\n ? ', has exclude'\n : `, has ${excludes.length} excludes`\n : ''\n }${\n checks?.length\n ? `, checks ${checks\n .map((check) => check.sql.toSQL({ values: [] }))\n .join(', ')}`\n : ''\n }`,\n );\n } else if (change.type === 'change') {\n let name = change.from.column?.data.name ?? key;\n if (config.snakeCase) name = toCamelCase(name);\n\n const changes: Code[] = [];\n inner.push(`${yellow('~ change column')} ${name}:`, changes);\n changes.push(`${yellow('from')}: `);\n\n const fromCode = change.from.column?.toCode(toCodeCtx, key);\n if (fromCode) {\n for (const code of fromCode) {\n addCode(changes, code);\n }\n }\n\n changes.push(` ${yellow('to')}: `);\n\n const toCode = change.to.column?.toCode(toCodeCtx, key);\n if (toCode) {\n for (const code of toCode) {\n addCode(changes, code);\n }\n }\n } else if (change.type === 'rename') {\n inner.push(\n `${yellow('~ rename column')} ${\n config.snakeCase ? toCamelCase(key) : key\n } ${yellow('=>')} ${change.name}`,\n );\n } else {\n exhaustive(change.type);\n }\n }\n }\n\n if (a.drop.primaryKey) {\n inner.push(\n `${red(`- drop primary key`)} on (${a.drop.primaryKey.columns.join(\n ', ',\n )})`,\n );\n }\n\n if (a.drop.indexes) {\n for (const index of a.drop.indexes) {\n inner.push(\n `${red(\n `- drop${index.options.unique ? ' unique' : ''} index`,\n )} on (${index.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.drop.excludes) {\n for (const exclude of a.drop.excludes) {\n inner.push(\n `${red(`- drop exclude`)} on (${exclude.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.drop.constraints) {\n for (const { references } of a.drop.constraints) {\n if (!references) continue;\n\n const [schema, name] = getSchemaAndTableFromName(\n currentSchema,\n references.fnOrTable as string,\n );\n\n inner.push(\n `${red(`- drop foreign key`)} on (${references.columns.join(\n ', ',\n )}) to ${dbItemName(\n {\n schema,\n name,\n },\n currentSchema,\n )}(${references.foreignColumns.join(', ')})`,\n );\n }\n\n for (const { check } of a.drop.constraints) {\n if (!check) continue;\n\n inner.push(`${red(`- drop check`)} ${check.toSQL({ values: [] })}`);\n }\n }\n\n if (a.add.primaryKey) {\n inner.push(\n `${green(`+ add primary key`)} on (${a.add.primaryKey.columns.join(\n ', ',\n )})`,\n );\n }\n\n if (a.add.indexes) {\n for (const index of a.add.indexes) {\n inner.push(\n `${green(\n `+ add${index.options.unique ? ' unique' : ''} index`,\n )} on (${index.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.add.excludes) {\n for (const exclude of a.add.excludes) {\n inner.push(\n `${green(`+ add exclude`)} on (${exclude.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.add.constraints) {\n for (const { references } of a.add.constraints) {\n if (!references) continue;\n\n inner.push(\n `${green(`+ add foreign key`)} on (${references.columns.join(\n ', ',\n )}) to ${\n references.fnOrTable as string\n }(${references.foreignColumns.join(', ')})`,\n );\n }\n\n for (const { check } of a.add.constraints) {\n if (!check) continue;\n\n inner.push(\n `${green(`+ add check`)} ${check.toSQL({ values: [] })}`,\n );\n }\n }\n\n code.push(\n `${yellow('~ change table')} ${dbItemName(a, currentSchema)}${\n inner.length ? ':' : ''\n }`,\n );\n\n if (inner.length) {\n code.push(inner);\n }\n\n break;\n }\n case 'schema': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create schema')\n : red('- drop schema')\n } ${a.name}`,\n );\n break;\n }\n case 'renameSchema': {\n code.push(\n `${yellow('~ rename schema')} ${a.from} ${yellow('=>')} ${a.to}`,\n );\n break;\n }\n case 'renameType': {\n code.push(\n `${yellow(\n `~ ${\n a.fromSchema !== a.toSchema\n ? a.from !== a.to\n ? 'change schema and rename'\n : 'change schema of'\n : 'rename'\n } ${a.kind.toLowerCase()}`,\n )} ${dbItemName(\n {\n schema: a.fromSchema,\n name: a.from,\n },\n currentSchema,\n )} ${yellow('=>')} ${dbItemName(\n {\n schema: a.toSchema,\n name: a.to,\n },\n currentSchema,\n )}`,\n );\n break;\n }\n case 'extension': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create extension')\n : red('- drop extension')\n } ${dbItemName(a, currentSchema)}${\n a.version ? ` ${pale(a.version)}` : ''\n }`,\n );\n break;\n }\n case 'enum': {\n code.push(\n `${\n a.action === 'create' ? green('+ create enum') : red('- drop enum')\n } ${dbItemName(a, currentSchema)}: (${a.values.join(', ')})`,\n );\n break;\n }\n case 'enumValues': {\n code.push(\n `${\n a.action === 'add'\n ? green('+ add values to enum')\n : red('- remove values from enum')\n } ${dbItemName(a, currentSchema)}: ${a.values.join(', ')}`,\n );\n break;\n }\n case 'changeEnumValues': {\n if (a.fromValues) {\n code.push(\n `${red('- remove values from enum')} ${dbItemName(\n a,\n currentSchema,\n )}: ${a.fromValues.join(', ')}`,\n );\n }\n if (a.toValues) {\n code.push(\n `${green('+ add values to enum')} ${dbItemName(\n a,\n currentSchema,\n )}: ${a.toValues.join(', ')}`,\n );\n }\n break;\n }\n case 'domain': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create domain')\n : red('- drop domain')\n } ${dbItemName(a, currentSchema)}`,\n );\n break;\n }\n case 'view':\n case 'collation':\n case 'renameEnumValues':\n case 'constraint':\n break;\n case 'renameTableItem': {\n code.push(\n `${yellow(`~ rename ${a.kind.toLowerCase()}`)} on table ${dbItemName(\n { schema: a.tableSchema, name: a.tableName },\n currentSchema,\n )}: ${a.from} ${yellow('=>')} ${a.to}`,\n );\n break;\n }\n case 'role':\n code.push(\n `${\n a.action === 'create' ? green('+ create role') : red('- drop role')\n } ${a.name}`,\n );\n break;\n case 'renameRole':\n case 'changeRole': {\n if (a.type === 'renameRole') {\n code.push(\n `${yellow('~ rename role')} ${a.from} ${yellow('=>')} ${a.to}`,\n );\n } else {\n code.push(`${yellow('~ change role')} ${a.name}`);\n }\n break;\n }\n case 'defaultPrivilege': {\n // Map privilege names for display (e.g., 'ALL' -> 'ALL PRIVILEGES')\n const mapPrivilege = (p: string) =>\n p === 'ALL' ? 'ALL PRIVILEGES' : p;\n\n const schema = a.schema\n ? ` in schema ${colors.pale(a.schema)}`\n : ` ${colors.pale('in all schemas')}`;\n\n // Report grant and revoke of default privileges\n const parts: string[] = [];\n if (a.grant) {\n for (const [objType, config] of Object.entries(a.grant)) {\n if (!config) continue;\n\n const type = objType.replace(/([A-Z])/g, ' $1').toLowerCase();\n\n // Report regular privileges separately\n if (config.privileges?.length) {\n parts.push(\n `${green('+ grant default privileges')} ${config.privileges\n .map(mapPrivilege)\n .join(', ')} on ${type} to ${a.grantee}${schema}`,\n );\n }\n\n // Report grantable privileges separately with \"with grant option\"\n if (config.grantablePrivileges?.length) {\n parts.push(\n `${green(\n '+ grant default privileges',\n )} ${config.grantablePrivileges\n .map(mapPrivilege)\n .join(', ')} on ${type} with grant option to ${\n a.grantee\n }${schema}`,\n );\n }\n }\n }\n if (a.revoke) {\n for (const [objType, config] of Object.entries(a.revoke)) {\n if (!config) continue;\n\n const type = objType.replace(/([A-Z])/g, ' $1').toLowerCase();\n\n // Report regular privileges separately\n if (config.privileges?.length) {\n parts.push(\n `${red('- revoke default privileges')} ${config.privileges\n .map(mapPrivilege)\n .join(', ')} on ${type} from ${a.grantee}${schema}`,\n );\n }\n\n // Report grantable privileges separately with \"with grant option\"\n if (config.grantablePrivileges?.length) {\n parts.push(\n `${red(\n '- revoke default privileges',\n )} ${config.grantablePrivileges\n .map(mapPrivilege)\n .join(', ')} on ${type} with grant option from ${\n a.grantee\n }${schema}`,\n );\n }\n }\n }\n if (parts.length) {\n code.push(parts.join('\\n'));\n }\n break;\n }\n default:\n exhaustive(a);\n }\n }\n\n const result = codeToString(code, '', ' ');\n config.logger.log(result);\n};\n\nconst dbItemName = (\n { schema, name }: { schema?: string; name: string },\n currentSchema: string,\n) => {\n return schema && schema !== currentSchema ? `${schema}.${name}` : name;\n};\n","import {\n AdapterBase,\n PickQueryShape,\n toCamelCase,\n ArrayColumn,\n ColumnsShape,\n Column,\n defaultSchemaConfig,\n DomainColumn,\n PickQueryInternal,\n QueryInternal,\n UnknownColumn,\n getQuerySchema,\n emptyObject,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport {\n concatSchemaAndName,\n getDbVersion,\n getSchemaAndTableFromName,\n introspectDbSchema,\n IntrospectedStructure,\n makeFileVersion,\n makeStructureToAstCtx,\n migrate,\n migrateAndClose,\n RakeDbAst,\n RakeDbConfig,\n writeMigrationFile,\n} from 'rake-db';\nimport { EnumItem } from './generators/enums.generator';\nimport { CodeDomain } from './generators/domains.generator';\nimport { composeMigration, ComposeMigrationParams } from './composeMigration';\nimport { verifyMigration } from './verify-migration';\nimport { report } from './reportGeneratedMigration';\nimport path from 'node:path';\nimport { pathToFileURL } from 'url';\n\nexport interface CodeTable extends PickQueryShape, PickQueryInternal {\n table: string;\n q: CodeTableQueryData;\n}\n\nexport interface CodeTableQueryData {\n schema?: string;\n}\n\nexport interface CodeItems {\n schemas: Set<string>;\n enums: Map<string, EnumItem>;\n tables: CodeTable[];\n domains: CodeDomain[];\n}\n\ninterface AfterPull {\n adapter: AdapterBase;\n version: string;\n}\n\nexport interface DbInstance {\n $qb: Query;\n}\n\nexport class AbortSignal extends Error {}\n\nexport const generate = async (\n adapters: AdapterBase[],\n config: RakeDbConfig,\n args: string[],\n afterPull?: AfterPull,\n): Promise<void> => {\n let { dbPath } = config;\n if (!dbPath || !config.baseTable) throw invalidConfig(config);\n if (!adapters.length) throw new Error(`Database options must not be empty`);\n\n if (!dbPath.endsWith('.ts')) dbPath += '.ts';\n\n let migrationName = args[0] ?? 'generated';\n let up: boolean;\n if (migrationName === 'up') {\n up = true;\n migrationName = 'generated';\n } else {\n up = args[1] === 'up';\n }\n\n if (afterPull) {\n adapters = [afterPull.adapter];\n }\n\n const db = await getDbFromConfig(config, dbPath);\n const { columnTypes, internal } = db.$qb;\n\n const rolesDbStructureParam = internal.roles\n ? internal.managedRolesSql\n ? { whereSql: internal.managedRolesSql }\n : emptyObject\n : undefined;\n\n const { dbStructure } = await migrateAndPullStructures(\n adapters,\n config,\n rolesDbStructureParam,\n internal.roles ? { loadDefaultPrivileges: true } : undefined,\n afterPull,\n );\n\n const [adapter] = adapters;\n const adapterSchema = adapter.getSchema();\n const currentSchema =\n (typeof adapterSchema === 'function' ? adapterSchema() : adapterSchema) ??\n 'public';\n\n const codeItems = await getActualItems(\n db,\n currentSchema,\n internal,\n columnTypes,\n );\n\n const structureToAstCtx = makeStructureToAstCtx(config, currentSchema);\n\n const generateMigrationParams: ComposeMigrationParams = {\n structureToAstCtx,\n codeItems,\n currentSchema,\n internal,\n };\n\n const ast: RakeDbAst[] = [];\n\n let migrationCode;\n try {\n migrationCode = await composeMigration(\n adapter,\n config,\n ast,\n dbStructure,\n generateMigrationParams,\n );\n } catch (err) {\n if (err instanceof AbortSignal) {\n await closeAdapters(adapters);\n return;\n }\n throw err;\n }\n\n if (migrationCode && !afterPull) {\n const result = await verifyMigration(\n adapter,\n config,\n migrationCode,\n generateMigrationParams,\n rolesDbStructureParam,\n internal.roles ? { loadDefaultPrivileges: true } : undefined,\n );\n\n if (result !== undefined) {\n throw new Error(\n `Failed to verify generated migration: some of database changes were not applied properly. This is a bug, please open an issue, attach the following migration code:\\n${migrationCode}${\n result === false ? '' : `\\nAfter applying:\\n${result}`\n }`,\n );\n }\n }\n\n const { logger } = config;\n\n if ((!up || !migrationCode) && !afterPull) await closeAdapters(adapters);\n\n if (!migrationCode) {\n logger?.log('No changes were detected');\n return;\n }\n\n const version = afterPull?.version ?? (await makeFileVersion({}, config));\n\n const delayLog: string[] = [];\n await writeMigrationFile(\n {\n ...config,\n logger: logger ? { ...logger, log: (msg) => delayLog.push(msg) } : logger,\n },\n version,\n migrationName,\n migrationCode,\n );\n\n report(ast, config, currentSchema);\n\n if (logger) {\n for (const msg of delayLog) {\n logger.log(`\\n${msg}`);\n }\n }\n\n if (up) {\n for (const adapter of adapters) {\n await migrateAndClose(adapter, config);\n }\n } else if (!afterPull) {\n await closeAdapters(adapters);\n }\n};\n\nconst invalidConfig = (config: RakeDbConfig) =>\n new Error(\n `\\`${\n config.dbPath ? 'baseTable' : 'dbPath'\n }\\` setting must be set in the migrations config for the generator to work`,\n );\n\nconst getDbFromConfig = async (\n config: RakeDbConfig,\n dbPath: string,\n): Promise<DbInstance> => {\n const module = await config.import(\n pathToFileURL(path.resolve(config.basePath, dbPath)).toString(),\n );\n const db = (module as { [K: string]: DbInstance })[\n config.dbExportedAs ?? 'db'\n ];\n if (!db?.$qb) {\n throw new Error(\n `Unable to import OrchidORM instance as ${\n config.dbExportedAs ?? 'db'\n } from ${config.dbPath}`,\n );\n }\n return db;\n};\n\nconst migrateAndPullStructures = async (\n adapters: AdapterBase[],\n config: RakeDbConfig,\n roles?: { whereSql?: string },\n defaultPrivileges?: { loadDefaultPrivileges?: boolean },\n afterPull?: AfterPull,\n): Promise<{\n dbStructure: IntrospectedStructure;\n}> => {\n if (afterPull) {\n const version = await getDbVersion(adapters[0]);\n\n return {\n dbStructure: {\n version,\n schemas: [],\n tables: [],\n views: [],\n indexes: [],\n excludes: [],\n constraints: [],\n triggers: [],\n extensions: [],\n enums: [],\n domains: [],\n collations: [],\n },\n };\n }\n\n for (const adapter of adapters) {\n await migrate(adapter, config);\n }\n\n const dbStructures = await Promise.all(\n adapters.map((adapter) =>\n introspectDbSchema(adapter, {\n roles,\n loadDefaultPrivileges: defaultPrivileges?.loadDefaultPrivileges,\n }),\n ),\n );\n\n const dbStructure = dbStructures[0];\n for (let i = 1; i < dbStructures.length; i++) {\n compareDbStructures(dbStructure, dbStructures[i], i);\n }\n\n return { dbStructure };\n};\n\nconst compareDbStructures = (\n a: unknown,\n b: unknown,\n i: number,\n path?: string,\n) => {\n let err: true | undefined;\n if (typeof a !== typeof b) {\n err = true;\n }\n\n if (!a || typeof a !== 'object') {\n if (a !== b) {\n err = true;\n }\n } else {\n if (Array.isArray(a)) {\n for (let n = 0, len = a.length; n < len; n++) {\n compareDbStructures(\n a[n],\n (b as unknown[])[n],\n i,\n path ? `${path}[${n}]` : String(n),\n );\n }\n } else {\n for (const key in a) {\n compareDbStructures(\n a[key as keyof typeof a],\n (b as Record<string, unknown>)[key],\n i,\n path ? `${path}.${key}` : key,\n );\n }\n }\n }\n\n if (err) {\n throw new Error(`${path} in the db 0 does not match db ${i}`);\n }\n};\n\nconst getActualItems = async (\n db: DbInstance,\n currentSchema: string,\n internal: QueryInternal,\n columnTypes: unknown,\n): Promise<CodeItems> => {\n const tableNames = new Set<string>();\n const habtmTables = new Map<string, CodeTable>();\n\n const codeItems: CodeItems = {\n schemas: new Set(undefined),\n enums: new Map(),\n tables: [],\n domains: [],\n };\n\n codeItems.schemas.add(currentSchema);\n\n const domains = new Map<string, CodeDomain>();\n\n for (const key in db) {\n if (key[0] === '$') continue;\n\n const table = db[key as keyof typeof db] as Query;\n\n if (!table.table) {\n throw new Error(`Table ${key} is missing table property`);\n }\n\n const schema = getQuerySchema(table);\n const name = concatSchemaAndName({ schema, name: table.table });\n if (tableNames.has(name)) {\n throw new Error(`Table ${name} is defined more than once`);\n }\n\n tableNames.add(name);\n\n if (schema) codeItems.schemas.add(schema);\n\n codeItems.tables.push({\n table: table.table as string,\n shape: table.shape,\n internal: table.internal,\n q: {\n schema: getQuerySchema(table),\n },\n });\n\n for (const key in table.relations) {\n const column = table.shape[key];\n // column won't be set for has and belongs to many\n if (column && 'joinTable' in column) {\n processHasAndBelongsToManyColumn(column, habtmTables, codeItems);\n }\n }\n\n for (const key in table.shape) {\n const column = table.shape[key] as Column;\n // remove computed columns from the shape\n if (column.data.computed) {\n delete table.shape[key];\n } else if (column instanceof DomainColumn) {\n const [schemaName = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n column.dataType,\n );\n domains.set(column.dataType, {\n schemaName,\n name,\n column: (column.data.as ??\n new UnknownColumn(defaultSchemaConfig)) as Column,\n });\n } else {\n const en =\n column.dataType === 'enum'\n ? column\n : column instanceof ArrayColumn &&\n column.data.item.dataType === 'enum'\n ? column.data.item\n : undefined;\n\n if (en) {\n processEnumColumn(en, currentSchema, codeItems);\n }\n }\n }\n }\n\n if (internal.extensions) {\n for (const extension of internal.extensions) {\n const [schema] = getSchemaAndTableFromName(currentSchema, extension.name);\n if (schema) codeItems.schemas.add(schema);\n }\n }\n\n if (internal.domains) {\n for (const key in internal.domains) {\n const [schemaName = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n key,\n );\n const column = internal.domains[key](columnTypes);\n\n domains.set(key, {\n schemaName,\n name,\n column,\n });\n }\n }\n\n for (const domain of domains.values()) {\n codeItems.schemas.add(domain.schemaName);\n codeItems.domains.push(domain);\n }\n\n // Add schemas from role default privileges to prevent them from being dropped\n if (internal.roles) {\n for (const role of internal.roles) {\n if (role.defaultPrivileges) {\n for (const privilege of role.defaultPrivileges) {\n if (privilege.schema) codeItems.schemas.add(privilege.schema);\n }\n }\n }\n }\n\n return codeItems;\n};\n\nconst processEnumColumn = (\n column: Column.Pick.QueryColumn,\n currentSchema: string,\n codeItems: CodeItems,\n) => {\n const { enumName, options } = column as unknown as {\n enumName: string;\n options: [string, ...string[]];\n };\n\n const [schema, name] = getSchemaAndTableFromName(currentSchema, enumName);\n const enumSchema = schema ?? currentSchema;\n\n codeItems.enums.set(`${enumSchema}.${name}`, {\n schema: enumSchema,\n name,\n values: options,\n });\n if (schema) codeItems.schemas.add(schema);\n};\n\nconst processHasAndBelongsToManyColumn = (\n column: Column.Pick.QueryColumn & { joinTable: unknown },\n habtmTables: Map<string, CodeTable>,\n codeItems: CodeItems,\n) => {\n const q = (column as { joinTable: CodeTable }).joinTable;\n const prev = habtmTables.get(q.table);\n if (prev) {\n for (const key in q.shape) {\n if (q.shape[key].dataType !== prev.shape[key]?.dataType) {\n throw new Error(\n `Column ${key} in ${q.table} in hasAndBelongsToMany relation does not match with the relation on the other side`,\n );\n }\n }\n return;\n }\n habtmTables.set(q.table, q);\n\n const joinTable = Object.create(q);\n\n const shape: ColumnsShape = {};\n for (const key in joinTable.shape) {\n const column = Object.create(joinTable.shape[key]);\n column.data = {\n ...column.data,\n name: column.data.name ?? key,\n identity: undefined,\n primaryKey: undefined,\n default: undefined,\n };\n shape[toCamelCase(key)] = column;\n }\n joinTable.shape = shape;\n joinTable.internal = {\n ...joinTable.internal,\n tableData: {\n ...joinTable.internal.tableData,\n primaryKey: {\n columns: Object.keys(shape),\n },\n },\n noPrimaryKey: false,\n };\n\n codeItems.tables.push(joinTable);\n\n return;\n};\n\nconst closeAdapters = (adapters: AdapterBase[]) => {\n return Promise.all(adapters.map((x) => x.close()));\n};\n","import {\n columnsShapeToCode,\n pushTableDataCode,\n TableData,\n Code,\n codeToString,\n getImportPath,\n RecordString,\n singleQuote,\n toCamelCase,\n toPascalCase,\n} from 'pqb/internal';\nimport { RakeDbAst, RakeDbConfig } from 'rake-db';\nimport path from 'node:path';\n\ninterface TableInfo {\n key: string;\n dbTableName: string;\n name: string;\n className: string;\n path: string;\n}\n\ninterface TableInfos {\n [dbTableName: string]: TableInfo;\n}\n\nexport interface AppCodeGenTable extends TableInfo {\n content: string;\n}\n\nexport interface AppCodeGenTables {\n [K: string]: AppCodeGenTable;\n}\n\ninterface FKeys {\n [K: string]: { table: TableInfo; references: TableData.References }[];\n}\n\nexport const getTableInfosAndFKeys = (\n asts: RakeDbAst[],\n config: RakeDbConfig,\n): { tableInfos: TableInfos; fkeys: FKeys } => {\n const generateTableTo =\n config.generateTableTo ?? ((name: string) => `./tables/${name}.table.ts`);\n\n const tableInfos: TableInfos = {};\n const fkeys: FKeys = {};\n for (const ast of asts) {\n if (ast.type === 'table') {\n const tableKey = toCamelCase(ast.name);\n const dbTableName = ast.schema ? `${ast.schema}.${ast.name}` : ast.name;\n let tablePath = path.resolve(config.basePath, generateTableTo(tableKey));\n if (!tablePath.endsWith('.ts')) tablePath += '.ts';\n\n const name = toPascalCase(ast.name);\n\n const info: TableInfo = {\n dbTableName,\n key: tableKey,\n path: tablePath,\n name,\n className: `${name}Table`,\n };\n\n tableInfos[dbTableName] = info;\n\n if (ast.constraints) {\n for (const { references } of ast.constraints) {\n if (!references) continue;\n\n (fkeys[references.fnOrTable as string] ??= []).push({\n table: info,\n references,\n });\n }\n }\n }\n }\n\n return { tableInfos, fkeys };\n};\n\nexport const appCodeGenTable = (\n tableInfos: TableInfos,\n fkeys: FKeys,\n ast: RakeDbAst.Table,\n baseTablePath: string,\n baseTableExportedAs: string,\n currentSchema: string,\n): AppCodeGenTable => {\n const tableInfo =\n tableInfos[ast.schema ? `${ast.schema}.${ast.name}` : ast.name];\n\n const imports: RecordString = {\n 'orchid-orm': 'Selectable, Insertable, Updatable',\n [getImportPath(tableInfo.path, baseTablePath)]: baseTableExportedAs,\n };\n\n const props: Code[] = [];\n\n if (ast.schema) {\n props.push(`schema = ${singleQuote(ast.schema)};`);\n }\n\n props.push(`readonly table = ${singleQuote(ast.name)};`);\n\n if (ast.comment) {\n props.push(`comment = ${singleQuote(ast.comment)};`);\n }\n\n if (ast.noPrimaryKey === 'ignore') {\n props.push('noPrimaryKey = true;');\n }\n\n const hasTableData = Boolean(\n ast.primaryKey ||\n ast.indexes?.length ||\n ast.excludes?.length ||\n ast.constraints?.length,\n );\n\n const shapeCode = columnsShapeToCode(\n { t: 't', table: ast.name, currentSchema },\n ast.shape,\n );\n\n props.push(\n `columns = this.setColumns(${hasTableData ? '\\n ' : ''}(t) => ({`,\n hasTableData ? [shapeCode] : shapeCode,\n hasTableData ? ' }),' : '}));',\n );\n\n if (hasTableData) {\n props.push(pushTableDataCode([], ast), ');');\n }\n\n const relations: Code[] = [];\n\n const fullTableName = ast.schema ? `${ast.schema}.${ast.name}` : ast.name;\n const belongsTo = fkeys[fullTableName];\n if (belongsTo) {\n for (const { table, references } of belongsTo) {\n imports[getImportPath(tableInfo.path, table.path)] = table.className;\n\n relations.push(\n `${table.key}: this.belongsTo(() => ${table.className}, {`,\n [\n `columns: [${references.foreignColumns\n .map(singleQuote)\n .join(', ')}],`,\n `references: [${references.columns.map(singleQuote).join(', ')}],`,\n ],\n '}),',\n );\n }\n }\n\n if (ast.constraints) {\n for (const { references } of ast.constraints) {\n if (!references) continue;\n\n const table = tableInfos[references.fnOrTable as string];\n imports[getImportPath(tableInfo.path, table.path)] = table.className;\n\n relations.push(\n `${table.key}: this.hasMany(() => ${table.className}, {`,\n [\n `columns: [${references.columns.map(singleQuote).join(', ')}],`,\n `references: [${references.foreignColumns\n .map(singleQuote)\n .join(', ')}],`,\n ],\n '}),',\n );\n }\n }\n\n if (relations.length) {\n props.push('', 'relations = {', relations, '};');\n }\n\n const importsCode = importsToCode(imports);\n\n const { name, className } = tableInfo;\n const code: Code[] = [\n `export type ${name} = Selectable<${className}>;\nexport type ${name}New = Insertable<${className}>;\nexport type ${name}Update = Updatable<${className}>;\n\nexport class ${className} extends ${baseTableExportedAs} {`,\n props,\n '}\\n',\n ];\n\n return {\n ...tableInfo,\n content: importsCode + '\\n\\n' + codeToString(code, '', ' '),\n };\n};\n\nfunction importsToCode(imports: Record<string, string>): string {\n return Object.entries(imports)\n .map(([from, name]) => `import { ${name} } from '${from}';`)\n .join('\\n');\n}\n","import fs from 'fs/promises';\nimport {\n CallExpression,\n Expression,\n ImportDeclaration,\n NamedImports,\n NodeArray,\n ObjectLiteralExpression,\n Statement,\n VariableStatement,\n} from 'typescript';\nimport { AppCodeGenTables } from './tables.appCodeGenerator';\nimport {\n DbExtension,\n getImportPath,\n quoteObjectKey,\n singleQuote,\n} from 'pqb/internal';\nimport { RakeDbAst } from 'rake-db';\n\n// importing directly won't work after compiling\nimport typescript from 'typescript';\nconst { createSourceFile, ScriptTarget, SyntaxKind } = typescript;\n\ntype Change = [from: number, to: number] | string;\n\nexport const appCodeGenUpdateDbFile = async (\n dbPath: string,\n tables: AppCodeGenTables,\n extensions: DbExtension[],\n domains: RakeDbAst.Domain[],\n currentSchema: string,\n): Promise<string | undefined> => {\n const content = await fs.readFile(dbPath, 'utf-8');\n const statements = getTsStatements(content);\n const importName = getOrchidOrmImportName(statements);\n if (!importName) {\n throw new Error(`Main file does not contain import of orchid-orm`);\n }\n const { config, tablesList } = getOrchidOrmArgs(importName, statements);\n\n const changes: Change[] = [];\n\n let replacedConfig: string | undefined;\n if (extensions.length || domains.length) {\n let code = content.slice(config.pos, config.end).trim();\n\n if (code[0] !== '{') code = `{...${code}}`;\n\n code = '{\\n ' + code.slice(1, -1).trim();\n\n if (!code.endsWith(',')) code += ',';\n\n if (extensions.length) {\n code += `\\n extensions: [${extensions\n .map((ext) =>\n ext.version\n ? `{ ${quoteObjectKey(ext.name, false)}: '${ext.version}' }`\n : singleQuote(ext.name),\n )\n .join(', ')}],`;\n }\n\n if (domains.length) {\n code += `\\n domains: {\\n ${domains\n .sort((a, b) => (a.name > b.name ? 1 : -1))\n .map(\n (ast) =>\n `${quoteObjectKey(\n ast.schema ? `${ast.schema}.${ast.name}` : ast.name,\n false,\n )}: (t) => ${ast.baseType.toCode(\n { t: 't', table: ast.name, currentSchema },\n ast.baseType.data.name ?? '',\n )},`,\n )\n .join('\\n ')}\\n },`;\n }\n\n replacedConfig = code + '\\n}';\n }\n\n const tablesChanges = makeTablesListChanges(\n content,\n statements,\n tablesList,\n tables,\n dbPath,\n );\n\n if (tablesChanges) {\n addChange(\n content,\n changes,\n tablesChanges.imports.pos,\n tablesChanges.imports.text,\n );\n }\n\n if (replacedConfig) {\n replaceContent(content, changes, config.pos, config.end, replacedConfig);\n }\n\n if (tablesChanges) {\n addChange(\n content,\n changes,\n tablesChanges.tablesList.pos,\n tablesChanges.tablesList.text,\n );\n }\n\n return applyChanges(content, changes);\n};\n\nconst getTsStatements = (content: string): NodeArray<Statement> => {\n return createSourceFile('file.ts', content, ScriptTarget.Latest, true)\n .statements;\n};\n\nconst getOrchidOrmImportName = (\n statements: NodeArray<Statement>,\n): string | undefined => {\n for (const node of statements) {\n if (node.kind !== SyntaxKind.ImportDeclaration) continue;\n\n const imp = node as ImportDeclaration;\n const source = imp.moduleSpecifier.getText().slice(1, -1);\n if (source !== 'orchid-orm') continue;\n\n if (!imp.importClause) continue;\n\n const elements = (imp.importClause.namedBindings as NamedImports)?.elements;\n\n if (!elements) imp;\n\n for (const element of elements) {\n if (\n element.name.escapedText === 'orchidORM' ||\n (element.propertyName &&\n 'escapedText' in element.propertyName &&\n element.propertyName.escapedText === 'orchidORM')\n ) {\n return element.name.escapedText.toString();\n }\n }\n }\n\n return;\n};\n\nconst makeTablesListChanges = (\n content: string,\n statements: NodeArray<Statement>,\n object: ObjectLiteralExpression,\n tables: AppCodeGenTables,\n dbPath: string,\n) => {\n const spaces = getTablesListSpaces(content, object);\n\n let imports = '';\n let tablesList = '';\n const prependComma =\n object.properties.length && !object.properties.hasTrailingComma;\n const tablesListNewLine = content\n .slice(object.properties.end, object.end)\n .includes('\\n');\n\n const tablesArr = Object.values(tables);\n for (let i = 0; i < tablesArr.length; i++) {\n const { path, className, key } = tablesArr[i];\n const importPath = getImportPath(dbPath, path);\n\n imports += `\\nimport { ${className} } from '${importPath}';`;\n\n tablesList += `${\n i === 0 && prependComma ? ',' : ''\n }\\n${spaces} ${key}: ${className},`;\n\n if (i === tablesArr.length - 1 && !tablesListNewLine) {\n tablesList += `\\n${spaces}`;\n }\n }\n\n if (!imports.length) return;\n\n let importPos = 0;\n for (const node of statements) {\n if (node.kind === SyntaxKind.ImportDeclaration) {\n importPos = node.end;\n }\n }\n\n return {\n imports: { pos: importPos, text: imports },\n tablesList: { pos: object.properties.end, text: tablesList },\n };\n};\n\nconst getTablesListSpaces = (content: string, object: Expression): string => {\n const lines = content.slice(0, object.end).split('\\n');\n const last = lines[lines.length - 1];\n return last.match(/^\\s+/)?.[0] || '';\n};\n\nconst getOrchidOrmArgs = (\n importName: string,\n statements: NodeArray<Statement>,\n): { config: Expression; tablesList: ObjectLiteralExpression } => {\n for (const v of statements) {\n if (v.kind !== SyntaxKind.VariableStatement) continue;\n\n for (const node of (v as VariableStatement).declarationList.declarations) {\n const call = node.initializer as CallExpression;\n if (call?.kind !== SyntaxKind.CallExpression) continue;\n\n if (call.expression.getText() !== importName) continue;\n\n if (call.arguments.length !== 2) {\n throw new Error(\n 'Invalid number of arguments when initializing orchid orm',\n );\n }\n\n const object = call.arguments[1] as ObjectLiteralExpression;\n if (object?.kind !== SyntaxKind.ObjectLiteralExpression) {\n throw new Error(\n 'Second argument of orchidORM must be an object literal',\n );\n }\n\n return { config: call.arguments[0], tablesList: object };\n }\n }\n\n throw new Error('List of tables is not found in main file');\n};\n\nconst addChange = (\n content: string,\n changes: Change[],\n at: number,\n text: string,\n end = at,\n) => {\n if (changes.length === 0) {\n changes.push([0, at], text, [end, content.length]);\n } else {\n const last = changes[changes.length - 1] as [number, number];\n last[1] = at;\n changes.push(text, [end, content.length]);\n }\n};\n\nconst replaceContent = (\n content: string,\n changes: Change[],\n from: number,\n to: number,\n text: string,\n) => {\n addChange(content, changes, from, text, to);\n};\n\nconst applyChanges = (content: string, changes: Change[]) => {\n return changes.length\n ? changes\n .map((item) =>\n typeof item === 'string' ? item : content.slice(item[0], item[1]),\n )\n .join('')\n : content;\n};\n","import { DbExtension, AdapterBase, pathToLog } from 'pqb/internal';\nimport {\n makeFileVersion,\n makeStructureToAstCtx,\n RakeDbAst,\n RakeDbConfig,\n saveMigratedVersion,\n SilentQueries,\n structureToAst,\n} from 'rake-db';\nimport fs from 'fs/promises';\nimport path from 'node:path';\nimport {\n AppCodeGenTable,\n appCodeGenTable,\n AppCodeGenTables,\n getTableInfosAndFKeys,\n} from './appCodeGenerators/tables.appCodeGenerator';\nimport { appCodeGenUpdateDbFile } from './appCodeGenerators/dbFile.appCodeGenerator';\nimport { generate } from '../generate/generate';\n\nexport const pull = async (adapters: AdapterBase[], config: RakeDbConfig) => {\n if (!config.dbPath || !config.baseTable) {\n throw new Error(\n `\\`${\n config.dbPath ? 'baseTable' : 'dbPath'\n }\\` setting must be set in the migrations config for pull command`,\n );\n }\n\n const baseTablePath = config.baseTable.getFilePath();\n const baseTableExportedAs = config.baseTable.exportAs;\n\n const [adapter] = adapters;\n const adapterSchema = adapter.getSchema();\n const currentSchema =\n (typeof adapterSchema === 'function' ? adapterSchema() : adapterSchema) ??\n 'public';\n\n const ctx = makeStructureToAstCtx(config, currentSchema);\n\n const asts = await structureToAst(ctx, adapter, config);\n\n const { tableInfos, fkeys } = getTableInfosAndFKeys(asts, config);\n\n const exclusiveWriteOptions = { flag: 'wx' as const };\n const pendingFileWrites: [\n path: string,\n content: string,\n options?: { flag: 'wx' },\n ][] = [];\n\n const tables: AppCodeGenTables = {};\n const extensions: DbExtension[] = [];\n const domains: RakeDbAst.Domain[] = [];\n\n let firstTable: undefined | AppCodeGenTable;\n for (const ast of asts) {\n switch (ast.type) {\n case 'table': {\n const table = appCodeGenTable(\n tableInfos,\n fkeys,\n ast,\n baseTablePath,\n baseTableExportedAs,\n currentSchema,\n );\n tables[table.key] = table;\n if (!firstTable) firstTable = table;\n pendingFileWrites.push([\n table.path,\n table.content,\n exclusiveWriteOptions,\n ]);\n break;\n }\n case 'extension': {\n extensions.push({\n name: ast.schema ? `${ast.schema}.${ast.name}` : ast.name,\n version: ast.version,\n });\n break;\n }\n case 'domain': {\n domains.push(ast);\n break;\n }\n }\n }\n\n if (!firstTable && !extensions.length && !domains.length) {\n await adapter.close();\n return;\n }\n\n let dbPath = path.resolve(config.basePath, config.dbPath);\n if (!dbPath.endsWith('.ts')) dbPath += '.ts';\n const content = await appCodeGenUpdateDbFile(\n dbPath,\n tables,\n extensions,\n domains,\n currentSchema,\n );\n if (content) pendingFileWrites.push([dbPath, content]);\n\n if (firstTable) {\n await fs.mkdir(path.dirname(firstTable.path), { recursive: true });\n }\n\n await Promise.all(\n pendingFileWrites.map(([path, content, options]) =>\n fs.writeFile(path, content, options).then(() => {\n config.logger?.log(`Created ${pathToLog(path)}`);\n }),\n ),\n );\n\n const version = await makeFileVersion({}, config);\n await generate(adapters, config, ['pull'], { adapter, version });\n\n // save migrated version into all configured databases\n await Promise.all(\n adapters.map(async (adapter) => {\n const silentAdapter = adapter as unknown as SilentQueries;\n silentAdapter.silentArrays = adapter.arrays;\n await saveMigratedVersion(silentAdapter, version, 'pull.ts', config);\n await adapter.close();\n }),\n );\n};\n","import { rakeDbCommands } from 'rake-db';\nimport { generate } from './generate/generate';\nimport { pull } from './pull/pull';\nimport { ColumnSchemaConfig } from 'pqb/internal';\n\nrakeDbCommands.g = rakeDbCommands.generate = {\n run: generate,\n help: 'gen migration from OrchidORM tables',\n helpArguments: {\n 'no arguments': '\"generated\" is a default file name',\n 'migration-name': 'set migration file name',\n up: 'auto-apply migration',\n 'migration-name up': 'with a custom name and apply it',\n },\n helpAfter: 'reset',\n};\n\nrakeDbCommands.pull.run = pull;\nrakeDbCommands.pull.help =\n 'generate ORM tables and a migration for an existing database';\n\ndeclare module 'rake-db' {\n export interface RakeDbConfig {\n dbPath?: string;\n dbExportedAs?: string;\n generateTableTo?(tableName: string): string;\n }\n\n export interface RakeDbCliConfigInputBase<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n SchemaConfig extends ColumnSchemaConfig,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n CT,\n > {\n dbPath?: string;\n dbExportedAs?: string;\n generateTableTo?(tableName: string): string;\n }\n}\n"],"names":["name","item","column","key","type","codeEnum","i","codeTable","codeRole","changes","code","config","adapter","path","content"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["patchRakeDb","patch"],"sources":["../../src/migrations/generate/generators/generators.utils.ts","../../src/migrations/generate/generators/schemas.generator.ts","../../src/migrations/generate/generators/extensions.generator.ts","../../src/migrations/generate/generators/columns.generator.ts","../../src/migrations/generate/generators/domains.generator.ts","../../src/migrations/generate/generators/enums.generator.ts","../../src/migrations/generate/generators/primaryKey.generator.ts","../../src/migrations/generate/generators/indexesAndExcludes.generator.ts","../../src/migrations/generate/generators/foreignKeys.generator.ts","../../src/migrations/generate/generators/checks.generator.ts","../../src/migrations/generate/generators/tables.generator.ts","../../src/migrations/generate/generators/roles.generator.ts","../../src/migrations/generate/generators/default-privilege.generator.ts","../../src/migrations/generate/composeMigration.ts","../../src/migrations/generate/verify-migration.ts","../../src/migrations/generate/reportGeneratedMigration.ts","../../src/migrations/generate/generate.ts","../../src/migrations/pull/appCodeGenerators/tables.appCodeGenerator.ts","../../src/migrations/pull/appCodeGenerators/dbFile.appCodeGenerator.ts","../../src/migrations/pull/pull.ts","../../src/migrations/patch-rake-db.ts","../../src/migrations/index.ts"],"sourcesContent":["import { RakeDbAst, promptSelect } from 'rake-db';\nimport { RawSqlBase, QueryResult, Adapter, colors } from 'pqb/internal';\nimport { AbortSignal } from '../generate';\n\nexport interface CompareExpression {\n compare: {\n inDb: string;\n inCode: (string | RawSqlBase)[];\n }[];\n\n handle(i?: number): void;\n}\n\nexport interface TableExpression extends CompareExpression {\n source: string;\n}\n\nexport const compareSqlExpressions = async (\n tableExpressions: TableExpression[],\n adapter: Adapter,\n) => {\n if (!tableExpressions.length) return;\n\n let id = 1;\n for (const { source, compare, handle } of tableExpressions) {\n const viewName = `orchidTmpView${id++}`;\n const values: unknown[] = [];\n\n // It is important to run `CREATE TEMPORARY VIEW` and `DROP VIEW` on the same db connection,\n // that's why SQLs are combined into a single query.\n const combinedQueries = [\n `CREATE TEMPORARY VIEW ${viewName} AS (SELECT ${compare\n .map(\n ({ inDb, inCode }, i): string =>\n `${inDb} AS \"*inDb-${i}*\", ${inCode\n .map(\n (s, j) =>\n `(${\n typeof s === 'string' ? s : s.toSQL({ values })\n }) \"*inCode-${i}-${j}*\"`,\n )\n .join(', ')}`,\n )\n .join(', ')} FROM ${source})`,\n `SELECT pg_get_viewdef('${viewName}') v`,\n `DROP VIEW ${viewName}`,\n ].join('; ');\n\n const result = await adapter.query(combinedQueries, values, viewName).then(\n (res) => (res as unknown as QueryResult[])[1],\n async (err) => {\n // ignore the \"type ... does not exist\" because the type may be added in the same migration,\n // but throw on other errors\n if (err.code !== '42704') {\n throw err;\n }\n },\n );\n\n if (!result) {\n handle();\n return;\n }\n\n const match = compareSqlExpressionResult(\n result.rows[0].v,\n compare[0].inCode,\n );\n handle(match);\n }\n};\n\nexport const compareSqlExpressionResult = (\n resultSql: string,\n inCode: unknown[],\n) => {\n let pos = 7;\n const rgx = /\\s+AS\\s+\"\\*(inDb-\\d+|inCode-\\d+-\\d+)\\*\",?/g;\n let match;\n let inDb = '';\n let codeI = 0;\n const matches = inCode.map(() => true);\n while ((match = rgx.exec(resultSql))) {\n const sql = resultSql.slice(pos, rgx.lastIndex - match[0].length).trim();\n const arr = match[1].split('-');\n if (arr.length === 2) {\n inDb = sql;\n codeI = 0;\n } else {\n if (\n inDb !== sql &&\n // Comparing `(sql) = sql` and `sql = (sql)` below.\n // Could not reproduce this case in integration tests, but it was reported in #494.\n !(\n inDb.startsWith('(') &&\n inDb.endsWith(')') &&\n inDb.slice(1, -1) === sql\n ) &&\n !(sql.startsWith('(') && sql.endsWith(')') && sql.slice(1, -1) === inDb)\n ) {\n matches[codeI] = false;\n }\n codeI++;\n }\n pos = rgx.lastIndex;\n }\n\n const firstMatching = matches.indexOf(true);\n return firstMatching === -1 ? undefined : firstMatching;\n};\n\nexport const promptCreateOrRename = (\n kind: string,\n name: string,\n drop: string[],\n verifying: boolean | undefined,\n): Promise<number> => {\n if (verifying) throw new AbortSignal();\n\n let hintPos = name.length + 4;\n for (const from of drop) {\n const value = from.length + 8 + name.length;\n if (value > hintPos) hintPos = value;\n }\n\n let max = 0;\n const add = name.length + 3;\n for (const name of drop) {\n if (name.length + add > max) {\n max = name.length + add;\n }\n }\n\n const renameMessage = `rename ${kind}`;\n\n return promptSelect({\n message: `Create or rename ${colors.blueBold(\n name,\n )} ${kind} from another ${kind}?`,\n options: [\n `${colors.greenBold('+')} ${name} ${colors.pale(\n `create ${kind}`.padStart(\n hintPos + renameMessage.length - name.length - 4,\n ' ',\n ),\n )}`,\n ...drop.map(\n (d) =>\n `${colors.yellowBold('~')} ${d} ${colors.yellowBold(\n '=>',\n )} ${name} ${colors.pale(\n renameMessage.padStart(\n hintPos + renameMessage.length - d.length - name.length - 8,\n ' ',\n ),\n )}`,\n ),\n ],\n });\n};\n\nexport const checkForColumnAddOrDrop = (\n shape: RakeDbAst.ChangeTableShape,\n key: string,\n) => {\n const item = shape[key];\n if (item) {\n return (\n item &&\n (Array.isArray(item) || item.type === 'add' || item.type === 'drop')\n );\n }\n\n for (const k in shape) {\n const item = shape[k];\n if (\n Array.isArray(item)\n ? item.some(\n (item) =>\n (item.type === 'add' || item.type === 'drop') &&\n item.item.data.name === key,\n )\n : (item.type === 'add' || item.type === 'drop') &&\n item.item.data.name === key\n ) {\n return true;\n }\n }\n\n return false;\n};\n","import { RakeDbAst, IntrospectedStructure } from 'rake-db';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ComposeMigrationParams } from '../composeMigration';\n\nexport const processSchemas = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n codeItems: { schemas },\n verifying,\n internal: { generatorIgnore },\n currentSchema,\n }: ComposeMigrationParams,\n): Promise<void> => {\n const createSchemas: string[] = [];\n const dropSchemas: string[] = [];\n\n for (const schema of schemas) {\n if (!dbStructure.schemas.includes(schema)) {\n createSchemas.push(schema);\n }\n }\n\n for (const schema of dbStructure.schemas) {\n if (\n !schemas.has(schema) &&\n schema !== 'public' &&\n schema !== currentSchema &&\n !generatorIgnore?.schemas?.includes(schema)\n ) {\n dropSchemas.push(schema);\n }\n }\n\n for (const schema of createSchemas) {\n if (dropSchemas.length) {\n const i = await promptCreateOrRename(\n 'schema',\n schema,\n dropSchemas,\n verifying,\n );\n if (i) {\n const from = dropSchemas[i - 1];\n dropSchemas.splice(i - 1, 1);\n\n renameSchemaInStructures(dbStructure.tables, from, schema);\n renameSchemaInStructures(dbStructure.views, from, schema);\n renameSchemaInStructures(dbStructure.indexes, from, schema);\n renameSchemaInStructures(dbStructure.excludes, from, schema);\n renameSchemaInStructures(dbStructure.constraints, from, schema);\n renameSchemaInStructures(dbStructure.triggers, from, schema);\n renameSchemaInStructures(dbStructure.enums, from, schema);\n renameSchemaInStructures(dbStructure.domains, from, schema);\n renameSchemaInStructures(dbStructure.collations, from, schema);\n\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.typeSchema === from) {\n column.typeSchema = schema;\n }\n }\n }\n\n ast.push({\n type: 'renameSchema',\n from,\n to: schema,\n });\n continue;\n }\n }\n\n ast.push({\n type: 'schema',\n action: 'create',\n name: schema,\n });\n }\n\n for (const schema of dropSchemas) {\n ast.push({\n type: 'schema',\n action: 'drop',\n name: schema,\n });\n }\n};\n\nconst renameSchemaInStructures = (\n items: { schemaName: string }[],\n from: string,\n to: string,\n) => {\n for (const item of items) {\n if (item.schemaName === from) {\n item.schemaName = to;\n }\n }\n};\n","import {\n RakeDbAst,\n IntrospectedStructure,\n getSchemaAndTableFromName,\n} from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\n\ninterface Extension {\n schema?: string;\n name: string;\n version?: string;\n}\n\nexport const processExtensions = (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n currentSchema,\n internal: { extensions, generatorIgnore },\n }: ComposeMigrationParams,\n) => {\n const codeExtensions = extensions?.map((ext): Extension => {\n const [schema, name] = getSchemaAndTableFromName(currentSchema, ext.name);\n return { schema, name, version: ext.version };\n });\n\n for (const dbExt of dbStructure.extensions) {\n if (\n generatorIgnore?.schemas?.includes(dbExt.schemaName) ||\n generatorIgnore?.extensions?.includes(dbExt.name)\n ) {\n continue;\n }\n\n if (codeExtensions) {\n let found = false;\n for (let i = 0; i < codeExtensions.length; i++) {\n const codeExt = codeExtensions[i];\n if (\n dbExt.name === codeExt.name &&\n dbExt.schemaName === (codeExt.schema ?? currentSchema) &&\n (!codeExt.version || codeExt.version === dbExt.version)\n ) {\n found = true;\n codeExtensions.splice(i, 1);\n break;\n }\n }\n\n if (found) continue;\n }\n\n ast.push({\n type: 'extension',\n action: 'drop',\n schema: dbExt.schemaName === currentSchema ? undefined : dbExt.schemaName,\n name: dbExt.name,\n version: dbExt.version,\n });\n }\n\n if (codeExtensions?.length) {\n ast.push(\n ...codeExtensions.map((ext) => ({\n type: 'extension' as const,\n action: 'create' as const,\n ...ext,\n })),\n );\n }\n};\n","import {\n RakeDbAst,\n dbColumnToAst,\n getDbTableColumnsChecks,\n instantiateDbColumn,\n StructureToAstCtx,\n DbStructure,\n IntrospectedStructure,\n encodeColumnDefault,\n concatSchemaAndName,\n getSchemaAndTableFromName,\n promptSelect,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport {\n ArrayColumn,\n DbStructureDomainsMap,\n EnumColumn,\n getColumnBaseType,\n deepCompare,\n RecordUnknown,\n toSnakeCase,\n Adapter,\n colors,\n} from 'pqb/internal';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ChangeTableData, CompareSql } from './tables.generator';\nimport { AbortSignal } from '../generate';\n\nexport interface TypeCastsCache {\n value?: Map<string, Set<string>>;\n}\n\ntype ColumnsToChange = Map<\n string,\n { key: string; dbName: string; column: Column }\n>;\n\nexport const processColumns = async (\n adapter: Adapter,\n config: RakeDbConfig,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n changeTableData: ChangeTableData,\n ast: RakeDbAst[],\n currentSchema: string,\n compareSql: CompareSql,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n const { dbTable } = changeTableData;\n const dbColumns = Object.fromEntries(\n dbTable.columns.map((column) => [column.name, column]),\n );\n\n const { columnsToAdd, columnsToDrop, columnsToChange } = groupColumns(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbColumns,\n changeTableData,\n );\n\n await addOrRenameColumns(\n config,\n dbStructure,\n changeTableData,\n columnsToAdd,\n columnsToDrop,\n columnsToChange,\n verifying,\n );\n\n await changeColumns(\n adapter,\n config,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n dbColumns,\n columnsToChange,\n compareSql,\n changeTableData,\n typeCastsCache,\n verifying,\n );\n\n dropColumns(changeTableData, columnsToDrop);\n};\n\ntype KeyAndColumn = { key: string; column: Column };\n\nconst groupColumns = (\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n dbColumns: { [K: string]: DbStructure.Column },\n changeTableData: ChangeTableData,\n): {\n columnsToAdd: KeyAndColumn[];\n columnsToDrop: KeyAndColumn[];\n columnsToChange: ColumnsToChange;\n} => {\n const columnsToAdd: { key: string; column: Column }[] = [];\n const columnsToDrop: { key: string; column: Column }[] = [];\n const columnsToChange: ColumnsToChange = new Map();\n const columnsToChangeByDbName = new Map<string, true>();\n\n const { codeTable, dbTable, dbTableData } = changeTableData;\n const checks = getDbTableColumnsChecks(changeTableData.dbTableData);\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n // skip virtual columns\n if (!column.dataType) continue;\n\n const name = column.data.name ?? key;\n if (dbColumns[name]) {\n columnsToChange.set(key, { key, dbName: name, column });\n columnsToChangeByDbName.set(name, true);\n } else {\n columnsToAdd.push({ key, column });\n }\n }\n\n for (const name in dbColumns) {\n if (columnsToChangeByDbName.has(name)) continue;\n\n const [key, column] = dbColumnToAst(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbTable.name,\n dbColumns[name],\n dbTable,\n dbTableData,\n checks,\n );\n\n columnsToDrop.push({ key, column });\n }\n\n return {\n columnsToAdd,\n columnsToDrop,\n columnsToChange,\n };\n};\n\nconst addOrRenameColumns = async (\n config: RakeDbConfig,\n dbStructure: IntrospectedStructure,\n {\n dbTableData,\n schema,\n changeTableAst: { name: tableName, shape },\n }: ChangeTableData,\n columnsToAdd: KeyAndColumn[],\n columnsToDrop: KeyAndColumn[],\n columnsToChange: ColumnsToChange,\n verifying: boolean | undefined,\n) => {\n for (const { key, column } of columnsToAdd) {\n if (columnsToDrop.length) {\n const codeName = column.data.name ?? key;\n const i = await promptCreateOrRename(\n 'column',\n codeName,\n columnsToDrop.map((x) => x.key),\n verifying,\n );\n if (i) {\n const drop = columnsToDrop[i - 1];\n columnsToDrop.splice(i - 1, 1);\n\n const from = drop.column.data.name ?? drop.key;\n columnsToChange.set(from, {\n key,\n dbName: from,\n column: column.name(codeName),\n });\n\n const to = config.snakeCase ? toSnakeCase(key) : key;\n\n if (dbTableData.primaryKey) {\n renameColumn(dbTableData.primaryKey.columns, from, to);\n }\n\n for (const index of dbTableData.indexes) {\n for (const column of index.columns) {\n if ('column' in column && column.column === from) {\n column.column = to;\n }\n }\n }\n\n for (const exclude of dbTableData.excludes) {\n for (const column of exclude.columns) {\n if ('column' in column && column.column === from) {\n column.column = to;\n }\n }\n }\n\n for (const c of dbTableData.constraints) {\n if (c.check?.columns) {\n renameColumn(c.check.columns, from, to);\n }\n if (c.references) {\n renameColumn(c.references.columns, from, to);\n }\n }\n\n for (const c of dbStructure.constraints) {\n if (\n c.references &&\n c.references.foreignSchema === schema &&\n c.references.foreignTable === tableName\n ) {\n renameColumn(c.references.foreignColumns, from, to);\n }\n }\n\n continue;\n }\n }\n\n shape[key] = {\n type: 'add',\n item: column,\n };\n }\n};\n\nconst dropColumns = (\n { changeTableAst: { shape } }: ChangeTableData,\n columnsToDrop: KeyAndColumn[],\n) => {\n for (const { key, column } of columnsToDrop) {\n shape[key] = {\n type: 'drop',\n item: column,\n };\n }\n};\n\nconst changeColumns = async (\n adapter: Adapter,\n config: RakeDbConfig,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n dbColumns: { [K: string]: DbStructure.Column },\n columnsToChange: ColumnsToChange,\n compareSql: CompareSql,\n changeTableData: ChangeTableData,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n for (const [\n key,\n { key: codeKey, dbName, column: codeColumn },\n ] of columnsToChange) {\n const dbColumnStructure = dbColumns[dbName];\n\n const dbColumn = instantiateDbColumn(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n dbColumnStructure,\n );\n\n const action = await compareColumns(\n adapter,\n domainsMap,\n ast,\n currentSchema,\n compareSql,\n changeTableData,\n typeCastsCache,\n verifying,\n key,\n dbName,\n dbColumn,\n codeColumn,\n );\n\n if (action === 'change') {\n changeColumn(changeTableData, key, dbName, dbColumn, codeColumn);\n } else if (action === 'recreate') {\n changeTableData.changeTableAst.shape[key] = [\n {\n type: 'drop',\n item: dbColumn,\n },\n {\n type: 'add',\n item: codeColumn,\n },\n ];\n } else if (action !== 'recreate') {\n const to = codeColumn.data.name ?? codeKey;\n if (dbName !== to) {\n changeTableData.changeTableAst.shape[\n config.snakeCase\n ? dbName === toSnakeCase(codeKey)\n ? codeKey\n : dbName\n : dbName\n ] = {\n type: 'rename',\n name: config.snakeCase\n ? to === toSnakeCase(codeKey)\n ? codeKey\n : to\n : to,\n };\n }\n }\n }\n};\n\nconst compareColumns = async (\n adapter: Adapter,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n compareSql: CompareSql,\n changeTableData: ChangeTableData,\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n key: string,\n dbName: string,\n dbColumn: Column,\n codeColumn: Column,\n): Promise<'change' | 'recreate' | undefined> => {\n if (dbColumn instanceof ArrayColumn && codeColumn instanceof ArrayColumn) {\n dbColumn = dbColumn.data.item;\n codeColumn = codeColumn.data.item;\n }\n\n const dbType = getColumnDbType(dbColumn, currentSchema);\n const codeType = getColumnDbType(codeColumn, currentSchema);\n\n if (dbType !== codeType) {\n const typeCasts = await getTypeCasts(adapter, typeCastsCache);\n\n const dbBaseType = getColumnBaseType(dbColumn, domainsMap, dbType);\n const codeBaseType = getColumnBaseType(codeColumn, domainsMap, codeType);\n\n if (!typeCasts.get(dbBaseType)?.has(codeBaseType)) {\n if (\n !(dbColumn instanceof EnumColumn) ||\n !(codeColumn instanceof EnumColumn) ||\n !deepCompare(dbColumn.options, codeColumn.options)\n ) {\n if (verifying) throw new AbortSignal();\n\n const tableName = concatSchemaAndName(changeTableData.changeTableAst);\n const abort = await promptSelect({\n message: `Cannot cast type of ${tableName}'s column ${key} from ${dbType} to ${codeType}`,\n options: [\n `${colors.yellowBold(\n `-/+`,\n )} recreate the column, existing data will be ${colors.red(\n 'lost',\n )}`,\n `write migration manually`,\n ],\n });\n if (abort) {\n throw new AbortSignal();\n }\n\n dbColumn.data.name = codeColumn.data.name;\n return 'recreate';\n }\n }\n\n return 'change';\n }\n\n const dbData = dbColumn.data as unknown as RecordUnknown;\n const codeData = codeColumn.data as unknown as RecordUnknown;\n\n for (const key of ['isNullable', 'comment']) {\n if (dbData[key] !== codeData[key]) {\n return 'change';\n }\n }\n\n for (const key of [\n 'maxChars',\n 'collation',\n 'compression',\n 'numericPrecision',\n 'numericScale',\n 'dateTimePrecision',\n ]) {\n // Check if key in codeData so that default precision/scale values for such columns as integer aren't counted.\n // If column supports precision/scale, it should have it listed in the data, even if it's undefined.\n if (key in codeData && dbData[key] !== codeData[key]) {\n return 'change';\n }\n }\n\n if (dbColumn.data.isOfCustomType) {\n const { typmod } = dbColumn.data;\n if (typmod !== undefined && typmod !== -1) {\n const i = codeColumn.dataType.indexOf('(');\n if (i === -1 || codeColumn.dataType.slice(i + 1, -1) !== `${typmod}`) {\n return 'change';\n }\n }\n }\n\n if (\n !deepCompare(\n dbData.identity,\n codeData.identity\n ? {\n always: false,\n start: 1,\n increment: 1,\n cache: 1,\n cycle: false,\n ...(codeData.identity ?? {}),\n }\n : undefined,\n )\n ) {\n return 'change';\n }\n\n if (dbData.default !== undefined && codeData.default !== undefined) {\n const valuesBeforeLen = compareSql.values.length;\n const dbDefault = encodeColumnDefault(\n dbData.default,\n compareSql.values,\n dbColumn,\n ) as string;\n const dbValues = compareSql.values.slice(valuesBeforeLen);\n\n const codeDefault = encodeColumnDefault(\n codeData.default,\n compareSql.values,\n codeColumn,\n );\n const codeValues = compareSql.values.slice(valuesBeforeLen);\n\n if (\n dbValues.length !== codeValues.length ||\n (dbValues.length &&\n JSON.stringify(dbValues) !== JSON.stringify(codeValues))\n ) {\n compareSql.values.length = valuesBeforeLen;\n return 'change';\n } else if (dbDefault !== codeDefault && dbDefault !== `(${codeDefault})`) {\n const change = () => {\n changeColumn(changeTableData, key, dbName, dbColumn, codeColumn);\n if (!changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n };\n\n compareSql.expressions.push({\n inDb: dbDefault,\n inCode: codeDefault,\n change,\n });\n }\n }\n\n return;\n};\n\nconst getTypeCasts = async (\n adapter: Adapter,\n typeCastsCache: TypeCastsCache,\n) => {\n let typeCasts = typeCastsCache.value;\n if (!typeCasts) {\n const { rows } = await adapter.arrays(`SELECT s.typname, t.typname\nFROM pg_cast\nJOIN pg_type AS s ON s.oid = castsource\nJOIN pg_type AS t ON t.oid = casttarget`);\n\n const directTypeCasts = new Map<string, Set<string>>();\n for (const [source, target] of rows) {\n const set = directTypeCasts.get(source);\n if (set) {\n set.add(target);\n } else {\n directTypeCasts.set(source, new Set([target]));\n }\n }\n\n typeCasts = new Map<string, Set<string>>();\n for (const [type, directSet] of directTypeCasts.entries()) {\n const set = new Set<string>(directSet);\n typeCasts.set(type, set);\n\n for (const subtype of directSet) {\n const subset = directTypeCasts.get(subtype);\n if (subset) {\n for (const type of subset) {\n set.add(type);\n }\n }\n }\n }\n\n typeCastsCache.value = typeCasts;\n }\n\n return typeCasts;\n};\n\nconst changeColumn = (\n changeTableData: ChangeTableData,\n key: string,\n dbName: string,\n dbColumn: Column,\n codeColumn: Column,\n) => {\n dbColumn.data.as = codeColumn.data.as = undefined;\n\n const simpleCodeColumn = Object.create(codeColumn);\n simpleCodeColumn.data = {\n ...codeColumn.data,\n primaryKey: undefined,\n indexes: undefined,\n excludes: undefined,\n foreignKeys: undefined,\n check: undefined,\n };\n\n changeTableData.changingColumns[dbName] = {\n from: dbColumn,\n to: simpleCodeColumn,\n };\n\n changeTableData.changeTableAst.shape[key] = {\n type: 'change',\n from: { column: dbColumn },\n to: { column: simpleCodeColumn },\n };\n};\n\nexport const getColumnDbType = (\n column: Column.Pick.DataAndDataType,\n currentSchema: string,\n) => {\n if (column instanceof EnumColumn) {\n const [schema = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n column.enumName,\n );\n return `${schema}.${name}`;\n } else if (column instanceof ArrayColumn) {\n const { item } = column.data;\n let type = item instanceof EnumColumn ? item.enumName : item.dataType;\n\n type = type.startsWith(currentSchema + '.')\n ? type.slice(currentSchema.length + 1)\n : type;\n\n return type + '[]'.repeat(column.data.arrayDims);\n } else if (column.data.isOfCustomType) {\n let type = column.dataType;\n\n const i = type.indexOf('(');\n if (i !== -1) {\n type = type.slice(0, i);\n }\n\n return type.includes('.') ? type : currentSchema + '.' + type;\n } else {\n return column.dataType;\n }\n};\n\nconst renameColumn = (columns: string[], from: string, to: string) => {\n for (let i = 0; i < columns.length; i++) {\n if (columns[i] === from) {\n columns[i] = to;\n }\n }\n};\n","import { Column, RawSql } from 'pqb/internal';\nimport {\n ArrayColumn,\n DbStructureDomainsMap,\n Adapter,\n deepCompare,\n emptyArray,\n TemplateLiteralArgs,\n} from 'pqb/internal';\nimport {\n RakeDbAst,\n getSchemaAndTableFromName,\n DbStructure,\n IntrospectedStructure,\n instantiateDbColumn,\n} from 'rake-db';\nimport { getColumnDbType } from './columns.generator';\nimport {\n CompareExpression,\n compareSqlExpressions,\n TableExpression,\n} from './generators.utils';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\ninterface ComparableDomainCompare extends Omit<\n DbStructure.Domain,\n 'schemaName' | 'name'\n> {\n hasDefault: boolean;\n hasChecks: boolean;\n}\n\ninterface ComparableDomain {\n schemaName: string;\n name: string;\n column: Column;\n compare: ComparableDomainCompare;\n}\n\nexport interface CodeDomain {\n schemaName: string;\n name: string;\n column: Column;\n}\n\nexport const processDomains = async (\n ast: RakeDbAst[],\n adapter: Adapter,\n domainsMap: DbStructureDomainsMap,\n dbStructure: IntrospectedStructure,\n {\n codeItems: { domains },\n structureToAstCtx,\n currentSchema,\n internal: { generatorIgnore },\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n) => {\n const codeDomains: ComparableDomain[] = [];\n if (domains) {\n for (const { schemaName, name, column } of domains) {\n codeDomains.push(\n makeComparableDomain(currentSchema, schemaName, name, column),\n );\n }\n }\n\n const tableExpressions: TableExpression[] = [];\n const holdCodeDomains = new Set<ComparableDomain>();\n\n for (const domain of dbStructure.domains) {\n if (\n generatorIgnore?.schemas?.includes(domain.schemaName) ||\n generatorIgnore?.domains?.includes(domain.name)\n ) {\n continue;\n }\n\n const dbColumn = instantiateDbColumn(\n structureToAstCtx,\n dbStructure,\n domainsMap,\n {\n // not destructuring `domain` because need to ignore `numericPrecision`, `numericScale`, etc.,\n // that are loaded from db, but not defined in the code\n schemaName: domain.typeSchema,\n tableName: 'N/A',\n name: domain.name,\n typeSchema: domain.typeSchema,\n type: domain.type,\n arrayDims: domain.arrayDims,\n default: domain.default,\n isNullable: domain.isNullable,\n collate: domain.collate,\n maxChars: domain.maxChars,\n typmod: -1,\n },\n );\n\n if (domain.checks) {\n dbColumn.data.checks = domain.checks.map((check) => ({\n sql: new RawSql([[check]] as unknown as TemplateLiteralArgs),\n }));\n }\n\n const dbDomain = makeComparableDomain(\n currentSchema,\n domain.schemaName,\n domain.name,\n dbColumn,\n );\n\n const found = codeDomains.filter((codeDomain) =>\n deepCompare(dbDomain.compare, codeDomain.compare),\n );\n\n if ((domain.default || domain.checks?.length) && found.length) {\n for (const codeDomain of found) {\n holdCodeDomains.add(codeDomain);\n }\n\n const compare: CompareExpression['compare'] = [];\n pushCompareDefault(compare, domain, found);\n pushCompareChecks(compare, domain, found);\n\n const source = `(VALUES (NULL::${getColumnDbType(\n dbColumn,\n currentSchema,\n )})) t(value)`;\n\n tableExpressions.push({\n compare,\n source,\n handle(i) {\n const codeDomain = i === undefined ? undefined : found[i];\n if (!codeDomain) {\n ast.push(dropAst(dbDomain));\n } else {\n holdCodeDomains.delete(codeDomain);\n }\n },\n });\n } else if (found.length) {\n let i = codeDomains.findIndex(\n (codeDomain) =>\n codeDomain.name === dbDomain.name &&\n codeDomain.schemaName === dbDomain.schemaName,\n );\n if (i === -1) {\n i = 0;\n const first = found[0];\n ast.push({\n type: 'renameType',\n kind: 'DOMAIN',\n fromSchema: dbDomain.schemaName,\n from: dbDomain.name,\n toSchema: first.schemaName,\n to: first.name,\n });\n pendingDbTypes.add(first.schemaName, first.name);\n }\n\n codeDomains.splice(i, 1);\n } else {\n ast.push(dropAst(dbDomain));\n }\n }\n\n for (const codeDomain of codeDomains) {\n if (!holdCodeDomains.has(codeDomain)) {\n ast.push(createAst(codeDomain));\n pendingDbTypes.add(codeDomain.schemaName, codeDomain.name);\n }\n }\n\n if (tableExpressions.length) {\n await compareSqlExpressions(tableExpressions, adapter);\n\n if (holdCodeDomains.size) {\n for (const codeDomain of holdCodeDomains.keys()) {\n ast.push(createAst(codeDomain));\n pendingDbTypes.add(codeDomain.schemaName, codeDomain.name);\n }\n }\n }\n};\n\nconst makeComparableDomain = (\n currentSchema: string,\n schemaName: string,\n name: string,\n column: Column,\n): ComparableDomain => {\n let arrayDims = 0;\n const isNullable = column.data.isNullable ?? false;\n let inner = column;\n while (inner instanceof ArrayColumn) {\n inner = inner.data.item;\n arrayDims++;\n }\n const fullType = getColumnDbType(inner, currentSchema);\n const [typeSchema = 'pg_catalog', type] = getSchemaAndTableFromName(\n currentSchema,\n fullType,\n );\n\n return {\n schemaName,\n name,\n column,\n compare: {\n type,\n typeSchema,\n arrayDims,\n isNullable,\n maxChars: inner.data.maxChars,\n numericPrecision: inner.data.numericPrecision,\n numericScale: inner.data.numericScale,\n dateTimePrecision: inner.data.dateTimePrecision,\n collate: column.data.collate,\n hasDefault: column.data.default !== undefined,\n hasChecks: !!column.data.checks?.length,\n },\n };\n};\n\nconst pushCompareDefault = (\n compare: CompareExpression['compare'],\n domain: DbStructure.Domain,\n found: ComparableDomain[],\n) => {\n if (domain.default) {\n compare.push({\n inDb: domain.default,\n inCode: found.map((codeDomain) => {\n const value = codeDomain.column.data.default;\n if ('sql' in (value as Column.Data.Check)) {\n return (value as Column.Data.Check).sql;\n }\n return value as string;\n }),\n });\n }\n};\n\nconst pushCompareChecks = (\n compare: CompareExpression['compare'],\n domain: DbStructure.Domain,\n found: ComparableDomain[],\n) => {\n if (domain.checks?.length) {\n const inCode = found.flatMap(\n (codeDomain) =>\n codeDomain.column.data.checks?.map((check) =>\n typeof check === 'string' ? check : check.sql,\n ) || emptyArray,\n );\n\n compare.push(\n ...domain.checks.map((check) => ({\n inDb: check,\n inCode,\n })),\n );\n }\n};\n\nconst dropAst = (dbDomain: ComparableDomain): RakeDbAst.Domain => ({\n type: 'domain',\n action: 'drop',\n schema: dbDomain.schemaName,\n name: dbDomain.name,\n baseType: dbDomain.column,\n});\n\nconst createAst = (codeDomain: ComparableDomain): RakeDbAst.Domain => ({\n type: 'domain',\n action: 'create',\n schema: codeDomain.schemaName,\n name: codeDomain.name,\n baseType: codeDomain.column,\n});\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { promptCreateOrRename } from './generators.utils';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\nexport interface EnumItem {\n schema?: string;\n name: string;\n values: [string, ...string[]];\n}\n\nexport const processEnums = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n {\n codeItems: { enums },\n currentSchema,\n verifying,\n internal: { generatorIgnore },\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const createEnums: EnumItem[] = [];\n const dropEnums: DbStructure.Enum[] = [];\n\n for (const [, codeEnum] of enums) {\n const { schema = currentSchema, name } = codeEnum;\n const dbEnum = dbStructure.enums.find(\n (x) => x.schemaName === schema && x.name === name,\n );\n if (!dbEnum) {\n createEnums.push(codeEnum);\n }\n }\n\n for (const dbEnum of dbStructure.enums) {\n if (\n generatorIgnore?.schemas?.includes(dbEnum.schemaName) ||\n generatorIgnore?.enums?.includes(dbEnum.name)\n ) {\n continue;\n }\n\n const codeEnum = enums.get(`${dbEnum.schemaName}.${dbEnum.name}`);\n if (codeEnum) {\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n continue;\n }\n\n const i = createEnums.findIndex((x) => x.name === dbEnum.name);\n if (i !== -1) {\n const codeEnum = createEnums[i];\n createEnums.splice(i, 1);\n const fromSchema = dbEnum.schemaName;\n const toSchema = codeEnum.schema ?? currentSchema;\n\n renameColumnsTypeSchema(dbStructure, fromSchema, toSchema);\n\n ast.push({\n type: 'renameType',\n kind: 'TYPE',\n fromSchema,\n from: dbEnum.name,\n toSchema,\n to: dbEnum.name,\n });\n pendingDbTypes.add(toSchema, dbEnum.name);\n\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n\n continue;\n }\n\n dropEnums.push(dbEnum);\n }\n\n for (const codeEnum of createEnums) {\n if (dropEnums.length) {\n const i = await promptCreateOrRename(\n 'enum',\n codeEnum.name,\n dropEnums.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbEnum = dropEnums[i - 1];\n dropEnums.splice(i - 1, 1);\n\n const fromSchema = dbEnum.schemaName;\n const from = dbEnum.name;\n const toSchema = codeEnum.schema ?? currentSchema;\n const to = codeEnum.name;\n\n if (fromSchema !== toSchema) {\n renameColumnsTypeSchema(dbStructure, fromSchema, toSchema);\n }\n\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.type === from) {\n column.type = to;\n }\n }\n }\n\n ast.push({\n type: 'renameType',\n kind: 'TYPE',\n fromSchema,\n from,\n toSchema,\n to,\n });\n pendingDbTypes.add(toSchema, to);\n\n changeEnum(ast, dbEnum, codeEnum, pendingDbTypes);\n\n continue;\n }\n }\n\n ast.push({\n type: 'enum',\n action: 'create',\n ...codeEnum,\n });\n pendingDbTypes.add(codeEnum.schema, codeEnum.name);\n }\n\n for (const dbEnum of dropEnums) {\n ast.push({\n type: 'enum',\n action: 'drop',\n schema: dbEnum.schemaName,\n name: dbEnum.name,\n values: dbEnum.values,\n });\n }\n};\n\nconst changeEnum = (\n ast: RakeDbAst[],\n dbEnum: DbStructure.Enum,\n codeEnum: EnumItem,\n pendingDbTypes: PendingDbTypes,\n) => {\n const { values: dbValues } = dbEnum;\n const { values: codeValues, schema, name } = codeEnum;\n\n if (dbValues.length < codeValues.length) {\n if (!dbValues.some((value) => !codeValues.includes(value))) {\n ast.push({\n type: 'enumValues',\n action: 'add',\n schema,\n name,\n values: codeValues.filter((value) => !dbValues.includes(value)),\n });\n pendingDbTypes.add(schema, name);\n return;\n }\n } else if (dbValues.length > codeValues.length) {\n if (!codeValues.some((value) => !dbValues.includes(value))) {\n ast.push({\n type: 'enumValues',\n action: 'drop',\n schema,\n name,\n values: dbValues.filter((value) => !codeValues.includes(value)),\n });\n pendingDbTypes.add(schema, name);\n return;\n }\n } else if (!dbValues.some((value) => !codeValues.includes(value))) {\n return;\n }\n\n ast.push({\n type: 'changeEnumValues',\n schema,\n name,\n fromValues: dbValues,\n toValues: codeValues,\n });\n pendingDbTypes.add(schema, name);\n};\n\nconst renameColumnsTypeSchema = (\n dbStructure: IntrospectedStructure,\n from: string,\n to: string,\n) => {\n for (const table of dbStructure.tables) {\n for (const column of table.columns) {\n if (column.typeSchema === from) {\n column.typeSchema = to;\n }\n }\n }\n};\n","import { Column } from 'pqb/internal';\nimport { toArray, toSnakeCase } from 'pqb/internal';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop } from './generators.utils';\nimport { RakeDbConfig } from 'rake-db';\n\nexport const processPrimaryKey = (\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n) => {\n const { codeTable } = changeTableData;\n\n const columnsPrimaryKey: { key: string; name: string }[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (column.data.primaryKey) {\n columnsPrimaryKey.push({ key, name: column.data.name ?? key });\n }\n }\n\n changePrimaryKey(config, columnsPrimaryKey, changeTableData);\n renamePrimaryKey(changeTableData);\n};\n\nconst changePrimaryKey = (\n config: RakeDbConfig,\n columnsPrimaryKey: { key: string; name: string }[],\n {\n codeTable,\n dbTableData: { primaryKey: dbPrimaryKey },\n changeTableAst: { shape, add, drop },\n changingColumns,\n }: ChangeTableData,\n) => {\n const tablePrimaryKey = codeTable.internal.tableData.primaryKey;\n const primaryKey = [\n ...new Set([\n ...columnsPrimaryKey,\n ...((config.snakeCase\n ? tablePrimaryKey?.columns.map((key) => ({\n key,\n name: toSnakeCase(key),\n }))\n : tablePrimaryKey?.columns.map((key) => ({ key, name: key }))) ?? []),\n ]),\n ];\n\n if (\n dbPrimaryKey &&\n primaryKey.length === dbPrimaryKey.columns.length &&\n !primaryKey.some(\n ({ name }) => !dbPrimaryKey.columns.some((dbName) => name === dbName),\n )\n ) {\n if (primaryKey.length === 1) {\n const { key } = primaryKey[0];\n const changes = shape[key] && toArray(shape[key]);\n if (changes) {\n for (const change of changes) {\n if (change.type !== 'change') continue;\n\n if (change.from.column) {\n change.from.column.data.primaryKey = undefined;\n }\n\n if (change.to.column) {\n const column = Object.create(change.to.column);\n column.data = { ...column.data, primaryKey: undefined };\n change.to.column = column;\n }\n }\n }\n }\n return;\n }\n\n const toDrop = dbPrimaryKey?.columns.filter(\n (key) => !checkForColumnAddOrDrop(shape, key),\n );\n if (toDrop?.length) {\n if (toDrop.length === 1 && changingColumns[toDrop[0]]) {\n const column = changingColumns[toDrop[0]];\n column.from.data.primaryKey =\n dbPrimaryKey?.name ?? (true as unknown as string);\n } else {\n drop.primaryKey = { columns: toDrop, name: dbPrimaryKey?.name };\n }\n }\n\n const toAdd = primaryKey.filter(\n ({ key }) => !checkForColumnAddOrDrop(shape, key),\n );\n if (toAdd.length) {\n if (toAdd.length === 1 && changingColumns[toAdd[0].name]) {\n const column = changingColumns[toAdd[0].name];\n column.to.data.primaryKey =\n tablePrimaryKey?.name ?? (true as unknown as string);\n } else {\n add.primaryKey = {\n columns: toAdd.map((c) => c.key),\n name: tablePrimaryKey?.name,\n };\n }\n }\n};\n\nconst renamePrimaryKey = ({\n codeTable,\n dbTableData: { primaryKey: dbPrimaryKey },\n schema,\n delayedAst,\n}: ChangeTableData) => {\n const tablePrimaryKey = codeTable.internal.tableData.primaryKey;\n if (\n dbPrimaryKey &&\n tablePrimaryKey &&\n dbPrimaryKey?.name !== tablePrimaryKey?.name\n ) {\n delayedAst.push({\n type: 'renameTableItem',\n kind: 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbPrimaryKey.name ?? `${codeTable.table}_pkey`,\n to: tablePrimaryKey.name ?? `${codeTable}_pkey`,\n });\n }\n};\n","import {\n RakeDbAst,\n getIndexName,\n DbStructure,\n getExcludeName,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport {\n TableData,\n deepCompare,\n MaybeArray,\n RecordUnknown,\n toArray,\n toSnakeCase,\n SearchWeight,\n} from 'pqb/internal';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop, CompareExpression } from './generators.utils';\nimport { CodeTable } from '../generate';\n\ninterface CodeItem {\n columnKeys: TableData.Index.ColumnOrExpressionOptions[];\n includeKeys?: MaybeArray<string>;\n}\n\ninterface CodeIndex extends TableData.Index, CodeItem {}\ninterface CodeExclude extends TableData.Exclude, CodeItem {}\n\ninterface CodeItems {\n indexes: CodeIndex[];\n excludes: CodeExclude[];\n}\n\ninterface ComparableIndexColumn {\n column?: string;\n collate?: string;\n opclass?: string;\n order?: string;\n weight?: SearchWeight;\n hasExpression: boolean;\n}\n\ninterface ComparableIndex {\n name?: string;\n using?: string;\n unique?: boolean;\n include?: string[];\n nullsNotDistinct?: boolean;\n tablespace?: string;\n tsVector?: boolean;\n language?: string;\n languageColumn?: string;\n columns: ComparableIndexColumn[];\n hasWith: boolean;\n hasWhere: boolean;\n hasExpression: boolean;\n columnKeys?: string[];\n includeKeys?: string[];\n}\n\ninterface ComparableExcludeColumn extends ComparableIndexColumn {\n with: string;\n}\n\ninterface ComparableExclude extends ComparableIndex {\n columns: ComparableExcludeColumn[];\n}\n\ninterface ComparableItems {\n indexes: ComparableIndex[];\n excludes: ComparableExclude[];\n}\n\ninterface SkipCodeItems {\n indexes: Map<number, boolean>;\n excludes: Map<number, boolean>;\n}\n\ninterface HoldCodeItems {\n indexes: Map<TableData.Index, boolean>;\n excludes: Map<TableData.Exclude, boolean>;\n}\n\ninterface Wait {\n indexes: number;\n excludes: number;\n}\n\ninterface ProcessParams {\n config: RakeDbConfig;\n changeTableData: ChangeTableData;\n codeComparableItems: ComparableItems;\n codeItems: CodeItems;\n skipCodeItems: SkipCodeItems;\n holdCodeItems: HoldCodeItems;\n wait: Wait;\n ast: RakeDbAst[];\n compareExpressions: CompareExpression[];\n}\n\nexport const processIndexesAndExcludes = (\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n ast: RakeDbAst[],\n compareExpressions: CompareExpression[],\n) => {\n const codeItems = collectCodeIndexes(config, changeTableData);\n const codeComparableItems = collectCodeComparableItems(config, codeItems);\n\n // to skip indexes without SQL from being added when they are matched with already existing indexes\n const skipCodeItems: SkipCodeItems = {\n indexes: new Map(),\n excludes: new Map(),\n };\n\n // to skip indexes with SQL from being added while their SQL is being asynchronously compared with existing indexes\n const holdCodeItems: HoldCodeItems = {\n indexes: new Map(),\n excludes: new Map(),\n };\n\n const processParams: ProcessParams = {\n config,\n changeTableData,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n // counter for async SQL comparisons that are in progress\n wait: { indexes: 0, excludes: 0 },\n ast,\n compareExpressions,\n };\n\n processItems(processParams, 'indexes');\n processItems(processParams, 'excludes');\n\n addMainItems(\n changeTableData,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n 'indexes',\n );\n addMainItems(\n changeTableData,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n 'excludes',\n );\n};\n\nconst processItems = (\n {\n config,\n changeTableData,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n holdCodeItems,\n wait,\n ast,\n compareExpressions,\n }: ProcessParams,\n key: 'indexes' | 'excludes',\n) => {\n const {\n changeTableAst: { shape },\n } = changeTableData;\n\n const dbItems = changeTableData.dbTableData[key];\n\n for (const dbItem of dbItems) {\n const hasAddedOrDroppedColumn = dbItem.columns.some(\n (column) =>\n 'column' in column && checkForColumnAddOrDrop(shape, column.column),\n );\n if (hasAddedOrDroppedColumn) continue;\n\n normalizeItem(dbItem);\n\n const { found, rename, foundAndHasSql } = findMatchingItem(\n dbItem,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n changeTableData.codeTable.table,\n config,\n key,\n );\n\n const { columns: dbColumns } = dbItem;\n\n if (!foundAndHasSql) {\n handleItemChange(\n changeTableData,\n dbItem,\n dbColumns,\n found[0],\n rename[0],\n key,\n );\n continue;\n }\n\n for (const codeItem of found) {\n holdCodeItems[key].set(codeItem as never, true);\n }\n\n const compare: CompareExpression['compare'] = [];\n for (let i = 0; i < dbItem.columns.length; i++) {\n const column = dbItem.columns[i];\n if (!('expression' in column)) continue;\n\n compare.push({\n inDb: column.expression,\n inCode: found.map(\n (x) => (x.columns[i] as { expression: string }).expression,\n ),\n });\n }\n\n if (dbItem.with) {\n compare.push({\n inDb: dbItem.with,\n inCode: found.map((x) => x.options.with as string),\n });\n }\n\n if (dbItem.where) {\n compare.push({\n inDb: dbItem.where,\n inCode: found.map((x) => x.options.where as string),\n });\n }\n\n wait[key]++;\n compareExpressions.push({\n compare,\n handle(i) {\n const codeItem = i === undefined ? undefined : found[i];\n\n handleItemChange(\n changeTableData,\n dbItem,\n dbColumns,\n codeItem,\n i === undefined ? undefined : rename[i],\n key,\n );\n\n if (codeItem) {\n holdCodeItems[key].delete(codeItem as never);\n }\n\n if (!--wait[key] && holdCodeItems[key].size) {\n addItems(changeTableData, [...holdCodeItems[key].keys()], key);\n\n if (!changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n }\n },\n });\n }\n};\n\nconst collectCodeIndexes = (\n config: RakeDbConfig,\n { codeTable, changeTableAst: { shape } }: ChangeTableData,\n): CodeItems => {\n const codeItems: CodeItems = { indexes: [], excludes: [] };\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.indexes && !column.data.excludes) continue;\n\n const name = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, name)) continue;\n\n pushCodeColumnItems(config, codeItems, key, name, column, 'indexes');\n pushCodeColumnItems(config, codeItems, key, name, column, 'excludes');\n }\n\n pushCodeCompositeItems(config, codeTable, codeItems, 'indexes');\n pushCodeCompositeItems(config, codeTable, codeItems, 'excludes');\n\n return codeItems;\n};\n\nconst pushCodeColumnItems = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n columnKey: string,\n name: string,\n column: Column,\n key: 'indexes' | 'excludes',\n) => {\n const items = column.data[key];\n if (!items) return;\n\n codeItems[key].push(\n ...(items as TableData.ColumnExclude[]).map(\n ({\n options: { collate, opclass, order, weight, ...options },\n with: wi,\n ...index\n }) => {\n const w = key === 'excludes' ? wi : (undefined as never);\n return {\n columns: [\n {\n collate,\n opclass,\n order,\n weight,\n column: name,\n with: w,\n },\n ],\n ...index,\n options: options.include\n ? config.snakeCase\n ? {\n ...options,\n include: toArray(options.include).map(toSnakeCase),\n }\n : options\n : options,\n columnKeys: [\n {\n collate,\n opclass,\n order,\n weight,\n column: columnKey,\n with: w,\n },\n ],\n includeKeys: options.include,\n };\n },\n ),\n );\n};\n\nconst pushCodeCompositeItems = (\n config: RakeDbConfig,\n codeTable: CodeTable,\n codeItems: CodeItems,\n key: 'indexes' | 'excludes',\n) => {\n const items = codeTable.internal.tableData[key];\n if (!items) return;\n\n codeItems[key].push(\n ...(items as TableData.Exclude[]).map((x) => ({\n ...x,\n columns: config.snakeCase\n ? x.columns.map((c) =>\n 'column' in c ? { ...c, column: toSnakeCase(c.column) } : c,\n )\n : x.columns,\n columnKeys: x.columns,\n options:\n x.options.include && config.snakeCase\n ? {\n ...x.options,\n include: toArray(x.options.include).map(toSnakeCase),\n }\n : x.options,\n includeKeys: x.options.include,\n })),\n );\n};\n\nconst collectCodeComparableItems = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n): ComparableItems => {\n return {\n indexes: collectCodeComparableItemsType(config, codeItems, 'indexes'),\n excludes: collectCodeComparableItemsType(config, codeItems, 'excludes'),\n };\n};\n\nconst collectCodeComparableItemsType = (\n config: RakeDbConfig,\n codeItems: CodeItems,\n key: 'indexes' | 'excludes',\n): ComparableExclude[] => {\n return codeItems[key].map((codeItem) => {\n normalizeItem(codeItem.options as never);\n\n return itemToComparable({\n ...codeItem.options,\n include:\n codeItem.options.include === undefined\n ? undefined\n : config.snakeCase\n ? toArray(codeItem.options.include).map(toSnakeCase)\n : toArray(codeItem.options.include),\n columns: codeItem.columns,\n name: codeItem.options.name,\n columnKeys: codeItem.columnKeys,\n includeKeys: codeItem.includeKeys,\n });\n }) as never;\n};\n\nconst normalizeItem = (item: {\n using?: string;\n unique?: boolean;\n nullsNotDistinct?: boolean;\n columns: RecordUnknown[];\n exclude?: string[];\n}) => {\n if (item.using) item.using = item.using.toLowerCase();\n if (item.using === 'btree') item.using = undefined;\n if (!item.unique) item.unique = undefined;\n if (item.nullsNotDistinct === false) item.nullsNotDistinct = undefined;\n if (item.exclude) {\n for (let i = 0; i < item.columns.length; i++) {\n item.columns[i].with = item.exclude[i];\n }\n }\n};\n\nconst itemToComparable = (\n index: TableData.Index.Options & {\n columns: DbStructure.Index['columns'];\n name?: string;\n columnKeys?: TableData.Index.ColumnOrExpressionOptions[];\n includeKeys?: MaybeArray<string>;\n },\n) => {\n let hasExpression = false;\n const columns = index.columns.map((column) => {\n const result = {\n ...column,\n expression: undefined,\n hasExpression: 'expression' in column,\n };\n if (result.hasExpression) hasExpression = true;\n return result;\n });\n\n return {\n ...index,\n schemaName: undefined,\n tableName: undefined,\n with: undefined,\n hasWith: !!index.with,\n where: undefined,\n hasWhere: !!index.where,\n columns,\n hasExpression,\n } as ComparableIndex;\n};\n\ninterface ItemChange {\n found: TableData.Index[] | TableData.Exclude[];\n rename: (string | undefined)[];\n}\n\nconst findMatchingItem = (\n dbItem: DbStructure.Index | DbStructure.Exclude,\n codeComparableItems: ComparableItems,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n tableName: string,\n config: RakeDbConfig,\n key: 'indexes' | 'excludes',\n) => {\n const dbComparableItem = itemToComparable(\n key === 'indexes'\n ? dbItem\n : {\n ...dbItem,\n exclude: undefined as never,\n columns: dbItem.columns.map((column, i) => ({\n ...column,\n with: (dbItem as DbStructure.Exclude).exclude[i],\n })),\n },\n );\n\n const { found, rename } = findMatchingItemWithoutSql(\n dbComparableItem,\n codeComparableItems,\n codeItems,\n skipCodeItems,\n tableName,\n config,\n key,\n );\n\n const foundAndHasSql = found.length && checkIfItemHasSql(dbComparableItem);\n\n return { found, rename, foundAndHasSql };\n};\n\nconst findMatchingItemWithoutSql = (\n dbItem: ComparableIndex | ComparableExclude,\n codeComparableItems: ComparableItems,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n tableName: string,\n config: RakeDbConfig,\n key: 'indexes' | 'excludes',\n): ItemChange => {\n const found: (TableData.Index | TableData.Exclude)[] = [];\n const rename: (string | undefined)[] = [];\n\n const { columns: dbColumns, ...dbItemWithoutColumns } = dbItem;\n\n for (let i = 0; i < codeComparableItems[key].length; i++) {\n if (skipCodeItems[key].has(i)) continue;\n\n const { columns: codeColumns, ...codeItem } = codeComparableItems[key][i];\n if (\n dbColumns.length === codeColumns.length &&\n !dbColumns.some((dbColumn, i) => !deepCompare(dbColumn, codeColumns[i]))\n ) {\n let a: RecordUnknown = dbItemWithoutColumns;\n let b = codeItem;\n const codeName =\n b.name ??\n (key === 'indexes' ? getIndexName : getExcludeName)(\n tableName,\n dbColumns,\n );\n if (a.name !== b.name) {\n a = { ...a, name: undefined };\n b = {\n ...b,\n name: undefined,\n columnKeys: undefined,\n includeKeys: undefined,\n };\n if (a.language && !b.language) {\n b.language = config.language ?? 'english';\n }\n\n if (deepCompare(a, b)) {\n found.push(codeItems[key][i]);\n rename.push(\n dbItemWithoutColumns.name !== codeName ? codeName : undefined,\n );\n }\n } else {\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n columnKeys,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n includeKeys,\n ...codeItemWithoutKeys\n } = codeItem;\n\n if (deepCompare(dbItemWithoutColumns, codeItemWithoutKeys)) {\n found.push(codeItems[key][i]);\n rename.push(undefined);\n }\n }\n\n if (found.length && !checkIfItemHasSql(codeItem)) {\n skipCodeItems[key].set(i, true);\n }\n }\n }\n\n return { found, rename };\n};\n\nconst checkIfItemHasSql = (\n x: Pick<ComparableIndex, 'hasWith' | 'hasWhere' | 'hasExpression'>,\n) => x.hasWith || x.hasWhere || x.hasExpression;\n\nconst handleItemChange = (\n {\n changeTableAst,\n schema,\n codeTable,\n changingColumns,\n delayedAst,\n }: ChangeTableData,\n dbItem: DbStructure.Index | DbStructure.Exclude,\n dbColumns: DbStructure.Index['columns'],\n found: TableData.Index | TableData.Exclude | undefined,\n rename: string | undefined,\n key: 'indexes' | 'excludes',\n) => {\n if (!found) {\n const name =\n dbItem.name ===\n (key === 'indexes' ? getIndexName : getExcludeName)(\n changeTableAst.name,\n dbColumns,\n )\n ? undefined\n : dbItem.name;\n\n if (dbColumns.length === 1 && 'column' in dbColumns[0]) {\n const dbColumn = dbColumns[0];\n const column = changingColumns[dbColumn.column];\n if (column) {\n (column.from.data[key] ??= []).push({\n options: { ...dbItem, name },\n with: (key === 'indexes'\n ? undefined\n : (dbColumn as unknown as { with: string }).with) as never,\n });\n return;\n }\n }\n\n (changeTableAst.drop[key] ??= []).push({\n columns: dbColumns,\n options: { ...dbItem, name },\n });\n } else if (rename) {\n delayedAst.push({\n type: 'renameTableItem',\n kind: key === 'indexes' ? 'INDEX' : 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbItem.name,\n to: rename,\n });\n }\n};\n\ninterface IndexWithMaybeColumnNames extends TableData.Index {\n columnNames?: TableData.Index.ColumnOrExpressionOptions[];\n}\n\nconst addMainItems = (\n changeTableData: ChangeTableData,\n codeItems: CodeItems,\n skipCodeItems: SkipCodeItems,\n holdCodeItems: HoldCodeItems,\n key: 'indexes' | 'excludes',\n) => {\n const itemsToAdd = codeItems[key].filter(\n (item, i) =>\n !skipCodeItems[key].has(i) && !holdCodeItems[key].has(item as never),\n );\n if (itemsToAdd.length) {\n addItems(\n changeTableData,\n itemsToAdd.map((x) => ({\n ...x,\n columns: x.columnKeys,\n columnNames: x.columns,\n options: x.options.include\n ? { ...x.options, include: x.includeKeys }\n : x.options,\n })),\n key,\n );\n }\n};\n\nconst addItems = (\n { changeTableAst, changingColumns }: ChangeTableData,\n add: IndexWithMaybeColumnNames[],\n key: 'indexes' | 'excludes',\n) => {\n const items = (changeTableAst.add[key] ??= []);\n for (const item of add) {\n if (item.columns.length === 1 && 'column' in item.columns[0]) {\n const column =\n changingColumns[\n ((item.columnNames || item.columns)[0] as { column: string }).column\n ];\n if (column) {\n (column.to.data[key] ??= []).push(\n key === 'indexes'\n ? item\n : ({\n ...item,\n with: (item as TableData.Exclude).columns[0].with,\n } as never),\n );\n continue;\n }\n }\n\n items.push(item);\n }\n};\n","import {\n RakeDbAst,\n DbStructure,\n concatSchemaAndName,\n getSchemaAndTableFromName,\n getConstraintName,\n RakeDbConfig,\n} from 'rake-db';\nimport { Column } from 'pqb/internal';\nimport { TableData, deepCompare, toSnakeCase } from 'pqb/internal';\nimport { ChangeTableData, TableShapes } from './tables.generator';\nimport { checkForColumnAddOrDrop } from './generators.utils';\n\ninterface Constraint extends TableData.Constraint {\n references: TableData.References;\n}\n\ninterface CodeForeignKey {\n references: DbStructure.References;\n codeConstraint: Constraint;\n}\n\ninterface ReferencesWithStringTable extends TableData.References {\n fnOrTable: string;\n}\n\nconst mapMatchToDb: {\n [K in TableData.References.Match]: DbStructure.ForeignKeyMatch;\n} = {\n FULL: 'f',\n PARTIAL: 'p',\n SIMPLE: 's',\n};\n\nconst mapMatchToCode = {} as {\n [K in DbStructure.ForeignKeyMatch]: TableData.References.Match;\n};\nfor (const key in mapMatchToDb) {\n mapMatchToCode[\n mapMatchToDb[\n key as TableData.References.Match\n ] as DbStructure.ForeignKeyMatch\n ] = key as TableData.References.Match;\n}\n\nconst mapActionToDb: {\n [K in TableData.References.Action]: DbStructure.ForeignKeyAction;\n} = {\n 'NO ACTION': 'a',\n RESTRICT: 'r',\n CASCADE: 'c',\n 'SET NULL': 'n',\n 'SET DEFAULT': 'd',\n};\n\nconst mapActionToCode = {} as {\n [K in DbStructure.ForeignKeyAction]: TableData.References.Action;\n};\nfor (const key in mapActionToDb) {\n mapActionToCode[\n mapActionToDb[\n key as TableData.References.Action\n ] as DbStructure.ForeignKeyAction\n ] = key as TableData.References.Action;\n}\n\nexport const processForeignKeys = (\n config: RakeDbConfig,\n ast: RakeDbAst[],\n changeTables: ChangeTableData[],\n currentSchema: string,\n tableShapes: TableShapes,\n): void => {\n for (const changeTableData of changeTables) {\n const codeForeignKeys = collectCodeFkeys(\n config,\n changeTableData,\n currentSchema,\n );\n\n const { codeTable, dbTableData, changeTableAst, schema, changingColumns } =\n changeTableData;\n const { shape, add, drop } = changeTableAst;\n let changed = false;\n\n for (const dbConstraint of dbTableData.constraints) {\n const { references: dbReferences } = dbConstraint;\n if (!dbReferences) continue;\n\n const hasChangedColumn = dbReferences.columns.some((column) =>\n checkForColumnAddOrDrop(shape, column),\n );\n if (hasChangedColumn) continue;\n\n const foreignShape =\n tableShapes[\n `${dbReferences.foreignSchema}.${dbReferences.foreignTable}`\n ];\n const hasForeignChangedColumn =\n foreignShape &&\n dbReferences.foreignColumns.some((column) => {\n return checkForColumnAddOrDrop(foreignShape, column);\n });\n if (hasForeignChangedColumn) continue;\n\n let found = false;\n let rename: string | undefined;\n for (let i = 0; i < codeForeignKeys.length; i++) {\n const codeForeignKey = codeForeignKeys[i];\n const codeReferences = codeForeignKey.references;\n if (deepCompare(dbReferences, codeReferences)) {\n found = true;\n codeForeignKeys.splice(i, 1);\n\n const codeName =\n codeForeignKey.codeConstraint.name ??\n getConstraintName(\n codeTable.table,\n codeForeignKey,\n config.snakeCase,\n );\n if (codeName !== dbConstraint.name) {\n rename = codeName;\n }\n }\n }\n\n if (!found) {\n const foreignKey = dbForeignKeyToCodeForeignKey(\n config,\n dbConstraint,\n dbReferences,\n );\n\n if (\n dbReferences.columns.length === 1 &&\n changingColumns[dbReferences.columns[0]]\n ) {\n const column = changingColumns[dbReferences.columns[0]];\n (column.from.data.foreignKeys ??= []).push({\n fnOrTable: foreignKey.references.fnOrTable,\n foreignColumns: foreignKey.references.foreignColumns,\n options: foreignKey.references.options,\n });\n } else {\n (drop.constraints ??= []).push(foreignKey);\n }\n\n changed = true;\n } else if (rename) {\n ast.push({\n type: 'renameTableItem',\n kind: 'CONSTRAINT',\n tableSchema: schema,\n tableName: codeTable.table,\n from: dbConstraint.name,\n to: rename,\n });\n }\n }\n\n if (codeForeignKeys.length) {\n const constraints = (add.constraints ??= []);\n for (const { codeConstraint, references } of codeForeignKeys) {\n if (\n references.columns.length === 1 &&\n changingColumns[references.columns[0]]\n ) {\n const column = changingColumns[references.columns[0]];\n (column.to.data.foreignKeys ??= []).push({\n fnOrTable: references.foreignTable,\n foreignColumns: codeConstraint.references.foreignColumns,\n options: codeConstraint.references.options,\n });\n } else {\n constraints.push(codeConstraint);\n }\n }\n\n changed = true;\n }\n\n if (changed && !changeTableData.pushedAst) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n }\n};\n\nconst collectCodeFkeys = (\n config: RakeDbConfig,\n { codeTable, changeTableAst: { shape } }: ChangeTableData,\n currentSchema: string,\n): CodeForeignKey[] => {\n const codeForeignKeys: CodeForeignKey[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.foreignKeys) continue;\n\n const name = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, name)) continue;\n\n codeForeignKeys.push(\n ...column.data.foreignKeys.map((x) => {\n const columns = [name];\n\n const fnOrTable = fnOrTableToString(x.fnOrTable);\n\n return parseForeignKey(\n config,\n {\n name: x.options?.name,\n references: {\n columns: [name],\n fnOrTable,\n foreignColumns: x.foreignColumns,\n options: x.options,\n },\n },\n {\n columns,\n fnOrTable,\n foreignColumns: x.foreignColumns,\n options: x.options,\n },\n currentSchema,\n );\n }),\n );\n }\n\n if (codeTable.internal.tableData.constraints) {\n for (const tableConstraint of codeTable.internal.tableData.constraints) {\n const { references: refs } = tableConstraint;\n if (!refs) continue;\n\n const fnOrTable = fnOrTableToString(refs.fnOrTable);\n\n codeForeignKeys.push(\n parseForeignKey(\n config,\n {\n ...tableConstraint,\n references: {\n ...refs,\n fnOrTable,\n },\n },\n {\n ...refs,\n fnOrTable,\n columns: config.snakeCase\n ? refs.columns.map(toSnakeCase)\n : refs.columns,\n foreignColumns: config.snakeCase\n ? refs.foreignColumns.map(toSnakeCase)\n : refs.foreignColumns,\n },\n currentSchema,\n ),\n );\n }\n }\n\n return codeForeignKeys;\n};\n\nexport const fnOrTableToString = (\n fnOrTable: TableData.References['fnOrTable'],\n) => {\n if (typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = concatSchemaAndName({ schema, name: table });\n }\n return fnOrTable;\n};\n\nconst parseForeignKey = (\n config: RakeDbConfig,\n codeConstraint: Constraint,\n references: ReferencesWithStringTable,\n currentSchema: string,\n): CodeForeignKey => {\n const { fnOrTable, columns, foreignColumns, options } = references;\n const [schema, table] = getSchemaAndTableFromName(currentSchema, fnOrTable);\n\n return {\n references: {\n foreignSchema: schema ?? currentSchema,\n foreignTable: table,\n columns,\n foreignColumns: config.snakeCase\n ? foreignColumns.map(toSnakeCase)\n : foreignColumns,\n match: mapMatchToDb[options?.match || 'SIMPLE'],\n onUpdate: mapActionToDb[options?.onUpdate || 'NO ACTION'],\n onDelete: mapActionToDb[options?.onDelete || 'NO ACTION'],\n },\n codeConstraint,\n };\n};\n\nconst dbForeignKeyToCodeForeignKey = (\n config: RakeDbConfig,\n dbConstraint: DbStructure.Constraint,\n dbReferences: DbStructure.References,\n): { name?: string; references: TableData.References } => ({\n name:\n dbConstraint.name ===\n getConstraintName(\n dbConstraint.tableName,\n { references: dbReferences },\n config.snakeCase,\n )\n ? undefined\n : dbConstraint.name,\n references: {\n columns: dbReferences.columns,\n fnOrTable: `${dbReferences.foreignSchema}.${dbReferences.foreignTable}`,\n foreignColumns: dbReferences.foreignColumns,\n options: {\n match:\n dbReferences.match === 's'\n ? undefined\n : mapMatchToCode[dbReferences.match],\n onUpdate:\n dbReferences.onUpdate === 'a'\n ? undefined\n : mapActionToCode[dbReferences.onUpdate],\n onDelete:\n dbReferences.onDelete === 'a'\n ? undefined\n : mapActionToCode[dbReferences.onDelete],\n },\n },\n});\n","import { Column, RawSql } from 'pqb/internal';\nimport { getFreeSetAlias, TemplateLiteralArgs, TableData } from 'pqb/internal';\nimport { DbStructure, RakeDbAst } from 'rake-db';\nimport { ChangeTableData } from './tables.generator';\nimport { checkForColumnAddOrDrop, CompareExpression } from './generators.utils';\n\ninterface CodeCheck {\n check: Column.Data.Check;\n name: string;\n column?: string;\n}\n\nexport const processChecks = (\n ast: RakeDbAst[],\n changeTableData: ChangeTableData,\n compareExpressions: CompareExpression[],\n): void => {\n const codeChecks = collectCodeChecks(changeTableData);\n const {\n dbTableData,\n changeTableAst: { add, shape },\n } = changeTableData;\n\n const hasDbChecks = dbTableData.constraints.some((c) => c.check);\n if (!hasDbChecks) {\n if (codeChecks.length) {\n const constraints = (add.constraints ??= []);\n for (const codeCheck of codeChecks) {\n if (\n !codeCheck.column ||\n !changeTableData.changingColumns[codeCheck.column]\n ) {\n constraints.push({\n check: codeCheck.check.sql,\n name: codeCheck.name,\n });\n }\n }\n }\n return;\n }\n\n let wait = 0;\n const foundCodeChecks = new Set<number>();\n for (const dbConstraint of dbTableData.constraints) {\n const { check: dbCheck, name } = dbConstraint;\n if (!dbCheck) continue;\n\n const hasChangedColumn = dbCheck.columns?.some((column) =>\n checkForColumnAddOrDrop(shape, column),\n );\n if (hasChangedColumn) continue;\n\n if (codeChecks.length) {\n wait++;\n compareExpressions.push({\n compare: [\n {\n inDb: dbCheck.expression,\n inCode: codeChecks.map(({ check }) => check.sql),\n },\n ],\n handle(i) {\n if (i !== undefined) {\n foundCodeChecks.add(i);\n } else {\n dropCheck(changeTableData, dbCheck, name);\n }\n\n if (--wait !== 0) return;\n\n const checksToAdd: TableData.Constraint[] = [];\n\n codeChecks.forEach((check, i) => {\n if (foundCodeChecks.has(i)) {\n if (!check.column) return;\n\n const change = changeTableData.changingColumns[check.column];\n if (!change) return;\n\n const columnChecks = change.to.data.checks;\n if (!columnChecks) return;\n\n const i = columnChecks.indexOf(check.check);\n if (i !== -1) {\n columnChecks.splice(i, 1);\n }\n return;\n }\n\n checksToAdd.push({\n name: check.name,\n check: check.check.sql,\n });\n });\n\n if (checksToAdd.length) {\n (add.constraints ??= []).push(...checksToAdd);\n }\n\n if (\n !changeTableData.pushedAst &&\n (changeTableData.changeTableAst.drop.constraints?.length ||\n add.constraints?.length)\n ) {\n changeTableData.pushedAst = true;\n ast.push(changeTableData.changeTableAst);\n }\n },\n });\n } else {\n dropCheck(changeTableData, dbCheck, name);\n }\n }\n};\n\nconst collectCodeChecks = ({\n codeTable,\n changeTableAst: { shape },\n}: ChangeTableData): CodeCheck[] => {\n const names = new Set<string>();\n\n const codeChecks: CodeCheck[] = [];\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n if (!column.data.checks) continue;\n\n const columnName = column.data.name ?? key;\n if (checkForColumnAddOrDrop(shape, columnName)) continue;\n\n const baseName = `${codeTable.table}_${columnName}_check`;\n\n codeChecks.push(\n ...column.data.checks.map((check) => {\n const name = check.name || getFreeSetAlias(names, baseName, 1);\n names.add(name);\n\n return {\n check,\n name,\n column: columnName,\n };\n }),\n );\n }\n\n if (codeTable.internal.tableData.constraints) {\n for (const constraint of codeTable.internal.tableData.constraints) {\n const { check } = constraint;\n if (check) {\n const baseName = `${codeTable.table}_check`;\n const name = constraint.name || getFreeSetAlias(names, baseName, 1);\n names.add(name);\n\n codeChecks.push({\n check: { sql: check, name: constraint.name },\n name,\n });\n }\n }\n }\n\n return codeChecks;\n};\n\nconst dropCheck = (\n { changeTableAst: { drop }, changingColumns }: ChangeTableData,\n dbCheck: DbStructure.Check,\n name: string,\n) => {\n const sql = new RawSql([\n [dbCheck.expression],\n ] as unknown as TemplateLiteralArgs);\n\n if (dbCheck.columns?.length === 1 && changingColumns[dbCheck.columns[0]]) {\n const column = changingColumns[dbCheck.columns[0]];\n column.from.data.name = 'i_d';\n (column.from.data.checks ??= []).push({\n name,\n sql,\n });\n } else {\n (drop.constraints ??= []).push({\n name,\n check: sql,\n });\n }\n};\n","import { Column } from 'pqb/internal';\nimport {\n ArrayColumn,\n ColumnsShape,\n DbStructureDomainsMap,\n Adapter,\n EnumColumn,\n GeneratorIgnore,\n VirtualColumn,\n} from 'pqb/internal';\nimport {\n DbStructure,\n IntrospectedStructure,\n RakeDbAst,\n getDbStructureTableData,\n StructureToAstCtx,\n StructureToAstTableData,\n tableToAst,\n getSchemaAndTableFromName,\n getMigrationsSchemaAndTable,\n RakeDbConfig,\n} from 'rake-db';\nimport {\n CompareExpression,\n compareSqlExpressions,\n promptCreateOrRename,\n TableExpression,\n} from './generators.utils';\nimport { processPrimaryKey } from './primaryKey.generator';\nimport { processIndexesAndExcludes } from './indexesAndExcludes.generator';\nimport { processColumns, TypeCastsCache } from './columns.generator';\nimport { processForeignKeys } from './foreignKeys.generator';\nimport { processChecks } from './checks.generator';\nimport { CodeTable } from '../generate';\nimport { ComposeMigrationParams, PendingDbTypes } from '../composeMigration';\n\nexport interface CompareSql {\n values: unknown[];\n expressions: {\n inDb: string;\n inCode: string | null;\n change(): void;\n }[];\n}\n\nexport interface ChangeTableSchemaData {\n codeTable: CodeTable;\n dbTable: DbStructure.Table;\n}\n\nexport interface ChangeTableData extends ChangeTableSchemaData {\n dbTableData: StructureToAstTableData;\n schema: string;\n changeTableAst: RakeDbAst.ChangeTable;\n pushedAst: boolean;\n changingColumns: ChangingColumns;\n delayedAst: RakeDbAst[];\n}\n\ninterface ChangingColumns {\n [dbName: string]: ChangingColumnsPair;\n}\n\nexport interface ChangingColumnsPair {\n from: Column;\n to: Column;\n}\n\nexport interface TableShapes {\n [K: string]: RakeDbAst.ChangeTableShape;\n}\n\nexport const processTables = async (\n ast: RakeDbAst[],\n domainsMap: DbStructureDomainsMap,\n adapter: Adapter,\n dbStructure: IntrospectedStructure,\n config: RakeDbConfig,\n {\n structureToAstCtx,\n codeItems: { tables },\n currentSchema,\n internal: { generatorIgnore },\n verifying,\n }: ComposeMigrationParams,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const createTables: CodeTable[] = collectCreateTables(\n tables,\n dbStructure,\n currentSchema,\n );\n const compareSql: CompareSql = { values: [], expressions: [] };\n const tableExpressions: TableExpression[] = [];\n const { changeTables, changeTableSchemas, dropTables, tableShapes } =\n collectChangeAndDropTables(\n adapter,\n config,\n tables,\n dbStructure,\n currentSchema,\n createTables,\n generatorIgnore,\n );\n\n applyChangeTableSchemas(changeTableSchemas, currentSchema, ast);\n\n await applyCreateOrRenameTables(\n dbStructure,\n createTables,\n dropTables,\n changeTables,\n tableShapes,\n currentSchema,\n ast,\n verifying,\n );\n\n await applyChangeTables(\n adapter,\n changeTables,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n config,\n compareSql,\n tableExpressions,\n verifying,\n pendingDbTypes,\n );\n\n processForeignKeys(config, ast, changeTables, currentSchema, tableShapes);\n\n await Promise.all([\n applyCompareSql(compareSql, adapter),\n compareSqlExpressions(tableExpressions, adapter),\n ]);\n\n for (const dbTable of dropTables) {\n ast.push(\n tableToAst(structureToAstCtx, dbStructure, dbTable, 'drop', domainsMap),\n );\n }\n};\n\nconst collectCreateTables = (\n tables: CodeTable[],\n dbStructure: IntrospectedStructure,\n currentSchema: string,\n): CodeTable[] => {\n return tables.reduce<CodeTable[]>((acc, codeTable) => {\n const tableSchema = codeTable.q.schema ?? currentSchema;\n const hasDbTable = dbStructure.tables.some(\n (t) => t.name === codeTable.table && t.schemaName === tableSchema,\n );\n if (!hasDbTable) {\n acc.push(codeTable);\n }\n return acc;\n }, []);\n};\n\nconst collectChangeAndDropTables = (\n adapter: Adapter,\n config: RakeDbConfig,\n tables: CodeTable[],\n dbStructure: IntrospectedStructure,\n currentSchema: string,\n createTables: CodeTable[],\n generatorIgnore: GeneratorIgnore | undefined,\n): {\n changeTables: ChangeTableData[];\n changeTableSchemas: ChangeTableSchemaData[];\n dropTables: DbStructure.Table[];\n tableShapes: TableShapes;\n} => {\n const changeTables: ChangeTableData[] = [];\n const changeTableSchemas: ChangeTableSchemaData[] = [];\n const dropTables: DbStructure.Table[] = [];\n const tableShapes: TableShapes = {};\n const ignoreTables = generatorIgnore?.tables?.map((name) => {\n const [schema = currentSchema, table] = getSchemaAndTableFromName(\n currentSchema,\n name,\n );\n return { schema, table };\n });\n\n const { schema: migrationsSchema = 'public', table: migrationsTable } =\n getMigrationsSchemaAndTable(adapter, config);\n for (const dbTable of dbStructure.tables) {\n if (\n (dbTable.name === migrationsTable &&\n dbTable.schemaName === migrationsSchema) ||\n generatorIgnore?.schemas?.includes(dbTable.schemaName) ||\n ignoreTables?.some(\n ({ schema, table }) =>\n table === dbTable.name && schema === dbTable.schemaName,\n )\n )\n continue;\n\n const codeTable = tables.find(\n (t) =>\n t.table === dbTable.name &&\n (t.q.schema ?? currentSchema) === dbTable.schemaName,\n );\n if (codeTable) {\n addChangeTable(\n dbStructure,\n changeTables,\n tableShapes,\n currentSchema,\n dbTable,\n codeTable,\n );\n continue;\n }\n\n const i = createTables.findIndex((t) => t.table === dbTable.name);\n if (i !== -1) {\n const codeTable = createTables[i];\n createTables.splice(i, 1);\n changeTableSchemas.push({ codeTable, dbTable });\n continue;\n }\n\n dropTables.push(dbTable);\n }\n\n return { changeTables, changeTableSchemas, dropTables, tableShapes };\n};\n\nconst applyChangeTableSchemas = (\n changeTableSchemas: ChangeTableSchemaData[],\n currentSchema: string,\n ast: RakeDbAst[],\n) => {\n for (const { codeTable, dbTable } of changeTableSchemas) {\n const fromSchema = dbTable.schemaName;\n const toSchema = codeTable.q.schema ?? currentSchema;\n\n ast.push({\n type: 'renameType',\n kind: 'TABLE',\n fromSchema,\n from: dbTable.name,\n toSchema,\n to: dbTable.name,\n });\n }\n};\n\nconst applyChangeTables = async (\n adapter: Adapter,\n changeTables: ChangeTableData[],\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n config: RakeDbConfig,\n compareSql: CompareSql,\n tableExpressions: TableExpression[],\n verifying: boolean | undefined,\n pendingDbTypes: PendingDbTypes,\n): Promise<void> => {\n const compareExpressions: CompareExpression[] = [];\n const typeCastsCache: TypeCastsCache = {};\n\n for (const changeTableData of changeTables) {\n compareExpressions.length = 0;\n\n await processTableChange(\n adapter,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n ast,\n currentSchema,\n config,\n changeTableData,\n compareSql,\n compareExpressions,\n typeCastsCache,\n verifying,\n );\n\n if (compareExpressions.length) {\n const { codeTable } = changeTableData;\n const names: string[] = [];\n const types: string[] = [];\n\n for (const key in codeTable.shape) {\n const column = codeTable.shape[key] as Column;\n // skip virtual columns\n if (!column.dataType) continue;\n\n const name = column.data.name ?? key;\n const type = getColumnDbTypeForComparison(column, currentSchema);\n if (!pendingDbTypes.set.has(type)) {\n names.push(name);\n types.push(type);\n }\n }\n\n const tableName = codeTable.table;\n const source = `(VALUES (${types\n .map((x) => `NULL::${x}`)\n .join(', ')})) \"${tableName}\"(${names\n .map((x) => `\"${x}\"`)\n .join(', ')})`;\n\n tableExpressions.push(\n ...compareExpressions.map((x) => ({ ...x, source })),\n );\n }\n }\n};\n\nconst getColumnDbTypeForComparison = (\n column: Column.Pick.DataAndDataType,\n currentSchema: string,\n): string => {\n if (column instanceof ArrayColumn) {\n return (\n getColumnDbTypeForComparison(column.data.item, currentSchema) +\n '[]'.repeat(column.data.arrayDims)\n );\n }\n\n let type = column instanceof EnumColumn ? column.enumName : column.dataType;\n\n const i = type.indexOf('(');\n let append = '';\n if (i !== -1) {\n type = type.slice(0, i);\n append = type.slice(i);\n }\n\n const j = type.indexOf('.');\n if (j === -1) {\n let result = `\"${type}\"${append}`;\n if (column.data.isOfCustomType || column instanceof EnumColumn) {\n result = `\"${currentSchema}\".${result}`;\n }\n return result;\n } else {\n return `\"${type.slice(j)}\".\"${type.slice(0, j)}\"${append}`;\n }\n};\n\n// https://github.com/romeerez/orchid-orm/issues/647\n// two clock_timestamp() statements aren't equal to each other, confusing SQL comparator.\n// adding 0.1ms to keep clock_timestamp() different from now(), so user can migrate from now() to clock_timestamp().\nconst freezeSqlClock = (sql: string) =>\n sql.replaceAll('clock_timestamp()', `'0.1ms'::interval + now()`);\n\nconst applyCompareSql = async (compareSql: CompareSql, adapter: Adapter) => {\n if (compareSql.expressions.length) {\n const {\n rows: [results],\n } = await adapter.arrays(\n 'SELECT ' +\n compareSql.expressions\n .map(\n (x) =>\n `${freezeSqlClock(x.inDb)} = (${\n x.inCode && freezeSqlClock(x.inCode)\n })`,\n )\n .join(', '),\n compareSql.values,\n );\n\n for (let i = 0; i < results.length; i++) {\n if (!results[i]) {\n compareSql.expressions[i].change();\n }\n }\n }\n};\n\nconst applyCreateOrRenameTables = async (\n dbStructure: IntrospectedStructure,\n createTables: CodeTable[],\n dropTables: DbStructure.Table[],\n changeTables: ChangeTableData[],\n tableShapes: TableShapes,\n currentSchema: string,\n ast: RakeDbAst[],\n verifying: boolean | undefined,\n) => {\n for (const codeTable of createTables) {\n if (dropTables.length) {\n const i = await promptCreateOrRename(\n 'table',\n codeTable.table,\n dropTables.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbTable = dropTables[i - 1];\n dropTables.splice(i - 1, 1);\n\n ast.push({\n type: 'renameType',\n kind: 'TABLE',\n fromSchema: dbTable.schemaName,\n from: dbTable.name,\n toSchema: codeTable.q.schema ?? currentSchema,\n to: codeTable.table,\n });\n\n addChangeTable(\n dbStructure,\n changeTables,\n tableShapes,\n currentSchema,\n dbTable,\n codeTable,\n );\n\n continue;\n }\n }\n\n ast.push(createTableAst(currentSchema, codeTable));\n }\n};\n\nconst addChangeTable = (\n dbStructure: IntrospectedStructure,\n changeTables: ChangeTableData[],\n tableShapes: TableShapes,\n currentSchema: string,\n dbTable: DbStructure.Table,\n codeTable: CodeTable,\n) => {\n const shape = {};\n const schema = codeTable.q.schema ?? currentSchema;\n\n changeTables.push({\n codeTable: cloneCodeTableForChange(codeTable),\n dbTable,\n dbTableData: getDbStructureTableData(dbStructure, dbTable),\n schema,\n changeTableAst: {\n type: 'changeTable',\n schema,\n name: codeTable.table,\n shape: shape,\n add: {},\n drop: {},\n },\n pushedAst: false,\n changingColumns: {},\n delayedAst: [],\n });\n\n tableShapes[`${schema}.${codeTable.table}`] = shape;\n};\n\nconst cloneCodeTableForChange = (codeTable: CodeTable) => ({\n ...codeTable,\n // codeTable is a class instance and not all props can be cloned with `...`\n table: codeTable.table,\n shape: Object.fromEntries(\n Object.entries(codeTable.shape).map(([key, column]) => {\n const cloned = Object.create(column as Column);\n cloned.data = {\n ...cloned.data,\n checks: cloned.data.checks && [...cloned.data.checks],\n };\n\n return [key, cloned];\n }),\n ),\n});\n\nconst createTableAst = (\n currentSchema: string,\n table: CodeTable,\n): RakeDbAst.Table => {\n return {\n type: 'table',\n action: 'create',\n schema: table.q.schema === currentSchema ? undefined : table.q.schema,\n comment: table.internal.comment,\n name: table.table,\n shape: makeTableShape(table),\n noPrimaryKey: table.internal.noPrimaryKey ? 'ignore' : 'error',\n ...table.internal.tableData,\n };\n};\n\nconst makeTableShape = (table: CodeTable): ColumnsShape => {\n const shape: ColumnsShape = {};\n for (const key in table.shape) {\n const column = table.shape[key];\n if (!(column instanceof VirtualColumn)) {\n shape[key] = column as Column;\n }\n }\n return shape;\n};\n\nconst processTableChange = async (\n adapter: Adapter,\n structureToAstCtx: StructureToAstCtx,\n dbStructure: IntrospectedStructure,\n domainsMap: DbStructureDomainsMap,\n ast: RakeDbAst[],\n currentSchema: string,\n config: RakeDbConfig,\n changeTableData: ChangeTableData,\n compareSql: CompareSql,\n compareExpressions: CompareExpression[],\n typeCastsCache: TypeCastsCache,\n verifying: boolean | undefined,\n) => {\n await processColumns(\n adapter,\n config,\n structureToAstCtx,\n dbStructure,\n domainsMap,\n changeTableData,\n ast,\n currentSchema,\n compareSql,\n typeCastsCache,\n verifying,\n );\n\n processPrimaryKey(config, changeTableData);\n\n processIndexesAndExcludes(config, changeTableData, ast, compareExpressions);\n\n processChecks(ast, changeTableData, compareExpressions);\n\n const { changeTableAst } = changeTableData;\n if (\n Object.keys(changeTableAst.shape).length ||\n Object.keys(changeTableAst.add).length ||\n Object.keys(changeTableAst.drop).length\n ) {\n changeTableData.pushedAst = true;\n ast.push(changeTableAst);\n }\n\n if (changeTableData.delayedAst.length) {\n ast.push(...changeTableData.delayedAst);\n }\n};\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\nimport { deepCompare } from 'pqb/internal';\nimport { promptCreateOrRename } from './generators.utils';\n\nconst defaults = {\n super: false,\n inherit: false,\n createRole: false,\n createDb: false,\n canLogin: false,\n replication: false,\n connLimit: -1,\n bypassRls: false,\n};\n\nexport const processRoles = async (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n { verifying, internal: { roles } }: ComposeMigrationParams,\n) => {\n if (!dbStructure.roles || !roles) return;\n\n const codeRoles = roles.map((role): DbStructure.Role => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { defaultPrivileges: _, ...roleWithoutPrivileges } = role;\n return {\n ...defaults,\n ...roleWithoutPrivileges,\n };\n });\n\n const found = new Set<string>();\n const dropRoles: DbStructure.Role[] = [];\n\n for (const dbRole of dbStructure.roles) {\n // Strip defaultPrivileges from dbRole for comparison\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n defaultPrivileges: _,\n ...dbRoleWithoutPrivileges\n } = dbRole as DbStructure.Role & { defaultPrivileges?: unknown };\n\n const codeRole = codeRoles.find(\n (codeRole) => dbRole.name === codeRole.name,\n );\n if (codeRole) {\n found.add(dbRole.name);\n\n if (!deepCompare(dbRoleWithoutPrivileges, codeRole)) {\n ast.push({\n type: 'changeRole',\n name: dbRole.name,\n from: dbRoleWithoutPrivileges,\n to: codeRole,\n });\n }\n\n continue;\n }\n\n dropRoles.push(dbRole);\n }\n\n for (const codeRole of codeRoles) {\n if (found.has(codeRole.name)) continue;\n\n if (dropRoles.length) {\n const i = await promptCreateOrRename(\n 'table',\n codeRole.name,\n dropRoles.map((x) => x.name),\n verifying,\n );\n if (i) {\n const dbRole = dropRoles[i - 1];\n dropRoles.splice(i - 1, 1);\n\n ast.push(makeRenameOrChangeAst(dbRole, codeRole));\n\n continue;\n }\n }\n\n ast.push({\n type: 'role',\n action: 'create',\n ...codeRole,\n });\n }\n\n for (const dbRole of dropRoles) {\n ast.push({\n type: 'role',\n action: 'drop',\n ...dbRole,\n });\n }\n};\n\nconst makeRenameOrChangeAst = (\n dbRole: DbStructure.Role,\n codeRole: DbStructure.Role,\n): RakeDbAst.RenameRole | RakeDbAst.ChangeRole => {\n const { name: dbRoleName, ...dbRoleRest } = dbRole;\n const { name: codeRoleName, ...codeRoleRest } = codeRole;\n if (deepCompare(dbRoleRest, codeRoleRest) && dbRoleName !== codeRoleName) {\n return {\n type: 'renameRole',\n from: dbRoleName,\n to: codeRoleName,\n };\n } else {\n return {\n type: 'changeRole',\n name: dbRole.name,\n from: dbRole,\n to: codeRole,\n };\n }\n};\n","import { DbStructure, IntrospectedStructure, RakeDbAst } from 'rake-db';\nimport { ComposeMigrationParams } from '../composeMigration';\nimport { getSupportedDefaultPrivileges, DefaultPrivileges } from 'pqb/internal';\n\nconst ALL_OBJECT_TYPES: DbStructure.DefaultPrivilegeObjectConfig['object'][] = [\n 'TABLES',\n 'SEQUENCES',\n 'FUNCTIONS',\n 'TYPES',\n 'SCHEMAS',\n 'LARGE_OBJECTS',\n];\n\n// Create object configs for all object types with given isGrantable flag\nconst createAllObjectConfigs = (\n isGrantable: boolean,\n schema: string | undefined,\n supportedPrivileges: DefaultPrivileges.SupportedDefaultPrivileges,\n): DbStructure.DefaultPrivilegeObjectConfig[] => {\n let types: DbStructure.DefaultPrivilegeObjectConfig['object'][];\n if (schema) {\n types = ALL_OBJECT_TYPES.filter(\n (t) => t !== 'SCHEMAS' && t !== 'LARGE_OBJECTS',\n );\n } else {\n types = ALL_OBJECT_TYPES.filter((t) => {\n if (t === 'LARGE_OBJECTS') {\n return supportedPrivileges.PRIVILEGES.LARGE_OBJECT !== undefined;\n }\n return true;\n });\n }\n return types.map((object) => ({\n object,\n privilegeConfigs: [{ privilege: 'ALL', isGrantable }],\n }));\n};\n\n// Map object type to the corresponding grant/revoke key\nconst objectTypeToKey: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n 'tables' | 'sequences' | 'functions' | 'types' | 'schemas' | 'largeObjects'\n> = {\n TABLES: 'tables',\n SEQUENCES: 'sequences',\n FUNCTIONS: 'functions',\n TYPES: 'types',\n SCHEMAS: 'schemas',\n LARGE_OBJECTS: 'largeObjects',\n};\n\n// Split privilege configs into regular and grantable privilege names\nconst splitPrivilegeConfigs = (\n configs: DbStructure.DefaultPrivilegeConfig[],\n): { regular: string[]; grantable: string[] } => {\n const regular: string[] = [];\n const grantable: string[] = [];\n for (const p of configs) {\n if (p.isGrantable) {\n grantable.push(p.privilege);\n } else {\n regular.push(p.privilege);\n }\n }\n return { regular, grantable };\n};\n\n// Create a setting object from regular and grantable privilege arrays\nconst createPrivilegeSetting = (\n regular: string[],\n grantable: string[],\n): { privileges?: string[]; grantablePrivileges?: string[] } => {\n const setting: { privileges?: string[]; grantablePrivileges?: string[] } = {};\n if (regular.length) setting.privileges = regular;\n if (grantable.length) setting.grantablePrivileges = grantable;\n return setting;\n};\n\n// Collapse privilege configs into ALL if all expected privileges are present.\n// Mutates newPrivilegeConfigs by pushing the result.\nconst collapsePrivileges = (\n privs: DbStructure.DefaultPrivilegeConfig[],\n newPrivilegeConfigs: DbStructure.DefaultPrivilegeConfig[],\n expectedPrivs: string[],\n isGrantable: boolean,\n): void => {\n const hasAll = privs.some((p) => p.privilege === 'ALL');\n const allPresent =\n hasAll ||\n (privs.length > 0 &&\n privs.length === expectedPrivs.length &&\n expectedPrivs.every((priv) => privs.some((p) => p.privilege === priv)));\n\n if (allPresent) {\n newPrivilegeConfigs.push({ privilege: 'ALL', isGrantable });\n } else if (privs.length > 0) {\n newPrivilegeConfigs.push(...privs);\n }\n};\n\n// Collapse privileges into ALL when all non-ALL privileges are present.\n// Returns a new DefaultPrivilege with collapsed privileges.\nconst collapsePrivilegesToAll = (\n privilege: DbStructure.DefaultPrivilege,\n objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >,\n): DbStructure.DefaultPrivilege => {\n const collapsedObjectConfigs = privilege.objectConfigs.map(\n (objConfig): DbStructure.DefaultPrivilegeObjectConfig => {\n const allPrivileges = objectTypeToAllPrivileges[objConfig.object];\n const expectedPrivs = allPrivileges.filter((p) => p !== 'ALL');\n\n // Group privilege configs by isGrantable using imperative loop\n const regularPrivs: DbStructure.DefaultPrivilegeConfig[] = [];\n const grantablePrivs: DbStructure.DefaultPrivilegeConfig[] = [];\n for (const p of objConfig.privilegeConfigs) {\n if (p.isGrantable) {\n grantablePrivs.push(p);\n } else {\n regularPrivs.push(p);\n }\n }\n\n const newPrivilegeConfigs: DbStructure.DefaultPrivilegeConfig[] = [];\n\n // Collapse regular privileges to ALL if all are present\n collapsePrivileges(\n regularPrivs,\n newPrivilegeConfigs,\n expectedPrivs,\n false,\n );\n\n // Collapse grantable privileges to ALL if all are present\n collapsePrivileges(\n grantablePrivs,\n newPrivilegeConfigs,\n expectedPrivs,\n true,\n );\n\n return {\n object: objConfig.object,\n privilegeConfigs: newPrivilegeConfigs,\n };\n },\n );\n\n return {\n owner: privilege.owner,\n grantee: privilege.grantee,\n schema: privilege.schema,\n objectConfigs: collapsedObjectConfigs,\n };\n};\n\n// Check if two privilege configs match, considering ALL expansion\nconst privilegeConfigsMatch = (\n a: DbStructure.DefaultPrivilegeConfig,\n b: DbStructure.DefaultPrivilegeConfig,\n objectType: DbStructure.DefaultPrivilegeObjectConfig['object'],\n objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >,\n): boolean => {\n // Exact match\n if (a.privilege === b.privilege && a.isGrantable === b.isGrantable) {\n return true;\n }\n\n const allPrivileges = objectTypeToAllPrivileges[objectType];\n const expectedPrivs = allPrivileges.filter((p) => p !== 'ALL');\n\n // Check if a is ALL and b has all expected privileges (or vice versa)\n if (a.privilege === 'ALL' && a.isGrantable === b.isGrantable) {\n // Check if b has all expected privileges\n return expectedPrivs.includes(b.privilege);\n }\n if (b.privilege === 'ALL' && a.isGrantable === b.isGrantable) {\n // Check if a has all expected privileges\n return expectedPrivs.includes(a.privilege);\n }\n\n return false;\n};\n\n// Normalize role name by stripping quotes that may come from database introspection\nconst normalizeRoleName = (name: string): string => {\n if (name.startsWith('\"') && name.endsWith('\"')) {\n return name.slice(1, -1);\n }\n return name;\n};\n\n// Process privilege config (tables, sequences, functions, types) into object configs\nconst processPrivilegeConfig = (\n config: { privileges?: string[]; grantablePrivileges?: string[] } | undefined,\n objectType: DbStructure.DefaultPrivilegeObjectConfig['object'],\n): DbStructure.DefaultPrivilegeObjectConfig | undefined => {\n if (!config) return;\n\n const privilegeConfigs: DbStructure.DefaultPrivilegeConfig[] = [];\n if (config.privileges) {\n for (const p of config.privileges) {\n privilegeConfigs.push({ privilege: p, isGrantable: false });\n }\n }\n if (config.grantablePrivileges) {\n for (const p of config.grantablePrivileges) {\n privilegeConfigs.push({ privilege: p, isGrantable: true });\n }\n }\n if (privilegeConfigs.length) {\n return { object: objectType, privilegeConfigs };\n }\n return;\n};\n\n// Check if a default privilege object config has any privileges set\nconst hasAnyPrivilege = (\n obj: RakeDbAst.DefaultPrivilegeObjectConfig | undefined,\n): boolean => {\n if (!obj) return false;\n for (const key of ALL_OBJECT_TYPES) {\n const setting = obj[objectTypeToKey[key]];\n if (setting?.privileges?.length || setting?.grantablePrivileges?.length) {\n return true;\n }\n }\n return false;\n};\n\nexport const processDefaultPrivileges = (\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n { internal: { roles } }: ComposeMigrationParams,\n) => {\n if (!dbStructure.defaultPrivileges || !roles) return;\n\n const supportedPrivileges = getSupportedDefaultPrivileges(\n dbStructure.version,\n );\n\n const objectTypeToAllPrivileges: Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n > = {} as Record<\n DbStructure.DefaultPrivilegeObjectConfig['object'],\n readonly string[]\n >;\n\n objectTypeToAllPrivileges.TABLES = supportedPrivileges.PRIVILEGES.TABLE;\n objectTypeToAllPrivileges.SEQUENCES = supportedPrivileges.PRIVILEGES.SEQUENCE;\n objectTypeToAllPrivileges.FUNCTIONS = supportedPrivileges.PRIVILEGES.FUNCTION;\n objectTypeToAllPrivileges.TYPES = supportedPrivileges.PRIVILEGES.TYPE;\n objectTypeToAllPrivileges.SCHEMAS = supportedPrivileges.PRIVILEGES.SCHEMA;\n\n if (supportedPrivileges.PRIVILEGES.LARGE_OBJECT) {\n objectTypeToAllPrivileges.LARGE_OBJECTS =\n supportedPrivileges.PRIVILEGES.LARGE_OBJECT;\n }\n\n // Collect default privileges from code roles\n const codePrivileges: Map<string, DbStructure.DefaultPrivilege> = new Map();\n\n for (const role of roles) {\n if (!role.defaultPrivileges) continue;\n\n for (const privilege of role.defaultPrivileges) {\n const key = `${role.name}.${privilege.schema}`;\n\n const objectConfigs: DbStructure.DefaultPrivilegeObjectConfig[] = [];\n\n // Start with allGrantable or all base config\n if (privilege.allGrantable) {\n objectConfigs.push(\n ...createAllObjectConfigs(\n true,\n privilege.schema,\n supportedPrivileges,\n ),\n );\n } else if (privilege.all) {\n objectConfigs.push(\n ...createAllObjectConfigs(\n false,\n privilege.schema,\n supportedPrivileges,\n ),\n );\n }\n\n for (const objectType of ALL_OBJECT_TYPES) {\n if (\n privilege.schema &&\n (objectType === 'SCHEMAS' || objectType === 'LARGE_OBJECTS')\n ) {\n continue;\n }\n if (\n objectType === 'LARGE_OBJECTS' &&\n !supportedPrivileges.PRIVILEGES.LARGE_OBJECT\n ) {\n continue;\n }\n const key = objectTypeToKey[objectType];\n if (key in privilege) {\n const config = privilege[key as keyof typeof privilege];\n const processed = processPrivilegeConfig(config as never, objectType);\n if (processed) {\n const existingIndex = objectConfigs.findIndex(\n (o) => o.object === objectType,\n );\n if (existingIndex >= 0) {\n objectConfigs[existingIndex] = processed;\n } else {\n objectConfigs.push(processed);\n }\n }\n }\n }\n\n if (objectConfigs.length) {\n // Store code privileges as-is (don't collapse - preserve user intent)\n codePrivileges.set(key, {\n owner: undefined,\n grantee: role.name,\n schema: privilege.schema,\n objectConfigs,\n });\n }\n }\n }\n\n // Compare with database privileges and generate AST items\n const found = new Set<string>();\n\n for (const dbPrivilege of dbStructure.defaultPrivileges) {\n // Normalize grantee to handle quotes from database\n const grantee = normalizeRoleName(dbPrivilege.grantee);\n if (grantee === 'postgres') continue;\n\n const key = `${grantee}.${dbPrivilege.schema}`;\n const codePrivilege = codePrivileges.get(key);\n\n if (codePrivilege) {\n found.add(key);\n\n const grant: RakeDbAst.DefaultPrivilege['grant'] = {};\n const revoke: RakeDbAst.DefaultPrivilege['revoke'] = {};\n\n // Compare object configs for each object type\n for (const objectType of ALL_OBJECT_TYPES) {\n if (\n objectType === 'LARGE_OBJECTS' &&\n !supportedPrivileges.PRIVILEGES.LARGE_OBJECT\n ) {\n continue;\n }\n\n const dbObj = dbPrivilege.objectConfigs.find(\n (o) => o.object === objectType,\n );\n const codeObj = codePrivilege.objectConfigs.find(\n (o) => o.object === objectType,\n );\n\n const dbPrivs = dbObj?.privilegeConfigs ?? [];\n const codePrivs = codeObj?.privilegeConfigs ?? [];\n\n // Collapse db privileges for comparison (but keep original for output)\n const collapsedDbPrivilege: DbStructure.DefaultPrivilege = {\n owner: dbPrivilege.owner,\n grantee: dbPrivilege.grantee,\n schema: dbPrivilege.schema,\n objectConfigs: [{ object: objectType, privilegeConfigs: dbPrivs }],\n };\n const collapsedDbObj = collapsePrivilegesToAll(\n collapsedDbPrivilege,\n objectTypeToAllPrivileges,\n ).objectConfigs[0];\n const collapsedDbPrivs = collapsedDbObj?.privilegeConfigs ?? [];\n\n // Find privileges to grant (in code but not in collapsed db)\n const toGrant = codePrivs.filter(\n (cp) =>\n !collapsedDbPrivs.some((dp) =>\n privilegeConfigsMatch(\n cp,\n dp,\n objectType,\n objectTypeToAllPrivileges,\n ),\n ),\n );\n\n // Find privileges to revoke (in db but not in code)\n // Use original dbPrivs for output, but collapsed for comparison\n const toRevoke = dbPrivs.filter(\n (dp) =>\n !codePrivs.some((cp) =>\n privilegeConfigsMatch(\n cp,\n dp,\n objectType,\n objectTypeToAllPrivileges,\n ),\n ),\n );\n\n if (toGrant.length) {\n const { regular, grantable } = splitPrivilegeConfigs(toGrant);\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n grant[objectTypeToKey[objectType]] = setting;\n }\n }\n\n if (toRevoke.length) {\n const { regular, grantable } = splitPrivilegeConfigs(toRevoke);\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n revoke[objectTypeToKey[objectType]] = setting;\n }\n }\n }\n\n const hasGrant = hasAnyPrivilege(grant);\n const hasRevoke = hasAnyPrivilege(revoke);\n\n if (hasGrant || hasRevoke) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: grantee,\n schema: dbPrivilege.schema,\n grant: hasGrant ? grant : undefined,\n revoke: hasRevoke ? revoke : undefined,\n });\n }\n } else {\n // Revoke all existing privileges\n const revoke: RakeDbAst.DefaultPrivilege['revoke'] = {};\n\n for (const obj of dbPrivilege.objectConfigs) {\n const { regular, grantable } = splitPrivilegeConfigs(\n obj.privilegeConfigs,\n );\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n revoke[objectTypeToKey[obj.object]] = setting;\n }\n }\n\n if (hasAnyPrivilege(revoke)) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: grantee,\n schema: dbPrivilege.schema,\n revoke,\n });\n }\n }\n }\n\n // Grant privileges that are in code but not in db\n for (const [key, codePrivilege] of codePrivileges) {\n if (found.has(key)) continue;\n\n const grant: RakeDbAst.DefaultPrivilege['grant'] = {};\n\n for (const obj of codePrivilege.objectConfigs) {\n const { regular, grantable } = splitPrivilegeConfigs(\n obj.privilegeConfigs,\n );\n const setting = createPrivilegeSetting(regular, grantable);\n if (setting.privileges || setting.grantablePrivileges) {\n grant[objectTypeToKey[obj.object]] = setting;\n }\n }\n\n if (hasAnyPrivilege(grant)) {\n ast.push({\n type: 'defaultPrivilege',\n grantee: codePrivilege.grantee,\n schema: codePrivilege.schema,\n grant,\n });\n }\n }\n};\n","import { QueryInternal, Adapter } from 'pqb/internal';\nimport {\n RakeDbAst,\n IntrospectedStructure,\n makeDomainsMap,\n StructureToAstCtx,\n astToMigration,\n} from 'rake-db';\nimport { processSchemas } from './generators/schemas.generator';\nimport { processExtensions } from './generators/extensions.generator';\nimport { processDomains } from './generators/domains.generator';\nimport { processEnums } from './generators/enums.generator';\nimport { processTables } from './generators/tables.generator';\nimport { CodeItems } from './generate';\nimport { RakeDbConfig } from 'rake-db';\nimport { processRoles } from './generators/roles.generator';\nimport { processDefaultPrivileges } from './generators/default-privilege.generator';\n\nexport interface ComposeMigrationParams {\n structureToAstCtx: StructureToAstCtx;\n codeItems: CodeItems;\n currentSchema: string;\n internal: QueryInternal;\n verifying?: boolean;\n}\n\n/**\n * This is needed to compare SQLs of table expressions.\n * Need to exclude table columns of pending types, such as enums or domains,\n * that aren't created yet from the SQL comparison.\n * Otherwise, the comparison fails because of the unknown types.\n */\nexport class PendingDbTypes {\n set = new Set<string>();\n add(schemaName: string | undefined = 'public', name: string) {\n this.set.add(`\"${schemaName}\".\"${name}\"`);\n }\n}\n\nexport const composeMigration = async (\n adapter: Adapter,\n config: RakeDbConfig,\n ast: RakeDbAst[],\n dbStructure: IntrospectedStructure,\n params: ComposeMigrationParams,\n): Promise<string | undefined> => {\n const { structureToAstCtx, currentSchema } = params;\n\n await processRoles(ast, dbStructure, params);\n\n processDefaultPrivileges(ast, dbStructure, params);\n\n const domainsMap = makeDomainsMap(structureToAstCtx, dbStructure);\n\n await processSchemas(ast, dbStructure, params);\n processExtensions(ast, dbStructure, params);\n\n const pendingDbTypes = new PendingDbTypes();\n\n await processDomains(\n ast,\n adapter,\n domainsMap,\n dbStructure,\n params,\n pendingDbTypes,\n );\n await processEnums(ast, dbStructure, params, pendingDbTypes);\n\n await processTables(\n ast,\n domainsMap,\n adapter,\n dbStructure,\n config,\n params,\n pendingDbTypes,\n );\n\n return astToMigration(currentSchema, config, ast);\n};\n","import { Adapter } from 'pqb/internal';\nimport {\n createMigrationInterface,\n ChangeCallback,\n introspectDbSchema,\n RakeDbConfig,\n} from 'rake-db';\nimport { composeMigration, ComposeMigrationParams } from './composeMigration';\nimport { AbortSignal } from './generate';\n\nconst rollbackErr = new Error('Rollback');\n\nexport const verifyMigration = async (\n adapter: Adapter,\n config: RakeDbConfig,\n migrationCode: string,\n generateMigrationParams: ComposeMigrationParams,\n roles?: { whereSql?: string },\n defaultPrivileges?: { loadDefaultPrivileges?: boolean },\n): Promise<string | false | undefined> => {\n const migrationFn = new Function('change', migrationCode);\n\n let code: string | false | undefined;\n\n try {\n await adapter.transaction(async (trx) => {\n const changeFns: ChangeCallback<unknown>[] = [];\n migrationFn((changeCb: ChangeCallback<unknown>) => {\n changeFns.push(changeCb);\n });\n\n const { log } = config;\n config.log = false;\n\n const db = createMigrationInterface(trx, true, config).getDb(\n config.columnTypes,\n );\n\n config.log = log;\n\n for (const changeFn of changeFns) {\n await changeFn(db, true);\n }\n\n const dbStructure = await introspectDbSchema(trx, {\n roles,\n loadDefaultPrivileges: defaultPrivileges?.loadDefaultPrivileges,\n });\n generateMigrationParams.verifying = true;\n\n try {\n code = await composeMigration(\n trx,\n config,\n [],\n dbStructure,\n generateMigrationParams,\n );\n } catch (err) {\n if (err instanceof AbortSignal) {\n code = false;\n throw rollbackErr;\n }\n throw err;\n }\n\n throw rollbackErr;\n });\n } catch (err) {\n if (err !== rollbackErr) {\n throw err;\n }\n }\n\n return code;\n};\n","import { RakeDbConfig, RakeDbAst, getSchemaAndTableFromName } from 'rake-db';\nimport {\n exhaustive,\n pluralize,\n addCode,\n Code,\n codeToString,\n ColumnToCodeCtx,\n toArray,\n toCamelCase,\n colors,\n} from 'pqb/internal';\nimport { getColumnDbType } from './generators/columns.generator';\nimport { fnOrTableToString } from './generators/foreignKeys.generator';\n\nexport const report = (\n ast: RakeDbAst[],\n config: RakeDbConfig,\n currentSchema: string,\n) => {\n if (!config.logger) return;\n\n const code: Code[] = [];\n\n let green, red, yellow, pale;\n if (typeof config.log === 'object' && config.log.colors === false) {\n green = red = yellow = pale = (s: string) => s;\n } else {\n ({ green, red, yellow, pale } = colors);\n }\n\n for (const a of ast) {\n switch (a.type) {\n case 'table': {\n let hasPrimaryKey = !!a.primaryKey;\n const counters = {\n column: 0,\n index: a.indexes?.length ?? 0,\n exclude: a.excludes?.length ?? 0,\n 'foreign key':\n a.constraints?.reduce<number>(\n (sum, c) => (c.references ? sum + 1 : sum),\n 0,\n ) ?? 0,\n check:\n a.constraints?.reduce<number>(\n (sum, c) => (c.check ? sum + 1 : sum),\n 0,\n ) ?? 0,\n };\n for (const key in a.shape) {\n counters.column++;\n\n const column = a.shape[key];\n if (column.data.primaryKey) {\n hasPrimaryKey = true;\n }\n\n if (column.data.indexes) {\n counters.index += column.data.indexes.length;\n }\n\n if (column.data.excludes) {\n counters.exclude += column.data.excludes.length;\n }\n\n if (column.data.foreignKeys) {\n counters['foreign key'] += column.data.foreignKeys.length;\n }\n\n if (column.data.checks) {\n counters.check += column.data.checks.length;\n }\n }\n\n const summary: string[] = [];\n\n for (const key in counters) {\n const value = counters[key as keyof typeof counters];\n if (value || key === 'column') {\n summary.push(\n `${value} ${pluralize(key, value, key === 'index' ? 'es' : 's')}`,\n );\n }\n }\n\n if (!hasPrimaryKey) {\n summary.push('no primary key');\n }\n\n code.push(\n `${\n a.action === 'create'\n ? green('+ create table')\n : red('- drop table')\n } ${dbItemName(a, currentSchema)} (${summary.join(', ')})`,\n );\n break;\n }\n case 'changeTable': {\n const inner: Code[] = [];\n\n const toCodeCtx: ColumnToCodeCtx = {\n t: 't',\n table: a.name,\n currentSchema,\n migration: true,\n snakeCase: config.snakeCase,\n };\n\n for (const key in a.shape) {\n const changes = toArray(a.shape[key]);\n for (const change of changes) {\n if (change.type === 'add' || change.type === 'drop') {\n const column = change.item;\n const { primaryKey, indexes, excludes, foreignKeys, checks } =\n column.data;\n\n inner.push(\n `${\n change.type === 'add'\n ? green('+ add column')\n : red('- drop column')\n } ${key} ${\n column.data.alias ?? getColumnDbType(column, currentSchema)\n }${column.data.isNullable ? ' nullable' : ''}${\n primaryKey ? ' primary key' : ''\n }${\n foreignKeys\n ? ` references ${foreignKeys\n .map((fk) => {\n return `${fnOrTableToString(\n fk.fnOrTable,\n )}(${fk.foreignColumns.join(', ')})`;\n })\n .join(', ')}`\n : ''\n }${\n indexes?.length\n ? indexes.length === 1\n ? ', has index'\n : `, has ${indexes.length} indexes`\n : ''\n }${\n excludes?.length\n ? excludes.length === 1\n ? ', has exclude'\n : `, has ${excludes.length} excludes`\n : ''\n }${\n checks?.length\n ? `, checks ${checks\n .map((check) => check.sql.toSQL({ values: [] }))\n .join(', ')}`\n : ''\n }`,\n );\n } else if (change.type === 'change') {\n let name = change.from.column?.data.name ?? key;\n if (config.snakeCase) name = toCamelCase(name);\n\n const changes: Code[] = [];\n inner.push(`${yellow('~ change column')} ${name}:`, changes);\n changes.push(`${yellow('from')}: `);\n\n const fromCode = change.from.column?.toCode(toCodeCtx, key);\n if (fromCode) {\n for (const code of fromCode) {\n addCode(changes, code);\n }\n }\n\n changes.push(` ${yellow('to')}: `);\n\n const toCode = change.to.column?.toCode(toCodeCtx, key);\n if (toCode) {\n for (const code of toCode) {\n addCode(changes, code);\n }\n }\n } else if (change.type === 'rename') {\n inner.push(\n `${yellow('~ rename column')} ${\n config.snakeCase ? toCamelCase(key) : key\n } ${yellow('=>')} ${change.name}`,\n );\n } else {\n exhaustive(change.type);\n }\n }\n }\n\n if (a.drop.primaryKey) {\n inner.push(\n `${red(`- drop primary key`)} on (${a.drop.primaryKey.columns.join(\n ', ',\n )})`,\n );\n }\n\n if (a.drop.indexes) {\n for (const index of a.drop.indexes) {\n inner.push(\n `${red(\n `- drop${index.options.unique ? ' unique' : ''} index`,\n )} on (${index.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.drop.excludes) {\n for (const exclude of a.drop.excludes) {\n inner.push(\n `${red(`- drop exclude`)} on (${exclude.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.drop.constraints) {\n for (const { references } of a.drop.constraints) {\n if (!references) continue;\n\n const [schema, name] = getSchemaAndTableFromName(\n currentSchema,\n references.fnOrTable as string,\n );\n\n inner.push(\n `${red(`- drop foreign key`)} on (${references.columns.join(\n ', ',\n )}) to ${dbItemName(\n {\n schema,\n name,\n },\n currentSchema,\n )}(${references.foreignColumns.join(', ')})`,\n );\n }\n\n for (const { check } of a.drop.constraints) {\n if (!check) continue;\n\n inner.push(`${red(`- drop check`)} ${check.toSQL({ values: [] })}`);\n }\n }\n\n if (a.add.primaryKey) {\n inner.push(\n `${green(`+ add primary key`)} on (${a.add.primaryKey.columns.join(\n ', ',\n )})`,\n );\n }\n\n if (a.add.indexes) {\n for (const index of a.add.indexes) {\n inner.push(\n `${green(\n `+ add${index.options.unique ? ' unique' : ''} index`,\n )} on (${index.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.add.excludes) {\n for (const exclude of a.add.excludes) {\n inner.push(\n `${green(`+ add exclude`)} on (${exclude.columns\n .map((c) => ('column' in c ? c.column : c.expression))\n .join(', ')})`,\n );\n }\n }\n\n if (a.add.constraints) {\n for (const { references } of a.add.constraints) {\n if (!references) continue;\n\n inner.push(\n `${green(`+ add foreign key`)} on (${references.columns.join(\n ', ',\n )}) to ${\n references.fnOrTable as string\n }(${references.foreignColumns.join(', ')})`,\n );\n }\n\n for (const { check } of a.add.constraints) {\n if (!check) continue;\n\n inner.push(\n `${green(`+ add check`)} ${check.toSQL({ values: [] })}`,\n );\n }\n }\n\n code.push(\n `${yellow('~ change table')} ${dbItemName(a, currentSchema)}${\n inner.length ? ':' : ''\n }`,\n );\n\n if (inner.length) {\n code.push(inner);\n }\n\n break;\n }\n case 'schema': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create schema')\n : red('- drop schema')\n } ${a.name}`,\n );\n break;\n }\n case 'renameSchema': {\n code.push(\n `${yellow('~ rename schema')} ${a.from} ${yellow('=>')} ${a.to}`,\n );\n break;\n }\n case 'renameType': {\n code.push(\n `${yellow(\n `~ ${\n a.fromSchema !== a.toSchema\n ? a.from !== a.to\n ? 'change schema and rename'\n : 'change schema of'\n : 'rename'\n } ${a.kind.toLowerCase()}`,\n )} ${dbItemName(\n {\n schema: a.fromSchema,\n name: a.from,\n },\n currentSchema,\n )} ${yellow('=>')} ${dbItemName(\n {\n schema: a.toSchema,\n name: a.to,\n },\n currentSchema,\n )}`,\n );\n break;\n }\n case 'extension': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create extension')\n : red('- drop extension')\n } ${dbItemName(a, currentSchema)}${\n a.version ? ` ${pale(a.version)}` : ''\n }`,\n );\n break;\n }\n case 'enum': {\n code.push(\n `${\n a.action === 'create' ? green('+ create enum') : red('- drop enum')\n } ${dbItemName(a, currentSchema)}: (${a.values.join(', ')})`,\n );\n break;\n }\n case 'enumValues': {\n code.push(\n `${\n a.action === 'add'\n ? green('+ add values to enum')\n : red('- remove values from enum')\n } ${dbItemName(a, currentSchema)}: ${a.values.join(', ')}`,\n );\n break;\n }\n case 'changeEnumValues': {\n if (a.fromValues) {\n code.push(\n `${red('- remove values from enum')} ${dbItemName(\n a,\n currentSchema,\n )}: ${a.fromValues.join(', ')}`,\n );\n }\n if (a.toValues) {\n code.push(\n `${green('+ add values to enum')} ${dbItemName(\n a,\n currentSchema,\n )}: ${a.toValues.join(', ')}`,\n );\n }\n break;\n }\n case 'domain': {\n code.push(\n `${\n a.action === 'create'\n ? green('+ create domain')\n : red('- drop domain')\n } ${dbItemName(a, currentSchema)}`,\n );\n break;\n }\n case 'view':\n case 'collation':\n case 'renameEnumValues':\n case 'constraint':\n break;\n case 'renameTableItem': {\n code.push(\n `${yellow(`~ rename ${a.kind.toLowerCase()}`)} on table ${dbItemName(\n { schema: a.tableSchema, name: a.tableName },\n currentSchema,\n )}: ${a.from} ${yellow('=>')} ${a.to}`,\n );\n break;\n }\n case 'role':\n code.push(\n `${\n a.action === 'create' ? green('+ create role') : red('- drop role')\n } ${a.name}`,\n );\n break;\n case 'renameRole':\n case 'changeRole': {\n if (a.type === 'renameRole') {\n code.push(\n `${yellow('~ rename role')} ${a.from} ${yellow('=>')} ${a.to}`,\n );\n } else {\n code.push(`${yellow('~ change role')} ${a.name}`);\n }\n break;\n }\n case 'defaultPrivilege': {\n // Map privilege names for display (e.g., 'ALL' -> 'ALL PRIVILEGES')\n const mapPrivilege = (p: string) =>\n p === 'ALL' ? 'ALL PRIVILEGES' : p;\n\n const schema = a.schema\n ? ` in schema ${colors.pale(a.schema)}`\n : ` ${colors.pale('in all schemas')}`;\n\n // Report grant and revoke of default privileges\n const parts: string[] = [];\n if (a.grant) {\n for (const [objType, config] of Object.entries(a.grant)) {\n if (!config) continue;\n\n const type = objType.replace(/([A-Z])/g, ' $1').toLowerCase();\n\n // Report regular privileges separately\n if (config.privileges?.length) {\n parts.push(\n `${green('+ grant default privileges')} ${config.privileges\n .map(mapPrivilege)\n .join(', ')} on ${type} to ${a.grantee}${schema}`,\n );\n }\n\n // Report grantable privileges separately with \"with grant option\"\n if (config.grantablePrivileges?.length) {\n parts.push(\n `${green(\n '+ grant default privileges',\n )} ${config.grantablePrivileges\n .map(mapPrivilege)\n .join(', ')} on ${type} with grant option to ${\n a.grantee\n }${schema}`,\n );\n }\n }\n }\n if (a.revoke) {\n for (const [objType, config] of Object.entries(a.revoke)) {\n if (!config) continue;\n\n const type = objType.replace(/([A-Z])/g, ' $1').toLowerCase();\n\n // Report regular privileges separately\n if (config.privileges?.length) {\n parts.push(\n `${red('- revoke default privileges')} ${config.privileges\n .map(mapPrivilege)\n .join(', ')} on ${type} from ${a.grantee}${schema}`,\n );\n }\n\n // Report grantable privileges separately with \"with grant option\"\n if (config.grantablePrivileges?.length) {\n parts.push(\n `${red(\n '- revoke default privileges',\n )} ${config.grantablePrivileges\n .map(mapPrivilege)\n .join(', ')} on ${type} with grant option from ${\n a.grantee\n }${schema}`,\n );\n }\n }\n }\n if (parts.length) {\n code.push(parts.join('\\n'));\n }\n break;\n }\n default:\n exhaustive(a);\n }\n }\n\n const result = codeToString(code, '', ' ');\n config.logger.log(result);\n};\n\nconst dbItemName = (\n { schema, name }: { schema?: string; name: string },\n currentSchema: string,\n) => {\n return schema && schema !== currentSchema ? `${schema}.${name}` : name;\n};\n","import {\n Adapter,\n PickQueryShape,\n toCamelCase,\n ArrayColumn,\n ColumnsShape,\n Column,\n defaultSchemaConfig,\n DomainColumn,\n PickQueryInternal,\n QueryInternal,\n UnknownColumn,\n getQuerySchema,\n emptyObject,\n} from 'pqb/internal';\nimport { Query } from 'pqb';\nimport {\n concatSchemaAndName,\n getDbVersion,\n getSchemaAndTableFromName,\n introspectDbSchema,\n IntrospectedStructure,\n makeFileVersion,\n makeStructureToAstCtx,\n migrate,\n migrateAndClose,\n RakeDbAst,\n RakeDbConfig,\n writeMigrationFile,\n} from 'rake-db';\nimport { EnumItem } from './generators/enums.generator';\nimport { CodeDomain } from './generators/domains.generator';\nimport { composeMigration, ComposeMigrationParams } from './composeMigration';\nimport { verifyMigration } from './verify-migration';\nimport { report } from './reportGeneratedMigration';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nexport interface CodeTable extends PickQueryShape, PickQueryInternal {\n table: string;\n q: CodeTableQueryData;\n}\n\nexport interface CodeTableQueryData {\n schema?: string;\n}\n\nexport interface CodeItems {\n schemas: Set<string>;\n enums: Map<string, EnumItem>;\n tables: CodeTable[];\n domains: CodeDomain[];\n}\n\ninterface AfterPull {\n adapter: Adapter;\n version: string;\n}\n\nexport interface DbInstance {\n $qb: Query;\n}\n\nexport class AbortSignal extends Error {}\n\nexport const generate = async (\n adapters: Adapter[],\n config: RakeDbConfig,\n args: string[],\n afterPull?: AfterPull,\n): Promise<void> => {\n let { dbPath } = config;\n if (!dbPath || !config.baseTable) throw invalidConfig(config);\n if (!adapters.length) throw new Error(`Database options must not be empty`);\n\n if (!dbPath.endsWith('.ts')) dbPath += '.ts';\n\n let migrationName = args[0] ?? 'generated';\n let up: boolean;\n if (migrationName === 'up') {\n up = true;\n migrationName = 'generated';\n } else {\n up = args[1] === 'up';\n }\n\n if (afterPull) {\n adapters = [afterPull.adapter];\n }\n\n const db = await getDbFromConfig(config, dbPath);\n const { columnTypes, internal } = db.$qb;\n\n const rolesDbStructureParam = internal.roles\n ? internal.managedRolesSql\n ? { whereSql: internal.managedRolesSql }\n : emptyObject\n : undefined;\n\n const { dbStructure } = await migrateAndPullStructures(\n adapters,\n config,\n rolesDbStructureParam,\n internal.roles ? { loadDefaultPrivileges: true } : undefined,\n afterPull,\n );\n\n const [adapter] = adapters;\n const adapterSchema = adapter.getSchema();\n const currentSchema =\n (typeof adapterSchema === 'function' ? adapterSchema() : adapterSchema) ??\n 'public';\n\n const codeItems = await getActualItems(\n db,\n currentSchema,\n internal,\n columnTypes,\n );\n\n const structureToAstCtx = makeStructureToAstCtx(config, currentSchema);\n\n const generateMigrationParams: ComposeMigrationParams = {\n structureToAstCtx,\n codeItems,\n currentSchema,\n internal,\n };\n\n const ast: RakeDbAst[] = [];\n\n let migrationCode;\n try {\n migrationCode = await composeMigration(\n adapter,\n config,\n ast,\n dbStructure,\n generateMigrationParams,\n );\n } catch (err) {\n if (err instanceof AbortSignal) {\n await closeAdapters(adapters);\n return;\n }\n throw err;\n }\n\n if (migrationCode && !afterPull) {\n const result = await verifyMigration(\n adapter,\n config,\n migrationCode,\n generateMigrationParams,\n rolesDbStructureParam,\n internal.roles ? { loadDefaultPrivileges: true } : undefined,\n );\n\n if (result !== undefined) {\n throw new Error(\n `Failed to verify generated migration: some of database changes were not applied properly. This is a bug, please open an issue, attach the following migration code:\\n${migrationCode}${\n result === false ? '' : `\\nAfter applying:\\n${result}`\n }`,\n );\n }\n }\n\n const { logger } = config;\n\n if ((!up || !migrationCode) && !afterPull) await closeAdapters(adapters);\n\n if (!migrationCode) {\n logger?.log('No changes were detected');\n return;\n }\n\n const version = afterPull?.version ?? (await makeFileVersion({}, config));\n\n const delayLog: string[] = [];\n await writeMigrationFile(\n {\n ...config,\n logger: logger ? { ...logger, log: (msg) => delayLog.push(msg) } : logger,\n },\n version,\n migrationName,\n migrationCode,\n );\n\n report(ast, config, currentSchema);\n\n if (logger) {\n for (const msg of delayLog) {\n logger.log(`\\n${msg}`);\n }\n }\n\n if (up) {\n for (const adapter of adapters) {\n await migrateAndClose(adapter, config);\n }\n } else if (!afterPull) {\n await closeAdapters(adapters);\n }\n};\n\nconst invalidConfig = (config: RakeDbConfig) =>\n new Error(\n `\\`${\n config.dbPath ? 'baseTable' : 'dbPath'\n }\\` setting must be set in the migrations config for the generator to work`,\n );\n\nconst getDbFromConfig = async (\n config: RakeDbConfig,\n dbPath: string,\n): Promise<DbInstance> => {\n const module = await config.import(\n pathToFileURL(path.resolve(config.basePath, dbPath)).toString(),\n );\n const db = (module as { [K: string]: DbInstance })[\n config.dbExportedAs ?? 'db'\n ];\n if (!db?.$qb) {\n throw new Error(\n `Unable to import OrchidORM instance as ${\n config.dbExportedAs ?? 'db'\n } from ${config.dbPath}`,\n );\n }\n return db;\n};\n\nconst migrateAndPullStructures = async (\n adapters: Adapter[],\n config: RakeDbConfig,\n roles?: { whereSql?: string },\n defaultPrivileges?: { loadDefaultPrivileges?: boolean },\n afterPull?: AfterPull,\n): Promise<{\n dbStructure: IntrospectedStructure;\n}> => {\n if (afterPull) {\n const version = await getDbVersion(adapters[0]);\n\n return {\n dbStructure: {\n version,\n schemas: [],\n tables: [],\n views: [],\n indexes: [],\n excludes: [],\n constraints: [],\n triggers: [],\n extensions: [],\n enums: [],\n domains: [],\n collations: [],\n },\n };\n }\n\n for (const adapter of adapters) {\n await migrate(adapter, config);\n }\n\n const dbStructures = await Promise.all(\n adapters.map((adapter) =>\n introspectDbSchema(adapter, {\n roles,\n loadDefaultPrivileges: defaultPrivileges?.loadDefaultPrivileges,\n }),\n ),\n );\n\n const dbStructure = dbStructures[0];\n for (let i = 1; i < dbStructures.length; i++) {\n compareDbStructures(dbStructure, dbStructures[i], i);\n }\n\n return { dbStructure };\n};\n\nconst compareDbStructures = (\n a: unknown,\n b: unknown,\n i: number,\n path?: string,\n) => {\n let err: true | undefined;\n if (typeof a !== typeof b) {\n err = true;\n }\n\n if (!a || typeof a !== 'object') {\n if (a !== b) {\n err = true;\n }\n } else {\n if (Array.isArray(a)) {\n for (let n = 0, len = a.length; n < len; n++) {\n compareDbStructures(\n a[n],\n (b as unknown[])[n],\n i,\n path ? `${path}[${n}]` : String(n),\n );\n }\n } else {\n for (const key in a) {\n compareDbStructures(\n a[key as keyof typeof a],\n (b as Record<string, unknown>)[key],\n i,\n path ? `${path}.${key}` : key,\n );\n }\n }\n }\n\n if (err) {\n throw new Error(`${path} in the db 0 does not match db ${i}`);\n }\n};\n\nconst getActualItems = async (\n db: DbInstance,\n currentSchema: string,\n internal: QueryInternal,\n columnTypes: unknown,\n): Promise<CodeItems> => {\n const tableNames = new Set<string>();\n const habtmTables = new Map<string, CodeTable>();\n\n const codeItems: CodeItems = {\n schemas: new Set(undefined),\n enums: new Map(),\n tables: [],\n domains: [],\n };\n\n codeItems.schemas.add(currentSchema);\n\n const domains = new Map<string, CodeDomain>();\n\n for (const key in db) {\n if (key[0] === '$') continue;\n\n const table = db[key as keyof typeof db] as Query;\n\n if (!table.table) {\n throw new Error(`Table ${key} is missing table property`);\n }\n\n const schema = getQuerySchema(table);\n const name = concatSchemaAndName({ schema, name: table.table });\n if (tableNames.has(name)) {\n throw new Error(`Table ${name} is defined more than once`);\n }\n\n tableNames.add(name);\n\n if (schema) codeItems.schemas.add(schema);\n\n codeItems.tables.push({\n table: table.table as string,\n shape: table.shape,\n internal: table.internal,\n q: {\n schema: getQuerySchema(table),\n },\n });\n\n for (const key in table.relations) {\n const column = table.shape[key];\n // column won't be set for has and belongs to many\n if (column && 'joinTable' in column) {\n processHasAndBelongsToManyColumn(column, habtmTables, codeItems);\n }\n }\n\n for (const key in table.shape) {\n const column = table.shape[key] as Column;\n // remove computed columns from the shape\n if (column.data.computed) {\n delete table.shape[key];\n } else if (column instanceof DomainColumn) {\n const [schemaName = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n column.dataType,\n );\n domains.set(column.dataType, {\n schemaName,\n name,\n column: (column.data.as ??\n new UnknownColumn(defaultSchemaConfig)) as Column,\n });\n } else {\n const en =\n column.dataType === 'enum'\n ? column\n : column instanceof ArrayColumn &&\n column.data.item.dataType === 'enum'\n ? column.data.item\n : undefined;\n\n if (en) {\n processEnumColumn(en, currentSchema, codeItems);\n }\n }\n }\n }\n\n if (internal.extensions) {\n for (const extension of internal.extensions) {\n const [schema] = getSchemaAndTableFromName(currentSchema, extension.name);\n if (schema) codeItems.schemas.add(schema);\n }\n }\n\n if (internal.domains) {\n for (const key in internal.domains) {\n const [schemaName = currentSchema, name] = getSchemaAndTableFromName(\n currentSchema,\n key,\n );\n const column = internal.domains[key](columnTypes);\n\n domains.set(key, {\n schemaName,\n name,\n column,\n });\n }\n }\n\n for (const domain of domains.values()) {\n codeItems.schemas.add(domain.schemaName);\n codeItems.domains.push(domain);\n }\n\n // Add schemas from role default privileges to prevent them from being dropped\n if (internal.roles) {\n for (const role of internal.roles) {\n if (role.defaultPrivileges) {\n for (const privilege of role.defaultPrivileges) {\n if (privilege.schema) codeItems.schemas.add(privilege.schema);\n }\n }\n }\n }\n\n return codeItems;\n};\n\nconst processEnumColumn = (\n column: Column.Pick.QueryColumn,\n currentSchema: string,\n codeItems: CodeItems,\n) => {\n const { enumName, options } = column as unknown as {\n enumName: string;\n options: [string, ...string[]];\n };\n\n const [schema, name] = getSchemaAndTableFromName(currentSchema, enumName);\n const enumSchema = schema ?? currentSchema;\n\n codeItems.enums.set(`${enumSchema}.${name}`, {\n schema: enumSchema,\n name,\n values: options,\n });\n if (schema) codeItems.schemas.add(schema);\n};\n\nconst processHasAndBelongsToManyColumn = (\n column: Column.Pick.QueryColumn & { joinTable: unknown },\n habtmTables: Map<string, CodeTable>,\n codeItems: CodeItems,\n) => {\n const q = (column as { joinTable: CodeTable }).joinTable;\n const prev = habtmTables.get(q.table);\n if (prev) {\n for (const key in q.shape) {\n if (q.shape[key].dataType !== prev.shape[key]?.dataType) {\n throw new Error(\n `Column ${key} in ${q.table} in hasAndBelongsToMany relation does not match with the relation on the other side`,\n );\n }\n }\n return;\n }\n habtmTables.set(q.table, q);\n\n const joinTable = Object.create(q);\n\n const shape: ColumnsShape = {};\n for (const key in joinTable.shape) {\n const column = Object.create(joinTable.shape[key]);\n column.data = {\n ...column.data,\n name: column.data.name ?? key,\n identity: undefined,\n primaryKey: undefined,\n default: undefined,\n };\n shape[toCamelCase(key)] = column;\n }\n joinTable.shape = shape;\n joinTable.internal = {\n ...joinTable.internal,\n tableData: {\n ...joinTable.internal.tableData,\n primaryKey: {\n columns: Object.keys(shape),\n },\n },\n noPrimaryKey: false,\n };\n\n codeItems.tables.push(joinTable);\n\n return;\n};\n\nconst closeAdapters = (adapters: Adapter[]) => {\n return Promise.all(adapters.map((x) => x.close()));\n};\n","import {\n columnsShapeToCode,\n pushTableDataCode,\n TableData,\n Code,\n codeToString,\n getImportPath,\n RecordString,\n singleQuote,\n toCamelCase,\n toPascalCase,\n} from 'pqb/internal';\nimport { RakeDbAst, RakeDbConfig } from 'rake-db';\nimport path from 'node:path';\n\ninterface TableInfo {\n key: string;\n dbTableName: string;\n name: string;\n className: string;\n path: string;\n}\n\ninterface TableInfos {\n [dbTableName: string]: TableInfo;\n}\n\nexport interface AppCodeGenTable extends TableInfo {\n content: string;\n}\n\nexport interface AppCodeGenTables {\n [K: string]: AppCodeGenTable;\n}\n\ninterface FKeys {\n [K: string]: { table: TableInfo; references: TableData.References }[];\n}\n\nexport const getTableInfosAndFKeys = (\n asts: RakeDbAst[],\n config: RakeDbConfig,\n): { tableInfos: TableInfos; fkeys: FKeys } => {\n const generateTableTo =\n config.generateTableTo ?? ((name: string) => `./tables/${name}.table.ts`);\n\n const tableInfos: TableInfos = {};\n const fkeys: FKeys = {};\n for (const ast of asts) {\n if (ast.type === 'table') {\n const tableKey = toCamelCase(ast.name);\n const dbTableName = ast.schema ? `${ast.schema}.${ast.name}` : ast.name;\n let tablePath = path.resolve(config.basePath, generateTableTo(tableKey));\n if (!tablePath.endsWith('.ts')) tablePath += '.ts';\n\n const name = toPascalCase(ast.name);\n\n const info: TableInfo = {\n dbTableName,\n key: tableKey,\n path: tablePath,\n name,\n className: `${name}Table`,\n };\n\n tableInfos[dbTableName] = info;\n\n if (ast.constraints) {\n for (const { references } of ast.constraints) {\n if (!references) continue;\n\n (fkeys[references.fnOrTable as string] ??= []).push({\n table: info,\n references,\n });\n }\n }\n }\n }\n\n return { tableInfos, fkeys };\n};\n\nexport const appCodeGenTable = (\n tableInfos: TableInfos,\n fkeys: FKeys,\n ast: RakeDbAst.Table,\n baseTablePath: string,\n baseTableExportedAs: string,\n currentSchema: string,\n): AppCodeGenTable => {\n const tableInfo =\n tableInfos[ast.schema ? `${ast.schema}.${ast.name}` : ast.name];\n\n const imports: RecordString = {\n 'orchid-orm': 'Selectable, Insertable, Updatable',\n [getImportPath(tableInfo.path, baseTablePath)]: baseTableExportedAs,\n };\n\n const props: Code[] = [];\n\n if (ast.schema) {\n props.push(`schema = ${singleQuote(ast.schema)};`);\n }\n\n props.push(`readonly table = ${singleQuote(ast.name)};`);\n\n if (ast.comment) {\n props.push(`comment = ${singleQuote(ast.comment)};`);\n }\n\n if (ast.noPrimaryKey === 'ignore') {\n props.push('noPrimaryKey = true;');\n }\n\n const hasTableData = Boolean(\n ast.primaryKey ||\n ast.indexes?.length ||\n ast.excludes?.length ||\n ast.constraints?.length,\n );\n\n const shapeCode = columnsShapeToCode(\n { t: 't', table: ast.name, currentSchema },\n ast.shape,\n );\n\n props.push(\n `columns = this.setColumns(${hasTableData ? '\\n ' : ''}(t) => ({`,\n hasTableData ? [shapeCode] : shapeCode,\n hasTableData ? ' }),' : '}));',\n );\n\n if (hasTableData) {\n props.push(pushTableDataCode([], ast), ');');\n }\n\n const relations: Code[] = [];\n\n const fullTableName = ast.schema ? `${ast.schema}.${ast.name}` : ast.name;\n const belongsTo = fkeys[fullTableName];\n if (belongsTo) {\n for (const { table, references } of belongsTo) {\n imports[getImportPath(tableInfo.path, table.path)] = table.className;\n\n relations.push(\n `${table.key}: this.belongsTo(() => ${table.className}, {`,\n [\n `columns: [${references.foreignColumns\n .map(singleQuote)\n .join(', ')}],`,\n `references: [${references.columns.map(singleQuote).join(', ')}],`,\n ],\n '}),',\n );\n }\n }\n\n if (ast.constraints) {\n for (const { references } of ast.constraints) {\n if (!references) continue;\n\n const table = tableInfos[references.fnOrTable as string];\n imports[getImportPath(tableInfo.path, table.path)] = table.className;\n\n relations.push(\n `${table.key}: this.hasMany(() => ${table.className}, {`,\n [\n `columns: [${references.columns.map(singleQuote).join(', ')}],`,\n `references: [${references.foreignColumns\n .map(singleQuote)\n .join(', ')}],`,\n ],\n '}),',\n );\n }\n }\n\n if (relations.length) {\n props.push('', 'relations = {', relations, '};');\n }\n\n const importsCode = importsToCode(imports);\n\n const { name, className } = tableInfo;\n const code: Code[] = [\n `export type ${name} = Selectable<${className}>;\nexport type ${name}New = Insertable<${className}>;\nexport type ${name}Update = Updatable<${className}>;\n\nexport class ${className} extends ${baseTableExportedAs} {`,\n props,\n '}\\n',\n ];\n\n return {\n ...tableInfo,\n content: importsCode + '\\n\\n' + codeToString(code, '', ' '),\n };\n};\n\nfunction importsToCode(imports: Record<string, string>): string {\n return Object.entries(imports)\n .map(([from, name]) => `import { ${name} } from '${from}';`)\n .join('\\n');\n}\n","import fs from 'node:fs/promises';\nimport {\n CallExpression,\n Expression,\n ImportDeclaration,\n NamedImports,\n NodeArray,\n ObjectLiteralExpression,\n Statement,\n VariableStatement,\n} from 'typescript';\nimport { AppCodeGenTables } from './tables.appCodeGenerator';\nimport {\n DbExtension,\n getImportPath,\n quoteObjectKey,\n singleQuote,\n} from 'pqb/internal';\nimport { RakeDbAst } from 'rake-db';\n\n// importing directly won't work after compiling\nimport typescript from 'typescript';\nconst { createSourceFile, ScriptTarget, SyntaxKind } = typescript;\n\ntype Change = [from: number, to: number] | string;\n\nexport const appCodeGenUpdateDbFile = async (\n dbPath: string,\n tables: AppCodeGenTables,\n extensions: DbExtension[],\n domains: RakeDbAst.Domain[],\n currentSchema: string,\n): Promise<string | undefined> => {\n const content = await fs.readFile(dbPath, 'utf-8');\n const statements = getTsStatements(content);\n const importName = getOrchidOrmImportName(statements);\n if (!importName) {\n throw new Error(`Main file does not contain import of orchid-orm`);\n }\n const { config, tablesList } = getOrchidOrmArgs(importName, statements);\n\n const changes: Change[] = [];\n\n let replacedConfig: string | undefined;\n if (extensions.length || domains.length) {\n let code = content.slice(config.pos, config.end).trim();\n\n if (code[0] !== '{') code = `{...${code}}`;\n\n code = '{\\n ' + code.slice(1, -1).trim();\n\n if (!code.endsWith(',')) code += ',';\n\n if (extensions.length) {\n code += `\\n extensions: [${extensions\n .map((ext) =>\n ext.version\n ? `{ ${quoteObjectKey(ext.name, false)}: '${ext.version}' }`\n : singleQuote(ext.name),\n )\n .join(', ')}],`;\n }\n\n if (domains.length) {\n code += `\\n domains: {\\n ${domains\n .sort((a, b) => (a.name > b.name ? 1 : -1))\n .map(\n (ast) =>\n `${quoteObjectKey(\n ast.schema ? `${ast.schema}.${ast.name}` : ast.name,\n false,\n )}: (t) => ${ast.baseType.toCode(\n { t: 't', table: ast.name, currentSchema },\n ast.baseType.data.name ?? '',\n )},`,\n )\n .join('\\n ')}\\n },`;\n }\n\n replacedConfig = code + '\\n}';\n }\n\n const tablesChanges = makeTablesListChanges(\n content,\n statements,\n tablesList,\n tables,\n dbPath,\n );\n\n if (tablesChanges) {\n addChange(\n content,\n changes,\n tablesChanges.imports.pos,\n tablesChanges.imports.text,\n );\n }\n\n if (replacedConfig) {\n replaceContent(content, changes, config.pos, config.end, replacedConfig);\n }\n\n if (tablesChanges) {\n addChange(\n content,\n changes,\n tablesChanges.tablesList.pos,\n tablesChanges.tablesList.text,\n );\n }\n\n return applyChanges(content, changes);\n};\n\nconst getTsStatements = (content: string): NodeArray<Statement> => {\n return createSourceFile('file.ts', content, ScriptTarget.Latest, true)\n .statements;\n};\n\nconst getOrchidOrmImportName = (\n statements: NodeArray<Statement>,\n): string | undefined => {\n for (const node of statements) {\n if (node.kind !== SyntaxKind.ImportDeclaration) continue;\n\n const imp = node as ImportDeclaration;\n const source = imp.moduleSpecifier.getText().slice(1, -1);\n if (source !== 'orchid-orm') continue;\n\n if (!imp.importClause) continue;\n\n const elements = (imp.importClause.namedBindings as NamedImports)?.elements;\n\n if (!elements) imp;\n\n for (const element of elements) {\n if (\n element.name.escapedText === 'orchidORM' ||\n (element.propertyName &&\n 'escapedText' in element.propertyName &&\n element.propertyName.escapedText === 'orchidORM')\n ) {\n return element.name.escapedText.toString();\n }\n }\n }\n\n return;\n};\n\nconst makeTablesListChanges = (\n content: string,\n statements: NodeArray<Statement>,\n object: ObjectLiteralExpression,\n tables: AppCodeGenTables,\n dbPath: string,\n) => {\n const spaces = getTablesListSpaces(content, object);\n\n let imports = '';\n let tablesList = '';\n const prependComma =\n object.properties.length && !object.properties.hasTrailingComma;\n const tablesListNewLine = content\n .slice(object.properties.end, object.end)\n .includes('\\n');\n\n const tablesArr = Object.values(tables);\n for (let i = 0; i < tablesArr.length; i++) {\n const { path, className, key } = tablesArr[i];\n const importPath = getImportPath(dbPath, path);\n\n imports += `\\nimport { ${className} } from '${importPath}';`;\n\n tablesList += `${\n i === 0 && prependComma ? ',' : ''\n }\\n${spaces} ${key}: ${className},`;\n\n if (i === tablesArr.length - 1 && !tablesListNewLine) {\n tablesList += `\\n${spaces}`;\n }\n }\n\n if (!imports.length) return;\n\n let importPos = 0;\n for (const node of statements) {\n if (node.kind === SyntaxKind.ImportDeclaration) {\n importPos = node.end;\n }\n }\n\n return {\n imports: { pos: importPos, text: imports },\n tablesList: { pos: object.properties.end, text: tablesList },\n };\n};\n\nconst getTablesListSpaces = (content: string, object: Expression): string => {\n const lines = content.slice(0, object.end).split('\\n');\n const last = lines[lines.length - 1];\n return last.match(/^\\s+/)?.[0] || '';\n};\n\nconst getOrchidOrmArgs = (\n importName: string,\n statements: NodeArray<Statement>,\n): { config: Expression; tablesList: ObjectLiteralExpression } => {\n for (const v of statements) {\n if (v.kind !== SyntaxKind.VariableStatement) continue;\n\n for (const node of (v as VariableStatement).declarationList.declarations) {\n const call = node.initializer as CallExpression;\n if (call?.kind !== SyntaxKind.CallExpression) continue;\n\n if (call.expression.getText() !== importName) continue;\n\n if (call.arguments.length !== 2) {\n throw new Error(\n 'Invalid number of arguments when initializing orchid orm',\n );\n }\n\n const object = call.arguments[1] as ObjectLiteralExpression;\n if (object?.kind !== SyntaxKind.ObjectLiteralExpression) {\n throw new Error(\n 'Second argument of orchidORM must be an object literal',\n );\n }\n\n return { config: call.arguments[0], tablesList: object };\n }\n }\n\n throw new Error('List of tables is not found in main file');\n};\n\nconst addChange = (\n content: string,\n changes: Change[],\n at: number,\n text: string,\n end = at,\n) => {\n if (changes.length === 0) {\n changes.push([0, at], text, [end, content.length]);\n } else {\n const last = changes[changes.length - 1] as [number, number];\n last[1] = at;\n changes.push(text, [end, content.length]);\n }\n};\n\nconst replaceContent = (\n content: string,\n changes: Change[],\n from: number,\n to: number,\n text: string,\n) => {\n addChange(content, changes, from, text, to);\n};\n\nconst applyChanges = (content: string, changes: Change[]) => {\n return changes.length\n ? changes\n .map((item) =>\n typeof item === 'string' ? item : content.slice(item[0], item[1]),\n )\n .join('')\n : content;\n};\n","import { DbExtension, Adapter, pathToLog } from 'pqb/internal';\nimport {\n makeFileVersion,\n makeStructureToAstCtx,\n RakeDbAst,\n RakeDbConfig,\n saveMigratedVersion,\n SilentQueries,\n structureToAst,\n} from 'rake-db';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n AppCodeGenTable,\n appCodeGenTable,\n AppCodeGenTables,\n getTableInfosAndFKeys,\n} from './appCodeGenerators/tables.appCodeGenerator';\nimport { appCodeGenUpdateDbFile } from './appCodeGenerators/dbFile.appCodeGenerator';\nimport { generate } from '../generate/generate';\n\nexport const pull = async (adapters: Adapter[], config: RakeDbConfig) => {\n if (!config.dbPath || !config.baseTable) {\n throw new Error(\n `\\`${\n config.dbPath ? 'baseTable' : 'dbPath'\n }\\` setting must be set in the migrations config for pull command`,\n );\n }\n\n const baseTablePath = config.baseTable.getFilePath();\n const baseTableExportedAs = config.baseTable.exportAs;\n\n const [adapter] = adapters;\n const adapterSchema = adapter.getSchema();\n const currentSchema =\n (typeof adapterSchema === 'function' ? adapterSchema() : adapterSchema) ??\n 'public';\n\n const ctx = makeStructureToAstCtx(config, currentSchema);\n\n const asts = await structureToAst(ctx, adapter, config);\n\n const { tableInfos, fkeys } = getTableInfosAndFKeys(asts, config);\n\n const exclusiveWriteOptions = { flag: 'wx' as const };\n const pendingFileWrites: [\n path: string,\n content: string,\n options?: { flag: 'wx' },\n ][] = [];\n\n const tables: AppCodeGenTables = {};\n const extensions: DbExtension[] = [];\n const domains: RakeDbAst.Domain[] = [];\n\n let firstTable: undefined | AppCodeGenTable;\n for (const ast of asts) {\n switch (ast.type) {\n case 'table': {\n const table = appCodeGenTable(\n tableInfos,\n fkeys,\n ast,\n baseTablePath,\n baseTableExportedAs,\n currentSchema,\n );\n tables[table.key] = table;\n if (!firstTable) firstTable = table;\n pendingFileWrites.push([\n table.path,\n table.content,\n exclusiveWriteOptions,\n ]);\n break;\n }\n case 'extension': {\n extensions.push({\n name: ast.schema ? `${ast.schema}.${ast.name}` : ast.name,\n version: ast.version,\n });\n break;\n }\n case 'domain': {\n domains.push(ast);\n break;\n }\n }\n }\n\n if (!firstTable && !extensions.length && !domains.length) {\n await adapter.close();\n return;\n }\n\n let dbPath = path.resolve(config.basePath, config.dbPath);\n if (!dbPath.endsWith('.ts')) dbPath += '.ts';\n const content = await appCodeGenUpdateDbFile(\n dbPath,\n tables,\n extensions,\n domains,\n currentSchema,\n );\n if (content) pendingFileWrites.push([dbPath, content]);\n\n if (firstTable) {\n await fs.mkdir(path.dirname(firstTable.path), { recursive: true });\n }\n\n await Promise.all(\n pendingFileWrites.map(([path, content, options]) =>\n fs.writeFile(path, content, options).then(() => {\n config.logger?.log(`Created ${pathToLog(path)}`);\n }),\n ),\n );\n\n const version = await makeFileVersion({}, config);\n await generate(adapters, config, ['pull'], { adapter, version });\n\n // save migrated version into all configured databases\n await Promise.all(\n adapters.map(async (adapter) => {\n const silentAdapter = adapter as unknown as SilentQueries;\n silentAdapter.silentArrays = adapter.arrays;\n await saveMigratedVersion(silentAdapter, version, 'pull.ts', config);\n await adapter.close();\n }),\n );\n};\n","import { rakeDbCommands } from 'rake-db';\nimport { generate } from './generate/generate';\nimport { pull } from './pull/pull';\n\nlet patched = false;\nexport const patchRakeDb = () => {\n if (patched) {\n return;\n }\n\n patched = true;\n\n rakeDbCommands.g = rakeDbCommands.generate = {\n run: generate,\n help: 'gen migration from OrchidORM tables',\n helpArguments: {\n 'no arguments': '\"generated\" is a default file name',\n 'migration-name': 'set migration file name',\n up: 'auto-apply migration',\n 'migration-name up': 'with a custom name and apply it',\n },\n helpAfter: 'reset',\n };\n\n rakeDbCommands.pull.run = pull;\n rakeDbCommands.pull.help =\n 'generate ORM tables and a migration for an existing database';\n};\n","import { patchRakeDb as patch } from './patch-rake-db';\nexport * from './patch-rake-db-types';\nexport * from 'rake-db';\n\npatch();\n\nexport const patchRakeDb = patch;\n"],"mappings":"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"}