orchid-orm 1.68.1 → 1.68.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["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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"}
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(undefined, undefined, 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":";;;;;;;AAiBA,MAAa,wBAAwB,OACnC,kBACA,YACG;AACH,KAAI,CAAC,iBAAiB,OAAQ;CAE9B,IAAI,KAAK;AACT,MAAK,MAAM,EAAE,QAAQ,SAAS,YAAY,kBAAkB;EAC1D,MAAM,WAAW,gBAAgB;EACjC,MAAM,SAAoB,EAAE;EAI5B,MAAM,kBAAkB;GACtB,yBAAyB,SAAS,cAAc,QAC7C,KACE,EAAE,MAAM,UAAU,MACjB,GAAG,KAAK,aAAa,EAAE,MAAM,OAC1B,KACE,GAAG,MACF,IACE,OAAO,MAAM,WAAW,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAChD,aAAa,EAAE,GAAG,EAAE,IACxB,CACA,KAAK,KAAK,GAChB,CACA,KAAK,KAAK,CAAC,QAAQ,OAAO;GAC7B,0BAA0B,SAAS;GACnC,aAAa;GACd,CAAC,KAAK,KAAK;EAEZ,MAAM,SAAS,MAAM,QAAQ,MAAM,iBAAiB,QAAQ,SAAS,CAAC,MACnE,QAAS,IAAiC,IAC3C,OAAO,QAAQ;AAGb,OAAI,IAAI,SAAS,QACf,OAAM;IAGX;AAED,MAAI,CAAC,QAAQ;AACX,WAAQ;AACR;;AAOF,SAJc,2BACZ,OAAO,KAAK,GAAG,GACf,QAAQ,GAAG,OACZ,CACY;;;AAIjB,MAAa,8BACX,WACA,WACG;CACH,IAAI,MAAM;CACV,MAAM,MAAM;CACZ,IAAI;CACJ,IAAI,OAAO;CACX,IAAI,QAAQ;CACZ,MAAM,UAAU,OAAO,UAAU,KAAK;AACtC,QAAQ,QAAQ,IAAI,KAAK,UAAU,EAAG;EACpC,MAAM,MAAM,UAAU,MAAM,KAAK,IAAI,YAAY,MAAM,GAAG,OAAO,CAAC,MAAM;AAExE,MADY,MAAM,GAAG,MAAM,IAAI,CACvB,WAAW,GAAG;AACpB,UAAO;AACP,WAAQ;SACH;AACL,OACE,SAAS,OAGT,EACE,KAAK,WAAW,IAAI,IACpB,KAAK,SAAS,IAAI,IAClB,KAAK,MAAM,GAAG,GAAG,KAAK,QAExB,EAAE,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,MAAM,GAAG,GAAG,KAAK,MAEnE,SAAQ,SAAS;AAEnB;;AAEF,QAAM,IAAI;;CAGZ,MAAM,gBAAgB,QAAQ,QAAQ,KAAK;AAC3C,QAAO,kBAAkB,KAAK,KAAA,IAAY;;AAG5C,MAAa,wBACX,MACA,MACA,MACA,cACoB;AACpB,KAAI,UAAW,OAAM,IAAI,aAAa;CAEtC,IAAI,UAAU,KAAK,SAAS;AAC5B,MAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK;AACrC,MAAI,QAAQ,QAAS,WAAU;;CAGjC,IAAI,MAAM;CACV,MAAM,MAAM,KAAK,SAAS;AAC1B,MAAK,MAAM,QAAQ,KACjB,KAAI,KAAK,SAAS,MAAM,IACtB,OAAM,KAAK,SAAS;CAIxB,MAAM,gBAAgB,UAAU;AAEhC,QAAO,aAAa;EAClB,SAAS,oBAAoB,OAAO,SAClC,KACD,CAAC,GAAG,KAAK,gBAAgB,KAAK;EAC/B,SAAS,CACP,GAAG,OAAO,UAAU,IAAI,CAAC,GAAG,KAAK,IAAI,OAAO,KAC1C,UAAU,OAAO,SACf,UAAU,cAAc,SAAS,KAAK,SAAS,GAC/C,IACD,CACF,IACD,GAAG,KAAK,KACL,MACC,GAAG,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,WACvC,KACD,CAAC,GAAG,KAAK,IAAI,OAAO,KACnB,cAAc,SACZ,UAAU,cAAc,SAAS,EAAE,SAAS,KAAK,SAAS,GAC1D,IACD,CACF,GACJ,CACF;EACF,CAAC;;AAGJ,MAAa,2BACX,OACA,QACG;CACH,MAAM,OAAO,MAAM;AACnB,KAAI,KACF,QACE,SACC,MAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,SAAS,KAAK,SAAS;AAIjE,MAAK,MAAM,KAAK,OAAO;EACrB,MAAM,OAAO,MAAM;AACnB,MACE,MAAM,QAAQ,KAAK,GACf,KAAK,MACF,UACE,KAAK,SAAS,SAAS,KAAK,SAAS,WACtC,KAAK,KAAK,KAAK,SAAS,IAC3B,IACA,KAAK,SAAS,SAAS,KAAK,SAAS,WACtC,KAAK,KAAK,KAAK,SAAS,IAE5B,QAAO;;AAIX,QAAO;;ACzLT,MAAa,iBAAiB,OAC5B,KACA,aACA,EACE,WAAW,EAAE,WACb,WACA,UAAU,EAAE,mBACZ,oBAEgB;CAClB,MAAM,gBAA0B,EAAE;CAClC,MAAM,cAAwB,EAAE;AAEhC,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,YAAY,QAAQ,SAAS,OAAO,CACvC,eAAc,KAAK,OAAO;AAI9B,MAAK,MAAM,UAAU,YAAY,QAC/B,KACE,CAAC,QAAQ,IAAI,OAAO,IACpB,WAAW,YACX,WAAW,iBACX,CAAC,iBAAiB,SAAS,SAAS,OAAO,CAE3C,aAAY,KAAK,OAAO;AAI5B,MAAK,MAAM,UAAU,eAAe;AAClC,MAAI,YAAY,QAAQ;GACtB,MAAM,IAAI,MAAM,qBACd,UACA,QACA,aACA,UACD;AACD,OAAI,GAAG;IACL,MAAM,OAAO,YAAY,IAAI;AAC7B,gBAAY,OAAO,IAAI,GAAG,EAAE;AAE5B,6BAAyB,YAAY,QAAQ,MAAM,OAAO;AAC1D,6BAAyB,YAAY,OAAO,MAAM,OAAO;AACzD,6BAAyB,YAAY,SAAS,MAAM,OAAO;AAC3D,6BAAyB,YAAY,UAAU,MAAM,OAAO;AAC5D,6BAAyB,YAAY,aAAa,MAAM,OAAO;AAC/D,6BAAyB,YAAY,UAAU,MAAM,OAAO;AAC5D,6BAAyB,YAAY,OAAO,MAAM,OAAO;AACzD,6BAAyB,YAAY,SAAS,MAAM,OAAO;AAC3D,6BAAyB,YAAY,YAAY,MAAM,OAAO;AAE9D,SAAK,MAAM,SAAS,YAAY,OAC9B,MAAK,MAAM,UAAU,MAAM,QACzB,KAAI,OAAO,eAAe,KACxB,QAAO,aAAa;AAK1B,QAAI,KAAK;KACP,MAAM;KACN;KACA,IAAI;KACL,CAAC;AACF;;;AAIJ,MAAI,KAAK;GACP,MAAM;GACN,QAAQ;GACR,MAAM;GACP,CAAC;;AAGJ,MAAK,MAAM,UAAU,YACnB,KAAI,KAAK;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACP,CAAC;;AAIN,MAAM,4BACJ,OACA,MACA,OACG;AACH,MAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,eAAe,KACtB,MAAK,aAAa;;ACnFxB,MAAa,qBACX,KACA,aACA,EACE,eACA,UAAU,EAAE,YAAY,wBAEvB;CACH,MAAM,iBAAiB,YAAY,KAAK,QAAmB;EACzD,MAAM,CAAC,QAAQ,QAAQ,0BAA0B,eAAe,IAAI,KAAK;AACzE,SAAO;GAAE;GAAQ;GAAM,SAAS,IAAI;GAAS;GAC7C;AAEF,MAAK,MAAM,SAAS,YAAY,YAAY;AAC1C,MACE,iBAAiB,SAAS,SAAS,MAAM,WAAW,IACpD,iBAAiB,YAAY,SAAS,MAAM,KAAK,CAEjD;AAGF,MAAI,gBAAgB;GAClB,IAAI,QAAQ;AACZ,QAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;IAC9C,MAAM,UAAU,eAAe;AAC/B,QACE,MAAM,SAAS,QAAQ,QACvB,MAAM,gBAAgB,QAAQ,UAAU,mBACvC,CAAC,QAAQ,WAAW,QAAQ,YAAY,MAAM,UAC/C;AACA,aAAQ;AACR,oBAAe,OAAO,GAAG,EAAE;AAC3B;;;AAIJ,OAAI,MAAO;;AAGb,MAAI,KAAK;GACP,MAAM;GACN,QAAQ;GACR,QAAQ,MAAM,eAAe,gBAAgB,KAAA,IAAY,MAAM;GAC/D,MAAM,MAAM;GACZ,SAAS,MAAM;GAChB,CAAC;;AAGJ,KAAI,gBAAgB,OAClB,KAAI,KACF,GAAG,eAAe,KAAK,SAAS;EAC9B,MAAM;EACN,QAAQ;EACR,GAAG;EACJ,EAAE,CACJ;;AC7BL,MAAa,iBAAiB,OAC5B,SACA,QACA,mBACA,aACA,YACA,iBACA,KACA,eACA,YACA,gBACA,cACG;CACH,MAAM,EAAE,YAAY;CACpB,MAAM,YAAY,OAAO,YACvB,QAAQ,QAAQ,KAAK,WAAW,CAAC,OAAO,MAAM,OAAO,CAAC,CACvD;CAED,MAAM,EAAE,cAAc,eAAe,oBAAoB,aACvD,mBACA,aACA,YACA,WACA,gBACD;AAED,OAAM,mBACJ,QACA,aACA,iBACA,cACA,eACA,iBACA,UACD;AAED,OAAM,cACJ,SACA,QACA,mBACA,aACA,YACA,KACA,eACA,WACA,iBACA,YACA,iBACA,gBACA,UACD;AAED,aAAY,iBAAiB,cAAc;;AAK7C,MAAM,gBACJ,mBACA,aACA,YACA,WACA,oBAKG;CACH,MAAM,eAAkD,EAAE;CAC1D,MAAM,gBAAmD,EAAE;CAC3D,MAAM,kCAAmC,IAAI,KAAK;CAClD,MAAM,0CAA0B,IAAI,KAAmB;CAEvD,MAAM,EAAE,WAAW,SAAS,gBAAgB;CAC5C,MAAM,SAAS,wBAAwB,gBAAgB,YAAY;AAEnE,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,UAAU,MAAM;AAE/B,MAAI,CAAC,OAAO,SAAU;EAEtB,MAAM,OAAO,OAAO,KAAK,QAAQ;AACjC,MAAI,UAAU,OAAO;AACnB,mBAAgB,IAAI,KAAK;IAAE;IAAK,QAAQ;IAAM;IAAQ,CAAC;AACvD,2BAAwB,IAAI,MAAM,KAAK;QAEvC,cAAa,KAAK;GAAE;GAAK;GAAQ,CAAC;;AAItC,MAAK,MAAM,QAAQ,WAAW;AAC5B,MAAI,wBAAwB,IAAI,KAAK,CAAE;EAEvC,MAAM,CAAC,KAAK,UAAU,cACpB,mBACA,aACA,YACA,QAAQ,MACR,UAAU,OACV,SACA,aACA,OACD;AAED,gBAAc,KAAK;GAAE;GAAK;GAAQ,CAAC;;AAGrC,QAAO;EACL;EACA;EACA;EACD;;AAGH,MAAM,qBAAqB,OACzB,QACA,aACA,EACE,aACA,QACA,gBAAgB,EAAE,MAAM,WAAW,WAErC,cACA,eACA,iBACA,cACG;AACH,MAAK,MAAM,EAAE,KAAK,YAAY,cAAc;AAC1C,MAAI,cAAc,QAAQ;GACxB,MAAM,WAAW,OAAO,KAAK,QAAQ;GACrC,MAAM,IAAI,MAAM,qBACd,UACA,UACA,cAAc,KAAK,MAAM,EAAE,IAAI,EAC/B,UACD;AACD,OAAI,GAAG;IACL,MAAM,OAAO,cAAc,IAAI;AAC/B,kBAAc,OAAO,IAAI,GAAG,EAAE;IAE9B,MAAM,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK;AAC3C,oBAAgB,IAAI,MAAM;KACxB;KACA,QAAQ;KACR,QAAQ,OAAO,KAAK,SAAS;KAC9B,CAAC;IAEF,MAAM,KAAK,OAAO,YAAY,YAAY,IAAI,GAAG;AAEjD,QAAI,YAAY,WACd,cAAa,YAAY,WAAW,SAAS,MAAM,GAAG;AAGxD,SAAK,MAAM,SAAS,YAAY,QAC9B,MAAK,MAAM,UAAU,MAAM,QACzB,KAAI,YAAY,UAAU,OAAO,WAAW,KAC1C,QAAO,SAAS;AAKtB,SAAK,MAAM,WAAW,YAAY,SAChC,MAAK,MAAM,UAAU,QAAQ,QAC3B,KAAI,YAAY,UAAU,OAAO,WAAW,KAC1C,QAAO,SAAS;AAKtB,SAAK,MAAM,KAAK,YAAY,aAAa;AACvC,SAAI,EAAE,OAAO,QACX,cAAa,EAAE,MAAM,SAAS,MAAM,GAAG;AAEzC,SAAI,EAAE,WACJ,cAAa,EAAE,WAAW,SAAS,MAAM,GAAG;;AAIhD,SAAK,MAAM,KAAK,YAAY,YAC1B,KACE,EAAE,cACF,EAAE,WAAW,kBAAkB,UAC/B,EAAE,WAAW,iBAAiB,UAE9B,cAAa,EAAE,WAAW,gBAAgB,MAAM,GAAG;AAIvD;;;AAIJ,QAAM,OAAO;GACX,MAAM;GACN,MAAM;GACP;;;AAIL,MAAM,eACJ,EAAE,gBAAgB,EAAE,WACpB,kBACG;AACH,MAAK,MAAM,EAAE,KAAK,YAAY,cAC5B,OAAM,OAAO;EACX,MAAM;EACN,MAAM;EACP;;AAIL,MAAM,gBAAgB,OACpB,SACA,QACA,mBACA,aACA,YACA,KACA,eACA,WACA,iBACA,YACA,iBACA,gBACA,cACG;AACH,MAAK,MAAM,CACT,KACA,EAAE,KAAK,SAAS,QAAQ,QAAQ,iBAC7B,iBAAiB;EACpB,MAAM,oBAAoB,UAAU;EAEpC,MAAM,WAAW,oBACf,mBACA,aACA,YACA,kBACD;EAED,MAAM,SAAS,MAAM,eACnB,SACA,YACA,KACA,eACA,YACA,iBACA,gBACA,WACA,KACA,QACA,UACA,WACD;AAED,MAAI,WAAW,SACb,cAAa,iBAAiB,KAAK,QAAQ,UAAU,WAAW;WACvD,WAAW,WACpB,iBAAgB,eAAe,MAAM,OAAO,CAC1C;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;WACQ,WAAW,YAAY;GAChC,MAAM,KAAK,WAAW,KAAK,QAAQ;AACnC,OAAI,WAAW,GACb,iBAAgB,eAAe,MAC7B,OAAO,YACH,WAAW,YAAY,QAAQ,GAC7B,UACA,SACF,UACF;IACF,MAAM;IACN,MAAM,OAAO,YACT,OAAO,YAAY,QAAQ,GACzB,UACA,KACF;IACL;;;;AAMT,MAAM,iBAAiB,OACrB,SACA,YACA,KACA,eACA,YACA,iBACA,gBACA,WACA,KACA,QACA,UACA,eAC+C;AAC/C,KAAI,oBAAoB,eAAe,sBAAsB,aAAa;AACxE,aAAW,SAAS,KAAK;AACzB,eAAa,WAAW,KAAK;;CAG/B,MAAM,SAAS,gBAAgB,UAAU,cAAc;CACvD,MAAM,WAAW,gBAAgB,YAAY,cAAc;AAE3D,KAAI,WAAW,UAAU;EACvB,MAAM,YAAY,MAAM,aAAa,SAAS,eAAe;EAE7D,MAAM,aAAa,kBAAkB,UAAU,YAAY,OAAO;EAClE,MAAM,eAAe,kBAAkB,YAAY,YAAY,SAAS;AAExE,MAAI,CAAC,UAAU,IAAI,WAAW,EAAE,IAAI,aAAa;OAE7C,EAAE,oBAAoB,eACtB,EAAE,sBAAsB,eACxB,CAAC,YAAY,SAAS,SAAS,WAAW,QAAQ,EAClD;AACA,QAAI,UAAW,OAAM,IAAI,aAAa;AActC,QAXc,MAAM,aAAa;KAC/B,SAAS,uBAFO,oBAAoB,gBAAgB,eAAe,CAEzB,YAAY,IAAI,QAAQ,OAAO,MAAM;KAC/E,SAAS,CACP,GAAG,OAAO,WACR,MACD,CAAC,8CAA8C,OAAO,IACrD,OACD,IACD,2BACD;KACF,CAAC,CAEA,OAAM,IAAI,aAAa;AAGzB,aAAS,KAAK,OAAO,WAAW,KAAK;AACrC,WAAO;;;AAIX,SAAO;;CAGT,MAAM,SAAS,SAAS;CACxB,MAAM,WAAW,WAAW;AAE5B,MAAK,MAAM,OAAO,CAAC,cAAc,UAAU,CACzC,KAAI,OAAO,SAAS,SAAS,KAC3B,QAAO;AAIX,MAAK,MAAM,OAAO;EAChB;EACA;EACA;EACA;EACA;EACA;EACD,CAGC,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,KAC9C,QAAO;AAIX,KAAI,SAAS,KAAK,gBAAgB;EAChC,MAAM,EAAE,WAAW,SAAS;AAC5B,MAAI,WAAW,KAAA,KAAa,WAAW,IAAI;GACzC,MAAM,IAAI,WAAW,SAAS,QAAQ,IAAI;AAC1C,OAAI,MAAM,MAAM,WAAW,SAAS,MAAM,IAAI,GAAG,GAAG,KAAK,GAAG,SAC1D,QAAO;;;AAKb,KACE,CAAC,YACC,OAAO,UACP,SAAS,WACL;EACE,QAAQ;EACR,OAAO;EACP,WAAW;EACX,OAAO;EACP,OAAO;EACP,GAAI,SAAS,YAAY,EAAE;EAC5B,GACD,KAAA,EACL,CAED,QAAO;AAGT,KAAI,OAAO,YAAY,KAAA,KAAa,SAAS,YAAY,KAAA,GAAW;EAClE,MAAM,kBAAkB,WAAW,OAAO;EAC1C,MAAM,YAAY,oBAChB,OAAO,SACP,WAAW,QACX,SACD;EACD,MAAM,WAAW,WAAW,OAAO,MAAM,gBAAgB;EAEzD,MAAM,cAAc,oBAClB,SAAS,SACT,WAAW,QACX,WACD;EACD,MAAM,aAAa,WAAW,OAAO,MAAM,gBAAgB;AAE3D,MACE,SAAS,WAAW,WAAW,UAC9B,SAAS,UACR,KAAK,UAAU,SAAS,KAAK,KAAK,UAAU,WAAW,EACzD;AACA,cAAW,OAAO,SAAS;AAC3B,UAAO;aACE,cAAc,eAAe,cAAc,IAAI,YAAY,IAAI;GACxE,MAAM,eAAe;AACnB,iBAAa,iBAAiB,KAAK,QAAQ,UAAU,WAAW;AAChE,QAAI,CAAC,gBAAgB,WAAW;AAC9B,qBAAgB,YAAY;AAC5B,SAAI,KAAK,gBAAgB,eAAe;;;AAI5C,cAAW,YAAY,KAAK;IAC1B,MAAM;IACN,QAAQ;IACR;IACD,CAAC;;;;AAOR,MAAM,eAAe,OACnB,SACA,mBACG;CACH,IAAI,YAAY,eAAe;AAC/B,KAAI,CAAC,WAAW;EACd,MAAM,EAAE,SAAS,MAAM,QAAQ,OAAO;;;yCAGD;EAErC,MAAM,kCAAkB,IAAI,KAA0B;AACtD,OAAK,MAAM,CAAC,QAAQ,WAAW,MAAM;GACnC,MAAM,MAAM,gBAAgB,IAAI,OAAO;AACvC,OAAI,IACF,KAAI,IAAI,OAAO;OAEf,iBAAgB,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;;AAIlD,8BAAY,IAAI,KAA0B;AAC1C,OAAK,MAAM,CAAC,MAAM,cAAc,gBAAgB,SAAS,EAAE;GACzD,MAAM,MAAM,IAAI,IAAY,UAAU;AACtC,aAAU,IAAI,MAAM,IAAI;AAExB,QAAK,MAAM,WAAW,WAAW;IAC/B,MAAM,SAAS,gBAAgB,IAAI,QAAQ;AAC3C,QAAI,OACF,MAAK,MAAM,QAAQ,OACjB,KAAI,IAAI,KAAK;;;AAMrB,iBAAe,QAAQ;;AAGzB,QAAO;;AAGT,MAAM,gBACJ,iBACA,KACA,QACA,UACA,eACG;AACH,UAAS,KAAK,KAAK,WAAW,KAAK,KAAK,KAAA;CAExC,MAAM,mBAAmB,OAAO,OAAO,WAAW;AAClD,kBAAiB,OAAO;EACtB,GAAG,WAAW;EACd,YAAY,KAAA;EACZ,SAAS,KAAA;EACT,UAAU,KAAA;EACV,aAAa,KAAA;EACb,OAAO,KAAA;EACR;AAED,iBAAgB,gBAAgB,UAAU;EACxC,MAAM;EACN,IAAI;EACL;AAED,iBAAgB,eAAe,MAAM,OAAO;EAC1C,MAAM;EACN,MAAM,EAAE,QAAQ,UAAU;EAC1B,IAAI,EAAE,QAAQ,kBAAkB;EACjC;;AAGH,MAAa,mBACX,QACA,kBACG;AACH,KAAI,kBAAkB,YAAY;EAChC,MAAM,CAAC,SAAS,eAAe,QAAQ,0BACrC,eACA,OAAO,SACR;AACD,SAAO,GAAG,OAAO,GAAG;YACX,kBAAkB,aAAa;EACxC,MAAM,EAAE,SAAS,OAAO;EACxB,IAAI,OAAO,gBAAgB,aAAa,KAAK,WAAW,KAAK;AAE7D,SAAO,KAAK,WAAW,gBAAgB,IAAI,GACvC,KAAK,MAAM,cAAc,SAAS,EAAE,GACpC;AAEJ,SAAO,OAAO,KAAK,OAAO,OAAO,KAAK,UAAU;YACvC,OAAO,KAAK,gBAAgB;EACrC,IAAI,OAAO,OAAO;EAElB,MAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,MAAI,MAAM,GACR,QAAO,KAAK,MAAM,GAAG,EAAE;AAGzB,SAAO,KAAK,SAAS,IAAI,GAAG,OAAO,gBAAgB,MAAM;OAEzD,QAAO,OAAO;;AAIlB,MAAM,gBAAgB,SAAmB,MAAc,OAAe;AACpE,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,KAAI,QAAQ,OAAO,KACjB,SAAQ,KAAK;;ACniBnB,MAAa,iBAAiB,OAC5B,KACA,SACA,YACA,aACA,EACE,WAAW,EAAE,WACb,mBACA,eACA,UAAU,EAAE,qBAEd,mBACG;CACH,MAAM,cAAkC,EAAE;AAC1C,KAAI,QACF,MAAK,MAAM,EAAE,YAAY,MAAM,YAAY,QACzC,aAAY,KACV,qBAAqB,eAAe,YAAY,MAAM,OAAO,CAC9D;CAIL,MAAM,mBAAsC,EAAE;CAC9C,MAAM,kCAAkB,IAAI,KAAuB;AAEnD,MAAK,MAAM,UAAU,YAAY,SAAS;AACxC,MACE,iBAAiB,SAAS,SAAS,OAAO,WAAW,IACrD,iBAAiB,SAAS,SAAS,OAAO,KAAK,CAE/C;EAGF,MAAM,WAAW,oBACf,mBACA,aACA,YACA;GAGE,YAAY,OAAO;GACnB,WAAW;GACX,MAAM,OAAO;GACb,YAAY,OAAO;GACnB,MAAM,OAAO;GACb,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB,YAAY,OAAO;GACnB,SAAS,OAAO;GAChB,UAAU,OAAO;GACjB,QAAQ;GACT,CACF;AAED,MAAI,OAAO,OACT,UAAS,KAAK,SAAS,OAAO,OAAO,KAAK,WAAW,EACnD,KAAK,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,CAAmC,EAC7D,EAAE;EAGL,MAAM,WAAW,qBACf,eACA,OAAO,YACP,OAAO,MACP,SACD;EAED,MAAM,QAAQ,YAAY,QAAQ,eAChC,YAAY,SAAS,SAAS,WAAW,QAAQ,CAClD;AAED,OAAK,OAAO,WAAW,OAAO,QAAQ,WAAW,MAAM,QAAQ;AAC7D,QAAK,MAAM,cAAc,MACvB,iBAAgB,IAAI,WAAW;GAGjC,MAAM,UAAwC,EAAE;AAChD,sBAAmB,SAAS,QAAQ,MAAM;AAC1C,qBAAkB,SAAS,QAAQ,MAAM;GAEzC,MAAM,SAAS,kBAAkB,gBAC/B,UACA,cACD,CAAC;AAEF,oBAAiB,KAAK;IACpB;IACA;IACA,OAAO,GAAG;KACR,MAAM,aAAa,MAAM,KAAA,IAAY,KAAA,IAAY,MAAM;AACvD,SAAI,CAAC,WACH,KAAI,KAAK,QAAQ,SAAS,CAAC;SAE3B,iBAAgB,OAAO,WAAW;;IAGvC,CAAC;aACO,MAAM,QAAQ;GACvB,IAAI,IAAI,YAAY,WACjB,eACC,WAAW,SAAS,SAAS,QAC7B,WAAW,eAAe,SAAS,WACtC;AACD,OAAI,MAAM,IAAI;AACZ,QAAI;IACJ,MAAM,QAAQ,MAAM;AACpB,QAAI,KAAK;KACP,MAAM;KACN,MAAM;KACN,YAAY,SAAS;KACrB,MAAM,SAAS;KACf,UAAU,MAAM;KAChB,IAAI,MAAM;KACX,CAAC;AACF,mBAAe,IAAI,MAAM,YAAY,MAAM,KAAK;;AAGlD,eAAY,OAAO,GAAG,EAAE;QAExB,KAAI,KAAK,QAAQ,SAAS,CAAC;;AAI/B,MAAK,MAAM,cAAc,YACvB,KAAI,CAAC,gBAAgB,IAAI,WAAW,EAAE;AACpC,MAAI,KAAK,UAAU,WAAW,CAAC;AAC/B,iBAAe,IAAI,WAAW,YAAY,WAAW,KAAK;;AAI9D,KAAI,iBAAiB,QAAQ;AAC3B,QAAM,sBAAsB,kBAAkB,QAAQ;AAEtD,MAAI,gBAAgB,KAClB,MAAK,MAAM,cAAc,gBAAgB,MAAM,EAAE;AAC/C,OAAI,KAAK,UAAU,WAAW,CAAC;AAC/B,kBAAe,IAAI,WAAW,YAAY,WAAW,KAAK;;;;AAMlE,MAAM,wBACJ,eACA,YACA,MACA,WACqB;CACrB,IAAI,YAAY;CAChB,MAAM,aAAa,OAAO,KAAK,cAAc;CAC7C,IAAI,QAAQ;AACZ,QAAO,iBAAiB,aAAa;AACnC,UAAQ,MAAM,KAAK;AACnB;;CAGF,MAAM,CAAC,aAAa,cAAc,QAAQ,0BACxC,eAFe,gBAAgB,OAAO,cAAc,CAIrD;AAED,QAAO;EACL;EACA;EACA;EACA,SAAS;GACP;GACA;GACA;GACA;GACA,UAAU,MAAM,KAAK;GACrB,kBAAkB,MAAM,KAAK;GAC7B,cAAc,MAAM,KAAK;GACzB,mBAAmB,MAAM,KAAK;GAC9B,SAAS,OAAO,KAAK;GACrB,YAAY,OAAO,KAAK,YAAY,KAAA;GACpC,WAAW,CAAC,CAAC,OAAO,KAAK,QAAQ;GAClC;EACF;;AAGH,MAAM,sBACJ,SACA,QACA,UACG;AACH,KAAI,OAAO,QACT,SAAQ,KAAK;EACX,MAAM,OAAO;EACb,QAAQ,MAAM,KAAK,eAAe;GAChC,MAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,OAAI,SAAU,MACZ,QAAQ,MAA4B;AAEtC,UAAO;IACP;EACH,CAAC;;AAIN,MAAM,qBACJ,SACA,QACA,UACG;AACH,KAAI,OAAO,QAAQ,QAAQ;EACzB,MAAM,SAAS,MAAM,SAClB,eACC,WAAW,OAAO,KAAK,QAAQ,KAAK,UAClC,OAAO,UAAU,WAAW,QAAQ,MAAM,IAC3C,IAAI,WACR;AAED,UAAQ,KACN,GAAG,OAAO,OAAO,KAAK,WAAW;GAC/B,MAAM;GACN;GACD,EAAE,CACJ;;;AAIL,MAAM,WAAW,cAAkD;CACjE,MAAM;CACN,QAAQ;CACR,QAAQ,SAAS;CACjB,MAAM,SAAS;CACf,UAAU,SAAS;CACpB;AAED,MAAM,aAAa,gBAAoD;CACrE,MAAM;CACN,QAAQ;CACR,QAAQ,WAAW;CACnB,MAAM,WAAW;CACjB,UAAU,WAAW;CACtB;AC/QD,MAAa,eAAe,OAC1B,KACA,aACA,EACE,WAAW,EAAE,SACb,eACA,WACA,UAAU,EAAE,qBAEd,mBACkB;CAClB,MAAM,cAA0B,EAAE;CAClC,MAAM,YAAgC,EAAE;AAExC,MAAK,MAAM,GAAG,aAAa,OAAO;EAChC,MAAM,EAAE,SAAS,eAAe,SAAS;AAIzC,MAAI,CAHW,YAAY,MAAM,MAC9B,MAAM,EAAE,eAAe,UAAU,EAAE,SAAS,KAC9C,CAEC,aAAY,KAAK,SAAS;;AAI9B,MAAK,MAAM,UAAU,YAAY,OAAO;AACtC,MACE,iBAAiB,SAAS,SAAS,OAAO,WAAW,IACrD,iBAAiB,OAAO,SAAS,OAAO,KAAK,CAE7C;EAGF,MAAM,WAAW,MAAM,IAAI,GAAG,OAAO,WAAW,GAAG,OAAO,OAAO;AACjE,MAAI,UAAU;AACZ,cAAW,KAAK,QAAQ,UAAU,eAAe;AACjD;;EAGF,MAAM,IAAI,YAAY,WAAW,MAAM,EAAE,SAAS,OAAO,KAAK;AAC9D,MAAI,MAAM,IAAI;GACZ,MAAM,WAAW,YAAY;AAC7B,eAAY,OAAO,GAAG,EAAE;GACxB,MAAM,aAAa,OAAO;GAC1B,MAAM,WAAW,SAAS,UAAU;AAEpC,2BAAwB,aAAa,YAAY,SAAS;AAE1D,OAAI,KAAK;IACP,MAAM;IACN,MAAM;IACN;IACA,MAAM,OAAO;IACb;IACA,IAAI,OAAO;IACZ,CAAC;AACF,kBAAe,IAAI,UAAU,OAAO,KAAK;AAEzC,cAAW,KAAK,QAAQ,UAAU,eAAe;AAEjD;;AAGF,YAAU,KAAK,OAAO;;AAGxB,MAAK,MAAM,YAAY,aAAa;AAClC,MAAI,UAAU,QAAQ;GACpB,MAAM,IAAI,MAAM,qBACd,QACA,SAAS,MACT,UAAU,KAAK,MAAM,EAAE,KAAK,EAC5B,UACD;AACD,OAAI,GAAG;IACL,MAAM,SAAS,UAAU,IAAI;AAC7B,cAAU,OAAO,IAAI,GAAG,EAAE;IAE1B,MAAM,aAAa,OAAO;IAC1B,MAAM,OAAO,OAAO;IACpB,MAAM,WAAW,SAAS,UAAU;IACpC,MAAM,KAAK,SAAS;AAEpB,QAAI,eAAe,SACjB,yBAAwB,aAAa,YAAY,SAAS;AAG5D,SAAK,MAAM,SAAS,YAAY,OAC9B,MAAK,MAAM,UAAU,MAAM,QACzB,KAAI,OAAO,SAAS,KAClB,QAAO,OAAO;AAKpB,QAAI,KAAK;KACP,MAAM;KACN,MAAM;KACN;KACA;KACA;KACA;KACD,CAAC;AACF,mBAAe,IAAI,UAAU,GAAG;AAEhC,eAAW,KAAK,QAAQ,UAAU,eAAe;AAEjD;;;AAIJ,MAAI,KAAK;GACP,MAAM;GACN,QAAQ;GACR,GAAG;GACJ,CAAC;AACF,iBAAe,IAAI,SAAS,QAAQ,SAAS,KAAK;;AAGpD,MAAK,MAAM,UAAU,UACnB,KAAI,KAAK;EACP,MAAM;EACN,QAAQ;EACR,QAAQ,OAAO;EACf,MAAM,OAAO;EACb,QAAQ,OAAO;EAChB,CAAC;;AAIN,MAAM,cACJ,KACA,QACA,UACA,mBACG;CACH,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,EAAE,QAAQ,YAAY,QAAQ,SAAS;AAE7C,KAAI,SAAS,SAAS,WAAW;MAC3B,CAAC,SAAS,MAAM,UAAU,CAAC,WAAW,SAAS,MAAM,CAAC,EAAE;AAC1D,OAAI,KAAK;IACP,MAAM;IACN,QAAQ;IACR;IACA;IACA,QAAQ,WAAW,QAAQ,UAAU,CAAC,SAAS,SAAS,MAAM,CAAC;IAChE,CAAC;AACF,kBAAe,IAAI,QAAQ,KAAK;AAChC;;YAEO,SAAS,SAAS,WAAW;MAClC,CAAC,WAAW,MAAM,UAAU,CAAC,SAAS,SAAS,MAAM,CAAC,EAAE;AAC1D,OAAI,KAAK;IACP,MAAM;IACN,QAAQ;IACR;IACA;IACA,QAAQ,SAAS,QAAQ,UAAU,CAAC,WAAW,SAAS,MAAM,CAAC;IAChE,CAAC;AACF,kBAAe,IAAI,QAAQ,KAAK;AAChC;;YAEO,CAAC,SAAS,MAAM,UAAU,CAAC,WAAW,SAAS,MAAM,CAAC,CAC/D;AAGF,KAAI,KAAK;EACP,MAAM;EACN;EACA;EACA,YAAY;EACZ,UAAU;EACX,CAAC;AACF,gBAAe,IAAI,QAAQ,KAAK;;AAGlC,MAAM,2BACJ,aACA,MACA,OACG;AACH,MAAK,MAAM,SAAS,YAAY,OAC9B,MAAK,MAAM,UAAU,MAAM,QACzB,KAAI,OAAO,eAAe,KACxB,QAAO,aAAa;;AC5L5B,MAAa,qBACX,QACA,oBACG;CACH,MAAM,EAAE,cAAc;CAEtB,MAAM,oBAAqD,EAAE;AAC7D,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,OAAO,KAAK,WACd,mBAAkB,KAAK;GAAE;GAAK,MAAM,OAAO,KAAK,QAAQ;GAAK,CAAC;;AAIlE,kBAAiB,QAAQ,mBAAmB,gBAAgB;AAC5D,kBAAiB,gBAAgB;;AAGnC,MAAM,oBACJ,QACA,mBACA,EACE,WACA,aAAa,EAAE,YAAY,gBAC3B,gBAAgB,EAAE,OAAO,KAAK,QAC9B,sBAEC;CACH,MAAM,kBAAkB,UAAU,SAAS,UAAU;CACrD,MAAM,aAAa,CACjB,GAAG,IAAI,IAAI,CACT,GAAG,mBACH,IAAK,OAAO,YACR,iBAAiB,QAAQ,KAAK,SAAS;EACrC;EACA,MAAM,YAAY,IAAI;EACvB,EAAE,GACH,iBAAiB,QAAQ,KAAK,SAAS;EAAE;EAAK,MAAM;EAAK,EAAE,KAAK,EAAE,CACvE,CAAC,CACH;AAED,KACE,gBACA,WAAW,WAAW,aAAa,QAAQ,UAC3C,CAAC,WAAW,MACT,EAAE,WAAW,CAAC,aAAa,QAAQ,MAAM,WAAW,SAAS,OAAO,CACtE,EACD;AACA,MAAI,WAAW,WAAW,GAAG;GAC3B,MAAM,EAAE,QAAQ,WAAW;GAC3B,MAAM,UAAU,MAAM,QAAQ,QAAQ,MAAM,KAAK;AACjD,OAAI,QACF,MAAK,MAAM,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,SAAU;AAE9B,QAAI,OAAO,KAAK,OACd,QAAO,KAAK,OAAO,KAAK,aAAa,KAAA;AAGvC,QAAI,OAAO,GAAG,QAAQ;KACpB,MAAM,SAAS,OAAO,OAAO,OAAO,GAAG,OAAO;AAC9C,YAAO,OAAO;MAAE,GAAG,OAAO;MAAM,YAAY,KAAA;MAAW;AACvD,YAAO,GAAG,SAAS;;;;AAK3B;;CAGF,MAAM,SAAS,cAAc,QAAQ,QAClC,QAAQ,CAAC,wBAAwB,OAAO,IAAI,CAC9C;AACD,KAAI,QAAQ,OACV,KAAI,OAAO,WAAW,KAAK,gBAAgB,OAAO,KAAK;EACrD,MAAM,SAAS,gBAAgB,OAAO;AACtC,SAAO,KAAK,KAAK,aACf,cAAc,QAAS;OAEzB,MAAK,aAAa;EAAE,SAAS;EAAQ,MAAM,cAAc;EAAM;CAInE,MAAM,QAAQ,WAAW,QACtB,EAAE,UAAU,CAAC,wBAAwB,OAAO,IAAI,CAClD;AACD,KAAI,MAAM,OACR,KAAI,MAAM,WAAW,KAAK,gBAAgB,MAAM,GAAG,OAAO;EACxD,MAAM,SAAS,gBAAgB,MAAM,GAAG;AACxC,SAAO,GAAG,KAAK,aACb,iBAAiB,QAAS;OAE5B,KAAI,aAAa;EACf,SAAS,MAAM,KAAK,MAAM,EAAE,IAAI;EAChC,MAAM,iBAAiB;EACxB;;AAKP,MAAM,oBAAoB,EACxB,WACA,aAAa,EAAE,YAAY,gBAC3B,QACA,iBACqB;CACrB,MAAM,kBAAkB,UAAU,SAAS,UAAU;AACrD,KACE,gBACA,mBACA,cAAc,SAAS,iBAAiB,KAExC,YAAW,KAAK;EACd,MAAM;EACN,MAAM;EACN,aAAa;EACb,WAAW,UAAU;EACrB,MAAM,aAAa,QAAQ,GAAG,UAAU,MAAM;EAC9C,IAAI,gBAAgB,QAAQ,GAAG,UAAU;EAC1C,CAAC;;ACxBN,MAAa,6BACX,QACA,iBACA,KACA,uBACG;CACH,MAAM,YAAY,mBAAmB,QAAQ,gBAAgB;CAC7D,MAAM,sBAAsB,2BAA2B,QAAQ,UAAU;CAGzE,MAAM,gBAA+B;EACnC,yBAAS,IAAI,KAAK;EAClB,0BAAU,IAAI,KAAK;EACpB;CAGD,MAAM,gBAA+B;EACnC,yBAAS,IAAI,KAAK;EAClB,0BAAU,IAAI,KAAK;EACpB;CAED,MAAM,gBAA+B;EACnC;EACA;EACA;EACA;EACA;EACA;EAEA,MAAM;GAAE,SAAS;GAAG,UAAU;GAAG;EACjC;EACA;EACD;AAED,cAAa,eAAe,UAAU;AACtC,cAAa,eAAe,WAAW;AAEvC,cACE,iBACA,WACA,eACA,eACA,UACD;AACD,cACE,iBACA,WACA,eACA,eACA,WACD;;AAGH,MAAM,gBACJ,EACE,QACA,iBACA,qBACA,WACA,eACA,eACA,MACA,KACA,sBAEF,QACG;CACH,MAAM,EACJ,gBAAgB,EAAE,YAChB;CAEJ,MAAM,UAAU,gBAAgB,YAAY;AAE5C,MAAK,MAAM,UAAU,SAAS;AAK5B,MAJgC,OAAO,QAAQ,MAC5C,WACC,YAAY,UAAU,wBAAwB,OAAO,OAAO,OAAO,CACtE,CAC4B;AAE7B,gBAAc,OAAO;EAErB,MAAM,EAAE,OAAO,QAAQ,mBAAmB,iBACxC,QACA,qBACA,WACA,eACA,gBAAgB,UAAU,OAC1B,QACA,IACD;EAED,MAAM,EAAE,SAAS,cAAc;AAE/B,MAAI,CAAC,gBAAgB;AACnB,oBACE,iBACA,QACA,WACA,MAAM,IACN,OAAO,IACP,IACD;AACD;;AAGF,OAAK,MAAM,YAAY,MACrB,eAAc,KAAK,IAAI,UAAmB,KAAK;EAGjD,MAAM,UAAwC,EAAE;AAChD,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,KAAK;GAC9C,MAAM,SAAS,OAAO,QAAQ;AAC9B,OAAI,EAAE,gBAAgB,QAAS;AAE/B,WAAQ,KAAK;IACX,MAAM,OAAO;IACb,QAAQ,MAAM,KACX,MAAO,EAAE,QAAQ,GAA8B,WACjD;IACF,CAAC;;AAGJ,MAAI,OAAO,KACT,SAAQ,KAAK;GACX,MAAM,OAAO;GACb,QAAQ,MAAM,KAAK,MAAM,EAAE,QAAQ,KAAe;GACnD,CAAC;AAGJ,MAAI,OAAO,MACT,SAAQ,KAAK;GACX,MAAM,OAAO;GACb,QAAQ,MAAM,KAAK,MAAM,EAAE,QAAQ,MAAgB;GACpD,CAAC;AAGJ,OAAK;AACL,qBAAmB,KAAK;GACtB;GACA,OAAO,GAAG;IACR,MAAM,WAAW,MAAM,KAAA,IAAY,KAAA,IAAY,MAAM;AAErD,qBACE,iBACA,QACA,WACA,UACA,MAAM,KAAA,IAAY,KAAA,IAAY,OAAO,IACrC,IACD;AAED,QAAI,SACF,eAAc,KAAK,OAAO,SAAkB;AAG9C,QAAI,CAAC,EAAE,KAAK,QAAQ,cAAc,KAAK,MAAM;AAC3C,cAAS,iBAAiB,CAAC,GAAG,cAAc,KAAK,MAAM,CAAC,EAAE,IAAI;AAE9D,SAAI,CAAC,gBAAgB,WAAW;AAC9B,sBAAgB,YAAY;AAC5B,UAAI,KAAK,gBAAgB,eAAe;;;;GAI/C,CAAC;;;AAIN,MAAM,sBACJ,QACA,EAAE,WAAW,gBAAgB,EAAE,cACjB;CACd,MAAM,YAAuB;EAAE,SAAS,EAAE;EAAE,UAAU,EAAE;EAAE;AAE1D,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,KAAK,WAAW,CAAC,OAAO,KAAK,SAAU;EAEnD,MAAM,OAAO,OAAO,KAAK,QAAQ;AACjC,MAAI,wBAAwB,OAAO,KAAK,CAAE;AAE1C,sBAAoB,QAAQ,WAAW,KAAK,MAAM,QAAQ,UAAU;AACpE,sBAAoB,QAAQ,WAAW,KAAK,MAAM,QAAQ,WAAW;;AAGvE,wBAAuB,QAAQ,WAAW,WAAW,UAAU;AAC/D,wBAAuB,QAAQ,WAAW,WAAW,WAAW;AAEhE,QAAO;;AAGT,MAAM,uBACJ,QACA,WACA,WACA,MACA,QACA,QACG;CACH,MAAM,QAAQ,OAAO,KAAK;AAC1B,KAAI,CAAC,MAAO;AAEZ,WAAU,KAAK,KACb,GAAI,MAAoC,KACrC,EACC,SAAS,EAAE,SAAS,SAAS,OAAO,QAAQ,GAAG,WAC/C,MAAM,IACN,GAAG,YACC;EACJ,MAAM,IAAI,QAAQ,aAAa,KAAM,KAAA;AACrC,SAAO;GACL,SAAS,CACP;IACE;IACA;IACA;IACA;IACA,QAAQ;IACR,MAAM;IACP,CACF;GACD,GAAG;GACH,SAAS,QAAQ,UACb,OAAO,YACL;IACE,GAAG;IACH,SAAS,QAAQ,QAAQ,QAAQ,CAAC,IAAI,YAAY;IACnD,GACD,UACF;GACJ,YAAY,CACV;IACE;IACA;IACA;IACA;IACA,QAAQ;IACR,MAAM;IACP,CACF;GACD,aAAa,QAAQ;GACtB;GAEJ,CACF;;AAGH,MAAM,0BACJ,QACA,WACA,WACA,QACG;CACH,MAAM,QAAQ,UAAU,SAAS,UAAU;AAC3C,KAAI,CAAC,MAAO;AAEZ,WAAU,KAAK,KACb,GAAI,MAA8B,KAAK,OAAO;EAC5C,GAAG;EACH,SAAS,OAAO,YACZ,EAAE,QAAQ,KAAK,MACb,YAAY,IAAI;GAAE,GAAG;GAAG,QAAQ,YAAY,EAAE,OAAO;GAAE,GAAG,EAC3D,GACD,EAAE;EACN,YAAY,EAAE;EACd,SACE,EAAE,QAAQ,WAAW,OAAO,YACxB;GACE,GAAG,EAAE;GACL,SAAS,QAAQ,EAAE,QAAQ,QAAQ,CAAC,IAAI,YAAY;GACrD,GACD,EAAE;EACR,aAAa,EAAE,QAAQ;EACxB,EAAE,CACJ;;AAGH,MAAM,8BACJ,QACA,cACoB;AACpB,QAAO;EACL,SAAS,+BAA+B,QAAQ,WAAW,UAAU;EACrE,UAAU,+BAA+B,QAAQ,WAAW,WAAW;EACxE;;AAGH,MAAM,kCACJ,QACA,WACA,QACwB;AACxB,QAAO,UAAU,KAAK,KAAK,aAAa;AACtC,gBAAc,SAAS,QAAiB;AAExC,SAAO,iBAAiB;GACtB,GAAG,SAAS;GACZ,SACE,SAAS,QAAQ,YAAY,KAAA,IACzB,KAAA,IACA,OAAO,YACL,QAAQ,SAAS,QAAQ,QAAQ,CAAC,IAAI,YAAY,GAClD,QAAQ,SAAS,QAAQ,QAAQ;GACzC,SAAS,SAAS;GAClB,MAAM,SAAS,QAAQ;GACvB,YAAY,SAAS;GACrB,aAAa,SAAS;GACvB,CAAC;GACF;;AAGJ,MAAM,iBAAiB,SAMjB;AACJ,KAAI,KAAK,MAAO,MAAK,QAAQ,KAAK,MAAM,aAAa;AACrD,KAAI,KAAK,UAAU,QAAS,MAAK,QAAQ,KAAA;AACzC,KAAI,CAAC,KAAK,OAAQ,MAAK,SAAS,KAAA;AAChC,KAAI,KAAK,qBAAqB,MAAO,MAAK,mBAAmB,KAAA;AAC7D,KAAI,KAAK,QACP,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,IACvC,MAAK,QAAQ,GAAG,OAAO,KAAK,QAAQ;;AAK1C,MAAM,oBACJ,UAMG;CACH,IAAI,gBAAgB;CACpB,MAAM,UAAU,MAAM,QAAQ,KAAK,WAAW;EAC5C,MAAM,SAAS;GACb,GAAG;GACH,YAAY,KAAA;GACZ,eAAe,gBAAgB;GAChC;AACD,MAAI,OAAO,cAAe,iBAAgB;AAC1C,SAAO;GACP;AAEF,QAAO;EACL,GAAG;EACH,YAAY,KAAA;EACZ,WAAW,KAAA;EACX,MAAM,KAAA;EACN,SAAS,CAAC,CAAC,MAAM;EACjB,OAAO,KAAA;EACP,UAAU,CAAC,CAAC,MAAM;EAClB;EACA;EACD;;AAQH,MAAM,oBACJ,QACA,qBACA,WACA,eACA,WACA,QACA,QACG;CACH,MAAM,mBAAmB,iBACvB,QAAQ,YACJ,SACA;EACE,GAAG;EACH,SAAS,KAAA;EACT,SAAS,OAAO,QAAQ,KAAK,QAAQ,OAAO;GAC1C,GAAG;GACH,MAAO,OAA+B,QAAQ;GAC/C,EAAE;EACJ,CACN;CAED,MAAM,EAAE,OAAO,WAAW,2BACxB,kBACA,qBACA,WACA,eACA,WACA,QACA,IACD;AAID,QAAO;EAAE;EAAO;EAAQ,gBAFD,MAAM,UAAU,kBAAkB,iBAAiB;EAElC;;AAG1C,MAAM,8BACJ,QACA,qBACA,WACA,eACA,WACA,QACA,QACe;CACf,MAAM,QAAiD,EAAE;CACzD,MAAM,SAAiC,EAAE;CAEzC,MAAM,EAAE,SAAS,WAAW,GAAG,yBAAyB;AAExD,MAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,KAAK,QAAQ,KAAK;AACxD,MAAI,cAAc,KAAK,IAAI,EAAE,CAAE;EAE/B,MAAM,EAAE,SAAS,aAAa,GAAG,aAAa,oBAAoB,KAAK;AACvE,MACE,UAAU,WAAW,YAAY,UACjC,CAAC,UAAU,MAAM,UAAU,MAAM,CAAC,YAAY,UAAU,YAAY,GAAG,CAAC,EACxE;GACA,IAAI,IAAmB;GACvB,IAAI,IAAI;GACR,MAAM,WACJ,EAAE,SACD,QAAQ,YAAY,eAAe,gBAClC,WACA,UACD;AACH,OAAI,EAAE,SAAS,EAAE,MAAM;AACrB,QAAI;KAAE,GAAG;KAAG,MAAM,KAAA;KAAW;AAC7B,QAAI;KACF,GAAG;KACH,MAAM,KAAA;KACN,YAAY,KAAA;KACZ,aAAa,KAAA;KACd;AACD,QAAI,EAAE,YAAY,CAAC,EAAE,SACnB,GAAE,WAAW,OAAO,YAAY;AAGlC,QAAI,YAAY,GAAG,EAAE,EAAE;AACrB,WAAM,KAAK,UAAU,KAAK,GAAG;AAC7B,YAAO,KACL,qBAAqB,SAAS,WAAW,WAAW,KAAA,EACrD;;UAEE;IACL,MAAM,EAEJ,YAEA,aACA,GAAG,wBACD;AAEJ,QAAI,YAAY,sBAAsB,oBAAoB,EAAE;AAC1D,WAAM,KAAK,UAAU,KAAK,GAAG;AAC7B,YAAO,KAAK,KAAA,EAAU;;;AAI1B,OAAI,MAAM,UAAU,CAAC,kBAAkB,SAAS,CAC9C,eAAc,KAAK,IAAI,GAAG,KAAK;;;AAKrC,QAAO;EAAE;EAAO;EAAQ;;AAG1B,MAAM,qBACJ,MACG,EAAE,WAAW,EAAE,YAAY,EAAE;AAElC,MAAM,oBACJ,EACE,gBACA,QACA,WACA,iBACA,cAEF,QACA,WACA,OACA,QACA,QACG;AACH,KAAI,CAAC,OAAO;EACV,MAAM,OACJ,OAAO,UACN,QAAQ,YAAY,eAAe,gBAClC,eAAe,MACf,UACD,GACG,KAAA,IACA,OAAO;AAEb,MAAI,UAAU,WAAW,KAAK,YAAY,UAAU,IAAI;GACtD,MAAM,WAAW,UAAU;GAC3B,MAAM,SAAS,gBAAgB,SAAS;AACxC,OAAI,QAAQ;AACV,KAAC,OAAO,KAAK,KAAK,SAAS,EAAE,EAAE,KAAK;KAClC,SAAS;MAAE,GAAG;MAAQ;MAAM;KAC5B,MAAO,QAAQ,YACX,KAAA,IACC,SAAyC;KAC/C,CAAC;AACF;;;AAIJ,GAAC,eAAe,KAAK,SAAS,EAAE,EAAE,KAAK;GACrC,SAAS;GACT,SAAS;IAAE,GAAG;IAAQ;IAAM;GAC7B,CAAC;YACO,OACT,YAAW,KAAK;EACd,MAAM;EACN,MAAM,QAAQ,YAAY,UAAU;EACpC,aAAa;EACb,WAAW,UAAU;EACrB,MAAM,OAAO;EACb,IAAI;EACL,CAAC;;AAQN,MAAM,gBACJ,iBACA,WACA,eACA,eACA,QACG;CACH,MAAM,aAAa,UAAU,KAAK,QAC/B,MAAM,MACL,CAAC,cAAc,KAAK,IAAI,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,KAAc,CACvE;AACD,KAAI,WAAW,OACb,UACE,iBACA,WAAW,KAAK,OAAO;EACrB,GAAG;EACH,SAAS,EAAE;EACX,aAAa,EAAE;EACf,SAAS,EAAE,QAAQ,UACf;GAAE,GAAG,EAAE;GAAS,SAAS,EAAE;GAAa,GACxC,EAAE;EACP,EAAE,EACH,IACD;;AAIL,MAAM,YACJ,EAAE,gBAAgB,mBAClB,KACA,QACG;CACH,MAAM,QAAS,eAAe,IAAI,SAAS,EAAE;AAC7C,MAAK,MAAM,QAAQ,KAAK;AACtB,MAAI,KAAK,QAAQ,WAAW,KAAK,YAAY,KAAK,QAAQ,IAAI;GAC5D,MAAM,SACJ,iBACI,KAAK,eAAe,KAAK,SAAS,GAA0B;AAElE,OAAI,QAAQ;AACV,KAAC,OAAO,GAAG,KAAK,SAAS,EAAE,EAAE,KAC3B,QAAQ,YACJ,OACC;KACC,GAAG;KACH,MAAO,KAA2B,QAAQ,GAAG;KAC9C,CACN;AACD;;;AAIJ,QAAM,KAAK,KAAK;;;ACzpBpB,MAAM,eAEF;CACF,MAAM;CACN,SAAS;CACT,QAAQ;CACT;AAED,MAAM,iBAAiB,EAAE;AAGzB,KAAK,MAAM,OAAO,aAChB,gBACE,aACE,QAEA;AAGN,MAAM,gBAEF;CACF,aAAa;CACb,UAAU;CACV,SAAS;CACT,YAAY;CACZ,eAAe;CAChB;AAED,MAAM,kBAAkB,EAAE;AAG1B,KAAK,MAAM,OAAO,cAChB,iBACE,cACE,QAEA;AAGN,MAAa,sBACX,QACA,KACA,cACA,eACA,gBACS;AACT,MAAK,MAAM,mBAAmB,cAAc;EAC1C,MAAM,kBAAkB,iBACtB,QACA,iBACA,cACD;EAED,MAAM,EAAE,WAAW,aAAa,gBAAgB,QAAQ,oBACtD;EACF,MAAM,EAAE,OAAO,KAAK,SAAS;EAC7B,IAAI,UAAU;AAEd,OAAK,MAAM,gBAAgB,YAAY,aAAa;GAClD,MAAM,EAAE,YAAY,iBAAiB;AACrC,OAAI,CAAC,aAAc;AAKnB,OAHyB,aAAa,QAAQ,MAAM,WAClD,wBAAwB,OAAO,OAAO,CACvC,CACqB;GAEtB,MAAM,eACJ,YACE,GAAG,aAAa,cAAc,GAAG,aAAa;AAOlD,OAJE,gBACA,aAAa,eAAe,MAAM,WAAW;AAC3C,WAAO,wBAAwB,cAAc,OAAO;KACpD,CACyB;GAE7B,IAAI,QAAQ;GACZ,IAAI;AACJ,QAAK,IAAI,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;IAC/C,MAAM,iBAAiB,gBAAgB;IACvC,MAAM,iBAAiB,eAAe;AACtC,QAAI,YAAY,cAAc,eAAe,EAAE;AAC7C,aAAQ;AACR,qBAAgB,OAAO,GAAG,EAAE;KAE5B,MAAM,WACJ,eAAe,eAAe,QAC9B,kBACE,UAAU,OACV,gBACA,OAAO,UACR;AACH,SAAI,aAAa,aAAa,KAC5B,UAAS;;;AAKf,OAAI,CAAC,OAAO;IACV,MAAM,aAAa,6BACjB,QACA,cACA,aACD;AAED,QACE,aAAa,QAAQ,WAAW,KAChC,gBAAgB,aAAa,QAAQ,KACrC;KACA,MAAM,SAAS,gBAAgB,aAAa,QAAQ;AACpD,MAAC,OAAO,KAAK,KAAK,gBAAgB,EAAE,EAAE,KAAK;MACzC,WAAW,WAAW,WAAW;MACjC,gBAAgB,WAAW,WAAW;MACtC,SAAS,WAAW,WAAW;MAChC,CAAC;UAEF,EAAC,KAAK,gBAAgB,EAAE,EAAE,KAAK,WAAW;AAG5C,cAAU;cACD,OACT,KAAI,KAAK;IACP,MAAM;IACN,MAAM;IACN,aAAa;IACb,WAAW,UAAU;IACrB,MAAM,aAAa;IACnB,IAAI;IACL,CAAC;;AAIN,MAAI,gBAAgB,QAAQ;GAC1B,MAAM,cAAe,IAAI,gBAAgB,EAAE;AAC3C,QAAK,MAAM,EAAE,gBAAgB,gBAAgB,gBAC3C,KACE,WAAW,QAAQ,WAAW,KAC9B,gBAAgB,WAAW,QAAQ,KACnC;IACA,MAAM,SAAS,gBAAgB,WAAW,QAAQ;AAClD,KAAC,OAAO,GAAG,KAAK,gBAAgB,EAAE,EAAE,KAAK;KACvC,WAAW,WAAW;KACtB,gBAAgB,eAAe,WAAW;KAC1C,SAAS,eAAe,WAAW;KACpC,CAAC;SAEF,aAAY,KAAK,eAAe;AAIpC,aAAU;;AAGZ,MAAI,WAAW,CAAC,gBAAgB,WAAW;AACzC,mBAAgB,YAAY;AAC5B,OAAI,KAAK,gBAAgB,eAAe;;;;AAK9C,MAAM,oBACJ,QACA,EAAE,WAAW,gBAAgB,EAAE,WAC/B,kBACqB;CACrB,MAAM,kBAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,KAAK,YAAa;EAE9B,MAAM,OAAO,OAAO,KAAK,QAAQ;AACjC,MAAI,wBAAwB,OAAO,KAAK,CAAE;AAE1C,kBAAgB,KACd,GAAG,OAAO,KAAK,YAAY,KAAK,MAAM;GACpC,MAAM,UAAU,CAAC,KAAK;GAEtB,MAAM,YAAY,kBAAkB,EAAE,UAAU;AAEhD,UAAO,gBACL,QACA;IACE,MAAM,EAAE,SAAS;IACjB,YAAY;KACV,SAAS,CAAC,KAAK;KACf;KACA,gBAAgB,EAAE;KAClB,SAAS,EAAE;KACZ;IACF,EACD;IACE;IACA;IACA,gBAAgB,EAAE;IAClB,SAAS,EAAE;IACZ,EACD,cACD;IACD,CACH;;AAGH,KAAI,UAAU,SAAS,UAAU,YAC/B,MAAK,MAAM,mBAAmB,UAAU,SAAS,UAAU,aAAa;EACtE,MAAM,EAAE,YAAY,SAAS;AAC7B,MAAI,CAAC,KAAM;EAEX,MAAM,YAAY,kBAAkB,KAAK,UAAU;AAEnD,kBAAgB,KACd,gBACE,QACA;GACE,GAAG;GACH,YAAY;IACV,GAAG;IACH;IACD;GACF,EACD;GACE,GAAG;GACH;GACA,SAAS,OAAO,YACZ,KAAK,QAAQ,IAAI,YAAY,GAC7B,KAAK;GACT,gBAAgB,OAAO,YACnB,KAAK,eAAe,IAAI,YAAY,GACpC,KAAK;GACV,EACD,cACD,CACF;;AAIL,QAAO;;AAGT,MAAa,qBACX,cACG;AACH,KAAI,OAAO,cAAc,UAAU;EACjC,MAAM,EAAE,QAAQ,UAAU,KAAK,WAAW,GAAG;AAC7C,cAAY,oBAAoB;GAAE;GAAQ,MAAM;GAAO,CAAC;;AAE1D,QAAO;;AAGT,MAAM,mBACJ,QACA,gBACA,YACA,kBACmB;CACnB,MAAM,EAAE,WAAW,SAAS,gBAAgB,YAAY;CACxD,MAAM,CAAC,QAAQ,SAAS,0BAA0B,eAAe,UAAU;AAE3E,QAAO;EACL,YAAY;GACV,eAAe,UAAU;GACzB,cAAc;GACd;GACA,gBAAgB,OAAO,YACnB,eAAe,IAAI,YAAY,GAC/B;GACJ,OAAO,aAAa,SAAS,SAAS;GACtC,UAAU,cAAc,SAAS,YAAY;GAC7C,UAAU,cAAc,SAAS,YAAY;GAC9C;EACD;EACD;;AAGH,MAAM,gCACJ,QACA,cACA,kBACyD;CACzD,MACE,aAAa,SACb,kBACE,aAAa,WACb,EAAE,YAAY,cAAc,EAC5B,OAAO,UACR,GACG,KAAA,IACA,aAAa;CACnB,YAAY;EACV,SAAS,aAAa;EACtB,WAAW,GAAG,aAAa,cAAc,GAAG,aAAa;EACzD,gBAAgB,aAAa;EAC7B,SAAS;GACP,OACE,aAAa,UAAU,MACnB,KAAA,IACA,eAAe,aAAa;GAClC,UACE,aAAa,aAAa,MACtB,KAAA,IACA,gBAAgB,aAAa;GACnC,UACE,aAAa,aAAa,MACtB,KAAA,IACA,gBAAgB,aAAa;GACpC;EACF;CACF;ACnUD,MAAa,iBACX,KACA,iBACA,uBACS;CACT,MAAM,aAAa,kBAAkB,gBAAgB;CACrD,MAAM,EACJ,aACA,gBAAgB,EAAE,KAAK,YACrB;AAGJ,KAAI,CADgB,YAAY,YAAY,MAAM,MAAM,EAAE,MAAM,EAC9C;AAChB,MAAI,WAAW,QAAQ;GACrB,MAAM,cAAe,IAAI,gBAAgB,EAAE;AAC3C,QAAK,MAAM,aAAa,WACtB,KACE,CAAC,UAAU,UACX,CAAC,gBAAgB,gBAAgB,UAAU,QAE3C,aAAY,KAAK;IACf,OAAO,UAAU,MAAM;IACvB,MAAM,UAAU;IACjB,CAAC;;AAIR;;CAGF,IAAI,OAAO;CACX,MAAM,kCAAkB,IAAI,KAAa;AACzC,MAAK,MAAM,gBAAgB,YAAY,aAAa;EAClD,MAAM,EAAE,OAAO,SAAS,SAAS;AACjC,MAAI,CAAC,QAAS;AAKd,MAHyB,QAAQ,SAAS,MAAM,WAC9C,wBAAwB,OAAO,OAAO,CACvC,CACqB;AAEtB,MAAI,WAAW,QAAQ;AACrB;AACA,sBAAmB,KAAK;IACtB,SAAS,CACP;KACE,MAAM,QAAQ;KACd,QAAQ,WAAW,KAAK,EAAE,YAAY,MAAM,IAAI;KACjD,CACF;IACD,OAAO,GAAG;AACR,SAAI,MAAM,KAAA,EACR,iBAAgB,IAAI,EAAE;SAEtB,WAAU,iBAAiB,SAAS,KAAK;AAG3C,SAAI,EAAE,SAAS,EAAG;KAElB,MAAM,cAAsC,EAAE;AAE9C,gBAAW,SAAS,OAAO,MAAM;AAC/B,UAAI,gBAAgB,IAAI,EAAE,EAAE;AAC1B,WAAI,CAAC,MAAM,OAAQ;OAEnB,MAAM,SAAS,gBAAgB,gBAAgB,MAAM;AACrD,WAAI,CAAC,OAAQ;OAEb,MAAM,eAAe,OAAO,GAAG,KAAK;AACpC,WAAI,CAAC,aAAc;OAEnB,MAAM,IAAI,aAAa,QAAQ,MAAM,MAAM;AAC3C,WAAI,MAAM,GACR,cAAa,OAAO,GAAG,EAAE;AAE3B;;AAGF,kBAAY,KAAK;OACf,MAAM,MAAM;OACZ,OAAO,MAAM,MAAM;OACpB,CAAC;OACF;AAEF,SAAI,YAAY,OACd,EAAC,IAAI,gBAAgB,EAAE,EAAE,KAAK,GAAG,YAAY;AAG/C,SACE,CAAC,gBAAgB,cAChB,gBAAgB,eAAe,KAAK,aAAa,UAChD,IAAI,aAAa,SACnB;AACA,sBAAgB,YAAY;AAC5B,UAAI,KAAK,gBAAgB,eAAe;;;IAG7C,CAAC;QAEF,WAAU,iBAAiB,SAAS,KAAK;;;AAK/C,MAAM,qBAAqB,EACzB,WACA,gBAAgB,EAAE,cACgB;CAClC,MAAM,wBAAQ,IAAI,KAAa;CAE/B,MAAM,aAA0B,EAAE;AAClC,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,KAAK,OAAQ;EAEzB,MAAM,aAAa,OAAO,KAAK,QAAQ;AACvC,MAAI,wBAAwB,OAAO,WAAW,CAAE;EAEhD,MAAM,WAAW,GAAG,UAAU,MAAM,GAAG,WAAW;AAElD,aAAW,KACT,GAAG,OAAO,KAAK,OAAO,KAAK,UAAU;GACnC,MAAM,OAAO,MAAM,QAAQ,gBAAgB,OAAO,UAAU,EAAE;AAC9D,SAAM,IAAI,KAAK;AAEf,UAAO;IACL;IACA;IACA,QAAQ;IACT;IACD,CACH;;AAGH,KAAI,UAAU,SAAS,UAAU,YAC/B,MAAK,MAAM,cAAc,UAAU,SAAS,UAAU,aAAa;EACjE,MAAM,EAAE,UAAU;AAClB,MAAI,OAAO;GACT,MAAM,WAAW,GAAG,UAAU,MAAM;GACpC,MAAM,OAAO,WAAW,QAAQ,gBAAgB,OAAO,UAAU,EAAE;AACnE,SAAM,IAAI,KAAK;AAEf,cAAW,KAAK;IACd,OAAO;KAAE,KAAK;KAAO,MAAM,WAAW;KAAM;IAC5C;IACD,CAAC;;;AAKR,QAAO;;AAGT,MAAM,aACJ,EAAE,gBAAgB,EAAE,QAAQ,mBAC5B,SACA,SACG;CACH,MAAM,MAAM,IAAI,OAAO,CACrB,CAAC,QAAQ,WAAW,CACrB,CAAmC;AAEpC,KAAI,QAAQ,SAAS,WAAW,KAAK,gBAAgB,QAAQ,QAAQ,KAAK;EACxE,MAAM,SAAS,gBAAgB,QAAQ,QAAQ;AAC/C,SAAO,KAAK,KAAK,OAAO;AACxB,GAAC,OAAO,KAAK,KAAK,WAAW,EAAE,EAAE,KAAK;GACpC;GACA;GACD,CAAC;OAEF,EAAC,KAAK,gBAAgB,EAAE,EAAE,KAAK;EAC7B;EACA,OAAO;EACR,CAAC;;ACjHN,MAAa,gBAAgB,OAC3B,KACA,YACA,SACA,aACA,QACA,EACE,mBACA,WAAW,EAAE,UACb,eACA,UAAU,EAAE,mBACZ,aAEF,mBACkB;CAClB,MAAM,eAA4B,oBAChC,QACA,aACA,cACD;CACD,MAAM,aAAyB;EAAE,QAAQ,EAAE;EAAE,aAAa,EAAE;EAAE;CAC9D,MAAM,mBAAsC,EAAE;CAC9C,MAAM,EAAE,cAAc,oBAAoB,YAAY,gBACpD,2BACE,SACA,QACA,QACA,aACA,eACA,cACA,gBACD;AAEH,yBAAwB,oBAAoB,eAAe,IAAI;AAE/D,OAAM,0BACJ,aACA,cACA,YACA,cACA,aACA,eACA,KACA,UACD;AAED,OAAM,kBACJ,SACA,cACA,mBACA,aACA,YACA,KACA,eACA,QACA,YACA,kBACA,WACA,eACD;AAED,oBAAmB,QAAQ,KAAK,cAAc,eAAe,YAAY;AAEzE,OAAM,QAAQ,IAAI,CAChB,gBAAgB,YAAY,QAAQ,EACpC,sBAAsB,kBAAkB,QAAQ,CACjD,CAAC;AAEF,MAAK,MAAM,WAAW,WACpB,KAAI,KACF,WAAW,mBAAmB,aAAa,SAAS,QAAQ,WAAW,CACxE;;AAIL,MAAM,uBACJ,QACA,aACA,kBACgB;AAChB,QAAO,OAAO,QAAqB,KAAK,cAAc;EACpD,MAAM,cAAc,UAAU,EAAE,UAAU;AAI1C,MAAI,CAHe,YAAY,OAAO,MACnC,MAAM,EAAE,SAAS,UAAU,SAAS,EAAE,eAAe,YACvD,CAEC,KAAI,KAAK,UAAU;AAErB,SAAO;IACN,EAAE,CAAC;;AAGR,MAAM,8BACJ,SACA,QACA,QACA,aACA,eACA,cACA,oBAMG;CACH,MAAM,eAAkC,EAAE;CAC1C,MAAM,qBAA8C,EAAE;CACtD,MAAM,aAAkC,EAAE;CAC1C,MAAM,cAA2B,EAAE;CACnC,MAAM,eAAe,iBAAiB,QAAQ,KAAK,SAAS;EAC1D,MAAM,CAAC,SAAS,eAAe,SAAS,0BACtC,eACA,KACD;AACD,SAAO;GAAE;GAAQ;GAAO;GACxB;CAEF,MAAM,EAAE,QAAQ,mBAAmB,UAAU,OAAO,oBAClD,4BAA4B,SAAS,OAAO;AAC9C,MAAK,MAAM,WAAW,YAAY,QAAQ;AACxC,MACG,QAAQ,SAAS,mBAChB,QAAQ,eAAe,oBACzB,iBAAiB,SAAS,SAAS,QAAQ,WAAW,IACtD,cAAc,MACX,EAAE,QAAQ,YACT,UAAU,QAAQ,QAAQ,WAAW,QAAQ,WAChD,CAED;EAEF,MAAM,YAAY,OAAO,MACtB,MACC,EAAE,UAAU,QAAQ,SACnB,EAAE,EAAE,UAAU,mBAAmB,QAAQ,WAC7C;AACD,MAAI,WAAW;AACb,kBACE,aACA,cACA,aACA,eACA,SACA,UACD;AACD;;EAGF,MAAM,IAAI,aAAa,WAAW,MAAM,EAAE,UAAU,QAAQ,KAAK;AACjE,MAAI,MAAM,IAAI;GACZ,MAAM,YAAY,aAAa;AAC/B,gBAAa,OAAO,GAAG,EAAE;AACzB,sBAAmB,KAAK;IAAE;IAAW;IAAS,CAAC;AAC/C;;AAGF,aAAW,KAAK,QAAQ;;AAG1B,QAAO;EAAE;EAAc;EAAoB;EAAY;EAAa;;AAGtE,MAAM,2BACJ,oBACA,eACA,QACG;AACH,MAAK,MAAM,EAAE,WAAW,aAAa,oBAAoB;EACvD,MAAM,aAAa,QAAQ;EAC3B,MAAM,WAAW,UAAU,EAAE,UAAU;AAEvC,MAAI,KAAK;GACP,MAAM;GACN,MAAM;GACN;GACA,MAAM,QAAQ;GACd;GACA,IAAI,QAAQ;GACb,CAAC;;;AAIN,MAAM,oBAAoB,OACxB,SACA,cACA,mBACA,aACA,YACA,KACA,eACA,QACA,YACA,kBACA,WACA,mBACkB;CAClB,MAAM,qBAA0C,EAAE;CAClD,MAAM,iBAAiC,EAAE;AAEzC,MAAK,MAAM,mBAAmB,cAAc;AAC1C,qBAAmB,SAAS;AAE5B,QAAM,mBACJ,SACA,mBACA,aACA,YACA,KACA,eACA,QACA,iBACA,YACA,oBACA,gBACA,UACD;AAED,MAAI,mBAAmB,QAAQ;GAC7B,MAAM,EAAE,cAAc;GACtB,MAAM,QAAkB,EAAE;GAC1B,MAAM,QAAkB,EAAE;AAE1B,QAAK,MAAM,OAAO,UAAU,OAAO;IACjC,MAAM,SAAS,UAAU,MAAM;AAE/B,QAAI,CAAC,OAAO,SAAU;IAEtB,MAAM,OAAO,OAAO,KAAK,QAAQ;IACjC,MAAM,OAAO,6BAA6B,QAAQ,cAAc;AAChE,QAAI,CAAC,eAAe,IAAI,IAAI,KAAK,EAAE;AACjC,WAAM,KAAK,KAAK;AAChB,WAAM,KAAK,KAAK;;;GAIpB,MAAM,YAAY,UAAU;GAC5B,MAAM,SAAS,YAAY,MACxB,KAAK,MAAM,SAAS,IAAI,CACxB,KAAK,KAAK,CAAC,MAAM,UAAU,IAAI,MAC/B,KAAK,MAAM,IAAI,EAAE,GAAG,CACpB,KAAK,KAAK,CAAC;AAEd,oBAAiB,KACf,GAAG,mBAAmB,KAAK,OAAO;IAAE,GAAG;IAAG;IAAQ,EAAE,CACrD;;;;AAKP,MAAM,gCACJ,QACA,kBACW;AACX,KAAI,kBAAkB,YACpB,QACE,6BAA6B,OAAO,KAAK,MAAM,cAAc,GAC7D,KAAK,OAAO,OAAO,KAAK,UAAU;CAItC,IAAI,OAAO,kBAAkB,aAAa,OAAO,WAAW,OAAO;CAEnE,MAAM,IAAI,KAAK,QAAQ,IAAI;CAC3B,IAAI,SAAS;AACb,KAAI,MAAM,IAAI;AACZ,SAAO,KAAK,MAAM,GAAG,EAAE;AACvB,WAAS,KAAK,MAAM,EAAE;;CAGxB,MAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,KAAI,MAAM,IAAI;EACZ,IAAI,SAAS,IAAI,KAAK,GAAG;AACzB,MAAI,OAAO,KAAK,kBAAkB,kBAAkB,WAClD,UAAS,IAAI,cAAc,IAAI;AAEjC,SAAO;OAEP,QAAO,IAAI,KAAK,MAAM,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG;;AAOtD,MAAM,kBAAkB,QACtB,IAAI,WAAW,qBAAqB,4BAA4B;AAElE,MAAM,kBAAkB,OAAO,YAAwB,YAAqB;AAC1E,KAAI,WAAW,YAAY,QAAQ;EACjC,MAAM,EACJ,MAAM,CAAC,aACL,MAAM,QAAQ,OAChB,YACE,WAAW,YACR,KACE,MACC,GAAG,eAAe,EAAE,KAAK,CAAC,MACxB,EAAE,UAAU,eAAe,EAAE,OAAO,CACrC,GACJ,CACA,KAAK,KAAK,EACf,WAAW,OACZ;AAED,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,KAAI,CAAC,QAAQ,GACX,YAAW,YAAY,GAAG,QAAQ;;;AAM1C,MAAM,4BAA4B,OAChC,aACA,cACA,YACA,cACA,aACA,eACA,KACA,cACG;AACH,MAAK,MAAM,aAAa,cAAc;AACpC,MAAI,WAAW,QAAQ;GACrB,MAAM,IAAI,MAAM,qBACd,SACA,UAAU,OACV,WAAW,KAAK,MAAM,EAAE,KAAK,EAC7B,UACD;AACD,OAAI,GAAG;IACL,MAAM,UAAU,WAAW,IAAI;AAC/B,eAAW,OAAO,IAAI,GAAG,EAAE;AAE3B,QAAI,KAAK;KACP,MAAM;KACN,MAAM;KACN,YAAY,QAAQ;KACpB,MAAM,QAAQ;KACd,UAAU,UAAU,EAAE,UAAU;KAChC,IAAI,UAAU;KACf,CAAC;AAEF,mBACE,aACA,cACA,aACA,eACA,SACA,UACD;AAED;;;AAIJ,MAAI,KAAK,eAAe,eAAe,UAAU,CAAC;;;AAItD,MAAM,kBACJ,aACA,cACA,aACA,eACA,SACA,cACG;CACH,MAAM,QAAQ,EAAE;CAChB,MAAM,SAAS,UAAU,EAAE,UAAU;AAErC,cAAa,KAAK;EAChB,WAAW,wBAAwB,UAAU;EAC7C;EACA,aAAa,wBAAwB,aAAa,QAAQ;EAC1D;EACA,gBAAgB;GACd,MAAM;GACN;GACA,MAAM,UAAU;GACT;GACP,KAAK,EAAE;GACP,MAAM,EAAE;GACT;EACD,WAAW;EACX,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf,CAAC;AAEF,aAAY,GAAG,OAAO,GAAG,UAAU,WAAW;;AAGhD,MAAM,2BAA2B,eAA0B;CACzD,GAAG;CAEH,OAAO,UAAU;CACjB,OAAO,OAAO,YACZ,OAAO,QAAQ,UAAU,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY;EACrD,MAAM,SAAS,OAAO,OAAO,OAAiB;AAC9C,SAAO,OAAO;GACZ,GAAG,OAAO;GACV,QAAQ,OAAO,KAAK,UAAU,CAAC,GAAG,OAAO,KAAK,OAAO;GACtD;AAED,SAAO,CAAC,KAAK,OAAO;GACpB,CACH;CACF;AAED,MAAM,kBACJ,eACA,UACoB;AACpB,QAAO;EACL,MAAM;EACN,QAAQ;EACR,QAAQ,MAAM,EAAE,WAAW,gBAAgB,KAAA,IAAY,MAAM,EAAE;EAC/D,SAAS,MAAM,SAAS;EACxB,MAAM,MAAM;EACZ,OAAO,eAAe,MAAM;EAC5B,cAAc,MAAM,SAAS,eAAe,WAAW;EACvD,GAAG,MAAM,SAAS;EACnB;;AAGH,MAAM,kBAAkB,UAAmC;CACzD,MAAM,QAAsB,EAAE;AAC9B,MAAK,MAAM,OAAO,MAAM,OAAO;EAC7B,MAAM,SAAS,MAAM,MAAM;AAC3B,MAAI,EAAE,kBAAkB,eACtB,OAAM,OAAO;;AAGjB,QAAO;;AAGT,MAAM,qBAAqB,OACzB,SACA,mBACA,aACA,YACA,KACA,eACA,QACA,iBACA,YACA,oBACA,gBACA,cACG;AACH,OAAM,eACJ,SACA,QACA,mBACA,aACA,YACA,iBACA,KACA,eACA,YACA,gBACA,UACD;AAED,mBAAkB,QAAQ,gBAAgB;AAE1C,2BAA0B,QAAQ,iBAAiB,KAAK,mBAAmB;AAE3E,eAAc,KAAK,iBAAiB,mBAAmB;CAEvD,MAAM,EAAE,mBAAmB;AAC3B,KACE,OAAO,KAAK,eAAe,MAAM,CAAC,UAClC,OAAO,KAAK,eAAe,IAAI,CAAC,UAChC,OAAO,KAAK,eAAe,KAAK,CAAC,QACjC;AACA,kBAAgB,YAAY;AAC5B,MAAI,KAAK,eAAe;;AAG1B,KAAI,gBAAgB,WAAW,OAC7B,KAAI,KAAK,GAAG,gBAAgB,WAAW;;ACriB3C,MAAM,WAAW;CACf,OAAO;CACP,SAAS;CACT,YAAY;CACZ,UAAU;CACV,UAAU;CACV,aAAa;CACb,WAAW;CACX,WAAW;CACZ;AAED,MAAa,eAAe,OAC1B,KACA,aACA,EAAE,WAAW,UAAU,EAAE,cACtB;AACH,KAAI,CAAC,YAAY,SAAS,CAAC,MAAO;CAElC,MAAM,YAAY,MAAM,KAAK,SAA2B;EAEtD,MAAM,EAAE,mBAAmB,GAAG,GAAG,0BAA0B;AAC3D,SAAO;GACL,GAAG;GACH,GAAG;GACJ;GACD;CAEF,MAAM,wBAAQ,IAAI,KAAa;CAC/B,MAAM,YAAgC,EAAE;AAExC,MAAK,MAAM,UAAU,YAAY,OAAO;EAEtC,MAAM,EAEJ,mBAAmB,GACnB,GAAG,4BACD;EAEJ,MAAM,WAAW,UAAU,MACxB,aAAa,OAAO,SAAS,SAAS,KACxC;AACD,MAAI,UAAU;AACZ,SAAM,IAAI,OAAO,KAAK;AAEtB,OAAI,CAAC,YAAY,yBAAyB,SAAS,CACjD,KAAI,KAAK;IACP,MAAM;IACN,MAAM,OAAO;IACb,MAAM;IACN,IAAI;IACL,CAAC;AAGJ;;AAGF,YAAU,KAAK,OAAO;;AAGxB,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,MAAM,IAAI,SAAS,KAAK,CAAE;AAE9B,MAAI,UAAU,QAAQ;GACpB,MAAM,IAAI,MAAM,qBACd,SACA,SAAS,MACT,UAAU,KAAK,MAAM,EAAE,KAAK,EAC5B,UACD;AACD,OAAI,GAAG;IACL,MAAM,SAAS,UAAU,IAAI;AAC7B,cAAU,OAAO,IAAI,GAAG,EAAE;AAE1B,QAAI,KAAK,sBAAsB,QAAQ,SAAS,CAAC;AAEjD;;;AAIJ,MAAI,KAAK;GACP,MAAM;GACN,QAAQ;GACR,GAAG;GACJ,CAAC;;AAGJ,MAAK,MAAM,UAAU,UACnB,KAAI,KAAK;EACP,MAAM;EACN,QAAQ;EACR,GAAG;EACJ,CAAC;;AAIN,MAAM,yBACJ,QACA,aACgD;CAChD,MAAM,EAAE,MAAM,YAAY,GAAG,eAAe;CAC5C,MAAM,EAAE,MAAM,cAAc,GAAG,iBAAiB;AAChD,KAAI,YAAY,YAAY,aAAa,IAAI,eAAe,aAC1D,QAAO;EACL,MAAM;EACN,MAAM;EACN,IAAI;EACL;KAED,QAAO;EACL,MAAM;EACN,MAAM,OAAO;EACb,MAAM;EACN,IAAI;EACL;;AClHL,MAAM,mBAAyE;CAC7E;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAM,0BACJ,aACA,QACA,wBAC+C;CAC/C,IAAI;AACJ,KAAI,OACF,SAAQ,iBAAiB,QACtB,MAAM,MAAM,aAAa,MAAM,gBACjC;KAED,SAAQ,iBAAiB,QAAQ,MAAM;AACrC,MAAI,MAAM,gBACR,QAAO,oBAAoB,WAAW,iBAAiB,KAAA;AAEzD,SAAO;GACP;AAEJ,QAAO,MAAM,KAAK,YAAY;EAC5B;EACA,kBAAkB,CAAC;GAAE,WAAW;GAAO;GAAa,CAAC;EACtD,EAAE;;AAIL,MAAM,kBAGF;CACF,QAAQ;CACR,WAAW;CACX,WAAW;CACX,OAAO;CACP,SAAS;CACT,eAAe;CAChB;AAGD,MAAM,yBACJ,YAC+C;CAC/C,MAAM,UAAoB,EAAE;CAC5B,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,KAAK,QACd,KAAI,EAAE,YACJ,WAAU,KAAK,EAAE,UAAU;KAE3B,SAAQ,KAAK,EAAE,UAAU;AAG7B,QAAO;EAAE;EAAS;EAAW;;AAI/B,MAAM,0BACJ,SACA,cAC8D;CAC9D,MAAM,UAAqE,EAAE;AAC7E,KAAI,QAAQ,OAAQ,SAAQ,aAAa;AACzC,KAAI,UAAU,OAAQ,SAAQ,sBAAsB;AACpD,QAAO;;AAKT,MAAM,sBACJ,OACA,qBACA,eACA,gBACS;AAQT,KAPe,MAAM,MAAM,MAAM,EAAE,cAAc,MAAM,IAGpD,MAAM,SAAS,KACd,MAAM,WAAW,cAAc,UAC/B,cAAc,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,cAAc,KAAK,CAAC,CAGxE,qBAAoB,KAAK;EAAE,WAAW;EAAO;EAAa,CAAC;UAClD,MAAM,SAAS,EACxB,qBAAoB,KAAK,GAAG,MAAM;;AAMtC,MAAM,2BACJ,WACA,8BAIiC;CACjC,MAAM,yBAAyB,UAAU,cAAc,KACpD,cAAwD;EAEvD,MAAM,gBADgB,0BAA0B,UAAU,QACtB,QAAQ,MAAM,MAAM,MAAM;EAG9D,MAAM,eAAqD,EAAE;EAC7D,MAAM,iBAAuD,EAAE;AAC/D,OAAK,MAAM,KAAK,UAAU,iBACxB,KAAI,EAAE,YACJ,gBAAe,KAAK,EAAE;MAEtB,cAAa,KAAK,EAAE;EAIxB,MAAM,sBAA4D,EAAE;AAGpE,qBACE,cACA,qBACA,eACA,MACD;AAGD,qBACE,gBACA,qBACA,eACA,KACD;AAED,SAAO;GACL,QAAQ,UAAU;GAClB,kBAAkB;GACnB;GAEJ;AAED,QAAO;EACL,OAAO,UAAU;EACjB,SAAS,UAAU;EACnB,QAAQ,UAAU;EAClB,eAAe;EAChB;;AAIH,MAAM,yBACJ,GACA,GACA,YACA,8BAIY;AAEZ,KAAI,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,YACrD,QAAO;CAIT,MAAM,gBADgB,0BAA0B,YACZ,QAAQ,MAAM,MAAM,MAAM;AAG9D,KAAI,EAAE,cAAc,SAAS,EAAE,gBAAgB,EAAE,YAE/C,QAAO,cAAc,SAAS,EAAE,UAAU;AAE5C,KAAI,EAAE,cAAc,SAAS,EAAE,gBAAgB,EAAE,YAE/C,QAAO,cAAc,SAAS,EAAE,UAAU;AAG5C,QAAO;;AAIT,MAAM,qBAAqB,SAAyB;AAClD,KAAI,KAAK,WAAW,KAAI,IAAI,KAAK,SAAS,KAAI,CAC5C,QAAO,KAAK,MAAM,GAAG,GAAG;AAE1B,QAAO;;AAIT,MAAM,0BACJ,QACA,eACyD;AACzD,KAAI,CAAC,OAAQ;CAEb,MAAM,mBAAyD,EAAE;AACjE,KAAI,OAAO,WACT,MAAK,MAAM,KAAK,OAAO,WACrB,kBAAiB,KAAK;EAAE,WAAW;EAAG,aAAa;EAAO,CAAC;AAG/D,KAAI,OAAO,oBACT,MAAK,MAAM,KAAK,OAAO,oBACrB,kBAAiB,KAAK;EAAE,WAAW;EAAG,aAAa;EAAM,CAAC;AAG9D,KAAI,iBAAiB,OACnB,QAAO;EAAE,QAAQ;EAAY;EAAkB;;AAMnD,MAAM,mBACJ,QACY;AACZ,KAAI,CAAC,IAAK,QAAO;AACjB,MAAK,MAAM,OAAO,kBAAkB;EAClC,MAAM,UAAU,IAAI,gBAAgB;AACpC,MAAI,SAAS,YAAY,UAAU,SAAS,qBAAqB,OAC/D,QAAO;;AAGX,QAAO;;AAGT,MAAa,4BACX,KACA,aACA,EAAE,UAAU,EAAE,cACX;AACH,KAAI,CAAC,YAAY,qBAAqB,CAAC,MAAO;CAE9C,MAAM,sBAAsB,8BAC1B,YAAY,QACb;CAED,MAAM,4BAGF,EAAE;AAKN,2BAA0B,SAAS,oBAAoB,WAAW;AAClE,2BAA0B,YAAY,oBAAoB,WAAW;AACrE,2BAA0B,YAAY,oBAAoB,WAAW;AACrE,2BAA0B,QAAQ,oBAAoB,WAAW;AACjE,2BAA0B,UAAU,oBAAoB,WAAW;AAEnE,KAAI,oBAAoB,WAAW,aACjC,2BAA0B,gBACxB,oBAAoB,WAAW;CAInC,MAAM,iCAA4D,IAAI,KAAK;AAE3E,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,CAAC,KAAK,kBAAmB;AAE7B,OAAK,MAAM,aAAa,KAAK,mBAAmB;GAC9C,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,UAAU;GAEtC,MAAM,gBAA4D,EAAE;AAGpE,OAAI,UAAU,aACZ,eAAc,KACZ,GAAG,uBACD,MACA,UAAU,QACV,oBACD,CACF;YACQ,UAAU,IACnB,eAAc,KACZ,GAAG,uBACD,OACA,UAAU,QACV,oBACD,CACF;AAGH,QAAK,MAAM,cAAc,kBAAkB;AACzC,QACE,UAAU,WACT,eAAe,aAAa,eAAe,iBAE5C;AAEF,QACE,eAAe,mBACf,CAAC,oBAAoB,WAAW,aAEhC;IAEF,MAAM,MAAM,gBAAgB;AAC5B,QAAI,OAAO,WAAW;KACpB,MAAM,SAAS,UAAU;KACzB,MAAM,YAAY,uBAAuB,QAAiB,WAAW;AACrE,SAAI,WAAW;MACb,MAAM,gBAAgB,cAAc,WACjC,MAAM,EAAE,WAAW,WACrB;AACD,UAAI,iBAAiB,EACnB,eAAc,iBAAiB;UAE/B,eAAc,KAAK,UAAU;;;;AAMrC,OAAI,cAAc,OAEhB,gBAAe,IAAI,KAAK;IACtB,OAAO,KAAA;IACP,SAAS,KAAK;IACd,QAAQ,UAAU;IAClB;IACD,CAAC;;;CAMR,MAAM,wBAAQ,IAAI,KAAa;AAE/B,MAAK,MAAM,eAAe,YAAY,mBAAmB;EAEvD,MAAM,UAAU,kBAAkB,YAAY,QAAQ;AACtD,MAAI,YAAY,WAAY;EAE5B,MAAM,MAAM,GAAG,QAAQ,GAAG,YAAY;EACtC,MAAM,gBAAgB,eAAe,IAAI,IAAI;AAE7C,MAAI,eAAe;AACjB,SAAM,IAAI,IAAI;GAEd,MAAM,QAA6C,EAAE;GACrD,MAAM,SAA+C,EAAE;AAGvD,QAAK,MAAM,cAAc,kBAAkB;AACzC,QACE,eAAe,mBACf,CAAC,oBAAoB,WAAW,aAEhC;IAGF,MAAM,QAAQ,YAAY,cAAc,MACrC,MAAM,EAAE,WAAW,WACrB;IACD,MAAM,UAAU,cAAc,cAAc,MACzC,MAAM,EAAE,WAAW,WACrB;IAED,MAAM,UAAU,OAAO,oBAAoB,EAAE;IAC7C,MAAM,YAAY,SAAS,oBAAoB,EAAE;IAajD,MAAM,mBAJiB,wBANoC;KACzD,OAAO,YAAY;KACnB,SAAS,YAAY;KACrB,QAAQ,YAAY;KACpB,eAAe,CAAC;MAAE,QAAQ;MAAY,kBAAkB;MAAS,CAAC;KACnE,EAGC,0BACD,CAAC,cAAc,IACyB,oBAAoB,EAAE;IAG/D,MAAM,UAAU,UAAU,QACvB,OACC,CAAC,iBAAiB,MAAM,OACtB,sBACE,IACA,IACA,YACA,0BACD,CACF,CACJ;IAID,MAAM,WAAW,QAAQ,QACtB,OACC,CAAC,UAAU,MAAM,OACf,sBACE,IACA,IACA,YACA,0BACD,CACF,CACJ;AAED,QAAI,QAAQ,QAAQ;KAClB,MAAM,EAAE,SAAS,cAAc,sBAAsB,QAAQ;KAC7D,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAC1D,SAAI,QAAQ,cAAc,QAAQ,oBAChC,OAAM,gBAAgB,eAAe;;AAIzC,QAAI,SAAS,QAAQ;KACnB,MAAM,EAAE,SAAS,cAAc,sBAAsB,SAAS;KAC9D,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAC1D,SAAI,QAAQ,cAAc,QAAQ,oBAChC,QAAO,gBAAgB,eAAe;;;GAK5C,MAAM,WAAW,gBAAgB,MAAM;GACvC,MAAM,YAAY,gBAAgB,OAAO;AAEzC,OAAI,YAAY,UACd,KAAI,KAAK;IACP,MAAM;IACG;IACT,QAAQ,YAAY;IACpB,OAAO,WAAW,QAAQ,KAAA;IAC1B,QAAQ,YAAY,SAAS,KAAA;IAC9B,CAAC;SAEC;GAEL,MAAM,SAA+C,EAAE;AAEvD,QAAK,MAAM,OAAO,YAAY,eAAe;IAC3C,MAAM,EAAE,SAAS,cAAc,sBAC7B,IAAI,iBACL;IACD,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAC1D,QAAI,QAAQ,cAAc,QAAQ,oBAChC,QAAO,gBAAgB,IAAI,WAAW;;AAI1C,OAAI,gBAAgB,OAAO,CACzB,KAAI,KAAK;IACP,MAAM;IACG;IACT,QAAQ,YAAY;IACpB;IACD,CAAC;;;AAMR,MAAK,MAAM,CAAC,KAAK,kBAAkB,gBAAgB;AACjD,MAAI,MAAM,IAAI,IAAI,CAAE;EAEpB,MAAM,QAA6C,EAAE;AAErD,OAAK,MAAM,OAAO,cAAc,eAAe;GAC7C,MAAM,EAAE,SAAS,cAAc,sBAC7B,IAAI,iBACL;GACD,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAC1D,OAAI,QAAQ,cAAc,QAAQ,oBAChC,OAAM,gBAAgB,IAAI,WAAW;;AAIzC,MAAI,gBAAgB,MAAM,CACxB,KAAI,KAAK;GACP,MAAM;GACN,SAAS,cAAc;GACvB,QAAQ,cAAc;GACtB;GACD,CAAC;;;;;;;;;ACzcR,IAAa,iBAAb,MAA4B;;6BACpB,IAAI,KAAa;;CACvB,IAAI,aAAiC,UAAU,MAAc;AAC3D,OAAK,IAAI,IAAI,IAAI,WAAW,KAAK,KAAK,GAAG;;;AAI7C,MAAa,mBAAmB,OAC9B,SACA,QACA,KACA,aACA,WACgC;CAChC,MAAM,EAAE,mBAAmB,kBAAkB;AAE7C,OAAM,aAAa,KAAK,aAAa,OAAO;AAE5C,0BAAyB,KAAK,aAAa,OAAO;CAElD,MAAM,aAAa,eAAe,mBAAmB,YAAY;AAEjE,OAAM,eAAe,KAAK,aAAa,OAAO;AAC9C,mBAAkB,KAAK,aAAa,OAAO;CAE3C,MAAM,iBAAiB,IAAI,gBAAgB;AAE3C,OAAM,eACJ,KACA,SACA,YACA,aACA,QACA,eACD;AACD,OAAM,aAAa,KAAK,aAAa,QAAQ,eAAe;AAE5D,OAAM,cACJ,KACA,YACA,SACA,aACA,QACA,QACA,eACD;AAED,QAAO,eAAe,eAAe,QAAQ,IAAI;;ACrEnD,MAAM,8BAAc,IAAI,MAAM,WAAW;AAEzC,MAAa,kBAAkB,OAC7B,SACA,QACA,eACA,yBACA,OACA,sBACwC;CACxC,MAAM,cAAc,IAAI,SAAS,UAAU,cAAc;CAEzD,IAAI;AAEJ,KAAI;AACF,QAAM,QAAQ,YAAY,KAAA,GAAW,KAAA,GAAW,OAAO,QAAQ;GAC7D,MAAM,YAAuC,EAAE;AAC/C,gBAAa,aAAsC;AACjD,cAAU,KAAK,SAAS;KACxB;GAEF,MAAM,EAAE,QAAQ;AAChB,UAAO,MAAM;GAEb,MAAM,KAAK,yBAAyB,KAAK,MAAM,OAAO,CAAC,MACrD,OAAO,YACR;AAED,UAAO,MAAM;AAEb,QAAK,MAAM,YAAY,UACrB,OAAM,SAAS,IAAI,KAAK;GAG1B,MAAM,cAAc,MAAM,mBAAmB,KAAK;IAChD;IACA,uBAAuB,mBAAmB;IAC3C,CAAC;AACF,2BAAwB,YAAY;AAEpC,OAAI;AACF,WAAO,MAAM,iBACX,KACA,QACA,EAAE,EACF,aACA,wBACD;YACM,KAAK;AACZ,QAAI,eAAe,aAAa;AAC9B,YAAO;AACP,WAAM;;AAER,UAAM;;AAGR,SAAM;IACN;UACK,KAAK;AACZ,MAAI,QAAQ,YACV,OAAM;;AAIV,QAAO;;AC3DT,MAAa,UACX,KACA,QACA,kBACG;AACH,KAAI,CAAC,OAAO,OAAQ;CAEpB,MAAM,OAAe,EAAE;CAEvB,IAAI,OAAO,KAAK,QAAQ;AACxB,KAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,WAAW,MAC1D,SAAQ,MAAM,SAAS,QAAQ,MAAc;KAE7C,EAAC,CAAE,OAAO,KAAK,QAAQ,QAAS;AAGlC,MAAK,MAAM,KAAK,IACd,SAAQ,EAAE,MAAV;EACE,KAAK,SAAS;GACZ,IAAI,gBAAgB,CAAC,CAAC,EAAE;GACxB,MAAM,WAAW;IACf,QAAQ;IACR,OAAO,EAAE,SAAS,UAAU;IAC5B,SAAS,EAAE,UAAU,UAAU;IAC/B,eACE,EAAE,aAAa,QACZ,KAAK,MAAO,EAAE,aAAa,MAAM,IAAI,KACtC,EACD,IAAI;IACP,OACE,EAAE,aAAa,QACZ,KAAK,MAAO,EAAE,QAAQ,MAAM,IAAI,KACjC,EACD,IAAI;IACR;AACD,QAAK,MAAM,OAAO,EAAE,OAAO;AACzB,aAAS;IAET,MAAM,SAAS,EAAE,MAAM;AACvB,QAAI,OAAO,KAAK,WACd,iBAAgB;AAGlB,QAAI,OAAO,KAAK,QACd,UAAS,SAAS,OAAO,KAAK,QAAQ;AAGxC,QAAI,OAAO,KAAK,SACd,UAAS,WAAW,OAAO,KAAK,SAAS;AAG3C,QAAI,OAAO,KAAK,YACd,UAAS,kBAAkB,OAAO,KAAK,YAAY;AAGrD,QAAI,OAAO,KAAK,OACd,UAAS,SAAS,OAAO,KAAK,OAAO;;GAIzC,MAAM,UAAoB,EAAE;AAE5B,QAAK,MAAM,OAAO,UAAU;IAC1B,MAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,QAAQ,SACnB,SAAQ,KACN,GAAG,MAAM,GAAG,UAAU,KAAK,OAAO,QAAQ,UAAU,OAAO,IAAI,GAChE;;AAIL,OAAI,CAAC,cACH,SAAQ,KAAK,iBAAiB;AAGhC,QAAK,KACH,GACE,EAAE,WAAW,WACT,MAAM,iBAAiB,GACvB,IAAI,eAAe,CACxB,GAAG,WAAW,GAAG,cAAc,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,GACzD;AACD;;EAEF,KAAK,eAAe;GAClB,MAAM,QAAgB,EAAE;GAExB,MAAM,YAA6B;IACjC,GAAG;IACH,OAAO,EAAE;IACT;IACA,WAAW;IACX,WAAW,OAAO;IACnB;AAED,QAAK,MAAM,OAAO,EAAE,OAAO;IACzB,MAAM,UAAU,QAAQ,EAAE,MAAM,KAAK;AACrC,SAAK,MAAM,UAAU,QACnB,KAAI,OAAO,SAAS,SAAS,OAAO,SAAS,QAAQ;KACnD,MAAM,SAAS,OAAO;KACtB,MAAM,EAAE,YAAY,SAAS,UAAU,aAAa,WAClD,OAAO;AAET,WAAM,KACJ,GACE,OAAO,SAAS,QACZ,MAAM,eAAe,GACrB,IAAI,gBAAgB,CACzB,GAAG,IAAI,GACN,OAAO,KAAK,SAAS,gBAAgB,QAAQ,cAAc,GAC1D,OAAO,KAAK,aAAa,cAAc,KACxC,aAAa,iBAAiB,KAE9B,cACI,eAAe,YACZ,KAAK,OAAO;AACX,aAAO,GAAG,kBACR,GAAG,UACJ,CAAC,GAAG,GAAG,eAAe,KAAK,KAAK,CAAC;OAClC,CACD,KAAK,KAAK,KACb,KAEJ,SAAS,SACL,QAAQ,WAAW,IACjB,gBACA,SAAS,QAAQ,OAAO,YAC1B,KAEJ,UAAU,SACN,SAAS,WAAW,IAClB,kBACA,SAAS,SAAS,OAAO,aAC3B,KAEJ,QAAQ,SACJ,YAAY,OACT,KAAK,UAAU,MAAM,IAAI,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAC/C,KAAK,KAAK,KACb,KAEP;eACQ,OAAO,SAAS,UAAU;KACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ;AAC5C,SAAI,OAAO,UAAW,QAAO,YAAY,KAAK;KAE9C,MAAM,UAAkB,EAAE;AAC1B,WAAM,KAAK,GAAG,OAAO,kBAAkB,CAAC,GAAG,KAAK,IAAI,QAAQ;AAC5D,aAAQ,KAAK,GAAG,OAAO,OAAO,CAAC,IAAI;KAEnC,MAAM,WAAW,OAAO,KAAK,QAAQ,OAAO,WAAW,IAAI;AAC3D,SAAI,SACF,MAAK,MAAM,QAAQ,SACjB,SAAQ,SAAS,KAAK;AAI1B,aAAQ,KAAK,KAAK,OAAO,KAAK,CAAC,IAAI;KAEnC,MAAM,SAAS,OAAO,GAAG,QAAQ,OAAO,WAAW,IAAI;AACvD,SAAI,OACF,MAAK,MAAM,QAAQ,OACjB,SAAQ,SAAS,KAAK;eAGjB,OAAO,SAAS,SACzB,OAAM,KACJ,GAAG,OAAO,kBAAkB,CAAC,GAC3B,OAAO,YAAY,YAAY,IAAI,GAAG,IACvC,GAAG,OAAO,KAAK,CAAC,GAAG,OAAO,OAC5B;QAED,YAAW,OAAO,KAAK;;AAK7B,OAAI,EAAE,KAAK,WACT,OAAM,KACJ,GAAG,IAAI,qBAAqB,CAAC,OAAO,EAAE,KAAK,WAAW,QAAQ,KAC5D,KACD,CAAC,GACH;AAGH,OAAI,EAAE,KAAK,QACT,MAAK,MAAM,SAAS,EAAE,KAAK,QACzB,OAAM,KACJ,GAAG,IACD,SAAS,MAAM,QAAQ,SAAS,YAAY,GAAG,QAChD,CAAC,OAAO,MAAM,QACZ,KAAK,MAAO,YAAY,IAAI,EAAE,SAAS,EAAE,WAAY,CACrD,KAAK,KAAK,CAAC,GACf;AAIL,OAAI,EAAE,KAAK,SACT,MAAK,MAAM,WAAW,EAAE,KAAK,SAC3B,OAAM,KACJ,GAAG,IAAI,iBAAiB,CAAC,OAAO,QAAQ,QACrC,KAAK,MAAO,YAAY,IAAI,EAAE,SAAS,EAAE,WAAY,CACrD,KAAK,KAAK,CAAC,GACf;AAIL,OAAI,EAAE,KAAK,aAAa;AACtB,SAAK,MAAM,EAAE,gBAAgB,EAAE,KAAK,aAAa;AAC/C,SAAI,CAAC,WAAY;KAEjB,MAAM,CAAC,QAAQ,QAAQ,0BACrB,eACA,WAAW,UACZ;AAED,WAAM,KACJ,GAAG,IAAI,qBAAqB,CAAC,OAAO,WAAW,QAAQ,KACrD,KACD,CAAC,OAAO,WACP;MACE;MACA;MACD,EACD,cACD,CAAC,GAAG,WAAW,eAAe,KAAK,KAAK,CAAC,GAC3C;;AAGH,SAAK,MAAM,EAAE,WAAW,EAAE,KAAK,aAAa;AAC1C,SAAI,CAAC,MAAO;AAEZ,WAAM,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,MAAM,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG;;;AAIvE,OAAI,EAAE,IAAI,WACR,OAAM,KACJ,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,WAAW,QAAQ,KAC5D,KACD,CAAC,GACH;AAGH,OAAI,EAAE,IAAI,QACR,MAAK,MAAM,SAAS,EAAE,IAAI,QACxB,OAAM,KACJ,GAAG,MACD,QAAQ,MAAM,QAAQ,SAAS,YAAY,GAAG,QAC/C,CAAC,OAAO,MAAM,QACZ,KAAK,MAAO,YAAY,IAAI,EAAE,SAAS,EAAE,WAAY,CACrD,KAAK,KAAK,CAAC,GACf;AAIL,OAAI,EAAE,IAAI,SACR,MAAK,MAAM,WAAW,EAAE,IAAI,SAC1B,OAAM,KACJ,GAAG,MAAM,gBAAgB,CAAC,OAAO,QAAQ,QACtC,KAAK,MAAO,YAAY,IAAI,EAAE,SAAS,EAAE,WAAY,CACrD,KAAK,KAAK,CAAC,GACf;AAIL,OAAI,EAAE,IAAI,aAAa;AACrB,SAAK,MAAM,EAAE,gBAAgB,EAAE,IAAI,aAAa;AAC9C,SAAI,CAAC,WAAY;AAEjB,WAAM,KACJ,GAAG,MAAM,oBAAoB,CAAC,OAAO,WAAW,QAAQ,KACtD,KACD,CAAC,OACA,WAAW,UACZ,GAAG,WAAW,eAAe,KAAK,KAAK,CAAC,GAC1C;;AAGH,SAAK,MAAM,EAAE,WAAW,EAAE,IAAI,aAAa;AACzC,SAAI,CAAC,MAAO;AAEZ,WAAM,KACJ,GAAG,MAAM,cAAc,CAAC,GAAG,MAAM,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,GACvD;;;AAIL,QAAK,KACH,GAAG,OAAO,iBAAiB,CAAC,GAAG,WAAW,GAAG,cAAc,GACzD,MAAM,SAAS,MAAM,KAExB;AAED,OAAI,MAAM,OACR,MAAK,KAAK,MAAM;AAGlB;;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,WACT,MAAM,kBAAkB,GACxB,IAAI,gBAAgB,CACzB,GAAG,EAAE,OACP;AACD;EAEF,KAAK;AACH,QAAK,KACH,GAAG,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,KAAK,CAAC,GAAG,EAAE,KAC7D;AACD;EAEF,KAAK;AACH,QAAK,KACH,GAAG,OACD,KACE,EAAE,eAAe,EAAE,WACf,EAAE,SAAS,EAAE,KACX,6BACA,qBACF,SACL,GAAG,EAAE,KAAK,aAAa,GACzB,CAAC,GAAG,WACH;IACE,QAAQ,EAAE;IACV,MAAM,EAAE;IACT,EACD,cACD,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,WACnB;IACE,QAAQ,EAAE;IACV,MAAM,EAAE;IACT,EACD,cACD,GACF;AACD;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,WACT,MAAM,qBAAqB,GAC3B,IAAI,mBAAmB,CAC5B,GAAG,WAAW,GAAG,cAAc,GAC9B,EAAE,UAAU,IAAI,KAAK,EAAE,QAAQ,KAAK,KAEvC;AACD;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,WAAW,MAAM,gBAAgB,GAAG,IAAI,cAAc,CACpE,GAAG,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,GAC3D;AACD;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,QACT,MAAM,uBAAuB,GAC7B,IAAI,4BAA4B,CACrC,GAAG,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,GACzD;AACD;EAEF,KAAK;AACH,OAAI,EAAE,WACJ,MAAK,KACH,GAAG,IAAI,4BAA4B,CAAC,GAAG,WACrC,GACA,cACD,CAAC,IAAI,EAAE,WAAW,KAAK,KAAK,GAC9B;AAEH,OAAI,EAAE,SACJ,MAAK,KACH,GAAG,MAAM,uBAAuB,CAAC,GAAG,WAClC,GACA,cACD,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,GAC5B;AAEH;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,WACT,MAAM,kBAAkB,GACxB,IAAI,gBAAgB,CACzB,GAAG,WAAW,GAAG,cAAc,GACjC;AACD;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aACH;EACF,KAAK;AACH,QAAK,KACH,GAAG,OAAO,YAAY,EAAE,KAAK,aAAa,GAAG,CAAC,YAAY,WACxD;IAAE,QAAQ,EAAE;IAAa,MAAM,EAAE;IAAW,EAC5C,cACD,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,KAAK,CAAC,GAAG,EAAE,KACnC;AACD;EAEF,KAAK;AACH,QAAK,KACH,GACE,EAAE,WAAW,WAAW,MAAM,gBAAgB,GAAG,IAAI,cAAc,CACpE,GAAG,EAAE,OACP;AACD;EACF,KAAK;EACL,KAAK;AACH,OAAI,EAAE,SAAS,aACb,MAAK,KACH,GAAG,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,KAAK,CAAC,GAAG,EAAE,KAC3D;OAED,MAAK,KAAK,GAAG,OAAO,gBAAgB,CAAC,GAAG,EAAE,OAAO;AAEnD;EAEF,KAAK,oBAAoB;GAEvB,MAAM,gBAAgB,MACpB,MAAM,QAAQ,mBAAmB;GAEnC,MAAM,SAAS,EAAE,SACb,cAAc,OAAO,KAAK,EAAE,OAAO,KACnC,IAAI,OAAO,KAAK,iBAAiB;GAGrC,MAAM,QAAkB,EAAE;AAC1B,OAAI,EAAE,MACJ,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,EAAE,MAAM,EAAE;AACvD,QAAI,CAAC,OAAQ;IAEb,MAAM,OAAO,QAAQ,QAAQ,YAAY,MAAM,CAAC,aAAa;AAG7D,QAAI,OAAO,YAAY,OACrB,OAAM,KACJ,GAAG,MAAM,6BAA6B,CAAC,GAAG,OAAO,WAC9C,IAAI,aAAa,CACjB,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,UAAU,SAC5C;AAIH,QAAI,OAAO,qBAAqB,OAC9B,OAAM,KACJ,GAAG,MACD,6BACD,CAAC,GAAG,OAAO,oBACT,IAAI,aAAa,CACjB,KAAK,KAAK,CAAC,MAAM,KAAK,wBACvB,EAAE,UACD,SACJ;;AAIP,OAAI,EAAE,OACJ,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,EAAE,OAAO,EAAE;AACxD,QAAI,CAAC,OAAQ;IAEb,MAAM,OAAO,QAAQ,QAAQ,YAAY,MAAM,CAAC,aAAa;AAG7D,QAAI,OAAO,YAAY,OACrB,OAAM,KACJ,GAAG,IAAI,8BAA8B,CAAC,GAAG,OAAO,WAC7C,IAAI,aAAa,CACjB,KAAK,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,UAAU,SAC9C;AAIH,QAAI,OAAO,qBAAqB,OAC9B,OAAM,KACJ,GAAG,IACD,8BACD,CAAC,GAAG,OAAO,oBACT,IAAI,aAAa,CACjB,KAAK,KAAK,CAAC,MAAM,KAAK,0BACvB,EAAE,UACD,SACJ;;AAIP,OAAI,MAAM,OACR,MAAK,KAAK,MAAM,KAAK,KAAK,CAAC;AAE7B;;EAEF,QACE,YAAW,EAAE;;CAInB,MAAM,SAAS,aAAa,MAAM,IAAI,KAAK;AAC3C,QAAO,OAAO,IAAI,OAAO;;AAG3B,MAAM,cACJ,EAAE,QAAQ,QACV,kBACG;AACH,QAAO,UAAU,WAAW,gBAAgB,GAAG,OAAO,GAAG,SAAS;;ACxdpE,IAAa,cAAb,cAAiC,MAAM;AAEvC,MAAa,WAAW,OACtB,UACA,QACA,MACA,cACkB;CAClB,IAAI,EAAE,WAAW;AACjB,KAAI,CAAC,UAAU,CAAC,OAAO,UAAW,OAAM,cAAc,OAAO;AAC7D,KAAI,CAAC,SAAS,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAE3E,KAAI,CAAC,OAAO,SAAS,MAAM,CAAE,WAAU;CAEvC,IAAI,gBAAgB,KAAK,MAAM;CAC/B,IAAI;AACJ,KAAI,kBAAkB,MAAM;AAC1B,OAAK;AACL,kBAAgB;OAEhB,MAAK,KAAK,OAAO;AAGnB,KAAI,UACF,YAAW,CAAC,UAAU,QAAQ;CAGhC,MAAM,KAAK,MAAM,gBAAgB,QAAQ,OAAO;CAChD,MAAM,EAAE,aAAa,aAAa,GAAG;CAErC,MAAM,wBAAwB,SAAS,QACnC,SAAS,kBACP,EAAE,UAAU,SAAS,iBAAiB,GACtC,cACF,KAAA;CAEJ,MAAM,EAAE,gBAAgB,MAAM,yBAC5B,UACA,QACA,uBACA,SAAS,QAAQ,EAAE,uBAAuB,MAAM,GAAG,KAAA,GACnD,UACD;CAED,MAAM,CAAC,WAAW;CAClB,MAAM,gBAAgB,QAAQ,WAAW;CACzC,MAAM,iBACH,OAAO,kBAAkB,aAAa,eAAe,GAAG,kBACzD;CAEF,MAAM,YAAY,MAAM,eACtB,IACA,eACA,UACA,YACD;CAID,MAAM,0BAAkD;EACtD,mBAHwB,sBAAsB,QAAQ,cAAc;EAIpE;EACA;EACA;EACD;CAED,MAAM,MAAmB,EAAE;CAE3B,IAAI;AACJ,KAAI;AACF,kBAAgB,MAAM,iBACpB,SACA,QACA,KACA,aACA,wBACD;UACM,KAAK;AACZ,MAAI,eAAe,aAAa;AAC9B,SAAM,cAAc,SAAS;AAC7B;;AAEF,QAAM;;AAGR,KAAI,iBAAiB,CAAC,WAAW;EAC/B,MAAM,SAAS,MAAM,gBACnB,SACA,QACA,eACA,yBACA,uBACA,SAAS,QAAQ,EAAE,uBAAuB,MAAM,GAAG,KAAA,EACpD;AAED,MAAI,WAAW,KAAA,EACb,OAAM,IAAI,MACR,wKAAwK,gBACtK,WAAW,QAAQ,KAAK,sBAAsB,WAEjD;;CAIL,MAAM,EAAE,WAAW;AAEnB,MAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAW,OAAM,cAAc,SAAS;AAExE,KAAI,CAAC,eAAe;AAClB,UAAQ,IAAI,2BAA2B;AACvC;;CAGF,MAAM,UAAU,WAAW,WAAY,MAAM,gBAAgB,EAAE,EAAE,OAAO;CAExE,MAAM,WAAqB,EAAE;AAC7B,OAAM,mBACJ;EACE,GAAG;EACH,QAAQ,SAAS;GAAE,GAAG;GAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI;GAAE,GAAG;EACpE,EACD,SACA,eACA,cACD;AAED,QAAO,KAAK,QAAQ,cAAc;AAElC,KAAI,OACF,MAAK,MAAM,OAAO,SAChB,QAAO,IAAI,KAAK,MAAM;AAI1B,KAAI,GACF,MAAK,MAAM,WAAW,SACpB,OAAM,gBAAgB,SAAS,OAAO;UAE/B,CAAC,UACV,OAAM,cAAc,SAAS;;AAIjC,MAAM,iBAAiB,2BACrB,IAAI,MACF,KACE,OAAO,SAAS,cAAc,SAC/B,2EACF;AAEH,MAAM,kBAAkB,OACtB,QACA,WACwB;CAIxB,MAAM,MAHS,MAAM,OAAO,OAC1B,cAAc,KAAK,QAAQ,OAAO,UAAU,OAAO,CAAC,CAAC,UAAU,CAChE,EAEC,OAAO,gBAAgB;AAEzB,KAAI,CAAC,IAAI,IACP,OAAM,IAAI,MACR,0CACE,OAAO,gBAAgB,KACxB,QAAQ,OAAO,SACjB;AAEH,QAAO;;AAGT,MAAM,2BAA2B,OAC/B,UACA,QACA,OACA,mBACA,cAGI;AACJ,KAAI,UAGF,QAAO,EACL,aAAa;EACX,SAJY,MAAM,aAAa,SAAS,GAAG;EAK3C,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,OAAO,EAAE;EACT,SAAS,EAAE;EACX,UAAU,EAAE;EACZ,aAAa,EAAE;EACf,UAAU,EAAE;EACZ,YAAY,EAAE;EACd,OAAO,EAAE;EACT,SAAS,EAAE;EACX,YAAY,EAAE;EACf,EACF;AAGH,MAAK,MAAM,WAAW,SACpB,OAAM,QAAQ,SAAS,OAAO;CAGhC,MAAM,eAAe,MAAM,QAAQ,IACjC,SAAS,KAAK,YACZ,mBAAmB,SAAS;EAC1B;EACA,uBAAuB,mBAAmB;EAC3C,CAAC,CACH,CACF;CAED,MAAM,cAAc,aAAa;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IACvC,qBAAoB,aAAa,aAAa,IAAI,EAAE;AAGtD,QAAO,EAAE,aAAa;;AAGxB,MAAM,uBACJ,GACA,GACA,GACA,SACG;CACH,IAAI;AACJ,KAAI,OAAO,MAAM,OAAO,EACtB,OAAM;AAGR,KAAI,CAAC,KAAK,OAAO,MAAM;MACjB,MAAM,EACR,OAAM;YAGJ,MAAM,QAAQ,EAAE,CAClB,MAAK,IAAI,IAAI,GAAG,MAAM,EAAE,QAAQ,IAAI,KAAK,IACvC,qBACE,EAAE,IACD,EAAgB,IACjB,GACA,OAAO,GAAG,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,CACnC;KAGH,MAAK,MAAM,OAAO,EAChB,qBACE,EAAE,MACD,EAA8B,MAC/B,GACA,OAAO,GAAG,KAAK,GAAG,QAAQ,IAC3B;AAKP,KAAI,IACF,OAAM,IAAI,MAAM,GAAG,KAAK,iCAAiC,IAAI;;AAIjE,MAAM,iBAAiB,OACrB,IACA,eACA,UACA,gBACuB;CACvB,MAAM,6BAAa,IAAI,KAAa;CACpC,MAAM,8BAAc,IAAI,KAAwB;CAEhD,MAAM,YAAuB;EAC3B,yBAAS,IAAI,IAAI,KAAA,EAAU;EAC3B,uBAAO,IAAI,KAAK;EAChB,QAAQ,EAAE;EACV,SAAS,EAAE;EACZ;AAED,WAAU,QAAQ,IAAI,cAAc;CAEpC,MAAM,0BAAU,IAAI,KAAyB;AAE7C,MAAK,MAAM,OAAO,IAAI;AACpB,MAAI,IAAI,OAAO,IAAK;EAEpB,MAAM,QAAQ,GAAG;AAEjB,MAAI,CAAC,MAAM,MACT,OAAM,IAAI,MAAM,SAAS,IAAI,4BAA4B;EAG3D,MAAM,SAAS,eAAe,MAAM;EACpC,MAAM,OAAO,oBAAoB;GAAE;GAAQ,MAAM,MAAM;GAAO,CAAC;AAC/D,MAAI,WAAW,IAAI,KAAK,CACtB,OAAM,IAAI,MAAM,SAAS,KAAK,4BAA4B;AAG5D,aAAW,IAAI,KAAK;AAEpB,MAAI,OAAQ,WAAU,QAAQ,IAAI,OAAO;AAEzC,YAAU,OAAO,KAAK;GACpB,OAAO,MAAM;GACb,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,GAAG,EACD,QAAQ,eAAe,MAAM,EAC9B;GACF,CAAC;AAEF,OAAK,MAAM,OAAO,MAAM,WAAW;GACjC,MAAM,SAAS,MAAM,MAAM;AAE3B,OAAI,UAAU,eAAe,OAC3B,kCAAiC,QAAQ,aAAa,UAAU;;AAIpE,OAAK,MAAM,OAAO,MAAM,OAAO;GAC7B,MAAM,SAAS,MAAM,MAAM;AAE3B,OAAI,OAAO,KAAK,SACd,QAAO,MAAM,MAAM;YACV,kBAAkB,cAAc;IACzC,MAAM,CAAC,aAAa,eAAe,QAAQ,0BACzC,eACA,OAAO,SACR;AACD,YAAQ,IAAI,OAAO,UAAU;KAC3B;KACA;KACA,QAAS,OAAO,KAAK,MACnB,IAAI,cAAc,oBAAoB;KACzC,CAAC;UACG;IACL,MAAM,KACJ,OAAO,aAAa,SAChB,SACA,kBAAkB,eAChB,OAAO,KAAK,KAAK,aAAa,SAC9B,OAAO,KAAK,OACZ,KAAA;AAER,QAAI,GACF,mBAAkB,IAAI,eAAe,UAAU;;;;AAMvD,KAAI,SAAS,WACX,MAAK,MAAM,aAAa,SAAS,YAAY;EAC3C,MAAM,CAAC,UAAU,0BAA0B,eAAe,UAAU,KAAK;AACzE,MAAI,OAAQ,WAAU,QAAQ,IAAI,OAAO;;AAI7C,KAAI,SAAS,QACX,MAAK,MAAM,OAAO,SAAS,SAAS;EAClC,MAAM,CAAC,aAAa,eAAe,QAAQ,0BACzC,eACA,IACD;EACD,MAAM,SAAS,SAAS,QAAQ,KAAK,YAAY;AAEjD,UAAQ,IAAI,KAAK;GACf;GACA;GACA;GACD,CAAC;;AAIN,MAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,YAAU,QAAQ,IAAI,OAAO,WAAW;AACxC,YAAU,QAAQ,KAAK,OAAO;;AAIhC,KAAI,SAAS;OACN,MAAM,QAAQ,SAAS,MAC1B,KAAI,KAAK;QACF,MAAM,aAAa,KAAK,kBAC3B,KAAI,UAAU,OAAQ,WAAU,QAAQ,IAAI,UAAU,OAAO;;;AAMrE,QAAO;;AAGT,MAAM,qBACJ,QACA,eACA,cACG;CACH,MAAM,EAAE,UAAU,YAAY;CAK9B,MAAM,CAAC,QAAQ,QAAQ,0BAA0B,eAAe,SAAS;CACzE,MAAM,aAAa,UAAU;AAE7B,WAAU,MAAM,IAAI,GAAG,WAAW,GAAG,QAAQ;EAC3C,QAAQ;EACR;EACA,QAAQ;EACT,CAAC;AACF,KAAI,OAAQ,WAAU,QAAQ,IAAI,OAAO;;AAG3C,MAAM,oCACJ,QACA,aACA,cACG;CACH,MAAM,IAAK,OAAoC;CAC/C,MAAM,OAAO,YAAY,IAAI,EAAE,MAAM;AACrC,KAAI,MAAM;AACR,OAAK,MAAM,OAAO,EAAE,MAClB,KAAI,EAAE,MAAM,KAAK,aAAa,KAAK,MAAM,MAAM,SAC7C,OAAM,IAAI,MACR,UAAU,IAAI,MAAM,EAAE,MAAM,qFAC7B;AAGL;;AAEF,aAAY,IAAI,EAAE,OAAO,EAAE;CAE3B,MAAM,YAAY,OAAO,OAAO,EAAE;CAElC,MAAM,QAAsB,EAAE;AAC9B,MAAK,MAAM,OAAO,UAAU,OAAO;EACjC,MAAM,SAAS,OAAO,OAAO,UAAU,MAAM,KAAK;AAClD,SAAO,OAAO;GACZ,GAAG,OAAO;GACV,MAAM,OAAO,KAAK,QAAQ;GAC1B,UAAU,KAAA;GACV,YAAY,KAAA;GACZ,SAAS,KAAA;GACV;AACD,QAAM,YAAY,IAAI,IAAI;;AAE5B,WAAU,QAAQ;AAClB,WAAU,WAAW;EACnB,GAAG,UAAU;EACb,WAAW;GACT,GAAG,UAAU,SAAS;GACtB,YAAY,EACV,SAAS,OAAO,KAAK,MAAM,EAC5B;GACF;EACD,cAAc;EACf;AAED,WAAU,OAAO,KAAK,UAAU;;AAKlC,MAAM,iBAAiB,aAAwB;AAC7C,QAAO,QAAQ,IAAI,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;;ACzepD,MAAa,yBACX,MACA,WAC6C;CAC7C,MAAM,kBACJ,OAAO,qBAAqB,SAAiB,YAAY,KAAK;CAEhE,MAAM,aAAyB,EAAE;CACjC,MAAM,QAAe,EAAE;AACvB,MAAK,MAAM,OAAO,KAChB,KAAI,IAAI,SAAS,SAAS;EACxB,MAAM,WAAW,YAAY,IAAI,KAAK;EACtC,MAAM,cAAc,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI;EACnE,IAAI,YAAY,KAAK,QAAQ,OAAO,UAAU,gBAAgB,SAAS,CAAC;AACxE,MAAI,CAAC,UAAU,SAAS,MAAM,CAAE,cAAa;EAE7C,MAAM,OAAO,aAAa,IAAI,KAAK;EAEnC,MAAM,OAAkB;GACtB;GACA,KAAK;GACL,MAAM;GACN;GACA,WAAW,GAAG,KAAK;GACpB;AAED,aAAW,eAAe;AAE1B,MAAI,IAAI,YACN,MAAK,MAAM,EAAE,gBAAgB,IAAI,aAAa;AAC5C,OAAI,CAAC,WAAY;AAEjB,IAAC,MAAM,WAAW,eAAyB,EAAE,EAAE,KAAK;IAClD,OAAO;IACP;IACD,CAAC;;;AAMV,QAAO;EAAE;EAAY;EAAO;;AAG9B,MAAa,mBACX,YACA,OACA,KACA,eACA,qBACA,kBACoB;CACpB,MAAM,YACJ,WAAW,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI;CAE5D,MAAM,UAAwB;EAC5B,cAAc;GACb,cAAc,UAAU,MAAM,cAAc,GAAG;EACjD;CAED,MAAM,QAAgB,EAAE;AAExB,KAAI,IAAI,OACN,OAAM,KAAK,YAAY,YAAY,IAAI,OAAO,CAAC,GAAG;AAGpD,OAAM,KAAK,oBAAoB,YAAY,IAAI,KAAK,CAAC,GAAG;AAExD,KAAI,IAAI,QACN,OAAM,KAAK,aAAa,YAAY,IAAI,QAAQ,CAAC,GAAG;AAGtD,KAAI,IAAI,iBAAiB,SACvB,OAAM,KAAK,uBAAuB;CAGpC,MAAM,eAAe,QACnB,IAAI,cACJ,IAAI,SAAS,UACb,IAAI,UAAU,UACd,IAAI,aAAa,OAClB;CAED,MAAM,YAAY,mBAChB;EAAE,GAAG;EAAK,OAAO,IAAI;EAAM;EAAe,EAC1C,IAAI,MACL;AAED,OAAM,KACJ,6BAA6B,eAAe,WAAW,GAAG,YAC1D,eAAe,CAAC,UAAU,GAAG,WAC7B,eAAe,UAAU,OAC1B;AAED,KAAI,aACF,OAAM,KAAK,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK;CAG9C,MAAM,YAAoB,EAAE;CAG5B,MAAM,YAAY,MADI,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI;AAErE,KAAI,UACF,MAAK,MAAM,EAAE,OAAO,gBAAgB,WAAW;AAC7C,UAAQ,cAAc,UAAU,MAAM,MAAM,KAAK,IAAI,MAAM;AAE3D,YAAU,KACR,GAAG,MAAM,IAAI,yBAAyB,MAAM,UAAU,MACtD,CACE,aAAa,WAAW,eACrB,IAAI,YAAY,CAChB,KAAK,KAAK,CAAC,KACd,gBAAgB,WAAW,QAAQ,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,IAChE,EACD,MACD;;AAIL,KAAI,IAAI,YACN,MAAK,MAAM,EAAE,gBAAgB,IAAI,aAAa;AAC5C,MAAI,CAAC,WAAY;EAEjB,MAAM,QAAQ,WAAW,WAAW;AACpC,UAAQ,cAAc,UAAU,MAAM,MAAM,KAAK,IAAI,MAAM;AAE3D,YAAU,KACR,GAAG,MAAM,IAAI,uBAAuB,MAAM,UAAU,MACpD,CACE,aAAa,WAAW,QAAQ,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,KAC5D,gBAAgB,WAAW,eACxB,IAAI,YAAY,CAChB,KAAK,KAAK,CAAC,IACf,EACD,MACD;;AAIL,KAAI,UAAU,OACZ,OAAM,KAAK,IAAI,iBAAiB,WAAW,KAAK;CAGlD,MAAM,cAAc,cAAc,QAAQ;CAE1C,MAAM,EAAE,MAAM,cAAc;CAC5B,MAAM,OAAe;EACnB,eAAe,KAAK,gBAAgB,UAAU;cACpC,KAAK,mBAAmB,UAAU;cAClC,KAAK,qBAAqB,UAAU;;eAEnC,UAAU,WAAW,oBAAoB;EACpD;EACA;EACD;AAED,QAAO;EACL,GAAG;EACH,SAAS,cAAc,SAAS,aAAa,MAAM,IAAI,KAAK;EAC7D;;AAGH,SAAS,cAAc,SAAyC;AAC9D,QAAO,OAAO,QAAQ,QAAQ,CAC3B,KAAK,CAAC,MAAM,UAAU,YAAY,KAAK,WAAW,KAAK,IAAI,CAC3D,KAAK,KAAK;;ACtLf,MAAM,EAAE,kBAAkB,cAAc,eAAe;AAIvD,MAAa,yBAAyB,OACpC,QACA,QACA,YACA,SACA,kBACgC;CAChC,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,QAAQ;CAClD,MAAM,aAAa,gBAAgB,QAAQ;CAC3C,MAAM,aAAa,uBAAuB,WAAW;AACrD,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,kDAAkD;CAEpE,MAAM,EAAE,QAAQ,eAAe,iBAAiB,YAAY,WAAW;CAEvE,MAAM,UAAoB,EAAE;CAE5B,IAAI;AACJ,KAAI,WAAW,UAAU,QAAQ,QAAQ;EACvC,IAAI,OAAO,QAAQ,MAAM,OAAO,KAAK,OAAO,IAAI,CAAC,MAAM;AAEvD,MAAI,KAAK,OAAO,IAAK,QAAO,OAAO,KAAK;AAExC,SAAO,UAAU,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM;AAEzC,MAAI,CAAC,KAAK,SAAS,IAAI,CAAE,SAAQ;AAEjC,MAAI,WAAW,OACb,SAAQ,oBAAoB,WACzB,KAAK,QACJ,IAAI,UACA,KAAK,eAAe,IAAI,MAAM,MAAM,CAAC,KAAK,IAAI,QAAQ,OACtD,YAAY,IAAI,KAAK,CAC1B,CACA,KAAK,KAAK,CAAC;AAGhB,MAAI,QAAQ,OACV,SAAQ,uBAAuB,QAC5B,MAAM,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,GAAI,CAC1C,KACE,QACC,GAAG,eACD,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,MAC/C,MACD,CAAC,WAAW,IAAI,SAAS,OACxB;GAAE,GAAG;GAAK,OAAO,IAAI;GAAM;GAAe,EAC1C,IAAI,SAAS,KAAK,QAAQ,GAC3B,CAAC,GACL,CACA,KAAK,SAAS,CAAC;AAGpB,mBAAiB,OAAO;;CAG1B,MAAM,gBAAgB,sBACpB,SACA,YACA,YACA,QACA,OACD;AAED,KAAI,cACF,WACE,SACA,SACA,cAAc,QAAQ,KACtB,cAAc,QAAQ,KACvB;AAGH,KAAI,eACF,gBAAe,SAAS,SAAS,OAAO,KAAK,OAAO,KAAK,eAAe;AAG1E,KAAI,cACF,WACE,SACA,SACA,cAAc,WAAW,KACzB,cAAc,WAAW,KAC1B;AAGH,QAAO,aAAa,SAAS,QAAQ;;AAGvC,MAAM,mBAAmB,YAA0C;AACjE,QAAO,iBAAiB,WAAW,SAAS,aAAa,QAAQ,KAAK,CACnE;;AAGL,MAAM,0BACJ,eACuB;AACvB,MAAK,MAAM,QAAQ,YAAY;AAC7B,MAAI,KAAK,SAAS,WAAW,kBAAmB;EAEhD,MAAM,MAAM;AAEZ,MADe,IAAI,gBAAgB,SAAS,CAAC,MAAM,GAAG,GAAG,KAC1C,aAAc;AAE7B,MAAI,CAAC,IAAI,aAAc;EAEvB,MAAM,WAAY,IAAI,aAAa,eAAgC;AAEnE,MAAI,CAAC;AAEL,OAAK,MAAM,WAAW,SACpB,KACE,QAAQ,KAAK,gBAAgB,eAC5B,QAAQ,gBACP,iBAAiB,QAAQ,gBACzB,QAAQ,aAAa,gBAAgB,YAEvC,QAAO,QAAQ,KAAK,YAAY,UAAU;;;AAQlD,MAAM,yBACJ,SACA,YACA,QACA,QACA,WACG;CACH,MAAM,SAAS,oBAAoB,SAAS,OAAO;CAEnD,IAAI,UAAU;CACd,IAAI,aAAa;CACjB,MAAM,eACJ,OAAO,WAAW,UAAU,CAAC,OAAO,WAAW;CACjD,MAAM,oBAAoB,QACvB,MAAM,OAAO,WAAW,KAAK,OAAO,IAAI,CACxC,SAAS,KAAK;CAEjB,MAAM,YAAY,OAAO,OAAO,OAAO;AACvC,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,MAAM,EAAE,MAAM,WAAW,QAAQ,UAAU;EAC3C,MAAM,aAAa,cAAc,QAAQ,KAAK;AAE9C,aAAW,cAAc,UAAU,WAAW,WAAW;AAEzD,gBAAc,GACZ,MAAM,KAAK,eAAe,MAAM,GACjC,IAAI,OAAO,IAAI,IAAI,IAAI,UAAU;AAElC,MAAI,MAAM,UAAU,SAAS,KAAK,CAAC,kBACjC,eAAc,KAAK;;AAIvB,KAAI,CAAC,QAAQ,OAAQ;CAErB,IAAI,YAAY;AAChB,MAAK,MAAM,QAAQ,WACjB,KAAI,KAAK,SAAS,WAAW,kBAC3B,aAAY,KAAK;AAIrB,QAAO;EACL,SAAS;GAAE,KAAK;GAAW,MAAM;GAAS;EAC1C,YAAY;GAAE,KAAK,OAAO,WAAW;GAAK,MAAM;GAAY;EAC7D;;AAGH,MAAM,uBAAuB,SAAiB,WAA+B;CAC3E,MAAM,QAAQ,QAAQ,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK;AAEtD,QADa,MAAM,MAAM,SAAS,GACtB,MAAM,OAAO,GAAG,MAAM;;AAGpC,MAAM,oBACJ,YACA,eACgE;AAChE,MAAK,MAAM,KAAK,YAAY;AAC1B,MAAI,EAAE,SAAS,WAAW,kBAAmB;AAE7C,OAAK,MAAM,QAAS,EAAwB,gBAAgB,cAAc;GACxE,MAAM,OAAO,KAAK;AAClB,OAAI,MAAM,SAAS,WAAW,eAAgB;AAE9C,OAAI,KAAK,WAAW,SAAS,KAAK,WAAY;AAE9C,OAAI,KAAK,UAAU,WAAW,EAC5B,OAAM,IAAI,MACR,2DACD;GAGH,MAAM,SAAS,KAAK,UAAU;AAC9B,OAAI,QAAQ,SAAS,WAAW,wBAC9B,OAAM,IAAI,MACR,yDACD;AAGH,UAAO;IAAE,QAAQ,KAAK,UAAU;IAAI,YAAY;IAAQ;;;AAI5D,OAAM,IAAI,MAAM,2CAA2C;;AAG7D,MAAM,aACJ,SACA,SACA,IACA,MACA,MAAM,OACH;AACH,KAAI,QAAQ,WAAW,EACrB,SAAQ,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,KAAK,QAAQ,OAAO,CAAC;MAC7C;EACL,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,OAAK,KAAK;AACV,UAAQ,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,CAAC;;;AAI7C,MAAM,kBACJ,SACA,SACA,MACA,IACA,SACG;AACH,WAAU,SAAS,SAAS,MAAM,MAAM,GAAG;;AAG7C,MAAM,gBAAgB,SAAiB,YAAsB;AAC3D,QAAO,QAAQ,SACX,QACG,KAAK,SACJ,OAAO,SAAS,WAAW,OAAO,QAAQ,MAAM,KAAK,IAAI,KAAK,GAAG,CAClE,CACA,KAAK,GAAG,GACX;;AC1PN,MAAa,OAAO,OAAO,UAAqB,WAAyB;AACvE,KAAI,CAAC,OAAO,UAAU,CAAC,OAAO,UAC5B,OAAM,IAAI,MACR,KACE,OAAO,SAAS,cAAc,SAC/B,kEACF;CAGH,MAAM,gBAAgB,OAAO,UAAU,aAAa;CACpD,MAAM,sBAAsB,OAAO,UAAU;CAE7C,MAAM,CAAC,WAAW;CAClB,MAAM,gBAAgB,QAAQ,WAAW;CACzC,MAAM,iBACH,OAAO,kBAAkB,aAAa,eAAe,GAAG,kBACzD;CAIF,MAAM,OAAO,MAAM,eAFP,sBAAsB,QAAQ,cAAc,EAEjB,SAAS,OAAO;CAEvD,MAAM,EAAE,YAAY,UAAU,sBAAsB,MAAM,OAAO;CAEjE,MAAM,wBAAwB,EAAE,MAAM,MAAe;CACrD,MAAM,oBAIA,EAAE;CAER,MAAM,SAA2B,EAAE;CACnC,MAAM,aAA4B,EAAE;CACpC,MAAM,UAA8B,EAAE;CAEtC,IAAI;AACJ,MAAK,MAAM,OAAO,KAChB,SAAQ,IAAI,MAAZ;EACE,KAAK,SAAS;GACZ,MAAM,QAAQ,gBACZ,YACA,OACA,KACA,eACA,qBACA,cACD;AACD,UAAO,MAAM,OAAO;AACpB,OAAI,CAAC,WAAY,cAAa;AAC9B,qBAAkB,KAAK;IACrB,MAAM;IACN,MAAM;IACN;IACD,CAAC;AACF;;EAEF,KAAK;AACH,cAAW,KAAK;IACd,MAAM,IAAI,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI;IACrD,SAAS,IAAI;IACd,CAAC;AACF;EAEF,KAAK;AACH,WAAQ,KAAK,IAAI;AACjB;;AAKN,KAAI,CAAC,cAAc,CAAC,WAAW,UAAU,CAAC,QAAQ,QAAQ;AACxD,QAAM,QAAQ,OAAO;AACrB;;CAGF,IAAI,SAAS,KAAK,QAAQ,OAAO,UAAU,OAAO,OAAO;AACzD,KAAI,CAAC,OAAO,SAAS,MAAM,CAAE,WAAU;CACvC,MAAM,UAAU,MAAM,uBACpB,QACA,QACA,YACA,SACA,cACD;AACD,KAAI,QAAS,mBAAkB,KAAK,CAAC,QAAQ,QAAQ,CAAC;AAEtD,KAAI,WACF,OAAM,GAAG,MAAM,KAAK,QAAQ,WAAW,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAGpE,OAAM,QAAQ,IACZ,kBAAkB,KAAK,CAAC,MAAM,SAAS,aACrC,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC,WAAW;AAC9C,SAAO,QAAQ,IAAI,WAAW,UAAU,KAAK,GAAG;GAChD,CACH,CACF;CAED,MAAM,UAAU,MAAM,gBAAgB,EAAE,EAAE,OAAO;AACjD,OAAM,SAAS,UAAU,QAAQ,CAAC,OAAO,EAAE;EAAE;EAAS;EAAS,CAAC;AAGhE,OAAM,QAAQ,IACZ,SAAS,IAAI,OAAO,YAAY;EAC9B,MAAM,gBAAgB;AACtB,gBAAc,eAAe,QAAQ;AACrC,QAAM,oBAAoB,eAAe,SAAS,WAAW,OAAO;AACpE,QAAM,QAAQ,OAAO;GACrB,CACH;;AC9HH,IAAI,UAAU;AACd,MAAaA,sBAAoB;AAC/B,KAAI,QACF;AAGF,WAAU;AAEV,gBAAe,IAAI,eAAe,WAAW;EAC3C,KAAK;EACL,MAAM;EACN,eAAe;GACb,gBAAgB;GAChB,kBAAkB;GAClB,IAAI;GACJ,qBAAqB;GACtB;EACD,WAAW;EACZ;AAED,gBAAe,KAAK,MAAM;AAC1B,gBAAe,KAAK,OAClB;;ACtBJC,eAAO;AAEP,MAAa,cAAcA"}