@prisma-next/adapter-postgres 0.0.1 → 0.1.0-pr.32.1

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,6 +1,6 @@
1
1
  import {
2
2
  createPostgresAdapter
3
- } from "./chunk-NOYZK3LL.js";
3
+ } from "./chunk-VQZZQVTU.js";
4
4
  import "./chunk-CPAKRHXM.js";
5
5
  export {
6
6
  createPostgresAdapter
@@ -4,6 +4,7 @@ import {
4
4
 
5
5
  // src/core/adapter.ts
6
6
  import { createCodecRegistry, isOperationExpr } from "@prisma-next/sql-relational-core/ast";
7
+ var VECTOR_CODEC_ID = "pg/vector@1";
7
8
  var defaultCapabilities = Object.freeze({
8
9
  postgres: {
9
10
  orderBy: true,
@@ -115,7 +116,7 @@ function renderParam(ref, contract, tableName, columnName) {
115
116
  if (contract && tableName && columnName) {
116
117
  const tableMeta = contract.storage.tables[tableName];
117
118
  const columnMeta = tableMeta?.columns[columnName];
118
- if (columnMeta?.type === "pg/vector@1") {
119
+ if (columnMeta?.codecId === VECTOR_CODEC_ID) {
119
120
  return `$${ref.index}::vector`;
120
121
  }
121
122
  }
@@ -138,7 +139,7 @@ function renderLiteral(expr) {
138
139
  }
139
140
  function renderOperation(expr, contract) {
140
141
  const self = renderExpr(expr.self, contract);
141
- const isVectorOperation = expr.forTypeId === "pg/vector@1";
142
+ const isVectorOperation = expr.forTypeId === VECTOR_CODEC_ID;
142
143
  const args = expr.args.map((arg) => {
143
144
  if (arg.kind === "col") {
144
145
  return renderColumn(arg);
@@ -239,7 +240,7 @@ function renderInsert(ast, contract) {
239
240
  const values = Object.entries(ast.values).map(([colName, val]) => {
240
241
  if (val.kind === "param") {
241
242
  const columnMeta = tableMeta?.columns[colName];
242
- const isVector = columnMeta?.type === "pg/vector@1";
243
+ const isVector = columnMeta?.codecId === VECTOR_CODEC_ID;
243
244
  return isVector ? `$${val.index}::vector` : `$${val.index}`;
244
245
  }
245
246
  if (val.kind === "col") {
@@ -259,7 +260,7 @@ function renderUpdate(ast, contract) {
259
260
  let value;
260
261
  if (val.kind === "param") {
261
262
  const columnMeta = tableMeta?.columns[col];
262
- const isVector = columnMeta?.type === "pg/vector@1";
263
+ const isVector = columnMeta?.codecId === VECTOR_CODEC_ID;
263
264
  value = isVector ? `$${val.index}::vector` : `$${val.index}`;
264
265
  } else if (val.kind === "col") {
265
266
  value = `${quoteIdentifier(val.table)}.${quoteIdentifier(val.column)}`;
@@ -285,4 +286,4 @@ function createPostgresAdapter(options) {
285
286
  export {
286
287
  createPostgresAdapter
287
288
  };
288
- //# sourceMappingURL=chunk-NOYZK3LL.js.map
289
+ //# sourceMappingURL=chunk-VQZZQVTU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/adapter.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterProfile,\n BinaryExpr,\n ColumnRef,\n DeleteAst,\n ExistsExpr,\n IncludeRef,\n InsertAst,\n JoinAst,\n LiteralExpr,\n LowererContext,\n OperationExpr,\n ParamRef,\n QueryAst,\n SelectAst,\n UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { createCodecRegistry, isOperationExpr } from '@prisma-next/sql-relational-core/ast';\nimport { codecDefinitions } from './codecs';\nimport type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';\n\nconst VECTOR_CODEC_ID = 'pg/vector@1' as const;\n\nconst defaultCapabilities = Object.freeze({\n postgres: {\n orderBy: true,\n limit: true,\n lateral: true,\n jsonAgg: true,\n returning: true,\n },\n});\n\nclass PostgresAdapterImpl implements Adapter<QueryAst, PostgresContract, PostgresLoweredStatement> {\n readonly profile: AdapterProfile<'postgres'>;\n private readonly codecRegistry = (() => {\n const registry = createCodecRegistry();\n for (const definition of Object.values(codecDefinitions)) {\n registry.register(definition.codec);\n }\n return registry;\n })();\n\n constructor(options?: PostgresAdapterOptions) {\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n codecs: () => this.codecRegistry,\n });\n }\n\n lower(ast: QueryAst, context: LowererContext<PostgresContract>) {\n let sql: string;\n const params = context.params ? [...context.params] : [];\n\n if (ast.kind === 'select') {\n sql = renderSelect(ast, context.contract);\n } else if (ast.kind === 'insert') {\n sql = renderInsert(ast, context.contract);\n } else if (ast.kind === 'update') {\n sql = renderUpdate(ast, context.contract);\n } else if (ast.kind === 'delete') {\n sql = renderDelete(ast, context.contract);\n } else {\n throw new Error(`Unsupported AST kind: ${(ast as { kind: string }).kind}`);\n }\n\n return Object.freeze({\n profileId: this.profile.id,\n body: Object.freeze({ sql, params }),\n });\n }\n}\n\nfunction renderSelect(ast: SelectAst, contract?: PostgresContract): string {\n const selectClause = `SELECT ${renderProjection(ast, contract)}`;\n const fromClause = `FROM ${quoteIdentifier(ast.from.name)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n const includesClause = ast.includes?.length\n ? ast.includes.map((include) => renderInclude(include, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? ` ORDER BY ${ast.orderBy\n .map((order) => {\n const expr = renderExpr(order.expr as ColumnRef | OperationExpr, contract);\n return `${expr} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n const limitClause = typeof ast.limit === 'number' ? ` LIMIT ${ast.limit}` : '';\n\n const clauses = [joinsClause, includesClause].filter(Boolean).join(' ');\n return `${selectClause} ${fromClause}${clauses ? ` ${clauses}` : ''}${whereClause}${orderClause}${limitClause}`.trim();\n}\n\nfunction renderProjection(ast: SelectAst, contract?: PostgresContract): string {\n return ast.project\n .map((item) => {\n const expr = item.expr as ColumnRef | IncludeRef | OperationExpr | LiteralExpr;\n if (expr.kind === 'includeRef') {\n // For include references, select the column from the LATERAL join alias\n // The LATERAL subquery returns a single column (the JSON array) with the alias\n // The table is aliased as {alias}_lateral, and the column inside is aliased as the include alias\n // We select it using table_alias.column_alias\n const tableAlias = `${expr.alias}_lateral`;\n return `${quoteIdentifier(tableAlias)}.${quoteIdentifier(expr.alias)} AS ${quoteIdentifier(item.alias)}`;\n }\n if (expr.kind === 'operation') {\n const operation = renderOperation(expr, contract);\n const alias = quoteIdentifier(item.alias);\n return `${operation} AS ${alias}`;\n }\n if (expr.kind === 'literal') {\n const literal = renderLiteral(expr);\n const alias = quoteIdentifier(item.alias);\n return `${literal} AS ${alias}`;\n }\n const column = renderColumn(expr as ColumnRef);\n const alias = quoteIdentifier(item.alias);\n return `${column} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction renderWhere(expr: BinaryExpr | ExistsExpr, contract?: PostgresContract): string {\n if (expr.kind === 'exists') {\n const notKeyword = expr.not ? 'NOT ' : '';\n const subquery = renderSelect(expr.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n return renderBinary(expr, contract);\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: PostgresContract): string {\n const leftExpr = expr.left as ColumnRef | OperationExpr;\n const left = renderExpr(leftExpr, contract);\n // Handle both ParamRef and ColumnRef on the right side\n // (ColumnRef can appear in EXISTS subqueries for correlation)\n const rightExpr = expr.right as ParamRef | ColumnRef;\n const right =\n rightExpr.kind === 'col'\n ? renderColumn(rightExpr)\n : renderParam(rightExpr as ParamRef, contract);\n // Only wrap in parentheses if it's an operation expression\n const leftRendered = isOperationExpr(leftExpr) ? `(${left})` : left;\n return `${leftRendered} = ${right}`;\n}\n\nfunction renderColumn(ref: ColumnRef): string {\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderExpr(expr: ColumnRef | OperationExpr, contract?: PostgresContract): string {\n if (isOperationExpr(expr)) {\n return renderOperation(expr, contract);\n }\n return renderColumn(expr);\n}\n\nfunction renderParam(\n ref: ParamRef,\n contract?: PostgresContract,\n tableName?: string,\n columnName?: string,\n): string {\n // Cast vector parameters to vector type for PostgreSQL\n if (contract && tableName && columnName) {\n const tableMeta = contract.storage.tables[tableName];\n const columnMeta = tableMeta?.columns[columnName];\n if (columnMeta?.codecId === VECTOR_CODEC_ID) {\n return `$${ref.index}::vector`;\n }\n }\n return `$${ref.index}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${expr.value.replace(/'/g, \"''\")}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (expr.value === null) {\n return 'NULL';\n }\n if (Array.isArray(expr.value)) {\n return `ARRAY[${expr.value.map((v: unknown) => renderLiteral({ kind: 'literal', value: v })).join(', ')}]`;\n }\n return JSON.stringify(expr.value);\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: PostgresContract): string {\n const self = renderExpr(expr.self, contract);\n // For vector operations, cast param arguments to vector type\n const isVectorOperation = expr.forTypeId === VECTOR_CODEC_ID;\n const args = expr.args.map((arg: ColumnRef | ParamRef | LiteralExpr | OperationExpr) => {\n if (arg.kind === 'col') {\n return renderColumn(arg);\n }\n if (arg.kind === 'param') {\n // Cast vector operation parameters to vector type\n return isVectorOperation ? `$${arg.index}::vector` : renderParam(arg, contract);\n }\n if (arg.kind === 'literal') {\n return renderLiteral(arg);\n }\n if (arg.kind === 'operation') {\n return renderOperation(arg, contract);\n }\n const _exhaustive: never = arg;\n throw new Error(`Unsupported argument kind: ${(_exhaustive as { kind: string }).kind}`);\n });\n\n let result = expr.lowering.template;\n result = result.replace(/\\$\\{self\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\$\\\\{arg${i}\\\\}`, 'g'), args[i] ?? '');\n }\n\n if (expr.lowering.strategy === 'function') {\n return result;\n }\n\n return result;\n}\n\nfunction renderJoin(join: JoinAst, _contract?: PostgresContract): string {\n const joinType = join.joinType.toUpperCase();\n const table = quoteIdentifier(join.table.name);\n const onClause = renderJoinOn(join.on);\n return `${joinType} JOIN ${table} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinAst['on']): string {\n if (on.kind === 'eqCol') {\n const left = renderColumn(on.left);\n const right = renderColumn(on.right);\n return `${left} = ${right}`;\n }\n throw new Error(`Unsupported join ON expression kind: ${on.kind}`);\n}\n\nfunction renderInclude(\n include: NonNullable<SelectAst['includes']>[number],\n contract?: PostgresContract,\n): string {\n const alias = include.alias;\n\n // Build the lateral subquery\n const childProjection = include.child.project\n .map((item: { alias: string; expr: ColumnRef | OperationExpr }) => {\n const expr = renderExpr(item.expr, contract);\n return `'${item.alias}', ${expr}`;\n })\n .join(', ');\n\n const jsonBuildObject = `json_build_object(${childProjection})`;\n\n // Build the ON condition from the include's ON clause - this goes in the WHERE clause\n const onCondition = renderJoinOn(include.child.on);\n\n // Build WHERE clause: combine ON condition with any additional WHERE clauses\n let whereClause = ` WHERE ${onCondition}`;\n if (include.child.where) {\n whereClause += ` AND ${renderWhere(include.child.where, contract)}`;\n }\n\n // Add ORDER BY if present - it goes inside json_agg() call\n const childOrderBy = include.child.orderBy?.length\n ? ` ORDER BY ${include.child.orderBy\n .map(\n (order: { expr: ColumnRef | OperationExpr; dir: string }) =>\n `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`,\n )\n .join(', ')}`\n : '';\n\n // Add LIMIT if present\n const childLimit = typeof include.child.limit === 'number' ? ` LIMIT ${include.child.limit}` : '';\n\n // Build the lateral subquery\n // When ORDER BY is present without LIMIT, it goes inside json_agg() call: json_agg(expr ORDER BY ...)\n // When LIMIT is present (with or without ORDER BY), we need to wrap in a subquery\n const childTable = quoteIdentifier(include.child.table.name);\n let subquery: string;\n if (typeof include.child.limit === 'number') {\n // With LIMIT, we need to wrap in a subquery\n // Select individual columns in inner query, then aggregate\n // Create a map of column references to their aliases for ORDER BY\n // Only ColumnRef can be mapped (OperationExpr doesn't have table/column properties)\n const columnAliasMap = new Map<string, string>();\n for (const item of include.child.project) {\n if (item.expr.kind === 'col') {\n const columnKey = `${item.expr.table}.${item.expr.column}`;\n columnAliasMap.set(columnKey, item.alias);\n }\n }\n\n const innerColumns = include.child.project\n .map((item: { alias: string; expr: ColumnRef | OperationExpr }) => {\n const expr = renderExpr(item.expr, contract);\n return `${expr} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ');\n\n // For ORDER BY, use column aliases if the column is in the SELECT list\n const childOrderByWithAliases = include.child.orderBy?.length\n ? ` ORDER BY ${include.child.orderBy\n .map((order: { expr: ColumnRef | OperationExpr; dir: string }) => {\n if (order.expr.kind === 'col') {\n const columnKey = `${order.expr.table}.${order.expr.column}`;\n const alias = columnAliasMap.get(columnKey);\n if (alias) {\n return `${quoteIdentifier(alias)} ${order.dir.toUpperCase()}`;\n }\n }\n return `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n\n const innerSelect = `SELECT ${innerColumns} FROM ${childTable}${whereClause}${childOrderByWithAliases}${childLimit}`;\n subquery = `(SELECT json_agg(row_to_json(sub.*)) AS ${quoteIdentifier(alias)} FROM (${innerSelect}) sub)`;\n } else if (childOrderBy) {\n // With ORDER BY but no LIMIT, ORDER BY goes inside json_agg()\n subquery = `(SELECT json_agg(${jsonBuildObject}${childOrderBy}) AS ${quoteIdentifier(alias)} FROM ${childTable}${whereClause})`;\n } else {\n // No ORDER BY or LIMIT\n subquery = `(SELECT json_agg(${jsonBuildObject}) AS ${quoteIdentifier(alias)} FROM ${childTable}${whereClause})`;\n }\n\n // Return the LATERAL join with ON true (the condition is in the WHERE clause)\n // The subquery returns a single column (the JSON array) with the alias\n // We use a different alias for the table to avoid ambiguity when selecting the column\n const tableAlias = `${alias}_lateral`;\n return `LEFT JOIN LATERAL ${subquery} AS ${quoteIdentifier(tableAlias)} ON true`;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction renderInsert(ast: InsertAst, contract: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const columns = Object.keys(ast.values).map((col) => quoteIdentifier(col));\n const tableMeta = contract.storage.tables[ast.table.name];\n const values = Object.entries(ast.values).map(([colName, val]) => {\n if (val.kind === 'param') {\n const columnMeta = tableMeta?.columns[colName];\n const isVector = columnMeta?.codecId === VECTOR_CODEC_ID;\n return isVector ? `$${val.index}::vector` : `$${val.index}`;\n }\n if (val.kind === 'col') {\n return `${quoteIdentifier(val.table)}.${quoteIdentifier(val.column)}`;\n }\n throw new Error(`Unsupported value kind in INSERT: ${(val as { kind: string }).kind}`);\n });\n\n const insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${values.join(', ')})`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `${insertClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const tableMeta = contract.storage.tables[ast.table.name];\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n const column = quoteIdentifier(col);\n let value: string;\n if (val.kind === 'param') {\n const columnMeta = tableMeta?.columns[col];\n const isVector = columnMeta?.codecId === VECTOR_CODEC_ID;\n value = isVector ? `$${val.index}::vector` : `$${val.index}`;\n } else if (val.kind === 'col') {\n value = `${quoteIdentifier(val.table)}.${quoteIdentifier(val.column)}`;\n } else {\n throw new Error(`Unsupported value kind in UPDATE: ${(val as { kind: string }).kind}`);\n }\n return `${column} = ${value}`;\n });\n\n const whereClause = ` WHERE ${renderBinary(ast.where, contract)}`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract?: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const whereClause = ` WHERE ${renderBinary(ast.where, contract)}`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;;AAkBA,SAAS,qBAAqB,uBAAuB;AAIrD,IAAM,kBAAkB;AAExB,IAAM,sBAAsB,OAAO,OAAO;AAAA,EACxC,UAAU;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF,CAAC;AAED,IAAM,sBAAN,MAAmG;AAAA,EACxF;AAAA,EACQ,iBAAiB,MAAM;AACtC,UAAM,WAAW,oBAAoB;AACrC,eAAW,cAAc,OAAO,OAAO,gBAAgB,GAAG;AACxD,eAAS,SAAS,WAAW,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACT,GAAG;AAAA,EAEH,YAAY,SAAkC;AAC5C,SAAK,UAAU,OAAO,OAAO;AAAA,MAC3B,IAAI,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,QAAQ,MAAM,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAe,SAA2C;AAC9D,QAAI;AACJ,UAAM,SAAS,QAAQ,SAAS,CAAC,GAAG,QAAQ,MAAM,IAAI,CAAC;AAEvD,QAAI,IAAI,SAAS,UAAU;AACzB,YAAM,aAAa,KAAK,QAAQ,QAAQ;AAAA,IAC1C,WAAW,IAAI,SAAS,UAAU;AAChC,YAAM,aAAa,KAAK,QAAQ,QAAQ;AAAA,IAC1C,WAAW,IAAI,SAAS,UAAU;AAChC,YAAM,aAAa,KAAK,QAAQ,QAAQ;AAAA,IAC1C,WAAW,IAAI,SAAS,UAAU;AAChC,YAAM,aAAa,KAAK,QAAQ,QAAQ;AAAA,IAC1C,OAAO;AACL,YAAM,IAAI,MAAM,yBAA0B,IAAyB,IAAI,EAAE;AAAA,IAC3E;AAEA,WAAO,OAAO,OAAO;AAAA,MACnB,WAAW,KAAK,QAAQ;AAAA,MACxB,MAAM,OAAO,OAAO,EAAE,KAAK,OAAO,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,aAAa,KAAgB,UAAqC;AACzE,QAAM,eAAe,UAAU,iBAAiB,KAAK,QAAQ,CAAC;AAC9D,QAAM,aAAa,QAAQ,gBAAgB,IAAI,KAAK,IAAI,CAAC;AAEzD,QAAM,cAAc,IAAI,OAAO,SAC3B,IAAI,MAAM,IAAI,CAAC,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,GAAG,IAC5D;AACJ,QAAM,iBAAiB,IAAI,UAAU,SACjC,IAAI,SAAS,IAAI,CAAC,YAAY,cAAc,SAAS,QAAQ,CAAC,EAAE,KAAK,GAAG,IACxE;AAEJ,QAAM,cAAc,IAAI,QAAQ,UAAU,YAAY,IAAI,OAAO,QAAQ,CAAC,KAAK;AAC/E,QAAM,cAAc,IAAI,SAAS,SAC7B,aAAa,IAAI,QACd,IAAI,CAAC,UAAU;AACd,UAAM,OAAO,WAAW,MAAM,MAAmC,QAAQ;AACzE,WAAO,GAAG,IAAI,IAAI,MAAM,IAAI,YAAY,CAAC;AAAA,EAC3C,CAAC,EACA,KAAK,IAAI,CAAC,KACb;AACJ,QAAM,cAAc,OAAO,IAAI,UAAU,WAAW,UAAU,IAAI,KAAK,KAAK;AAE5E,QAAM,UAAU,CAAC,aAAa,cAAc,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACtE,SAAO,GAAG,YAAY,IAAI,UAAU,GAAG,UAAU,IAAI,OAAO,KAAK,EAAE,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,KAAK;AACvH;AAEA,SAAS,iBAAiB,KAAgB,UAAqC;AAC7E,SAAO,IAAI,QACR,IAAI,CAAC,SAAS;AACb,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,SAAS,cAAc;AAK9B,YAAM,aAAa,GAAG,KAAK,KAAK;AAChC,aAAO,GAAG,gBAAgB,UAAU,CAAC,IAAI,gBAAgB,KAAK,KAAK,CAAC,OAAO,gBAAgB,KAAK,KAAK,CAAC;AAAA,IACxG;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,YAAY,gBAAgB,MAAM,QAAQ;AAChD,YAAMA,SAAQ,gBAAgB,KAAK,KAAK;AACxC,aAAO,GAAG,SAAS,OAAOA,MAAK;AAAA,IACjC;AACA,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,UAAU,cAAc,IAAI;AAClC,YAAMA,SAAQ,gBAAgB,KAAK,KAAK;AACxC,aAAO,GAAG,OAAO,OAAOA,MAAK;AAAA,IAC/B;AACA,UAAM,SAAS,aAAa,IAAiB;AAC7C,UAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,WAAO,GAAG,MAAM,OAAO,KAAK;AAAA,EAC9B,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAAS,YAAY,MAA+B,UAAqC;AACvF,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,aAAa,KAAK,MAAM,SAAS;AACvC,UAAM,WAAW,aAAa,KAAK,UAAU,QAAQ;AACrD,WAAO,GAAG,UAAU,WAAW,QAAQ;AAAA,EACzC;AACA,SAAO,aAAa,MAAM,QAAQ;AACpC;AAEA,SAAS,aAAa,MAAkB,UAAqC;AAC3E,QAAM,WAAW,KAAK;AACtB,QAAM,OAAO,WAAW,UAAU,QAAQ;AAG1C,QAAM,YAAY,KAAK;AACvB,QAAM,QACJ,UAAU,SAAS,QACf,aAAa,SAAS,IACtB,YAAY,WAAuB,QAAQ;AAEjD,QAAM,eAAe,gBAAgB,QAAQ,IAAI,IAAI,IAAI,MAAM;AAC/D,SAAO,GAAG,YAAY,MAAM,KAAK;AACnC;AAEA,SAAS,aAAa,KAAwB;AAC5C,SAAO,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC;AACrE;AAEA,SAAS,WAAW,MAAiC,UAAqC;AACxF,MAAI,gBAAgB,IAAI,GAAG;AACzB,WAAO,gBAAgB,MAAM,QAAQ;AAAA,EACvC;AACA,SAAO,aAAa,IAAI;AAC1B;AAEA,SAAS,YACP,KACA,UACA,WACA,YACQ;AAER,MAAI,YAAY,aAAa,YAAY;AACvC,UAAM,YAAY,SAAS,QAAQ,OAAO,SAAS;AACnD,UAAM,aAAa,WAAW,QAAQ,UAAU;AAChD,QAAI,YAAY,YAAY,iBAAiB;AAC3C,aAAO,IAAI,IAAI,KAAK;AAAA,IACtB;AAAA,EACF;AACA,SAAO,IAAI,IAAI,KAAK;AACtB;AAEA,SAAS,cAAc,MAA2B;AAChD,MAAI,OAAO,KAAK,UAAU,UAAU;AAClC,WAAO,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC3C;AACA,MAAI,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,UAAU,WAAW;AACrE,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AACA,MAAI,KAAK,UAAU,MAAM;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC7B,WAAO,SAAS,KAAK,MAAM,IAAI,CAAC,MAAe,cAAc,EAAE,MAAM,WAAW,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACzG;AACA,SAAO,KAAK,UAAU,KAAK,KAAK;AAClC;AAEA,SAAS,gBAAgB,MAAqB,UAAqC;AACjF,QAAM,OAAO,WAAW,KAAK,MAAM,QAAQ;AAE3C,QAAM,oBAAoB,KAAK,cAAc;AAC7C,QAAM,OAAO,KAAK,KAAK,IAAI,CAAC,QAA4D;AACtF,QAAI,IAAI,SAAS,OAAO;AACtB,aAAO,aAAa,GAAG;AAAA,IACzB;AACA,QAAI,IAAI,SAAS,SAAS;AAExB,aAAO,oBAAoB,IAAI,IAAI,KAAK,aAAa,YAAY,KAAK,QAAQ;AAAA,IAChF;AACA,QAAI,IAAI,SAAS,WAAW;AAC1B,aAAO,cAAc,GAAG;AAAA,IAC1B;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,aAAO,gBAAgB,KAAK,QAAQ;AAAA,IACtC;AACA,UAAM,cAAqB;AAC3B,UAAM,IAAI,MAAM,8BAA+B,YAAiC,IAAI,EAAE;AAAA,EACxF,CAAC;AAED,MAAI,SAAS,KAAK,SAAS;AAC3B,WAAS,OAAO,QAAQ,eAAe,IAAI;AAC3C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,aAAS,OAAO,QAAQ,IAAI,OAAO,YAAY,CAAC,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE;AAAA,EAC5E;AAEA,MAAI,KAAK,SAAS,aAAa,YAAY;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,MAAe,WAAsC;AACvE,QAAM,WAAW,KAAK,SAAS,YAAY;AAC3C,QAAM,QAAQ,gBAAgB,KAAK,MAAM,IAAI;AAC7C,QAAM,WAAW,aAAa,KAAK,EAAE;AACrC,SAAO,GAAG,QAAQ,SAAS,KAAK,OAAO,QAAQ;AACjD;AAEA,SAAS,aAAa,IAA2B;AAC/C,MAAI,GAAG,SAAS,SAAS;AACvB,UAAM,OAAO,aAAa,GAAG,IAAI;AACjC,UAAM,QAAQ,aAAa,GAAG,KAAK;AACnC,WAAO,GAAG,IAAI,MAAM,KAAK;AAAA,EAC3B;AACA,QAAM,IAAI,MAAM,wCAAwC,GAAG,IAAI,EAAE;AACnE;AAEA,SAAS,cACP,SACA,UACQ;AACR,QAAM,QAAQ,QAAQ;AAGtB,QAAM,kBAAkB,QAAQ,MAAM,QACnC,IAAI,CAAC,SAA6D;AACjE,UAAM,OAAO,WAAW,KAAK,MAAM,QAAQ;AAC3C,WAAO,IAAI,KAAK,KAAK,MAAM,IAAI;AAAA,EACjC,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,kBAAkB,qBAAqB,eAAe;AAG5D,QAAM,cAAc,aAAa,QAAQ,MAAM,EAAE;AAGjD,MAAI,cAAc,UAAU,WAAW;AACvC,MAAI,QAAQ,MAAM,OAAO;AACvB,mBAAe,QAAQ,YAAY,QAAQ,MAAM,OAAO,QAAQ,CAAC;AAAA,EACnE;AAGA,QAAM,eAAe,QAAQ,MAAM,SAAS,SACxC,aAAa,QAAQ,MAAM,QACxB;AAAA,IACC,CAAC,UACC,GAAG,WAAW,MAAM,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,YAAY,CAAC;AAAA,EAClE,EACC,KAAK,IAAI,CAAC,KACb;AAGJ,QAAM,aAAa,OAAO,QAAQ,MAAM,UAAU,WAAW,UAAU,QAAQ,MAAM,KAAK,KAAK;AAK/F,QAAM,aAAa,gBAAgB,QAAQ,MAAM,MAAM,IAAI;AAC3D,MAAI;AACJ,MAAI,OAAO,QAAQ,MAAM,UAAU,UAAU;AAK3C,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,eAAW,QAAQ,QAAQ,MAAM,SAAS;AACxC,UAAI,KAAK,KAAK,SAAS,OAAO;AAC5B,cAAM,YAAY,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AACxD,uBAAe,IAAI,WAAW,KAAK,KAAK;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ,MAAM,QAChC,IAAI,CAAC,SAA6D;AACjE,YAAM,OAAO,WAAW,KAAK,MAAM,QAAQ;AAC3C,aAAO,GAAG,IAAI,OAAO,gBAAgB,KAAK,KAAK,CAAC;AAAA,IAClD,CAAC,EACA,KAAK,IAAI;AAGZ,UAAM,0BAA0B,QAAQ,MAAM,SAAS,SACnD,aAAa,QAAQ,MAAM,QACxB,IAAI,CAAC,UAA4D;AAChE,UAAI,MAAM,KAAK,SAAS,OAAO;AAC7B,cAAM,YAAY,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;AAC1D,cAAMA,SAAQ,eAAe,IAAI,SAAS;AAC1C,YAAIA,QAAO;AACT,iBAAO,GAAG,gBAAgBA,MAAK,CAAC,IAAI,MAAM,IAAI,YAAY,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,aAAO,GAAG,WAAW,MAAM,MAAM,QAAQ,CAAC,IAAI,MAAM,IAAI,YAAY,CAAC;AAAA,IACvE,CAAC,EACA,KAAK,IAAI,CAAC,KACb;AAEJ,UAAM,cAAc,UAAU,YAAY,SAAS,UAAU,GAAG,WAAW,GAAG,uBAAuB,GAAG,UAAU;AAClH,eAAW,2CAA2C,gBAAgB,KAAK,CAAC,UAAU,WAAW;AAAA,EACnG,WAAW,cAAc;AAEvB,eAAW,oBAAoB,eAAe,GAAG,YAAY,QAAQ,gBAAgB,KAAK,CAAC,SAAS,UAAU,GAAG,WAAW;AAAA,EAC9H,OAAO;AAEL,eAAW,oBAAoB,eAAe,QAAQ,gBAAgB,KAAK,CAAC,SAAS,UAAU,GAAG,WAAW;AAAA,EAC/G;AAKA,QAAM,aAAa,GAAG,KAAK;AAC3B,SAAO,qBAAqB,QAAQ,OAAO,gBAAgB,UAAU,CAAC;AACxE;AAEA,SAAS,gBAAgB,YAA4B;AACnD,SAAO,IAAI,WAAW,QAAQ,MAAM,IAAI,CAAC;AAC3C;AAEA,SAAS,aAAa,KAAgB,UAAoC;AACxE,QAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;AAC5C,QAAM,UAAU,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,CAAC,QAAQ,gBAAgB,GAAG,CAAC;AACzE,QAAM,YAAY,SAAS,QAAQ,OAAO,IAAI,MAAM,IAAI;AACxD,QAAM,SAAS,OAAO,QAAQ,IAAI,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,GAAG,MAAM;AAChE,QAAI,IAAI,SAAS,SAAS;AACxB,YAAM,aAAa,WAAW,QAAQ,OAAO;AAC7C,YAAM,WAAW,YAAY,YAAY;AACzC,aAAO,WAAW,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK;AAAA,IAC3D;AACA,QAAI,IAAI,SAAS,OAAO;AACtB,aAAO,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC;AAAA,IACrE;AACA,UAAM,IAAI,MAAM,qCAAsC,IAAyB,IAAI,EAAE;AAAA,EACvF,CAAC;AAED,QAAM,eAAe,eAAe,KAAK,KAAK,QAAQ,KAAK,IAAI,CAAC,aAAa,OAAO,KAAK,IAAI,CAAC;AAC9F,QAAM,kBAAkB,IAAI,WAAW,SACnC,cAAc,IAAI,UAAU,IAAI,CAAC,QAAQ,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACnH;AAEJ,SAAO,GAAG,YAAY,GAAG,eAAe;AAC1C;AAEA,SAAS,aAAa,KAAgB,UAAoC;AACxE,QAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;AAC5C,QAAM,YAAY,SAAS,QAAQ,OAAO,IAAI,MAAM,IAAI;AACxD,QAAM,aAAa,OAAO,QAAQ,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AAC7D,UAAM,SAAS,gBAAgB,GAAG;AAClC,QAAI;AACJ,QAAI,IAAI,SAAS,SAAS;AACxB,YAAM,aAAa,WAAW,QAAQ,GAAG;AACzC,YAAM,WAAW,YAAY,YAAY;AACzC,cAAQ,WAAW,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK;AAAA,IAC5D,WAAW,IAAI,SAAS,OAAO;AAC7B,cAAQ,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC;AAAA,IACtE,OAAO;AACL,YAAM,IAAI,MAAM,qCAAsC,IAAyB,IAAI,EAAE;AAAA,IACvF;AACA,WAAO,GAAG,MAAM,MAAM,KAAK;AAAA,EAC7B,CAAC;AAED,QAAM,cAAc,UAAU,aAAa,IAAI,OAAO,QAAQ,CAAC;AAC/D,QAAM,kBAAkB,IAAI,WAAW,SACnC,cAAc,IAAI,UAAU,IAAI,CAAC,QAAQ,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACnH;AAEJ,SAAO,UAAU,KAAK,QAAQ,WAAW,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,eAAe;AACrF;AAEA,SAAS,aAAa,KAAgB,UAAqC;AACzE,QAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;AAC5C,QAAM,cAAc,UAAU,aAAa,IAAI,OAAO,QAAQ,CAAC;AAC/D,QAAM,kBAAkB,IAAI,WAAW,SACnC,cAAc,IAAI,UAAU,IAAI,CAAC,QAAQ,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,gBAAgB,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACnH;AAEJ,SAAO,eAAe,KAAK,GAAG,WAAW,GAAG,eAAe;AAC7D;AAEO,SAAS,sBAAsB,SAAkC;AACtE,SAAO,OAAO,OAAO,IAAI,oBAAoB,OAAO,CAAC;AACvD;","names":["alias"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Column type descriptor containing both codec ID and native type.
3
+ * Used when defining columns with descriptor objects instead of string IDs.
4
+ */
5
+ type ColumnTypeDescriptor = {
6
+ readonly codecId: string;
7
+ readonly nativeType: string;
8
+ };
9
+
10
+ /**
11
+ * Column type descriptors for Postgres adapter.
12
+ *
13
+ * These descriptors provide both codecId and nativeType for use in contract authoring.
14
+ * They are derived from the same source of truth as codec definitions and manifests.
15
+ */
16
+
17
+ declare const textColumn: ColumnTypeDescriptor;
18
+ declare const int4Column: ColumnTypeDescriptor;
19
+ declare const int2Column: ColumnTypeDescriptor;
20
+ declare const int8Column: ColumnTypeDescriptor;
21
+ declare const float4Column: ColumnTypeDescriptor;
22
+ declare const float8Column: ColumnTypeDescriptor;
23
+ declare const timestampColumn: ColumnTypeDescriptor;
24
+ declare const timestamptzColumn: ColumnTypeDescriptor;
25
+ declare const boolColumn: ColumnTypeDescriptor;
26
+
27
+ export { boolColumn, float4Column, float8Column, int2Column, int4Column, int8Column, textColumn, timestampColumn, timestamptzColumn };
@@ -0,0 +1,49 @@
1
+ // src/exports/column-types.ts
2
+ var textColumn = {
3
+ codecId: "pg/text@1",
4
+ nativeType: "text"
5
+ };
6
+ var int4Column = {
7
+ codecId: "pg/int4@1",
8
+ nativeType: "int4"
9
+ };
10
+ var int2Column = {
11
+ codecId: "pg/int2@1",
12
+ nativeType: "int2"
13
+ };
14
+ var int8Column = {
15
+ codecId: "pg/int8@1",
16
+ nativeType: "int8"
17
+ };
18
+ var float4Column = {
19
+ codecId: "pg/float4@1",
20
+ nativeType: "float4"
21
+ };
22
+ var float8Column = {
23
+ codecId: "pg/float8@1",
24
+ nativeType: "float8"
25
+ };
26
+ var timestampColumn = {
27
+ codecId: "pg/timestamp@1",
28
+ nativeType: "timestamp"
29
+ };
30
+ var timestamptzColumn = {
31
+ codecId: "pg/timestamptz@1",
32
+ nativeType: "timestamptz"
33
+ };
34
+ var boolColumn = {
35
+ codecId: "pg/bool@1",
36
+ nativeType: "bool"
37
+ };
38
+ export {
39
+ boolColumn,
40
+ float4Column,
41
+ float8Column,
42
+ int2Column,
43
+ int4Column,
44
+ int8Column,
45
+ textColumn,
46
+ timestampColumn,
47
+ timestamptzColumn
48
+ };
49
+ //# sourceMappingURL=column-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/column-types.ts"],"sourcesContent":["/**\n * Column type descriptors for Postgres adapter.\n *\n * These descriptors provide both codecId and nativeType for use in contract authoring.\n * They are derived from the same source of truth as codec definitions and manifests.\n */\n\nimport type { ColumnTypeDescriptor } from '@prisma-next/contract-authoring';\n\nexport const textColumn: ColumnTypeDescriptor = {\n codecId: 'pg/text@1',\n nativeType: 'text',\n} as const;\n\nexport const int4Column: ColumnTypeDescriptor = {\n codecId: 'pg/int4@1',\n nativeType: 'int4',\n} as const;\n\nexport const int2Column: ColumnTypeDescriptor = {\n codecId: 'pg/int2@1',\n nativeType: 'int2',\n} as const;\n\nexport const int8Column: ColumnTypeDescriptor = {\n codecId: 'pg/int8@1',\n nativeType: 'int8',\n} as const;\n\nexport const float4Column: ColumnTypeDescriptor = {\n codecId: 'pg/float4@1',\n nativeType: 'float4',\n} as const;\n\nexport const float8Column: ColumnTypeDescriptor = {\n codecId: 'pg/float8@1',\n nativeType: 'float8',\n} as const;\n\nexport const timestampColumn: ColumnTypeDescriptor = {\n codecId: 'pg/timestamp@1',\n nativeType: 'timestamp',\n} as const;\n\nexport const timestamptzColumn: ColumnTypeDescriptor = {\n codecId: 'pg/timestamptz@1',\n nativeType: 'timestamptz',\n} as const;\n\nexport const boolColumn: ColumnTypeDescriptor = {\n codecId: 'pg/bool@1',\n nativeType: 'bool',\n} as const;\n"],"mappings":";AASO,IAAM,aAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,aAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,aAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,aAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,eAAqC;AAAA,EAChD,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,eAAqC;AAAA,EAChD,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,kBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,oBAA0C;AAAA,EACrD,SAAS;AAAA,EACT,YAAY;AACd;AAEO,IAAM,aAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AACd;","names":[]}
@@ -73,8 +73,6 @@ var PostgresControlAdapter = class {
73
73
  }
74
74
  columns[colRow.column_name] = {
75
75
  name: colRow.column_name,
76
- // Placeholder typeId - enrichment will replace this with actual codec ID
77
- typeId: "unmapped",
78
76
  nativeType,
79
77
  nullable: colRow.is_nullable === "YES"
80
78
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/control.ts","../../src/core/control-adapter.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ExtensionPackManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { ControlAdapterDescriptor } from '@prisma-next/core-control-plane/types';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { type } from 'arktype';\nimport { PostgresControlAdapter } from '../core/control-adapter';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst TypesImportSpecSchema = type({\n package: 'string',\n named: 'string',\n alias: 'string',\n});\n\nconst StorageTypeMetadataSchema = type({\n typeId: 'string',\n familyId: 'string',\n targetId: 'string',\n 'nativeType?': 'string',\n});\n\nconst ExtensionPackManifestSchema = type({\n id: 'string',\n version: 'string',\n 'targets?': type({ '[string]': type({ 'minVersion?': 'string' }) }),\n 'capabilities?': 'Record<string, unknown>',\n 'types?': type({\n 'codecTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'operationTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'storage?': StorageTypeMetadataSchema.array(),\n }),\n 'operations?': 'unknown[]',\n});\n\n/**\n * Loads the adapter manifest from packs/manifest.json.\n */\nfunction loadAdapterManifest(): ExtensionPackManifest {\n const manifestPath = join(__dirname, '../../packs/manifest.json');\n const manifestJson = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n\n const result = ExtensionPackManifestSchema(manifestJson);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid adapter manifest structure at ${manifestPath}: ${messages}`);\n }\n\n return result as ExtensionPackManifest;\n}\n\n/**\n * Postgres adapter descriptor for CLI config.\n */\nconst postgresAdapterDescriptor: ControlAdapterDescriptor<\n 'sql',\n 'postgres',\n SqlControlAdapter<'postgres'>\n> = {\n kind: 'adapter',\n familyId: 'sql',\n targetId: 'postgres',\n id: 'postgres',\n manifest: loadAdapterManifest(),\n create(): SqlControlAdapter<'postgres'> {\n return new PostgresControlAdapter();\n },\n};\n\nexport default postgresAdapterDescriptor;\n","import type { ControlDriverInstance } from '@prisma-next/core-control-plane/types';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport type {\n PrimaryKey,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\n\n/**\n * Postgres control plane adapter for control-plane operations like introspection.\n * Provides target-specific implementations for control-plane domain actions.\n */\nexport class PostgresControlAdapter implements SqlControlAdapter<'postgres'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'postgres' as const;\n /**\n * @deprecated Use targetId instead\n */\n readonly target = 'postgres' as const;\n\n /**\n * Introspects a Postgres database schema and returns a raw SqlSchemaIR.\n *\n * This is a pure schema discovery operation that queries the Postgres catalog\n * and returns the schema structure without type mapping or contract enrichment.\n * Type mapping and enrichment are handled separately by enrichment helpers.\n *\n * @param driver - ControlDriverInstance<'postgres'> instance for executing queries\n * @param contractIR - Optional contract IR for contract-guided introspection (filtering, optimization)\n * @param schema - Schema name to introspect (defaults to 'public')\n * @returns Promise resolving to SqlSchemaIR representing the live database schema\n */\n async introspect(\n driver: ControlDriverInstance<'postgres'>,\n _contractIR?: unknown,\n schema = 'public',\n ): Promise<SqlSchemaIR> {\n // Query tables\n const tablesResult = await driver.query<{\n table_name: string;\n }>(\n `SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_type = 'BASE TABLE'\n ORDER BY table_name`,\n [schema],\n );\n\n const tables: Record<string, SqlTableIR> = {};\n\n for (const tableRow of tablesResult.rows) {\n const tableName = tableRow.table_name;\n\n // Query columns for this table\n const columnsResult = await driver.query<{\n column_name: string;\n data_type: string;\n udt_name: string;\n is_nullable: string;\n character_maximum_length: number | null;\n numeric_precision: number | null;\n numeric_scale: number | null;\n }>(\n `SELECT\n column_name,\n data_type,\n udt_name,\n is_nullable,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n ORDER BY ordinal_position`,\n [schema, tableName],\n );\n\n const columns: Record<string, SqlColumnIR> = {};\n for (const colRow of columnsResult.rows) {\n // Build native type string from catalog data\n let nativeType = colRow.udt_name;\n if (colRow.data_type === 'character varying' || colRow.data_type === 'character') {\n if (colRow.character_maximum_length) {\n nativeType = `${colRow.data_type}(${colRow.character_maximum_length})`;\n } else {\n nativeType = colRow.data_type;\n }\n } else if (colRow.data_type === 'numeric' || colRow.data_type === 'decimal') {\n if (colRow.numeric_precision && colRow.numeric_scale !== null) {\n nativeType = `${colRow.data_type}(${colRow.numeric_precision},${colRow.numeric_scale})`;\n } else if (colRow.numeric_precision) {\n nativeType = `${colRow.data_type}(${colRow.numeric_precision})`;\n } else {\n nativeType = colRow.data_type;\n }\n } else {\n nativeType = colRow.udt_name || colRow.data_type;\n }\n\n columns[colRow.column_name] = {\n name: colRow.column_name,\n // Placeholder typeId - enrichment will replace this with actual codec ID\n typeId: 'unmapped',\n nativeType,\n nullable: colRow.is_nullable === 'YES',\n };\n }\n\n // Query primary key\n const pkResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'PRIMARY KEY'\n ORDER BY kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const primaryKeyColumns = pkResult.rows\n .sort((a, b) => a.ordinal_position - b.ordinal_position)\n .map((row) => row.column_name);\n const primaryKey: PrimaryKey | undefined =\n primaryKeyColumns.length > 0\n ? {\n columns: primaryKeyColumns,\n ...(pkResult.rows[0]?.constraint_name\n ? { name: pkResult.rows[0].constraint_name }\n : {}),\n }\n : undefined;\n\n // Query foreign keys\n const fkResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n referenced_table_schema: string;\n referenced_table_name: string;\n referenced_column_name: string;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position,\n ccu.table_schema AS referenced_table_schema,\n ccu.table_name AS referenced_table_name,\n ccu.column_name AS referenced_column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n JOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'FOREIGN KEY'\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const foreignKeysMap = new Map<\n string,\n {\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n name: string;\n }\n >();\n for (const fkRow of fkResult.rows) {\n const existing = foreignKeysMap.get(fkRow.constraint_name);\n if (existing) {\n // Multi-column FK - add column\n existing.columns.push(fkRow.column_name);\n existing.referencedColumns.push(fkRow.referenced_column_name);\n } else {\n foreignKeysMap.set(fkRow.constraint_name, {\n columns: [fkRow.column_name],\n referencedTable: fkRow.referenced_table_name,\n referencedColumns: [fkRow.referenced_column_name],\n name: fkRow.constraint_name,\n });\n }\n }\n const foreignKeys: readonly SqlForeignKeyIR[] = Array.from(foreignKeysMap.values()).map(\n (fk) => ({\n columns: Object.freeze([...fk.columns]) as readonly string[],\n referencedTable: fk.referencedTable,\n referencedColumns: Object.freeze([...fk.referencedColumns]) as readonly string[],\n name: fk.name,\n }),\n );\n\n // Query unique constraints (excluding PK)\n const uniqueResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'UNIQUE'\n AND tc.constraint_name NOT IN (\n SELECT constraint_name\n FROM information_schema.table_constraints\n WHERE table_schema = $1\n AND table_name = $2\n AND constraint_type = 'PRIMARY KEY'\n )\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const uniquesMap = new Map<\n string,\n {\n columns: string[];\n name: string;\n }\n >();\n for (const uniqueRow of uniqueResult.rows) {\n const existing = uniquesMap.get(uniqueRow.constraint_name);\n if (existing) {\n existing.columns.push(uniqueRow.column_name);\n } else {\n uniquesMap.set(uniqueRow.constraint_name, {\n columns: [uniqueRow.column_name],\n name: uniqueRow.constraint_name,\n });\n }\n }\n const uniques: readonly SqlUniqueIR[] = Array.from(uniquesMap.values()).map((uq) => ({\n columns: Object.freeze([...uq.columns]) as readonly string[],\n name: uq.name,\n }));\n\n // Query indexes (excluding PK and unique constraints)\n const indexResult = await driver.query<{\n indexname: string;\n indisunique: boolean;\n attname: string;\n attnum: number;\n }>(\n `SELECT\n i.indexname,\n ix.indisunique,\n a.attname,\n a.attnum\n FROM pg_indexes i\n JOIN pg_class ic ON ic.relname = i.indexname\n JOIN pg_namespace ins ON ins.oid = ic.relnamespace AND ins.nspname = $1\n JOIN pg_index ix ON ix.indexrelid = ic.oid\n JOIN pg_class t ON t.oid = ix.indrelid\n JOIN pg_namespace tn ON tn.oid = t.relnamespace AND tn.nspname = $1\n LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND a.attnum > 0\n WHERE i.schemaname = $1\n AND i.tablename = $2\n AND NOT EXISTS (\n SELECT 1\n FROM information_schema.table_constraints tc\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_name = i.indexname\n )\n ORDER BY i.indexname, a.attnum`,\n [schema, tableName],\n );\n\n const indexesMap = new Map<\n string,\n {\n columns: string[];\n name: string;\n unique: boolean;\n }\n >();\n for (const idxRow of indexResult.rows) {\n // Skip rows where attname is null (system columns or invalid attnum)\n if (!idxRow.attname) {\n continue;\n }\n const existing = indexesMap.get(idxRow.indexname);\n if (existing) {\n existing.columns.push(idxRow.attname);\n } else {\n indexesMap.set(idxRow.indexname, {\n columns: [idxRow.attname],\n name: idxRow.indexname,\n unique: idxRow.indisunique,\n });\n }\n }\n const indexes: readonly SqlIndexIR[] = Array.from(indexesMap.values()).map((idx) => ({\n columns: Object.freeze([...idx.columns]) as readonly string[],\n name: idx.name,\n unique: idx.unique,\n }));\n\n tables[tableName] = {\n name: tableName,\n columns,\n ...(primaryKey ? { primaryKey } : {}),\n foreignKeys,\n uniques,\n indexes,\n };\n }\n\n // Query extensions\n const extensionsResult = await driver.query<{\n extname: string;\n }>(\n `SELECT extname\n FROM pg_extension\n ORDER BY extname`,\n [],\n );\n\n const extensions = extensionsResult.rows.map((row) => row.extname);\n\n // Build annotations with Postgres-specific metadata\n const annotations = {\n pg: {\n schema,\n version: await this.getPostgresVersion(driver),\n },\n };\n\n return {\n tables,\n extensions,\n annotations,\n };\n }\n\n /**\n * Gets the Postgres version from the database.\n */\n private async getPostgresVersion(driver: ControlDriverInstance<'postgres'>): Promise<string> {\n const result = await driver.query<{ version: string }>('SELECT version() AS version', []);\n const versionString = result.rows[0]?.version ?? '';\n // Extract version number from \"PostgreSQL 15.1 ...\" format\n const match = versionString.match(/PostgreSQL (\\d+\\.\\d+)/);\n return match?.[1] ?? 'unknown';\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/exports/control.ts","../../src/core/control-adapter.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ExtensionPackManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { ControlAdapterDescriptor } from '@prisma-next/core-control-plane/types';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { type } from 'arktype';\nimport { PostgresControlAdapter } from '../core/control-adapter';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst TypesImportSpecSchema = type({\n package: 'string',\n named: 'string',\n alias: 'string',\n});\n\nconst StorageTypeMetadataSchema = type({\n typeId: 'string',\n familyId: 'string',\n targetId: 'string',\n 'nativeType?': 'string',\n});\n\nconst ExtensionPackManifestSchema = type({\n id: 'string',\n version: 'string',\n 'targets?': type({ '[string]': type({ 'minVersion?': 'string' }) }),\n 'capabilities?': 'Record<string, unknown>',\n 'types?': type({\n 'codecTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'operationTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'storage?': StorageTypeMetadataSchema.array(),\n }),\n 'operations?': 'unknown[]',\n});\n\n/**\n * Loads the adapter manifest from packs/manifest.json.\n */\nfunction loadAdapterManifest(): ExtensionPackManifest {\n const manifestPath = join(__dirname, '../../packs/manifest.json');\n const manifestJson = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n\n const result = ExtensionPackManifestSchema(manifestJson);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid adapter manifest structure at ${manifestPath}: ${messages}`);\n }\n\n return result as ExtensionPackManifest;\n}\n\n/**\n * Postgres adapter descriptor for CLI config.\n */\nconst postgresAdapterDescriptor: ControlAdapterDescriptor<\n 'sql',\n 'postgres',\n SqlControlAdapter<'postgres'>\n> = {\n kind: 'adapter',\n familyId: 'sql',\n targetId: 'postgres',\n id: 'postgres',\n manifest: loadAdapterManifest(),\n create(): SqlControlAdapter<'postgres'> {\n return new PostgresControlAdapter();\n },\n};\n\nexport default postgresAdapterDescriptor;\n","import type { ControlDriverInstance } from '@prisma-next/core-control-plane/types';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport type {\n PrimaryKey,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\n\n/**\n * Postgres control plane adapter for control-plane operations like introspection.\n * Provides target-specific implementations for control-plane domain actions.\n */\nexport class PostgresControlAdapter implements SqlControlAdapter<'postgres'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'postgres' as const;\n /**\n * @deprecated Use targetId instead\n */\n readonly target = 'postgres' as const;\n\n /**\n * Introspects a Postgres database schema and returns a raw SqlSchemaIR.\n *\n * This is a pure schema discovery operation that queries the Postgres catalog\n * and returns the schema structure without type mapping or contract enrichment.\n * Type mapping and enrichment are handled separately by enrichment helpers.\n *\n * @param driver - ControlDriverInstance<'postgres'> instance for executing queries\n * @param contractIR - Optional contract IR for contract-guided introspection (filtering, optimization)\n * @param schema - Schema name to introspect (defaults to 'public')\n * @returns Promise resolving to SqlSchemaIR representing the live database schema\n */\n async introspect(\n driver: ControlDriverInstance<'postgres'>,\n _contractIR?: unknown,\n schema = 'public',\n ): Promise<SqlSchemaIR> {\n // Query tables\n const tablesResult = await driver.query<{\n table_name: string;\n }>(\n `SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_type = 'BASE TABLE'\n ORDER BY table_name`,\n [schema],\n );\n\n const tables: Record<string, SqlTableIR> = {};\n\n for (const tableRow of tablesResult.rows) {\n const tableName = tableRow.table_name;\n\n // Query columns for this table\n const columnsResult = await driver.query<{\n column_name: string;\n data_type: string;\n udt_name: string;\n is_nullable: string;\n character_maximum_length: number | null;\n numeric_precision: number | null;\n numeric_scale: number | null;\n }>(\n `SELECT\n column_name,\n data_type,\n udt_name,\n is_nullable,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n ORDER BY ordinal_position`,\n [schema, tableName],\n );\n\n const columns: Record<string, SqlColumnIR> = {};\n for (const colRow of columnsResult.rows) {\n // Build native type string from catalog data\n let nativeType = colRow.udt_name;\n if (colRow.data_type === 'character varying' || colRow.data_type === 'character') {\n if (colRow.character_maximum_length) {\n nativeType = `${colRow.data_type}(${colRow.character_maximum_length})`;\n } else {\n nativeType = colRow.data_type;\n }\n } else if (colRow.data_type === 'numeric' || colRow.data_type === 'decimal') {\n if (colRow.numeric_precision && colRow.numeric_scale !== null) {\n nativeType = `${colRow.data_type}(${colRow.numeric_precision},${colRow.numeric_scale})`;\n } else if (colRow.numeric_precision) {\n nativeType = `${colRow.data_type}(${colRow.numeric_precision})`;\n } else {\n nativeType = colRow.data_type;\n }\n } else {\n nativeType = colRow.udt_name || colRow.data_type;\n }\n\n columns[colRow.column_name] = {\n name: colRow.column_name,\n nativeType,\n nullable: colRow.is_nullable === 'YES',\n };\n }\n\n // Query primary key\n const pkResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'PRIMARY KEY'\n ORDER BY kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const primaryKeyColumns = pkResult.rows\n .sort((a, b) => a.ordinal_position - b.ordinal_position)\n .map((row) => row.column_name);\n const primaryKey: PrimaryKey | undefined =\n primaryKeyColumns.length > 0\n ? {\n columns: primaryKeyColumns,\n ...(pkResult.rows[0]?.constraint_name\n ? { name: pkResult.rows[0].constraint_name }\n : {}),\n }\n : undefined;\n\n // Query foreign keys\n const fkResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n referenced_table_schema: string;\n referenced_table_name: string;\n referenced_column_name: string;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position,\n ccu.table_schema AS referenced_table_schema,\n ccu.table_name AS referenced_table_name,\n ccu.column_name AS referenced_column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n JOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'FOREIGN KEY'\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const foreignKeysMap = new Map<\n string,\n {\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n name: string;\n }\n >();\n for (const fkRow of fkResult.rows) {\n const existing = foreignKeysMap.get(fkRow.constraint_name);\n if (existing) {\n // Multi-column FK - add column\n existing.columns.push(fkRow.column_name);\n existing.referencedColumns.push(fkRow.referenced_column_name);\n } else {\n foreignKeysMap.set(fkRow.constraint_name, {\n columns: [fkRow.column_name],\n referencedTable: fkRow.referenced_table_name,\n referencedColumns: [fkRow.referenced_column_name],\n name: fkRow.constraint_name,\n });\n }\n }\n const foreignKeys: readonly SqlForeignKeyIR[] = Array.from(foreignKeysMap.values()).map(\n (fk) => ({\n columns: Object.freeze([...fk.columns]) as readonly string[],\n referencedTable: fk.referencedTable,\n referencedColumns: Object.freeze([...fk.referencedColumns]) as readonly string[],\n name: fk.name,\n }),\n );\n\n // Query unique constraints (excluding PK)\n const uniqueResult = await driver.query<{\n constraint_name: string;\n column_name: string;\n ordinal_position: number;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n kcu.ordinal_position\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'UNIQUE'\n AND tc.constraint_name NOT IN (\n SELECT constraint_name\n FROM information_schema.table_constraints\n WHERE table_schema = $1\n AND table_name = $2\n AND constraint_type = 'PRIMARY KEY'\n )\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schema, tableName],\n );\n\n const uniquesMap = new Map<\n string,\n {\n columns: string[];\n name: string;\n }\n >();\n for (const uniqueRow of uniqueResult.rows) {\n const existing = uniquesMap.get(uniqueRow.constraint_name);\n if (existing) {\n existing.columns.push(uniqueRow.column_name);\n } else {\n uniquesMap.set(uniqueRow.constraint_name, {\n columns: [uniqueRow.column_name],\n name: uniqueRow.constraint_name,\n });\n }\n }\n const uniques: readonly SqlUniqueIR[] = Array.from(uniquesMap.values()).map((uq) => ({\n columns: Object.freeze([...uq.columns]) as readonly string[],\n name: uq.name,\n }));\n\n // Query indexes (excluding PK and unique constraints)\n const indexResult = await driver.query<{\n indexname: string;\n indisunique: boolean;\n attname: string;\n attnum: number;\n }>(\n `SELECT\n i.indexname,\n ix.indisunique,\n a.attname,\n a.attnum\n FROM pg_indexes i\n JOIN pg_class ic ON ic.relname = i.indexname\n JOIN pg_namespace ins ON ins.oid = ic.relnamespace AND ins.nspname = $1\n JOIN pg_index ix ON ix.indexrelid = ic.oid\n JOIN pg_class t ON t.oid = ix.indrelid\n JOIN pg_namespace tn ON tn.oid = t.relnamespace AND tn.nspname = $1\n LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND a.attnum > 0\n WHERE i.schemaname = $1\n AND i.tablename = $2\n AND NOT EXISTS (\n SELECT 1\n FROM information_schema.table_constraints tc\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_name = i.indexname\n )\n ORDER BY i.indexname, a.attnum`,\n [schema, tableName],\n );\n\n const indexesMap = new Map<\n string,\n {\n columns: string[];\n name: string;\n unique: boolean;\n }\n >();\n for (const idxRow of indexResult.rows) {\n // Skip rows where attname is null (system columns or invalid attnum)\n if (!idxRow.attname) {\n continue;\n }\n const existing = indexesMap.get(idxRow.indexname);\n if (existing) {\n existing.columns.push(idxRow.attname);\n } else {\n indexesMap.set(idxRow.indexname, {\n columns: [idxRow.attname],\n name: idxRow.indexname,\n unique: idxRow.indisunique,\n });\n }\n }\n const indexes: readonly SqlIndexIR[] = Array.from(indexesMap.values()).map((idx) => ({\n columns: Object.freeze([...idx.columns]) as readonly string[],\n name: idx.name,\n unique: idx.unique,\n }));\n\n tables[tableName] = {\n name: tableName,\n columns,\n ...(primaryKey ? { primaryKey } : {}),\n foreignKeys,\n uniques,\n indexes,\n };\n }\n\n // Query extensions\n const extensionsResult = await driver.query<{\n extname: string;\n }>(\n `SELECT extname\n FROM pg_extension\n ORDER BY extname`,\n [],\n );\n\n const extensions = extensionsResult.rows.map((row) => row.extname);\n\n // Build annotations with Postgres-specific metadata\n const annotations = {\n pg: {\n schema,\n version: await this.getPostgresVersion(driver),\n },\n };\n\n return {\n tables,\n extensions,\n annotations,\n };\n }\n\n /**\n * Gets the Postgres version from the database.\n */\n private async getPostgresVersion(driver: ControlDriverInstance<'postgres'>): Promise<string> {\n const result = await driver.query<{ version: string }>('SELECT version() AS version', []);\n const versionString = result.rows[0]?.version ?? '';\n // Extract version number from \"PostgreSQL 15.1 ...\" format\n const match = versionString.match(/PostgreSQL (\\d+\\.\\d+)/);\n return match?.[1] ?? 'unknown';\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createPostgresAdapter
3
- } from "./chunk-NOYZK3LL.js";
3
+ } from "./chunk-VQZZQVTU.js";
4
4
  import "./chunk-CPAKRHXM.js";
5
5
 
6
6
  // src/exports/runtime.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-postgres",
3
- "version": "0.0.1",
3
+ "version": "0.1.0-pr.32.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -8,14 +8,14 @@
8
8
  ],
9
9
  "dependencies": {
10
10
  "arktype": "^2.0.0",
11
- "@prisma-next/core-execution-plane": "0.0.1",
12
- "@prisma-next/cli": "0.0.1",
13
- "@prisma-next/family-sql": "0.0.1",
14
- "@prisma-next/sql-contract": "0.0.1",
15
- "@prisma-next/sql-operations": "0.0.1",
16
- "@prisma-next/sql-schema-ir": "0.0.1",
17
- "@prisma-next/sql-contract-ts": "0.0.1",
18
- "@prisma-next/sql-relational-core": "0.0.1"
11
+ "@prisma-next/core-execution-plane": "0.1.0-pr.32.1",
12
+ "@prisma-next/family-sql": "0.1.0-pr.32.1",
13
+ "@prisma-next/sql-contract-ts": "0.1.0-pr.32.1",
14
+ "@prisma-next/cli": "0.1.0-pr.32.1",
15
+ "@prisma-next/sql-operations": "0.1.0-pr.32.1",
16
+ "@prisma-next/sql-relational-core": "0.1.0-pr.32.1",
17
+ "@prisma-next/sql-schema-ir": "0.1.0-pr.32.1",
18
+ "@prisma-next/sql-contract": "0.1.0-pr.32.1"
19
19
  },
20
20
  "devDependencies": {
21
21
  "tsup": "^8.3.0",
@@ -36,6 +36,10 @@
36
36
  "types": "./dist/exports/codec-types.d.ts",
37
37
  "import": "./dist/exports/codec-types.js"
38
38
  },
39
+ "./column-types": {
40
+ "types": "./dist/exports/column-types.d.ts",
41
+ "import": "./dist/exports/column-types.js"
42
+ },
39
43
  "./control": {
40
44
  "types": "./dist/exports/control.d.ts",
41
45
  "import": "./dist/exports/control.js"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/adapter.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterProfile,\n BinaryExpr,\n ColumnRef,\n DeleteAst,\n ExistsExpr,\n IncludeRef,\n InsertAst,\n JoinAst,\n LiteralExpr,\n LowererContext,\n OperationExpr,\n ParamRef,\n QueryAst,\n SelectAst,\n UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { createCodecRegistry, isOperationExpr } from '@prisma-next/sql-relational-core/ast';\nimport { codecDefinitions } from './codecs';\nimport type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';\n\nconst defaultCapabilities = Object.freeze({\n postgres: {\n orderBy: true,\n limit: true,\n lateral: true,\n jsonAgg: true,\n returning: true,\n },\n});\n\nclass PostgresAdapterImpl implements Adapter<QueryAst, PostgresContract, PostgresLoweredStatement> {\n readonly profile: AdapterProfile<'postgres'>;\n private readonly codecRegistry = (() => {\n const registry = createCodecRegistry();\n for (const definition of Object.values(codecDefinitions)) {\n registry.register(definition.codec);\n }\n return registry;\n })();\n\n constructor(options?: PostgresAdapterOptions) {\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n codecs: () => this.codecRegistry,\n });\n }\n\n lower(ast: QueryAst, context: LowererContext<PostgresContract>) {\n let sql: string;\n const params = context.params ? [...context.params] : [];\n\n if (ast.kind === 'select') {\n sql = renderSelect(ast, context.contract);\n } else if (ast.kind === 'insert') {\n sql = renderInsert(ast, context.contract);\n } else if (ast.kind === 'update') {\n sql = renderUpdate(ast, context.contract);\n } else if (ast.kind === 'delete') {\n sql = renderDelete(ast, context.contract);\n } else {\n throw new Error(`Unsupported AST kind: ${(ast as { kind: string }).kind}`);\n }\n\n return Object.freeze({\n profileId: this.profile.id,\n body: Object.freeze({ sql, params }),\n });\n }\n}\n\nfunction renderSelect(ast: SelectAst, contract?: PostgresContract): string {\n const selectClause = `SELECT ${renderProjection(ast, contract)}`;\n const fromClause = `FROM ${quoteIdentifier(ast.from.name)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n const includesClause = ast.includes?.length\n ? ast.includes.map((include) => renderInclude(include, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? ` ORDER BY ${ast.orderBy\n .map((order) => {\n const expr = renderExpr(order.expr as ColumnRef | OperationExpr, contract);\n return `${expr} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n const limitClause = typeof ast.limit === 'number' ? ` LIMIT ${ast.limit}` : '';\n\n const clauses = [joinsClause, includesClause].filter(Boolean).join(' ');\n return `${selectClause} ${fromClause}${clauses ? ` ${clauses}` : ''}${whereClause}${orderClause}${limitClause}`.trim();\n}\n\nfunction renderProjection(ast: SelectAst, contract?: PostgresContract): string {\n return ast.project\n .map((item) => {\n const expr = item.expr as ColumnRef | IncludeRef | OperationExpr | LiteralExpr;\n if (expr.kind === 'includeRef') {\n // For include references, select the column from the LATERAL join alias\n // The LATERAL subquery returns a single column (the JSON array) with the alias\n // The table is aliased as {alias}_lateral, and the column inside is aliased as the include alias\n // We select it using table_alias.column_alias\n const tableAlias = `${expr.alias}_lateral`;\n return `${quoteIdentifier(tableAlias)}.${quoteIdentifier(expr.alias)} AS ${quoteIdentifier(item.alias)}`;\n }\n if (expr.kind === 'operation') {\n const operation = renderOperation(expr, contract);\n const alias = quoteIdentifier(item.alias);\n return `${operation} AS ${alias}`;\n }\n if (expr.kind === 'literal') {\n const literal = renderLiteral(expr);\n const alias = quoteIdentifier(item.alias);\n return `${literal} AS ${alias}`;\n }\n const column = renderColumn(expr as ColumnRef);\n const alias = quoteIdentifier(item.alias);\n return `${column} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction renderWhere(expr: BinaryExpr | ExistsExpr, contract?: PostgresContract): string {\n if (expr.kind === 'exists') {\n const notKeyword = expr.not ? 'NOT ' : '';\n const subquery = renderSelect(expr.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n return renderBinary(expr, contract);\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: PostgresContract): string {\n const leftExpr = expr.left as ColumnRef | OperationExpr;\n const left = renderExpr(leftExpr, contract);\n // Handle both ParamRef and ColumnRef on the right side\n // (ColumnRef can appear in EXISTS subqueries for correlation)\n const rightExpr = expr.right as ParamRef | ColumnRef;\n const right =\n rightExpr.kind === 'col'\n ? renderColumn(rightExpr)\n : renderParam(rightExpr as ParamRef, contract);\n // Only wrap in parentheses if it's an operation expression\n const leftRendered = isOperationExpr(leftExpr) ? `(${left})` : left;\n return `${leftRendered} = ${right}`;\n}\n\nfunction renderColumn(ref: ColumnRef): string {\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderExpr(expr: ColumnRef | OperationExpr, contract?: PostgresContract): string {\n if (isOperationExpr(expr)) {\n return renderOperation(expr, contract);\n }\n return renderColumn(expr);\n}\n\nfunction renderParam(\n ref: ParamRef,\n contract?: PostgresContract,\n tableName?: string,\n columnName?: string,\n): string {\n // Cast vector parameters to vector type for PostgreSQL\n if (contract && tableName && columnName) {\n const tableMeta = contract.storage.tables[tableName];\n const columnMeta = tableMeta?.columns[columnName];\n if (columnMeta?.type === 'pg/vector@1') {\n return `$${ref.index}::vector`;\n }\n }\n return `$${ref.index}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${expr.value.replace(/'/g, \"''\")}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (expr.value === null) {\n return 'NULL';\n }\n if (Array.isArray(expr.value)) {\n return `ARRAY[${expr.value.map((v: unknown) => renderLiteral({ kind: 'literal', value: v })).join(', ')}]`;\n }\n return JSON.stringify(expr.value);\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: PostgresContract): string {\n const self = renderExpr(expr.self, contract);\n // For vector operations, cast param arguments to vector type\n const isVectorOperation = expr.forTypeId === 'pg/vector@1';\n const args = expr.args.map((arg: ColumnRef | ParamRef | LiteralExpr | OperationExpr) => {\n if (arg.kind === 'col') {\n return renderColumn(arg);\n }\n if (arg.kind === 'param') {\n // Cast vector operation parameters to vector type\n return isVectorOperation ? `$${arg.index}::vector` : renderParam(arg, contract);\n }\n if (arg.kind === 'literal') {\n return renderLiteral(arg);\n }\n if (arg.kind === 'operation') {\n return renderOperation(arg, contract);\n }\n const _exhaustive: never = arg;\n throw new Error(`Unsupported argument kind: ${(_exhaustive as { kind: string }).kind}`);\n });\n\n let result = expr.lowering.template;\n result = result.replace(/\\$\\{self\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\$\\\\{arg${i}\\\\}`, 'g'), args[i] ?? '');\n }\n\n if (expr.lowering.strategy === 'function') {\n return result;\n }\n\n return result;\n}\n\nfunction renderJoin(join: JoinAst, _contract?: PostgresContract): string {\n const joinType = join.joinType.toUpperCase();\n const table = quoteIdentifier(join.table.name);\n const onClause = renderJoinOn(join.on);\n return `${joinType} JOIN ${table} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinAst['on']): string {\n if (on.kind === 'eqCol') {\n const left = renderColumn(on.left);\n const right = renderColumn(on.right);\n return `${left} = ${right}`;\n }\n throw new Error(`Unsupported join ON expression kind: ${on.kind}`);\n}\n\nfunction renderInclude(\n include: NonNullable<SelectAst['includes']>[number],\n contract?: PostgresContract,\n): string {\n const alias = include.alias;\n\n // Build the lateral subquery\n const childProjection = include.child.project\n .map((item: { alias: string; expr: ColumnRef | OperationExpr }) => {\n const expr = renderExpr(item.expr, contract);\n return `'${item.alias}', ${expr}`;\n })\n .join(', ');\n\n const jsonBuildObject = `json_build_object(${childProjection})`;\n\n // Build the ON condition from the include's ON clause - this goes in the WHERE clause\n const onCondition = renderJoinOn(include.child.on);\n\n // Build WHERE clause: combine ON condition with any additional WHERE clauses\n let whereClause = ` WHERE ${onCondition}`;\n if (include.child.where) {\n whereClause += ` AND ${renderWhere(include.child.where, contract)}`;\n }\n\n // Add ORDER BY if present - it goes inside json_agg() call\n const childOrderBy = include.child.orderBy?.length\n ? ` ORDER BY ${include.child.orderBy\n .map(\n (order: { expr: ColumnRef | OperationExpr; dir: string }) =>\n `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`,\n )\n .join(', ')}`\n : '';\n\n // Add LIMIT if present\n const childLimit = typeof include.child.limit === 'number' ? ` LIMIT ${include.child.limit}` : '';\n\n // Build the lateral subquery\n // When ORDER BY is present without LIMIT, it goes inside json_agg() call: json_agg(expr ORDER BY ...)\n // When LIMIT is present (with or without ORDER BY), we need to wrap in a subquery\n const childTable = quoteIdentifier(include.child.table.name);\n let subquery: string;\n if (typeof include.child.limit === 'number') {\n // With LIMIT, we need to wrap in a subquery\n // Select individual columns in inner query, then aggregate\n // Create a map of column references to their aliases for ORDER BY\n // Only ColumnRef can be mapped (OperationExpr doesn't have table/column properties)\n const columnAliasMap = new Map<string, string>();\n for (const item of include.child.project) {\n if (item.expr.kind === 'col') {\n const columnKey = `${item.expr.table}.${item.expr.column}`;\n columnAliasMap.set(columnKey, item.alias);\n }\n }\n\n const innerColumns = include.child.project\n .map((item: { alias: string; expr: ColumnRef | OperationExpr }) => {\n const expr = renderExpr(item.expr, contract);\n return `${expr} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ');\n\n // For ORDER BY, use column aliases if the column is in the SELECT list\n const childOrderByWithAliases = include.child.orderBy?.length\n ? ` ORDER BY ${include.child.orderBy\n .map((order: { expr: ColumnRef | OperationExpr; dir: string }) => {\n if (order.expr.kind === 'col') {\n const columnKey = `${order.expr.table}.${order.expr.column}`;\n const alias = columnAliasMap.get(columnKey);\n if (alias) {\n return `${quoteIdentifier(alias)} ${order.dir.toUpperCase()}`;\n }\n }\n return `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n\n const innerSelect = `SELECT ${innerColumns} FROM ${childTable}${whereClause}${childOrderByWithAliases}${childLimit}`;\n subquery = `(SELECT json_agg(row_to_json(sub.*)) AS ${quoteIdentifier(alias)} FROM (${innerSelect}) sub)`;\n } else if (childOrderBy) {\n // With ORDER BY but no LIMIT, ORDER BY goes inside json_agg()\n subquery = `(SELECT json_agg(${jsonBuildObject}${childOrderBy}) AS ${quoteIdentifier(alias)} FROM ${childTable}${whereClause})`;\n } else {\n // No ORDER BY or LIMIT\n subquery = `(SELECT json_agg(${jsonBuildObject}) AS ${quoteIdentifier(alias)} FROM ${childTable}${whereClause})`;\n }\n\n // Return the LATERAL join with ON true (the condition is in the WHERE clause)\n // The subquery returns a single column (the JSON array) with the alias\n // We use a different alias for the table to avoid ambiguity when selecting the column\n const tableAlias = `${alias}_lateral`;\n return `LEFT JOIN LATERAL ${subquery} AS ${quoteIdentifier(tableAlias)} ON true`;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction renderInsert(ast: InsertAst, contract: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const columns = Object.keys(ast.values).map((col) => quoteIdentifier(col));\n const tableMeta = contract.storage.tables[ast.table.name];\n const values = Object.entries(ast.values).map(([colName, val]) => {\n if (val.kind === 'param') {\n const columnMeta = tableMeta?.columns[colName];\n const isVector = columnMeta?.type === 'pg/vector@1';\n return isVector ? `$${val.index}::vector` : `$${val.index}`;\n }\n if (val.kind === 'col') {\n return `${quoteIdentifier(val.table)}.${quoteIdentifier(val.column)}`;\n }\n throw new Error(`Unsupported value kind in INSERT: ${(val as { kind: string }).kind}`);\n });\n\n const insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${values.join(', ')})`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `${insertClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const tableMeta = contract.storage.tables[ast.table.name];\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n const column = quoteIdentifier(col);\n let value: string;\n if (val.kind === 'param') {\n const columnMeta = tableMeta?.columns[col];\n const isVector = columnMeta?.type === 'pg/vector@1';\n value = isVector ? `$${val.index}::vector` : `$${val.index}`;\n } else if (val.kind === 'col') {\n value = `${quoteIdentifier(val.table)}.${quoteIdentifier(val.column)}`;\n } else {\n throw new Error(`Unsupported value kind in UPDATE: ${(val as { kind: string }).kind}`);\n }\n return `${column} = ${value}`;\n });\n\n const whereClause = ` WHERE ${renderBinary(ast.where, contract)}`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract?: PostgresContract): string {\n const table = quoteIdentifier(ast.table.name);\n const whereClause = ` WHERE ${renderBinary(ast.where, contract)}`;\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":"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","names":["alias"]}