{"version":3,"sources":["../../src/netlify-db/driver.ts"],"sourcesContent":["import { neon, Pool, types } from '@neondatabase/serverless';\nimport { getDatabase } from '@netlify/db';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.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 { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport * as V1 from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.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 NetlifyDbDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NetlifyDbDriver {\n\tstatic readonly [entityKind]: string = 'NetlifyDbDriver';\n\n\tconstructor(\n\t\tprivate httpClient: NeonHttpClient,\n\t\tprivate pool: Pool,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NetlifyDbDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: V1.RelationalSchemaConfig<V1.TablesRelationalConfig> | undefined,\n\t): NetlifyDbSession<Record<string, unknown>, V1.TablesRelationalConfig> {\n\t\treturn new NetlifyDbSession(this.httpClient, this.pool, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val: any) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val: any) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val: any) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val: any) => val);\n\t\ttypes.setTypeParser(1231, (val: any) => val);\n\t\ttypes.setTypeParser(1115, (val: any) => val);\n\t\ttypes.setTypeParser(1185, (val: any) => val);\n\t\ttypes.setTypeParser(1187, (val: any) => val);\n\t\ttypes.setTypeParser(1182, (val: any) => val);\n\t}\n}\n\nexport class NetlifyDbDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NetlifyDbDatabase';\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 (<NetlifyDbSession<TSchema, V1.ExtractTablesWithRelations<TSchema>>> this.session).batch(\n\t\t\tbatch,\n\t\t) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\thttpClient: NeonHttpClient,\n\tpool: Pool,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NetlifyDbDatabase<TSchema> & {\n\t$client: NetlifyDbClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\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\n\tlet schema: V1.RelationalSchemaConfig<V1.TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = V1.extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tV1.createTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NetlifyDbDriver(httpClient, pool, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NetlifyDbDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as V1.RelationalSchemaConfig<V1.ExtractTablesWithRelations<TSchema>> | undefined,\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\tTSchema extends Record<string, unknown> = Record<string, never>,\n>():\n\t| (NetlifyDbDatabase<TSchema> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TSchema> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tconfig: DrizzleConfig<TSchema>,\n):\n\t| (NetlifyDbDatabase<TSchema> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TSchema> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tconfig: DrizzleConfig<TSchema> & { client: ServerlessDrizzleClient },\n): NetlifyDbDatabase<TSchema> & { $client: NetlifyDbClient };\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tconfig: DrizzleConfig<TSchema> & { client: ServerDrizzleClient },\n): NodePgDatabase<TSchema> & { $client: NodePgClient };\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tconfig: DrizzleConfig<TSchema> & { client: DrizzleClient },\n):\n\t| (NetlifyDbDatabase<TSchema> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TSchema> & { $client: NodePgClient });\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\t...params: [\n\t\tstring,\n\t] | [\n\t\tstring,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\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<TSchema> & { $client: NetlifyDbClient };\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\t...params: [] | [\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\tstring,\n\t] | [\n\t\tstring,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\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<TSchema> & { $client: NetlifyDbClient })\n\t| (NodePgDatabase<TSchema> & { $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 DrizzleConfig<TSchema>;\n\t\tconst connection = getDatabase();\n\n\t\tif (connection.driver === 'server') {\n\t\t\treturn drizzleNodePg({ client: connection.pool, ...drizzleConfig }) as any;\n\t\t}\n\n\t\treturn construct(connection.httpClient, connection.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} & DrizzleConfig<TSchema>;\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\tTSchema extends Record<string, unknown> = Record<string, never>,\n\t>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NetlifyDbDatabase<TSchema> & {\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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","names":["import_db","drizzleNodePg","drizzle"]}