{"version":3,"file":"index.mjs","sources":["../postgres.ts"],"sourcesContent":["import { SqlTag } from '@sqltags/core';\nimport { type Client, type Pool, type PoolClient, type QueryResult } from 'pg';\nimport Cursor, { type CursorQueryConfig } from 'pg-cursor';\n\nfunction isPool(client: Client | Pool): client is Pool {\n  return 'idleCount' in client;\n}\n\nexport function createPgTag(client: Client | Pool) {\n  return new SqlTag<QueryResult, CursorQueryConfig>({\n    parameterizeValue(_value: any, _paramIndex: number) {\n      return `$${_paramIndex + 1}`;\n    },\n\n    escapeIdentifier(identifier: string) {\n      // Not using the one from 'pg' library because it requires a connection instance which doesn't work with the pool\n      // Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\n      return '\"' + identifier.replace(/\"/g, '\"\"') + '\"';\n    },\n\n    // Note that values are not serialized using the default sqltags serialization.\n    // Instead, they are passed as-is and serialized according to this:\n    // https://node-postgres.com/features/queries#parameterized-query\n    serializeValue(value: any) {\n      return value;\n    },\n\n    async query(sql: string, params: any[]): Promise<[any[], QueryResult]> {\n      const res = await client.query(sql, params);\n      return [res.rows, res];\n    },\n\n    cursor(sql: string, params: any[], options?: CursorQueryConfig): AsyncIterable<any> {\n      let _client: Client | PoolClient;\n      let cursor: Cursor<any>;\n      const queue: any[] = [];\n\n      return {\n        [Symbol.asyncIterator]: () => ({\n          next: async () => {\n            if (!_client) {\n              _client = isPool(client) ? await client.connect() : client;\n              cursor = _client.query(new Cursor(sql, params, options));\n            }\n\n            if (queue.length > 0) {\n              return { done: false, value: queue.shift() };\n            }\n\n            try {\n              const res = await cursor.read(100);\n              if (res.length === 0) {\n                await cursor.close();\n                if (isPool(client)) (_client as PoolClient).release();\n                return { done: true, value: undefined };\n              }\n\n              queue.push(...res);\n              return { done: false, value: queue.shift() };\n            } catch (err: any) {\n              await cursor.close();\n              if (isPool(client)) (_client as PoolClient).release();\n              throw err;\n            }\n          },\n        }),\n      };\n    },\n  });\n}\n"],"names":[],"mappings":";;;AAIA,SAAS,MAAM,CAAC,MAAqB,EAAA;IACnC,OAAO,WAAW,IAAI,MAAM;AAC9B;AAEM,SAAU,WAAW,CAAC,MAAqB,EAAA;IAC/C,OAAO,IAAI,MAAM,CAAiC;QAChD,iBAAiB,CAAC,MAAW,EAAE,WAAmB,EAAA;AAChD,YAAA,OAAO,CAAA,CAAA,EAAI,WAAW,GAAG,CAAC,EAAE;QAC9B,CAAC;AAED,QAAA,gBAAgB,CAAC,UAAkB,EAAA;;;AAGjC,YAAA,OAAO,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG;QACnD,CAAC;;;;AAKD,QAAA,cAAc,CAAC,KAAU,EAAA;AACvB,YAAA,OAAO,KAAK;QACd,CAAC;AAED,QAAA,MAAM,KAAK,CAAC,GAAW,EAAE,MAAa,EAAA;YACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;AAC3C,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;QACxB,CAAC;AAED,QAAA,MAAM,CAAC,GAAW,EAAE,MAAa,EAAE,OAA2B,EAAA;AAC5D,YAAA,IAAI,OAA4B;AAChC,YAAA,IAAI,MAAmB;YACvB,MAAM,KAAK,GAAU,EAAE;YAEvB,OAAO;gBACL,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO;oBAC7B,IAAI,EAAE,YAAW;wBACf,IAAI,CAAC,OAAO,EAAE;AACZ,4BAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM;AAC1D,4BAAA,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;wBAC1D;AAEA,wBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,4BAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE;wBAC9C;AAEA,wBAAA,IAAI;4BACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,4BAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,gCAAA,MAAM,MAAM,CAAC,KAAK,EAAE;gCACpB,IAAI,MAAM,CAAC,MAAM,CAAC;oCAAG,OAAsB,CAAC,OAAO,EAAE;gCACrD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;4BACzC;AAEA,4BAAA,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AAClB,4BAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE;wBAC9C;wBAAE,OAAO,GAAQ,EAAE;AACjB,4BAAA,MAAM,MAAM,CAAC,KAAK,EAAE;4BACpB,IAAI,MAAM,CAAC,MAAM,CAAC;gCAAG,OAAsB,CAAC,OAAO,EAAE;AACrD,4BAAA,MAAM,GAAG;wBACX;oBACF,CAAC;iBACF,CAAC;aACH;QACH,CAAC;AACF,KAAA,CAAC;AACJ;;;;"}