{"version":3,"file":"schema-inspector.mjs","sources":["../../../src/dialects/postgresql/schema-inspector.ts"],"sourcesContent":["import type { Database } from '../..';\nimport type { Schema, Column, Index, ForeignKey } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\n\ninterface RawColumn {\n  table_name: string;\n  data_type: string;\n  column_name: string;\n  character_maximum_length: number;\n  column_default: string;\n  is_nullable: string;\n}\n\ninterface RawIndex {\n  table_name: string;\n  indexrelid: string;\n  index_name: string;\n  column_name: string;\n  is_unique: boolean;\n  is_primary: boolean;\n}\n\ninterface RawTable {\n  table_name: string;\n}\n\nconst SQL_QUERIES = {\n  TABLE_LIST: /* sql */ `\n    SELECT *\n    FROM information_schema.tables\n    WHERE\n      table_schema = ?\n      AND table_type = 'BASE TABLE'\n      AND table_name != 'geometry_columns'\n      AND table_name != 'spatial_ref_sys';\n  `,\n  BULK_COLUMNS: /* sql */ `\n    SELECT table_name, data_type, column_name, character_maximum_length, column_default, is_nullable\n    FROM information_schema.columns\n    WHERE table_schema = ? AND table_name = ANY(?);\n  `,\n  BULK_INDEXES: /* sql */ `\n    SELECT\n      t.relname as table_name,\n      ix.indexrelid,\n      i.relname as index_name,\n      a.attname as column_name,\n      ix.indisunique as is_unique,\n      ix.indisprimary as is_primary\n    FROM\n      pg_class t,\n      pg_namespace s,\n      pg_class i,\n      pg_index ix,\n      pg_attribute a\n    WHERE\n      t.oid = ix.indrelid\n      AND i.oid = ix.indexrelid\n      AND a.attrelid = t.oid\n      AND a.attnum = ANY(ix.indkey)\n      AND t.relkind = 'r'\n      AND t.relnamespace = s.oid\n      AND s.nspname = ?\n      AND t.relname = ANY(?);\n  `,\n  BULK_FOREIGN_KEYS: /* sql */ `\n    SELECT\n      cl.relname AS table_name,\n      c.conname AS constraint_name,\n      att.attname AS column_name,\n      fcl.relname AS foreign_table,\n      fatt.attname AS fk_column_name,\n      CASE c.confupdtype\n        WHEN 'a' THEN 'NO ACTION'\n        WHEN 'r' THEN 'RESTRICT'\n        WHEN 'c' THEN 'CASCADE'\n        WHEN 'n' THEN 'SET NULL'\n        WHEN 'd' THEN 'SET DEFAULT'\n      END AS on_update,\n      CASE c.confdeltype\n        WHEN 'a' THEN 'NO ACTION'\n        WHEN 'r' THEN 'RESTRICT'\n        WHEN 'c' THEN 'CASCADE'\n        WHEN 'n' THEN 'SET NULL'\n        WHEN 'd' THEN 'SET DEFAULT'\n      END AS on_delete\n    FROM pg_constraint c\n    JOIN pg_class cl ON cl.oid = c.conrelid\n    JOIN pg_namespace n ON n.oid = cl.relnamespace\n    JOIN pg_class fcl ON fcl.oid = c.confrelid\n    JOIN LATERAL unnest(c.conkey, c.confkey) AS cols(conkey, confkey) ON true\n    JOIN pg_attribute att ON att.attrelid = c.conrelid AND att.attnum = cols.conkey\n    JOIN pg_attribute fatt ON fatt.attrelid = c.confrelid AND fatt.attnum = cols.confkey\n    WHERE c.contype = 'f'\n      AND n.nspname = ?\n      AND cl.relname = ANY(?)\n      AND fcl.relnamespace = cl.relnamespace\n    ORDER BY cl.relname, c.conname, cols.conkey;\n  `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n  const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n  switch (rootType) {\n    case 'integer': {\n      // find a way to figure out the increments\n      return { type: 'integer' };\n    }\n    case 'text': {\n      return { type: 'text', args: ['longtext'] };\n    }\n    case 'boolean': {\n      return { type: 'boolean' };\n    }\n    case 'character': {\n      return { type: 'string', args: [column.character_maximum_length] };\n    }\n    case 'timestamp': {\n      return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n    }\n    case 'date': {\n      return { type: 'date' };\n    }\n    case 'time': {\n      return { type: 'time', args: [{ precision: 3 }] };\n    }\n    case 'numeric': {\n      return { type: 'decimal', args: [10, 2] };\n    }\n    case 'real':\n    case 'double': {\n      return { type: 'double' };\n    }\n    case 'bigint': {\n      return { type: 'bigInteger' };\n    }\n    case 'jsonb': {\n      return { type: 'jsonb' };\n    }\n    default: {\n      return { type: 'specificType', args: [column.data_type] };\n    }\n  }\n};\n\nconst getIndexType = (index: RawIndex) => {\n  if (index.is_primary) {\n    return 'primary';\n  }\n\n  if (index.is_unique) {\n    return 'unique';\n  }\n};\n\nexport default class PostgresqlSchemaInspector implements SchemaInspector {\n  db: Database;\n\n  constructor(db: Database) {\n    this.db = db;\n  }\n\n  async getSchema() {\n    const schema: Schema = { tables: [] };\n    const dbSchema = this.getDatabaseSchema();\n\n    const tables = await this.getTables();\n\n    if (tables.length === 0) {\n      return schema;\n    }\n\n    // Run 3 bulk queries in parallel instead of N+1 per-table queries\n    const [allColumns, allIndexes, allForeignKeys] = await Promise.all([\n      this.getBulkColumns(dbSchema, tables),\n      this.getBulkIndexes(dbSchema, tables),\n      this.getBulkForeignKeys(dbSchema, tables),\n    ]);\n\n    schema.tables = tables.map((tableName) => ({\n      name: tableName,\n      columns: allColumns.get(tableName) ?? [],\n      indexes: allIndexes.get(tableName) ?? [],\n      foreignKeys: allForeignKeys.get(tableName) ?? [],\n    }));\n\n    return schema;\n  }\n\n  getDatabaseSchema(): string {\n    return this.db.getSchemaName() || 'public';\n  }\n\n  async getTables(): Promise<string[]> {\n    const { rows } = await this.db.connection.raw<{ rows: RawTable[] }>(SQL_QUERIES.TABLE_LIST, [\n      this.getDatabaseSchema(),\n    ]);\n\n    return rows.map((row) => row.table_name);\n  }\n\n  async getBulkColumns(dbSchema: string, tableNames: string[]): Promise<Map<string, Column[]>> {\n    if (tableNames.length === 0) {\n      return new Map();\n    }\n\n    const { rows } = await this.db.connection.raw<{ rows: RawColumn[] }>(SQL_QUERIES.BULK_COLUMNS, [\n      dbSchema,\n      tableNames,\n    ]);\n\n    const result = new Map<string, Column[]>();\n\n    for (const row of rows) {\n      const { type, args = [], ...rest } = toStrapiType(row);\n      const defaultTo =\n        row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;\n\n      const column: Column = {\n        type,\n        args,\n        defaultTo,\n        name: row.column_name,\n        notNullable: row.is_nullable === 'NO',\n        unsigned: false,\n        ...rest,\n      };\n\n      const existing = result.get(row.table_name);\n      if (existing) {\n        existing.push(column);\n      } else {\n        result.set(row.table_name, [column]);\n      }\n    }\n\n    return result;\n  }\n\n  async getBulkIndexes(dbSchema: string, tableNames: string[]): Promise<Map<string, Index[]>> {\n    if (tableNames.length === 0) {\n      return new Map();\n    }\n\n    const { rows } = await this.db.connection.raw<{ rows: RawIndex[] }>(SQL_QUERIES.BULK_INDEXES, [\n      dbSchema,\n      tableNames,\n    ]);\n\n    // Group by table, then by indexrelid\n    const byTable = new Map<string, Map<string, Index>>();\n\n    for (const index of rows) {\n      if (index.column_name === 'id') {\n        continue;\n      }\n\n      let tableIndexes = byTable.get(index.table_name);\n      if (!tableIndexes) {\n        tableIndexes = new Map();\n        byTable.set(index.table_name, tableIndexes);\n      }\n\n      const existing = tableIndexes.get(index.indexrelid);\n      if (existing) {\n        existing.columns.push(index.column_name);\n      } else {\n        tableIndexes.set(index.indexrelid, {\n          columns: [index.column_name],\n          name: index.index_name,\n          type: getIndexType(index),\n        });\n      }\n    }\n\n    const result = new Map<string, Index[]>();\n    for (const [tableName, tableIndexes] of byTable) {\n      result.set(tableName, Array.from(tableIndexes.values()));\n    }\n\n    return result;\n  }\n\n  async getIndexes(tableName: string): Promise<Index[]> {\n    const dbSchema = this.getDatabaseSchema();\n    const result = await this.getBulkIndexes(dbSchema, [tableName]);\n    return result.get(tableName) ?? [];\n  }\n\n  async getForeignKeys(tableName: string): Promise<ForeignKey[]> {\n    const dbSchema = this.getDatabaseSchema();\n    const result = await this.getBulkForeignKeys(dbSchema, [tableName]);\n    return result.get(tableName) ?? [];\n  }\n\n  async getBulkForeignKeys(\n    dbSchema: string,\n    tableNames: string[]\n  ): Promise<Map<string, ForeignKey[]>> {\n    if (tableNames.length === 0) {\n      return new Map();\n    }\n\n    const { rows } = await this.db.connection.raw<{\n      rows: Array<{\n        table_name: string;\n        constraint_name: string;\n        column_name: string;\n        on_update: string;\n        on_delete: string;\n        foreign_table: string;\n        fk_column_name: string;\n      }>;\n    }>(SQL_QUERIES.BULK_FOREIGN_KEYS, [dbSchema, tableNames]);\n\n    // Group by table_name, then by constraint_name\n    const byTable = new Map<string, Map<string, ForeignKey>>();\n\n    for (const row of rows) {\n      let tableFKs = byTable.get(row.table_name);\n      if (!tableFKs) {\n        tableFKs = new Map();\n        byTable.set(row.table_name, tableFKs);\n      }\n\n      let fk = tableFKs.get(row.constraint_name);\n      if (!fk) {\n        fk = {\n          name: row.constraint_name,\n          columns: [row.column_name],\n          referencedColumns: [row.fk_column_name],\n          referencedTable: row.foreign_table,\n          onUpdate: row.on_update?.toUpperCase() ?? null,\n          onDelete: row.on_delete?.toUpperCase() ?? null,\n        };\n        tableFKs.set(row.constraint_name, fk);\n      } else {\n        if (!fk.columns.includes(row.column_name)) {\n          fk.columns.push(row.column_name);\n        }\n        if (!fk.referencedColumns.includes(row.fk_column_name)) {\n          fk.referencedColumns.push(row.fk_column_name);\n        }\n      }\n    }\n\n    const result = new Map<string, ForeignKey[]>();\n    for (const [tableName, tableFKs] of byTable) {\n      result.set(tableName, Array.from(tableFKs.values()));\n    }\n\n    return result;\n  }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","BULK_COLUMNS","BULK_INDEXES","BULK_FOREIGN_KEYS","toStrapiType","column","rootType","data_type","toLowerCase","match","type","args","character_maximum_length","useTz","precision","getIndexType","index","is_primary","is_unique","PostgresqlSchemaInspector","getSchema","schema","tables","dbSchema","getDatabaseSchema","getTables","length","allColumns","allIndexes","allForeignKeys","Promise","all","getBulkColumns","getBulkIndexes","getBulkForeignKeys","map","tableName","name","columns","get","indexes","foreignKeys","db","getSchemaName","rows","connection","raw","row","table_name","tableNames","Map","result","rest","defaultTo","column_default","includes","column_name","notNullable","is_nullable","unsigned","existing","push","set","byTable","tableIndexes","indexrelid","index_name","Array","from","values","getIndexes","getForeignKeys","tableFKs","fk","constraint_name","referencedColumns","fk_column_name","referencedTable","foreign_table","onUpdate","on_update","toUpperCase","onDelete","on_delete"],"mappings":"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"}