{"version":3,"file":"driver.cjs","names":["PgAsyncDatabase","entityKind","NetlifyDbSession","PgDialect","netlifyDbCodecs","DefaultLogger","netlifyDbTransactionCodecs","types","Pool"],"sources":["../../src/netlify-db/driver.ts"],"sourcesContent":["import { type HTTPQueryOptions, neon, Pool, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport type { NeonHttpClient, NeonHttpQueryResultHKT } from '~/neon-http/session.ts';\nimport { drizzle as drizzleNodePg, type NodePgDatabase } from '~/node-postgres/driver.ts';\nimport type { NodePgClient } from '~/node-postgres/session.ts';\nimport { PgAsyncDatabase } from '~/pg-core/async/db.ts';\nimport type { PgCodecs } from '~/pg-core/codecs.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport type { DrizzlePgConfig } from '~/pg-core/utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { isConfig, jitCompatCheck } from '~/utils.ts';\nimport { netlifyDbCodecs, netlifyDbTransactionCodecs } from './codecs.ts';\nimport { type NetlifyDbClient, NetlifyDbSession } from './session.ts';\n\nexport interface ServerlessDrizzleClient {\n\tdriver: 'serverless';\n\thttpClient: NeonHttpClient;\n\tpool: Pool;\n\tconnectionString: string;\n}\n\nexport interface ServerDrizzleClient {\n\tdriver: 'server';\n\tpool: NodePgClient;\n\tconnectionString: string;\n}\n\nexport type DrizzleClient = ServerlessDrizzleClient | ServerDrizzleClient;\n\nexport interface DrizzleNetlifyConfig<TRelations extends AnyRelations = EmptyRelations>\n\textends DrizzlePgConfig<TRelations>\n{\n\t/** Netlify utilizes different driver for transactions, thus requiring separate set of codecs */\n\ttransactionCodecs?: PgCodecs | undefined;\n}\n\nexport class NetlifyDbDatabase<\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<NeonHttpQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'NetlifyDbDatabase';\n\n\tdeclare session: NetlifyDbSession<TRelations>;\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<this, '$withAuth'> {\n\t\tconst session = new NetlifyDbSession(this.session.httpClient, this.session.pool, this.dialect, this._.relations, {\n\t\t\t...this.session.options,\n\t\t\tauthToken: token,\n\t\t});\n\n\t\treturn new NetlifyDbDatabase(this.dialect, session, this._.relations) as any;\n\t}\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(\n\t\t\tbatch,\n\t\t) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\thttpClient: NeonHttpClient,\n\tpool: Pool,\n\tconfig: DrizzleNetlifyConfig<TRelations> = {},\n): NetlifyDbDatabase<TRelations> & {\n\t$client: NetlifyDbClient;\n} {\n\tconst dialect = new PgDialect({\n\t\tcodecs: config.codecs ?? netlifyDbCodecs,\n\t\tuseJitMappers: jitCompatCheck(config.jit),\n\t});\n\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\tconst relations = config.relations ?? {} as TRelations;\n\n\tconst session = new NetlifyDbSession(httpClient, pool, dialect, relations ?? {}, {\n\t\tlogger: logger,\n\t\tcache: config.cache,\n\t\ttransactionCodecs: config.transactionCodecs ?? netlifyDbTransactionCodecs,\n\t});\n\n\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\ttypes.setTypeParser(1231, (val) => val);\n\ttypes.setTypeParser(1115, (val) => val);\n\ttypes.setTypeParser(1185, (val) => val);\n\ttypes.setTypeParser(1187, (val) => val);\n\ttypes.setTypeParser(1182, (val) => val);\n\n\tconst db = new NetlifyDbDatabase(\n\t\tdialect,\n\t\tsession,\n\t\trelations,\n\t);\n\t(<any> db).$client = { http: httpClient, pool } satisfies NetlifyDbClient;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>():\n\t| (NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TRelations> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\tconfig: DrizzleNetlifyConfig<TRelations>,\n):\n\t| (NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TRelations> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\tconfig: DrizzleNetlifyConfig<TRelations> & { client: ServerlessDrizzleClient },\n): NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient };\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\tconfig: DrizzleNetlifyConfig<TRelations> & { client: ServerDrizzleClient },\n): NodePgDatabase<TRelations> & { $client: NodePgClient };\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\tconfig: DrizzleNetlifyConfig<TRelations> & { client: DrizzleClient },\n):\n\t| (NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TRelations> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\t...params: [\n\t\tstring,\n\t] | [\n\t\tstring,\n\t\tDrizzleNetlifyConfig<TRelations>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleNetlifyConfig<TRelations>\n\t\t\t& ({\n\t\t\t\tconnection: string | { connectionString: string };\n\t\t\t} | {\n\t\t\t\tclient: NetlifyDbClient | DrizzleClient;\n\t\t\t})\n\t\t),\n\t]\n): NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient };\n\nexport function drizzle<TRelations extends AnyRelations = EmptyRelations>(\n\t...params: [] | [\n\t\tDrizzleNetlifyConfig<TRelations>,\n\t] | [\n\t\tstring,\n\t] | [\n\t\tstring,\n\t\tDrizzleNetlifyConfig<TRelations>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleNetlifyConfig<TRelations>\n\t\t\t& ({\n\t\t\t\tconnection: string | { connectionString: string };\n\t\t\t} | {\n\t\t\t\tclient: NetlifyDbClient | DrizzleClient;\n\t\t\t})\n\t\t),\n\t]\n):\n\t| (NetlifyDbDatabase<TRelations> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TRelations> & { $client: NodePgClient })\n{\n\t// Zero-config: read env vars\n\tif (\n\t\tparams.length === 0\n\t\t|| (params.length === 1 && isConfig(params[0]) && !('connection' in (params[0] as any))\n\t\t\t&& !('client' in (params[0] as any)))\n\t) {\n\t\tconst drizzleConfig = (params[0] ?? {}) as DrizzleNetlifyConfig<TRelations>;\n\t\tconst connectionString = process.env['NETLIFY_DB_URL'];\n\n\t\tif (!connectionString) {\n\t\t\tthrow new Error(\n\t\t\t\t'NETLIFY_DB_URL environment variable is not set. '\n\t\t\t\t\t+ 'Provide a connection string or client to drizzle().',\n\t\t\t);\n\t\t}\n\n\t\tconst driver = process.env['NETLIFY_DB_DRIVER'];\n\n\t\tif (driver === 'server') {\n\t\t\treturn drizzleNodePg({ connection: connectionString, ...drizzleConfig }) as any;\n\t\t}\n\n\t\tconst httpClient = neon(connectionString);\n\t\tconst pool = new Pool({ connectionString });\n\t\treturn construct(httpClient, pool, drizzleConfig) as any;\n\t}\n\n\tif (typeof params[0] === 'string') {\n\t\tconst connectionString = params[0];\n\t\tconst httpClient = neon(connectionString);\n\t\tconst pool = new Pool({ connectionString });\n\t\treturn construct(httpClient, pool, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: { connectionString: string } | string;\n\t\t\tclient?: NetlifyDbClient | DrizzleClient;\n\t\t} & DrizzleNetlifyConfig<TRelations>;\n\n\t\tif (client) {\n\t\t\tif ('driver' in client) {\n\t\t\t\tif (client.driver === 'serverless') {\n\t\t\t\t\treturn construct(client.httpClient, client.pool, drizzleConfig);\n\t\t\t\t}\n\t\t\t\treturn drizzleNodePg({ client: client.pool, ...drizzleConfig }) as any;\n\t\t\t}\n\t\t\treturn construct(client.http, client.pool, drizzleConfig);\n\t\t}\n\n\t\tconst connectionString = typeof connection === 'string' ? connection : connection!.connectionString;\n\t\tconst httpClient = neon(connectionString);\n\t\tconst pool = new Pool({ connectionString });\n\n\t\treturn construct(httpClient, pool, drizzleConfig) as any;\n\t}\n\n\tthrow new Error('Invalid arguments. Expected a connection string or a config object.');\n}\n\nexport namespace drizzle {\n\texport function mock<\n\t\tTRelations extends AnyRelations = EmptyRelations,\n\t>(\n\t\tconfig?: DrizzleNetlifyConfig<TRelations>,\n\t): NetlifyDbDatabase<TRelations> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, {} as any, config) as any;\n\t}\n}\n"],"mappings":"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"}