{"version":3,"file":"pg.mjs","sources":["../src/shared/utils.ts","../src/pg/session.ts","../src/pg/driver.ts"],"sourcesContent":["import { AnyColumn, Column, DriverValueDecoder, SQL, SelectedFieldsOrdered, getTableName, is } from 'drizzle-orm';\n\nexport function mapResultRow<TResult>(\n  columns: SelectedFieldsOrdered<AnyColumn>,\n  row: unknown[],\n  joinsNotNullableMap: Record<string, boolean> | undefined\n): TResult {\n  // Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n  const nullifyMap: Record<string, string | false> = {};\n\n  const result = columns.reduce<Record<string, any>>((result, { path, field }, columnIndex) => {\n    let decoder: DriverValueDecoder<unknown, unknown>;\n    if (is(field, Column)) {\n      decoder = field;\n    } else if (is(field, SQL)) {\n      decoder = (field as any).decoder;\n    } else {\n      decoder = (field.sql as any).decoder;\n    }\n    let node = result;\n    for (const [pathChunkIndex, pathChunk] of path.entries()) {\n      if (pathChunkIndex < path.length - 1) {\n        if (!(pathChunk in node)) {\n          node[pathChunk] = {};\n        }\n        node = node[pathChunk];\n      } else {\n        const rawValue = row[columnIndex]!;\n        const value = (node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue));\n\n        if (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n          const objectName = path[0]!;\n          if (!(objectName in nullifyMap)) {\n            nullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n          } else if (\n            typeof nullifyMap[objectName] === 'string' &&\n            nullifyMap[objectName] !== getTableName(field.table)\n          ) {\n            nullifyMap[objectName] = false;\n          }\n        }\n      }\n    }\n    return result;\n  }, {});\n\n  // Nullify all nested objects from nullifyMap that are nullable\n  if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n    for (const [objectName, tableName] of Object.entries(nullifyMap)) {\n      if (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n        result[objectName] = null;\n      }\n    }\n  }\n\n  return result as TResult;\n}\n","import {\n  Assume,\n  Logger,\n  NoopLogger,\n  Query,\n  RelationalSchemaConfig,\n  SelectedFieldsOrdered,\n  TablesRelationalConfig,\n  entityKind,\n  fillPlaceholders,\n  sql\n} from 'drizzle-orm';\nimport {\n  PgColumn,\n  PgDialect,\n  PgSession,\n  PgTransaction,\n  PgTransactionConfig,\n  PgPreparedQuery,\n  PreparedQueryConfig,\n  PgQueryResultHKT\n} from 'drizzle-orm/pg-core';\nimport { Client, Pool, PoolClient, QueryArrayConfig, QueryConfig, QueryResult, QueryResultRow } from 'pg';\nimport { mapResultRow } from '../shared/utils';\n\nexport type XataClient = Pool | PoolClient | Client;\n\nexport class XataPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n  static readonly [entityKind]: string = 'XataPreparedQuery';\n\n  private rawQueryConfig: QueryConfig;\n  private queryConfig: QueryArrayConfig;\n\n  constructor(\n    private client: XataClient,\n    queryString: string,\n    private params: unknown[],\n    private logger: Logger,\n    private fields: SelectedFieldsOrdered<PgColumn> | undefined,\n    name: string | undefined,\n    private _isResponseInArrayMode: boolean,\n    private customResultMapper?: (rows: unknown[][]) => T['execute']\n  ) {\n    super({ sql: queryString, params });\n    this.rawQueryConfig = {\n      name,\n      text: queryString\n    };\n    this.queryConfig = {\n      name,\n      text: queryString,\n      rowMode: 'array'\n    };\n  }\n\n  async execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n    const params = fillPlaceholders(this.params, placeholderValues);\n\n    this.logger.logQuery(this.rawQueryConfig.text, params);\n\n    const {\n      fields,\n      client,\n      rawQueryConfig: rawQuery,\n      queryConfig: query,\n      // @ts-expect-error joinsNotNullableMap is internal\n      joinsNotNullableMap,\n      customResultMapper\n    } = this;\n    if (!fields && !customResultMapper) {\n      return await client.query(rawQuery, params);\n    }\n\n    const result = await client.query(query, params);\n\n    return customResultMapper\n      ? customResultMapper(result.rows)\n      : result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n  }\n\n  all(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n    const params = fillPlaceholders(this.params, placeholderValues);\n    this.logger.logQuery(this.rawQueryConfig.text, params);\n    return this.client.query(this.rawQueryConfig, params).then((result) => result.rows);\n  }\n\n  values(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['values']> {\n    const params = fillPlaceholders(this.params, placeholderValues);\n    this.logger.logQuery(this.rawQueryConfig.text, params);\n    return this.client.query(this.queryConfig, params).then((result) => result.rows);\n  }\n\n  /** @internal */\n  isResponseInArrayMode() {\n    return this._isResponseInArrayMode;\n  }\n}\n\nexport interface XataSessionOptions {\n  logger?: Logger;\n}\n\nexport class XataSession<\n  TFullSchema extends Record<string, unknown>,\n  TSchema extends TablesRelationalConfig\n> extends PgSession<XataQueryResultHKT, TFullSchema, TSchema> {\n  static readonly [entityKind]: string = 'XataSession';\n\n  private logger: Logger;\n\n  constructor(\n    private client: XataClient,\n    dialect: PgDialect,\n    private schema: RelationalSchemaConfig<TSchema> | undefined,\n    private options: XataSessionOptions = {}\n  ) {\n    super(dialect);\n    this.logger = options.logger ?? new NoopLogger();\n  }\n\n  prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n    query: Query,\n    fields: SelectedFieldsOrdered<PgColumn> | undefined,\n    name: string | undefined,\n    isResponseInArrayMode: boolean,\n    customResultMapper?: (rows: unknown[][]) => T['execute']\n  ): PgPreparedQuery<T> {\n    return new XataPreparedQuery(\n      this.client,\n      query.sql,\n      query.params,\n      this.logger,\n      fields,\n      name,\n      isResponseInArrayMode,\n      customResultMapper\n    );\n  }\n\n  async query(query: string, params: unknown[]): Promise<QueryResult> {\n    this.logger.logQuery(query, params);\n    return await this.client.query({ rowMode: 'array', text: query, values: params });\n  }\n\n  async queryObjects<T extends QueryResultRow>(query: string, params: unknown[]): Promise<QueryResult<T>> {\n    return await this.client.query<T>(query, params);\n  }\n\n  override async transaction<T>(\n    transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>,\n    config: PgTransactionConfig = {}\n  ): Promise<T> {\n    const session =\n      this.client instanceof Pool\n        ? new XataSession(await this.client.connect(), this.dialect, this.schema, this.options)\n        : this;\n    const tx = new XataTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n    // @ts-expect-error getTransactionConfigSQL is internal\n    await tx.execute(sql`begin ${tx.getTransactionConfigSQL(config)}`);\n    try {\n      const result = await transaction(tx);\n      await tx.execute(sql`commit`);\n      return result;\n    } catch (error) {\n      await tx.execute(sql`rollback`);\n      throw error;\n    } finally {\n      if (this.client instanceof Pool) {\n        (session.client as PoolClient).release();\n      }\n    }\n  }\n}\n\nexport class XataTransaction<\n  TFullSchema extends Record<string, unknown>,\n  TSchema extends TablesRelationalConfig\n> extends PgTransaction<XataQueryResultHKT, TFullSchema, TSchema> {\n  static readonly [entityKind]: string = 'XataTransaction';\n\n  override async transaction<T>(transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n    const savepointName = `sp${this.nestedIndex + 1}`;\n    // @ts-expect-error session and dialect are internal\n    const tx = new XataTransaction<TFullSchema, TSchema>(this.dialect, this.session, this.schema, this.nestedIndex + 1);\n    await tx.execute(sql.raw(`savepoint ${savepointName}`));\n    try {\n      const result = await transaction(tx);\n      await tx.execute(sql.raw(`release savepoint ${savepointName}`));\n      return result;\n    } catch (e) {\n      await tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n      throw e;\n    }\n  }\n}\n\nexport interface XataQueryResultHKT extends PgQueryResultHKT {\n  type: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n","import {\n  DefaultLogger,\n  DrizzleConfig,\n  Logger,\n  RelationalSchemaConfig,\n  TablesRelationalConfig,\n  createTableRelationsHelpers,\n  entityKind,\n  extractTablesRelationalConfig\n} from 'drizzle-orm';\nimport type { XataClient, XataQueryResultHKT } from './session.js';\nimport { XataSession } from './session.js';\nimport { PgDatabase, PgDialect } from 'drizzle-orm/pg-core';\n\nexport interface XataDriverOptions {\n  logger?: Logger;\n}\n\nexport class XataDriver {\n  static readonly [entityKind]: string = 'XataDriver';\n\n  constructor(private client: XataClient, private dialect: PgDialect, private options: XataDriverOptions = {}) {\n    this.initMappers();\n  }\n\n  createSession(\n    schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined\n  ): XataSession<Record<string, unknown>, TablesRelationalConfig> {\n    return new XataSession(this.client, this.dialect, schema, { logger: this.options.logger });\n  }\n\n  initMappers() {\n    // TODO: Add custom type parsers\n  }\n}\n\nexport type XataDatabase<TSchema extends Record<string, unknown> = Record<string, never>> = PgDatabase<\n  XataQueryResultHKT,\n  TSchema\n>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n  client: XataClient,\n  config: DrizzleConfig<TSchema> = {}\n): XataDatabase<TSchema> {\n  const dialect = new PgDialect();\n  let logger;\n  if (config.logger === true) {\n    logger = new DefaultLogger();\n  } else if (config.logger !== false) {\n    logger = config.logger;\n  }\n\n  let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n  if (config.schema) {\n    const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n    schema = {\n      fullSchema: config.schema,\n      schema: tablesConfig.tables,\n      tableNamesMap: tablesConfig.tableNamesMap\n    };\n  }\n\n  const driver = new XataDriver(client, dialect, { logger });\n  const session = driver.createSession(schema);\n  return new PgDatabase(dialect, session, schema) as XataDatabase<TSchema>;\n}\n"],"names":["result","_a"],"mappings":"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"}