@event-driven-io/dumbo 0.4.0 → 0.5.0
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.
- package/dist/index.cjs +11 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -6
- package/dist/index.d.ts +14 -6
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pg = require('pg'); var _pg2 = _interopRequireDefault(_pg);var _pgconnectionstring = require('pg-connection-string'); var _pgconnectionstring2 = _interopRequireDefault(_pgconnectionstring);var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pg = require('pg'); var _pg2 = _interopRequireDefault(_pg);var _pgconnectionstring = require('pg-connection-string'); var _pgconnectionstring2 = _interopRequireDefault(_pgconnectionstring);var l="postgres",u= exports.getDatabaseNameOrDefault =e=>_nullishCoalesce(_pgconnectionstring2.default.parse(e).database, () => (l));var n=new Map,a=new Map,g= exports.getPool =e=>{let t=typeof e=="string"?e:e.connectionString,o=typeof e=="string"?{connectionString:t}:e,s=_nullishCoalesce(o.database, () => ((o.connectionString?u(o.connectionString):void 0))),r=y(t,s);return P(r,1),_nullishCoalesce(n.get(r), () => (n.set(r,new _pg2.default.Pool(o)).get(r)))},c= exports.endPool =async({connectionString:e,database:t,force:o})=>{t=_nullishCoalesce(t, () => (u(e)));let s=y(e,t),r=n.get(s);r&&(P(s,-1)<=0||o===!0)&&await R(s,r)},R= exports.onEndPool =async(e,t)=>{try{await t.end(),n.delete(e)}catch(o){console.log(`Error while closing the connection pool: ${e}`),console.log(o)}},D= exports.endAllPools =()=>Promise.all([...n.entries()].map(([e,t])=>R(e,t))),y=(e,t)=>`${e}|${_nullishCoalesce(t, () => (l))}`,P=(e,t)=>{let o=_nullishCoalesce(a.get(e), () => (0)),s=o+t;return a.set(e,o+t),s};var B=(e,t)=>{let o=g({connectionString:e,database:t});return{connect:()=>o.connect(),close:()=>c({connectionString:e,database:t})}};var w=e=>e instanceof _pg2.default.Pool,W= exports.isPgClient =e=>e instanceof _pg2.default.Client,d= exports.isPgPoolClient =e=>"release"in e&&typeof e.release=="function",x= exports.execute =async(e,t)=>{let o=w(e)?await e.connect():e;try{return await t(o)}finally{w(e)&&d(o)&&o.release()}},f= exports.executeInTransaction =async(e,t)=>x(e,async o=>{try{await o.query("BEGIN");let{success:s,result:r}=await t(o);return s?await o.query("COMMIT"):await o.query("ROLLBACK"),r}catch(s){throw await o.query("ROLLBACK"),s}}),S= exports.executeSQL =async(e,t)=>x(e,o=>o.query(t)),X= exports.executeSQLInTransaction =async(e,t)=>(console.log(t),f(e,async o=>({success:!0,result:await o.query(t)}))),z= exports.executeSQLBatchInTransaction =async(e,...t)=>f(e,async o=>{for(let s of t)await o.query(s);return{success:!0,result:void 0}}),G= exports.firstOrNull =async e=>{let t=await e;return t.rows.length>0?_nullishCoalesce(t.rows[0], () => (null)):null},j= exports.first =async e=>{let t=await e;if(t.rows.length===0)throw new Error("Query didn't return any result");return t.rows[0]},J= exports.singleOrNull =async e=>{let t=await e;if(t.rows.length>1)throw new Error("Query had more than one result");return t.rows.length>0?_nullishCoalesce(t.rows[0], () => (null)):null},L= exports.single =async e=>{let t=await e;if(t.rows.length===0)throw new Error("Query didn't return any result");if(t.rows.length>1)throw new Error("Query had more than one result");return t.rows[0]},V= exports.mapRows =async(e,t)=>(await e).rows.map(t),E= exports.toCamelCase =e=>e.replace(/_([a-z])/g,t=>_nullishCoalesce(_optionalChain([t, 'access', _ => _[1], 'optionalAccess', _2 => _2.toUpperCase, 'call', _3 => _3()]), () => (""))),Y= exports.mapToCamelCase =e=>{let t={};for(let o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[E(o)]=e[o]);return t},i= exports.exists =async(e,t)=>(await L(S(e,t))).exists===!0;var _pgformat = require('pg-format'); var _pgformat2 = _interopRequireDefault(_pgformat);var h=e=>p(`
|
|
2
|
+
SELECT EXISTS (
|
|
3
|
+
SELECT FROM pg_tables
|
|
4
|
+
WHERE tablename = %L
|
|
5
|
+
) AS exists;`,e),re= exports.tableExists =async(e,t)=>i(e,h(t)),b= exports.functionExistsSQL =e=>p(`
|
|
6
|
+
SELECT EXISTS (
|
|
7
|
+
SELECT FROM pg_proc
|
|
8
|
+
WHERE
|
|
9
|
+
proname = %L
|
|
10
|
+
) AS exists;
|
|
11
|
+
`,e),ne= exports.functionExists =async(e,t)=>i(e,b(t));var p=(e,...t)=>_pgformat2.default.call(void 0, e,...t),pe= exports.rawSql =e=>e;exports.defaultPostgreSqlDatabase = l; exports.endAllPools = D; exports.endPool = c; exports.execute = x; exports.executeInTransaction = f; exports.executeSQL = S; exports.executeSQLBatchInTransaction = z; exports.executeSQLInTransaction = X; exports.exists = i; exports.first = j; exports.firstOrNull = G; exports.functionExists = ne; exports.functionExistsSQL = b; exports.getDatabaseNameOrDefault = u; exports.getPool = g; exports.isPgClient = W; exports.isPgPool = w; exports.isPgPoolClient = d; exports.mapRows = V; exports.mapToCamelCase = Y; exports.onEndPool = R; exports.postgresClient = B; exports.rawSql = pe; exports.single = L; exports.singleOrNull = J; exports.sql = p; exports.tableExists = re; exports.tableExistsSQL = h; exports.toCamelCase = E;
|
|
2
12
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connections/client.ts","../src/connections/pool.ts","../src/connections/connectionString.ts","../src/execute/index.ts","../src/sql/index.ts"],"names":["pg","pgcs","defaultPostgreSqlDatabase","getDatabaseNameOrDefault","connectionString","pools","usageCounter","getPool","connectionStringOrOptions","poolOptions","database","lookupKey","key","updatePoolUsageCounter","endPool","force","pool","onEndPool","error","endAllPools","by","currentCounter","newCounter","postgresClient","execute","handle","client","executeInTransaction","success","result","e","executeSQL","poolOrClient","sql","executeSQLInTransaction","executeSQLBatchInTransaction","sqls","firstOrNull","getResult","first","singleOrNull","single","mapRows","map","toCamelCase","snakeStr","g","mapToCamelCase","obj","newObj","exists","format","sqlQuery","params","rawSql"],"mappings":"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","sourcesContent":["import pg from 'pg';\nimport { endPool, getPool } from './pool';\n\nexport interface PostgresClient {\n connect(): Promise<pg.PoolClient>;\n close(): Promise<void>;\n}\n\nexport const postgresClient = (\n connectionString: string,\n database?: string,\n): PostgresClient => {\n const pool = getPool({ connectionString, database });\n\n return {\n connect: () => pool.connect(),\n close: () => endPool({ connectionString, database }),\n };\n};\n","import pg from 'pg';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from './connectionString';\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n pools.delete(lookupKey);\n } catch (error) {\n console.log(`Error while closing the connection pool: ${lookupKey}`);\n console.log(error);\n }\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pgcs from 'pg-connection-string';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import type pg from 'pg';\nimport type { SQL } from '../sql';\n\nexport const execute = async <Result = void>(\n pool: pg.Pool,\n handle: (client: pg.PoolClient) => Promise<Result>,\n) => {\n const client = await pool.connect();\n try {\n return await handle(client);\n } finally {\n client.release();\n }\n};\n\nexport const executeInTransaction = async <Result = void>(\n pool: pg.Pool,\n handle: (\n client: pg.PoolClient,\n ) => Promise<{ success: boolean; result: Result }>,\n): Promise<Result> =>\n execute(pool, async (client) => {\n try {\n await client.query('BEGIN');\n\n const { success, result } = await handle(client);\n\n if (success) await client.query('COMMIT');\n else await client.query('ROLLBACK');\n\n return result;\n } catch (e) {\n await client.query('ROLLBACK');\n throw e;\n }\n });\n\nexport const executeSQL = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n poolOrClient: pg.Pool | pg.PoolClient,\n sql: SQL,\n): Promise<pg.QueryResult<Result>> =>\n 'totalCount' in poolOrClient\n ? execute(poolOrClient, (client) => client.query<Result>(sql))\n : poolOrClient.query<Result>(sql);\n\nexport const executeSQLInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool,\n sql: SQL,\n) => {\n console.log(sql);\n return executeInTransaction(pool, async (client) => ({\n success: true,\n result: await client.query<Result>(sql),\n }));\n};\n\nexport const executeSQLBatchInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool,\n ...sqls: SQL[]\n) =>\n executeInTransaction(pool, async (client) => {\n for (const sql of sqls) {\n await client.query<Result>(sql);\n }\n\n return { success: true, result: undefined };\n });\n\nexport const firstOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const first = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const single = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport const mapRows = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: T,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (pool: pg.Pool, sql: SQL): Promise<boolean> => {\n const result = await single(executeSQL<ExistsSQLQueryResult>(pool, sql));\n\n return result.exists === true;\n};\n","import format from 'pg-format';\n\nexport type SQL = string & { __brand: 'sql' };\n\nexport const sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nexport const rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connections/client.ts","../src/connections/pool.ts","../src/connections/connectionString.ts","../src/execute/index.ts","../src/sql/index.ts","../src/sql/schema.ts"],"names":["pg","pgcs","defaultPostgreSqlDatabase","getDatabaseNameOrDefault","connectionString","pools","usageCounter","getPool","connectionStringOrOptions","poolOptions","database","lookupKey","key","updatePoolUsageCounter","endPool","force","pool","onEndPool","error","endAllPools","by","currentCounter","newCounter","postgresClient","isPgPool","poolOrClient","isPgClient","isPgPoolClient","execute","handle","client","executeInTransaction","success","result","e","executeSQL","sql","executeSQLInTransaction","executeSQLBatchInTransaction","sqls","firstOrNull","getResult","first","singleOrNull","single","mapRows","map","toCamelCase","snakeStr","g","mapToCamelCase","obj","newObj","exists","format","tableExistsSQL","tableName","tableExists","functionExistsSQL","functionName","functionExists","sqlQuery","params","rawSql"],"mappings":"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","sourcesContent":["import pg from 'pg';\nimport { endPool, getPool } from './pool';\n\nexport interface PostgresClient {\n connect(): Promise<pg.PoolClient>;\n close(): Promise<void>;\n}\n\nexport const postgresClient = (\n connectionString: string,\n database?: string,\n): PostgresClient => {\n const pool = getPool({ connectionString, database });\n\n return {\n connect: () => pool.connect(),\n close: () => endPool({ connectionString, database }),\n };\n};\n","import pg from 'pg';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from './connectionString';\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n pools.delete(lookupKey);\n } catch (error) {\n console.log(`Error while closing the connection pool: ${lookupKey}`);\n console.log(error);\n }\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pgcs from 'pg-connection-string';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import pg from 'pg';\nimport type { SQL } from '../sql';\n\nexport const isPgPool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const execute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgPool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgPool(poolOrClient) && isPgPoolClient(client)) client.release();\n }\n};\n\nexport const executeInTransaction = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (\n client: pg.PoolClient | pg.Client,\n ) => Promise<{ success: boolean; result: Result }>,\n): Promise<Result> =>\n execute(poolOrClient, async (client) => {\n try {\n await client.query('BEGIN');\n\n const { success, result } = await handle(client);\n\n if (success) await client.query('COMMIT');\n else await client.query('ROLLBACK');\n\n return result;\n } catch (e) {\n await client.query('ROLLBACK');\n throw e;\n }\n });\n\nexport const executeSQL = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n sql: SQL,\n): Promise<pg.QueryResult<Result>> =>\n execute(poolOrClient, (client) => client.query<Result>(sql));\n\nexport const executeSQLInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool | pg.PoolClient | pg.Client,\n sql: SQL,\n) => {\n console.log(sql);\n return executeInTransaction(pool, async (client) => ({\n success: true,\n result: await client.query<Result>(sql),\n }));\n};\n\nexport const executeSQLBatchInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool | pg.PoolClient | pg.Client,\n ...sqls: SQL[]\n) =>\n executeInTransaction(pool, async (client) => {\n for (const sql of sqls) {\n await client.query<Result>(sql);\n }\n\n return { success: true, result: undefined };\n });\n\nexport const firstOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const first = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const single = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport const mapRows = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: T,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (pool: pg.Pool, sql: SQL): Promise<boolean> => {\n const result = await single(executeSQL<ExistsSQLQueryResult>(pool, sql));\n\n return result.exists === true;\n};\n","import format from 'pg-format';\nexport * from './schema';\n\nexport type SQL = string & { __brand: 'sql' };\n\nexport const sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nexport const rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n","import pg from 'pg';\nimport { sql, type SQL } from '.';\nimport { exists } from '../execute';\nexport * from './schema';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: pg.Pool,\n tableName: string,\n): Promise<boolean> => exists(pool, tableExistsSQL(tableName));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: pg.Pool,\n functionName: string,\n): Promise<boolean> => exists(pool, functionExistsSQL(functionName));\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -18,20 +18,28 @@ declare const endPool: ({ connectionString, database, force, }: {
|
|
|
18
18
|
declare const onEndPool: (lookupKey: string, pool: pg.Pool) => Promise<void>;
|
|
19
19
|
declare const endAllPools: () => Promise<void[]>;
|
|
20
20
|
|
|
21
|
+
declare const tableExistsSQL: (tableName: string) => SQL;
|
|
22
|
+
declare const tableExists: (pool: pg.Pool, tableName: string) => Promise<boolean>;
|
|
23
|
+
declare const functionExistsSQL: (functionName: string) => SQL;
|
|
24
|
+
declare const functionExists: (pool: pg.Pool, functionName: string) => Promise<boolean>;
|
|
25
|
+
|
|
21
26
|
type SQL = string & {
|
|
22
27
|
__brand: 'sql';
|
|
23
28
|
};
|
|
24
29
|
declare const sql: (sqlQuery: string, ...params: unknown[]) => SQL;
|
|
25
30
|
declare const rawSql: (sqlQuery: string) => SQL;
|
|
26
31
|
|
|
27
|
-
declare const
|
|
28
|
-
declare const
|
|
32
|
+
declare const isPgPool: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.Pool;
|
|
33
|
+
declare const isPgClient: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.Client;
|
|
34
|
+
declare const isPgPoolClient: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.PoolClient;
|
|
35
|
+
declare const execute: <Result = void>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, handle: (client: pg.PoolClient | pg.Client) => Promise<Result>) => Promise<Result>;
|
|
36
|
+
declare const executeInTransaction: <Result = void>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, handle: (client: pg.PoolClient | pg.Client) => Promise<{
|
|
29
37
|
success: boolean;
|
|
30
38
|
result: Result;
|
|
31
39
|
}>) => Promise<Result>;
|
|
32
|
-
declare const executeSQL: <Result extends pg.QueryResultRow = pg.QueryResultRow>(poolOrClient: pg.Pool | pg.PoolClient, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
33
|
-
declare const executeSQLInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
34
|
-
declare const executeSQLBatchInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool, ...sqls: SQL[]) => Promise<undefined>;
|
|
40
|
+
declare const executeSQL: <Result extends pg.QueryResultRow = pg.QueryResultRow>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
41
|
+
declare const executeSQLInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool | pg.PoolClient | pg.Client, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
42
|
+
declare const executeSQLBatchInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool | pg.PoolClient | pg.Client, ...sqls: SQL[]) => Promise<undefined>;
|
|
35
43
|
declare const firstOrNull: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result | null>;
|
|
36
44
|
declare const first: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result>;
|
|
37
45
|
declare const singleOrNull: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result | null>;
|
|
@@ -44,4 +52,4 @@ type ExistsSQLQueryResult = {
|
|
|
44
52
|
};
|
|
45
53
|
declare const exists: (pool: pg.Pool, sql: SQL) => Promise<boolean>;
|
|
46
54
|
|
|
47
|
-
export { type ExistsSQLQueryResult, type PostgresClient, type SQL, defaultPostgreSqlDatabase, endAllPools, endPool, execute, executeInTransaction, executeSQL, executeSQLBatchInTransaction, executeSQLInTransaction, exists, first, firstOrNull, getDatabaseNameOrDefault, getPool, mapRows, mapToCamelCase, onEndPool, postgresClient, rawSql, single, singleOrNull, sql, toCamelCase };
|
|
55
|
+
export { type ExistsSQLQueryResult, type PostgresClient, type SQL, defaultPostgreSqlDatabase, endAllPools, endPool, execute, executeInTransaction, executeSQL, executeSQLBatchInTransaction, executeSQLInTransaction, exists, first, firstOrNull, functionExists, functionExistsSQL, getDatabaseNameOrDefault, getPool, isPgClient, isPgPool, isPgPoolClient, mapRows, mapToCamelCase, onEndPool, postgresClient, rawSql, single, singleOrNull, sql, tableExists, tableExistsSQL, toCamelCase };
|
package/dist/index.d.ts
CHANGED
|
@@ -18,20 +18,28 @@ declare const endPool: ({ connectionString, database, force, }: {
|
|
|
18
18
|
declare const onEndPool: (lookupKey: string, pool: pg.Pool) => Promise<void>;
|
|
19
19
|
declare const endAllPools: () => Promise<void[]>;
|
|
20
20
|
|
|
21
|
+
declare const tableExistsSQL: (tableName: string) => SQL;
|
|
22
|
+
declare const tableExists: (pool: pg.Pool, tableName: string) => Promise<boolean>;
|
|
23
|
+
declare const functionExistsSQL: (functionName: string) => SQL;
|
|
24
|
+
declare const functionExists: (pool: pg.Pool, functionName: string) => Promise<boolean>;
|
|
25
|
+
|
|
21
26
|
type SQL = string & {
|
|
22
27
|
__brand: 'sql';
|
|
23
28
|
};
|
|
24
29
|
declare const sql: (sqlQuery: string, ...params: unknown[]) => SQL;
|
|
25
30
|
declare const rawSql: (sqlQuery: string) => SQL;
|
|
26
31
|
|
|
27
|
-
declare const
|
|
28
|
-
declare const
|
|
32
|
+
declare const isPgPool: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.Pool;
|
|
33
|
+
declare const isPgClient: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.Client;
|
|
34
|
+
declare const isPgPoolClient: (poolOrClient: pg.Pool | pg.PoolClient | pg.Client) => poolOrClient is pg.PoolClient;
|
|
35
|
+
declare const execute: <Result = void>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, handle: (client: pg.PoolClient | pg.Client) => Promise<Result>) => Promise<Result>;
|
|
36
|
+
declare const executeInTransaction: <Result = void>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, handle: (client: pg.PoolClient | pg.Client) => Promise<{
|
|
29
37
|
success: boolean;
|
|
30
38
|
result: Result;
|
|
31
39
|
}>) => Promise<Result>;
|
|
32
|
-
declare const executeSQL: <Result extends pg.QueryResultRow = pg.QueryResultRow>(poolOrClient: pg.Pool | pg.PoolClient, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
33
|
-
declare const executeSQLInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
34
|
-
declare const executeSQLBatchInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool, ...sqls: SQL[]) => Promise<undefined>;
|
|
40
|
+
declare const executeSQL: <Result extends pg.QueryResultRow = pg.QueryResultRow>(poolOrClient: pg.Pool | pg.PoolClient | pg.Client, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
41
|
+
declare const executeSQLInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool | pg.PoolClient | pg.Client, sql: SQL) => Promise<pg.QueryResult<Result>>;
|
|
42
|
+
declare const executeSQLBatchInTransaction: <Result extends pg.QueryResultRow = pg.QueryResultRow>(pool: pg.Pool | pg.PoolClient | pg.Client, ...sqls: SQL[]) => Promise<undefined>;
|
|
35
43
|
declare const firstOrNull: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result | null>;
|
|
36
44
|
declare const first: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result>;
|
|
37
45
|
declare const singleOrNull: <Result extends pg.QueryResultRow = pg.QueryResultRow>(getResult: Promise<pg.QueryResult<Result>>) => Promise<Result | null>;
|
|
@@ -44,4 +52,4 @@ type ExistsSQLQueryResult = {
|
|
|
44
52
|
};
|
|
45
53
|
declare const exists: (pool: pg.Pool, sql: SQL) => Promise<boolean>;
|
|
46
54
|
|
|
47
|
-
export { type ExistsSQLQueryResult, type PostgresClient, type SQL, defaultPostgreSqlDatabase, endAllPools, endPool, execute, executeInTransaction, executeSQL, executeSQLBatchInTransaction, executeSQLInTransaction, exists, first, firstOrNull, getDatabaseNameOrDefault, getPool, mapRows, mapToCamelCase, onEndPool, postgresClient, rawSql, single, singleOrNull, sql, toCamelCase };
|
|
55
|
+
export { type ExistsSQLQueryResult, type PostgresClient, type SQL, defaultPostgreSqlDatabase, endAllPools, endPool, execute, executeInTransaction, executeSQL, executeSQLBatchInTransaction, executeSQLInTransaction, exists, first, firstOrNull, functionExists, functionExistsSQL, getDatabaseNameOrDefault, getPool, isPgClient, isPgPool, isPgPoolClient, mapRows, mapToCamelCase, onEndPool, postgresClient, rawSql, single, singleOrNull, sql, tableExists, tableExistsSQL, toCamelCase };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
import"pg";import
|
|
1
|
+
import"pg";import C from"pg";import Q from"pg-connection-string";var l="postgres",u=e=>Q.parse(e).database??l;var n=new Map,a=new Map,g=e=>{let t=typeof e=="string"?e:e.connectionString,o=typeof e=="string"?{connectionString:t}:e,s=o.database??(o.connectionString?u(o.connectionString):void 0),r=y(t,s);return P(r,1),n.get(r)??n.set(r,new C.Pool(o)).get(r)},c=async({connectionString:e,database:t,force:o})=>{t=t??u(e);let s=y(e,t),r=n.get(s);r&&(P(s,-1)<=0||o===!0)&&await R(s,r)},R=async(e,t)=>{try{await t.end(),n.delete(e)}catch(o){console.log(`Error while closing the connection pool: ${e}`),console.log(o)}},D=()=>Promise.all([...n.entries()].map(([e,t])=>R(e,t))),y=(e,t)=>`${e}|${t??l}`,P=(e,t)=>{let o=a.get(e)??0,s=o+t;return a.set(e,o+t),s};var B=(e,t)=>{let o=g({connectionString:e,database:t});return{connect:()=>o.connect(),close:()=>c({connectionString:e,database:t})}};import m from"pg";var w=e=>e instanceof m.Pool,W=e=>e instanceof m.Client,d=e=>"release"in e&&typeof e.release=="function",x=async(e,t)=>{let o=w(e)?await e.connect():e;try{return await t(o)}finally{w(e)&&d(o)&&o.release()}},f=async(e,t)=>x(e,async o=>{try{await o.query("BEGIN");let{success:s,result:r}=await t(o);return s?await o.query("COMMIT"):await o.query("ROLLBACK"),r}catch(s){throw await o.query("ROLLBACK"),s}}),S=async(e,t)=>x(e,o=>o.query(t)),X=async(e,t)=>(console.log(t),f(e,async o=>({success:!0,result:await o.query(t)}))),z=async(e,...t)=>f(e,async o=>{for(let s of t)await o.query(s);return{success:!0,result:void 0}}),G=async e=>{let t=await e;return t.rows.length>0?t.rows[0]??null:null},j=async e=>{let t=await e;if(t.rows.length===0)throw new Error("Query didn't return any result");return t.rows[0]},J=async e=>{let t=await e;if(t.rows.length>1)throw new Error("Query had more than one result");return t.rows.length>0?t.rows[0]??null:null},L=async e=>{let t=await e;if(t.rows.length===0)throw new Error("Query didn't return any result");if(t.rows.length>1)throw new Error("Query had more than one result");return t.rows[0]},V=async(e,t)=>(await e).rows.map(t),E=e=>e.replace(/_([a-z])/g,t=>t[1]?.toUpperCase()??""),Y=e=>{let t={};for(let o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[E(o)]=e[o]);return t},i=async(e,t)=>(await L(S(e,t))).exists===!0;import T from"pg-format";import"pg";var h=e=>p(`
|
|
2
|
+
SELECT EXISTS (
|
|
3
|
+
SELECT FROM pg_tables
|
|
4
|
+
WHERE tablename = %L
|
|
5
|
+
) AS exists;`,e),re=async(e,t)=>i(e,h(t)),b=e=>p(`
|
|
6
|
+
SELECT EXISTS (
|
|
7
|
+
SELECT FROM pg_proc
|
|
8
|
+
WHERE
|
|
9
|
+
proname = %L
|
|
10
|
+
) AS exists;
|
|
11
|
+
`,e),ne=async(e,t)=>i(e,b(t));var p=(e,...t)=>T(e,...t),pe=e=>e;export{l as defaultPostgreSqlDatabase,D as endAllPools,c as endPool,x as execute,f as executeInTransaction,S as executeSQL,z as executeSQLBatchInTransaction,X as executeSQLInTransaction,i as exists,j as first,G as firstOrNull,ne as functionExists,b as functionExistsSQL,u as getDatabaseNameOrDefault,g as getPool,W as isPgClient,w as isPgPool,d as isPgPoolClient,V as mapRows,Y as mapToCamelCase,R as onEndPool,B as postgresClient,pe as rawSql,L as single,J as singleOrNull,p as sql,re as tableExists,h as tableExistsSQL,E as toCamelCase};
|
|
2
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connections/client.ts","../src/connections/pool.ts","../src/connections/connectionString.ts","../src/execute/index.ts","../src/sql/index.ts"],"sourcesContent":["import pg from 'pg';\nimport { endPool, getPool } from './pool';\n\nexport interface PostgresClient {\n connect(): Promise<pg.PoolClient>;\n close(): Promise<void>;\n}\n\nexport const postgresClient = (\n connectionString: string,\n database?: string,\n): PostgresClient => {\n const pool = getPool({ connectionString, database });\n\n return {\n connect: () => pool.connect(),\n close: () => endPool({ connectionString, database }),\n };\n};\n","import pg from 'pg';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from './connectionString';\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n pools.delete(lookupKey);\n } catch (error) {\n console.log(`Error while closing the connection pool: ${lookupKey}`);\n console.log(error);\n }\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pgcs from 'pg-connection-string';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import type pg from 'pg';\nimport type { SQL } from '../sql';\n\nexport const execute = async <Result = void>(\n pool: pg.Pool,\n handle: (client: pg.PoolClient) => Promise<Result>,\n) => {\n const client = await pool.connect();\n try {\n return await handle(client);\n } finally {\n client.release();\n }\n};\n\nexport const executeInTransaction = async <Result = void>(\n pool: pg.Pool,\n handle: (\n client: pg.PoolClient,\n ) => Promise<{ success: boolean; result: Result }>,\n): Promise<Result> =>\n execute(pool, async (client) => {\n try {\n await client.query('BEGIN');\n\n const { success, result } = await handle(client);\n\n if (success) await client.query('COMMIT');\n else await client.query('ROLLBACK');\n\n return result;\n } catch (e) {\n await client.query('ROLLBACK');\n throw e;\n }\n });\n\nexport const executeSQL = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n poolOrClient: pg.Pool | pg.PoolClient,\n sql: SQL,\n): Promise<pg.QueryResult<Result>> =>\n 'totalCount' in poolOrClient\n ? execute(poolOrClient, (client) => client.query<Result>(sql))\n : poolOrClient.query<Result>(sql);\n\nexport const executeSQLInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool,\n sql: SQL,\n) => {\n console.log(sql);\n return executeInTransaction(pool, async (client) => ({\n success: true,\n result: await client.query<Result>(sql),\n }));\n};\n\nexport const executeSQLBatchInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool,\n ...sqls: SQL[]\n) =>\n executeInTransaction(pool, async (client) => {\n for (const sql of sqls) {\n await client.query<Result>(sql);\n }\n\n return { success: true, result: undefined };\n });\n\nexport const firstOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const first = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const single = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport const mapRows = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: T,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (pool: pg.Pool, sql: SQL): Promise<boolean> => {\n const result = await single(executeSQL<ExistsSQLQueryResult>(pool, sql));\n\n return result.exists === true;\n};\n","import format from 'pg-format';\n\nexport type SQL = string & { __brand: 'sql' };\n\nexport const sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nexport const rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n"],"mappings":"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","names":["pg","pgcs","defaultPostgreSqlDatabase","getDatabaseNameOrDefault","connectionString","pools","usageCounter","getPool","connectionStringOrOptions","connectionString","poolOptions","database","getDatabaseNameOrDefault","lookupKey","key","updatePoolUsageCounter","pg","endPool","force","pool","onEndPool","error","endAllPools","defaultPostgreSqlDatabase","by","currentCounter","newCounter","postgresClient","connectionString","database","pool","getPool","endPool","execute","pool","handle","client","executeInTransaction","success","result","e","executeSQL","poolOrClient","sql","executeSQLInTransaction","executeSQLBatchInTransaction","sqls","firstOrNull","getResult","first","singleOrNull","single","mapRows","map","toCamelCase","snakeStr","g","mapToCamelCase","obj","newObj","key","exists","format","sql","sqlQuery","params","rawSql"]}
|
|
1
|
+
{"version":3,"sources":["../src/connections/client.ts","../src/connections/pool.ts","../src/connections/connectionString.ts","../src/execute/index.ts","../src/sql/index.ts","../src/sql/schema.ts"],"sourcesContent":["import pg from 'pg';\nimport { endPool, getPool } from './pool';\n\nexport interface PostgresClient {\n connect(): Promise<pg.PoolClient>;\n close(): Promise<void>;\n}\n\nexport const postgresClient = (\n connectionString: string,\n database?: string,\n): PostgresClient => {\n const pool = getPool({ connectionString, database });\n\n return {\n connect: () => pool.connect(),\n close: () => endPool({ connectionString, database }),\n };\n};\n","import pg from 'pg';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from './connectionString';\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n pools.delete(lookupKey);\n } catch (error) {\n console.log(`Error while closing the connection pool: ${lookupKey}`);\n console.log(error);\n }\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pgcs from 'pg-connection-string';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import pg from 'pg';\nimport type { SQL } from '../sql';\n\nexport const isPgPool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const execute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgPool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgPool(poolOrClient) && isPgPoolClient(client)) client.release();\n }\n};\n\nexport const executeInTransaction = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (\n client: pg.PoolClient | pg.Client,\n ) => Promise<{ success: boolean; result: Result }>,\n): Promise<Result> =>\n execute(poolOrClient, async (client) => {\n try {\n await client.query('BEGIN');\n\n const { success, result } = await handle(client);\n\n if (success) await client.query('COMMIT');\n else await client.query('ROLLBACK');\n\n return result;\n } catch (e) {\n await client.query('ROLLBACK');\n throw e;\n }\n });\n\nexport const executeSQL = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n sql: SQL,\n): Promise<pg.QueryResult<Result>> =>\n execute(poolOrClient, (client) => client.query<Result>(sql));\n\nexport const executeSQLInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool | pg.PoolClient | pg.Client,\n sql: SQL,\n) => {\n console.log(sql);\n return executeInTransaction(pool, async (client) => ({\n success: true,\n result: await client.query<Result>(sql),\n }));\n};\n\nexport const executeSQLBatchInTransaction = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n pool: pg.Pool | pg.PoolClient | pg.Client,\n ...sqls: SQL[]\n) =>\n executeInTransaction(pool, async (client) => {\n for (const sql of sqls) {\n await client.query<Result>(sql);\n }\n\n return { success: true, result: undefined };\n });\n\nexport const firstOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const first = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? result.rows[0] ?? null : null;\n};\n\nexport const single = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport const mapRows = async <\n Result extends pg.QueryResultRow = pg.QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<pg.QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: T,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (pool: pg.Pool, sql: SQL): Promise<boolean> => {\n const result = await single(executeSQL<ExistsSQLQueryResult>(pool, sql));\n\n return result.exists === true;\n};\n","import format from 'pg-format';\nexport * from './schema';\n\nexport type SQL = string & { __brand: 'sql' };\n\nexport const sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nexport const rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n","import pg from 'pg';\nimport { sql, type SQL } from '.';\nimport { exists } from '../execute';\nexport * from './schema';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: pg.Pool,\n tableName: string,\n): Promise<boolean> => exists(pool, tableExistsSQL(tableName));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: pg.Pool,\n functionName: string,\n): Promise<boolean> => exists(pool, functionExistsSQL(functionName));\n"],"mappings":"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","names":["pg","pgcs","defaultPostgreSqlDatabase","getDatabaseNameOrDefault","connectionString","pools","usageCounter","getPool","connectionStringOrOptions","connectionString","poolOptions","database","getDatabaseNameOrDefault","lookupKey","key","updatePoolUsageCounter","pg","endPool","force","pool","onEndPool","error","endAllPools","defaultPostgreSqlDatabase","by","currentCounter","newCounter","postgresClient","connectionString","database","pool","getPool","endPool","pg","isPgPool","poolOrClient","isPgClient","isPgPoolClient","execute","handle","client","executeInTransaction","success","result","e","executeSQL","sql","executeSQLInTransaction","pool","executeSQLBatchInTransaction","sqls","firstOrNull","getResult","first","singleOrNull","single","mapRows","map","toCamelCase","snakeStr","g","mapToCamelCase","obj","newObj","key","exists","format","tableExistsSQL","tableName","sql","tableExists","pool","exists","functionExistsSQL","functionName","functionExists","sql","sqlQuery","params","format","rawSql"]}
|