@prairielearn/postgres 6.0.4 → 7.0.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/.turbo/turbo-build.log +1 -0
- package/CHANGELOG.md +12 -0
- package/LICENSE +683 -0
- package/dist/default-pool.d.ts +26 -26
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pool.d.ts +26 -35
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js.map +1 -1
- package/dist/pool.test.d.ts.map +1 -1
- package/dist/pool.test.js +2 -2
- package/dist/pool.test.js.map +1 -1
- package/package.json +15 -15
- package/src/index.ts +1 -1
- package/src/pool.test.ts +2 -2
- package/src/pool.ts +40 -63
package/dist/pool.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Writable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\n\nimport { afterAll, assert, beforeAll, describe, expect, it } from 'vitest';\nimport { ZodError, z } from 'zod';\n\nimport {\n callOptionalRow,\n callOptionalScalar,\n callRow,\n callRows,\n callScalar,\n callScalars,\n execute,\n queryCursor,\n queryOptionalRow,\n queryOptionalScalar,\n queryRow,\n queryRows,\n queryScalar,\n queryScalars,\n} from './default-pool.js';\nimport { makePostgresTestUtils } from './test-utils.js';\n\nconst postgresTestUtils = makePostgresTestUtils({\n database: 'prairielearn_postgres',\n});\n\nconst WorkspaceSchema = z.object({\n id: z.string(),\n created_at: z.date(),\n});\n\nconst SprocTwoColumnsSchema = z.object({\n id: z.string(),\n negative: z.number(),\n});\n\ndescribe('@prairielearn/postgres', function () {\n beforeAll(async () => {\n await postgresTestUtils.createDatabase();\n await execute(\n 'CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP);',\n );\n await execute('INSERT INTO workspaces (id) SELECT s FROM generate_series(1, 100) AS s');\n await execute(\n 'CREATE FUNCTION test_sproc_one_column(num_entries INT) RETURNS TABLE (id BIGINT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id FROM generate_series(1, num_entries) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_two_columns(num_entries INT) RETURNS TABLE (id BIGINT, negative INT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id, -s AS negative FROM generate_series(1, num_entries) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_one_column_ten_rows() RETURNS TABLE (id BIGINT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id FROM generate_series(1, 10) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_one_column_one_row(OUT id BIGINT) AS $$ BEGIN id = 1; END; $$ LANGUAGE plpgsql;',\n );\n });\n\n afterAll(async () => {\n await postgresTestUtils.dropDatabase();\n });\n\n describe('paramsToArray', () => {\n it('enforces SQL must be a string', async () => {\n // @ts-expect-error SQL must be a string\n const rows = execute({ invalid: true }, {});\n await expect(rows).rejects.toThrow('SQL must be a string');\n });\n\n it('enforces params must be array or object', async () => {\n // @ts-expect-error params must be an array or object\n const rows = execute('SELECT 33;', 33);\n await expect(rows).rejects.toThrow('params must be array or object');\n });\n\n it('rejects missing parameters', async () => {\n const rows = execute('SELECT $missing;', {});\n await expect(rows).rejects.toThrow('Missing parameter');\n });\n\n it('rejects unused parameters in testing', async () => {\n const rows = execute('SELECT 33;', { unsed_parameter: true });\n await expect(rows).rejects.toThrow('Unused parameter');\n });\n });\n\n describe('queryRows', () => {\n it('handles single column', async () => {\n const rows = await queryRows(\n 'SELECT id FROM workspaces WHERE id <= 10;',\n z.object({ id: z.string() }),\n );\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const rows = await queryRows('SELECT * FROM workspaces WHERE id <= 10;', WorkspaceSchema);\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n assert.isNotNull(rows[0].created_at);\n });\n\n it('handles parameters', async () => {\n const rows = await queryRows(\n 'SELECT * FROM workspaces WHERE id <= $1;',\n [10],\n WorkspaceSchema,\n );\n assert.lengthOf(rows, 10);\n });\n });\n\n describe('queryRow', () => {\n it('handles single column', async () => {\n const row = await queryRow(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await queryRow('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n assert.equal(row.id, '1');\n assert.isNotNull(row.created_at);\n });\n\n it('handles parameters', async () => {\n const row = await queryRow('SELECT * FROM workspaces WHERE id = $1;', [1], WorkspaceSchema);\n assert.equal(row.id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const rows = queryRow('SELECT * FROM workspaces WHERE id = -1;', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = queryRow('SELECT * FROM workspaces', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('queryOptionalRow', () => {\n it('handles single column', async () => {\n const row = await queryRow(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await queryOptionalRow('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n assert.isNotNull(row?.created_at);\n });\n\n it('handles parameters', async () => {\n const row = await queryOptionalRow(\n 'SELECT * FROM workspaces WHERE id = $1;',\n [1],\n WorkspaceSchema,\n );\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n });\n\n it('handles missing result', async () => {\n const row = await queryOptionalRow(\n 'SELECT * FROM workspaces WHERE id = -1;',\n WorkspaceSchema,\n );\n assert.isNull(row);\n });\n\n it('rejects with multiple rows', async () => {\n const rows = queryOptionalRow('SELECT * FROM workspaces', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('callRows', () => {\n it('handles single column', async () => {\n const rows = await callRows('test_sproc_one_column_ten_rows', z.object({ id: z.string() }));\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles parameters', async () => {\n const rows = await callRows('test_sproc_one_column', [10], z.object({ id: z.string() }));\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const rows = await callRows('test_sproc_two_columns', [20], SprocTwoColumnsSchema);\n assert.lengthOf(rows, 20);\n assert.equal(rows[0].id, '1');\n assert.equal(rows[0].negative, -1);\n assert.equal(rows[19].id, '20');\n assert.equal(rows[19].negative, -20);\n });\n });\n\n describe('callRow', () => {\n it('handles single column', async () => {\n const row = await callRow('test_sproc_one_column_one_row', z.object({ id: z.string() }));\n assert.equal(row.id, '1');\n });\n\n it('handles parameters', async () => {\n const row = await callRow('test_sproc_one_column', [1], z.object({ id: z.string() }));\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await callRow('test_sproc_two_columns', [1], SprocTwoColumnsSchema);\n assert.equal(row.id, '1');\n assert.equal(row.negative, -1);\n });\n\n it('rejects results with zero rows', async () => {\n const row = callRow('test_sproc_two_columns', [0], SprocTwoColumnsSchema);\n await expect(row).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = callRow('test_sproc_two_columns', [100], SprocTwoColumnsSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('callOptionalRow', () => {\n it('handles single column', async () => {\n const row = await callOptionalRow(\n 'test_sproc_one_column_one_row',\n z.object({ id: z.string() }),\n );\n assert.equal(row?.id, '1');\n });\n\n it('handles parameters', async () => {\n const row = await callOptionalRow('test_sproc_one_column', [1], z.object({ id: z.string() }));\n assert.equal(row?.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await callOptionalRow('test_sproc_two_columns', [1], SprocTwoColumnsSchema);\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n assert.equal(row?.negative, -1);\n });\n\n it('handles results with zero rows', async () => {\n const row = await callOptionalRow('test_sproc_two_columns', [0], SprocTwoColumnsSchema);\n assert.isNull(row);\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = callOptionalRow('test_sproc_two_columns', [100], SprocTwoColumnsSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('queryScalars', () => {\n it('returns all scalar values', async () => {\n const ids = await queryScalars(\n 'SELECT id FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n z.string(),\n );\n assert.lengthOf(ids, 10);\n assert.equal(ids[0], '1');\n assert.equal(ids[9], '10');\n });\n\n it('handles parameters', async () => {\n const ids = await queryScalars(\n 'SELECT id FROM workspaces WHERE id <= $1 ORDER BY id ASC;',\n [5],\n z.string(),\n );\n assert.lengthOf(ids, 5);\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryScalars('SELECT * FROM workspaces WHERE id <= 10;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryScalar', () => {\n it('returns a single scalar value', async () => {\n const id = await queryScalar('SELECT id FROM workspaces WHERE id = 1;', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await queryScalar('SELECT id FROM workspaces WHERE id = $1;', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const result = queryScalar('SELECT id FROM workspaces WHERE id = -1;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const result = queryScalar('SELECT id FROM workspaces;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryScalar('SELECT * FROM workspaces WHERE id = 1;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryOptionalScalar', () => {\n it('returns a scalar value when present', async () => {\n const id = await queryOptionalScalar('SELECT id FROM workspaces WHERE id = 1;', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await queryOptionalScalar(\n 'SELECT id FROM workspaces WHERE id = $1;',\n [1],\n z.string(),\n );\n assert.equal(id, '1');\n });\n\n it('returns null for zero rows', async () => {\n const id = await queryOptionalScalar('SELECT id FROM workspaces WHERE id = -1;', z.string());\n assert.isNull(id);\n });\n\n it('rejects results with multiple rows', async () => {\n const result = queryOptionalScalar('SELECT id FROM workspaces;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryOptionalScalar('SELECT * FROM workspaces WHERE id = 1;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callScalars', () => {\n it('returns all scalar values', async () => {\n const ids = await callScalars('test_sproc_one_column', [10], z.string());\n assert.lengthOf(ids, 10);\n assert.equal(ids[0], '1');\n });\n\n it('handles no parameters', async () => {\n const ids = await callScalars('test_sproc_one_column_ten_rows', z.string());\n assert.lengthOf(ids, 10);\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callScalars('test_sproc_two_columns', [10], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callScalar', () => {\n it('returns a single scalar value', async () => {\n const id = await callScalar('test_sproc_one_column_one_row', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await callScalar('test_sproc_one_column', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const result = callScalar('test_sproc_one_column', [0], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const result = callScalar('test_sproc_one_column', [100], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callScalar('test_sproc_two_columns', [1], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callOptionalScalar', () => {\n it('returns a scalar value when present', async () => {\n const id = await callOptionalScalar('test_sproc_one_column_one_row', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await callOptionalScalar('test_sproc_one_column', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('returns null for zero rows', async () => {\n const id = await callOptionalScalar('test_sproc_one_column', [0], z.string());\n assert.isNull(id);\n });\n\n it('rejects results with multiple rows', async () => {\n const result = callOptionalScalar('test_sproc_one_column', [100], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callOptionalScalar('test_sproc_two_columns', [1], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryCursor', () => {\n it('handles single column', async () => {\n const cursor = await queryCursor(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n const allRows: { id: string }[] = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.equal(allRows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n const allRows: z.infer<typeof WorkspaceSchema>[] = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.equal(allRows[0].id, '1');\n assert.isNotNull(allRows[0].created_at);\n });\n it('returns zero rows', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id = 10000;', z.unknown());\n const rowBatches = [];\n for await (const rows of cursor.iterate(10)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 0);\n });\n\n it('returns one row at a time', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id <= 2;', z.unknown());\n const rowBatches = [];\n for await (const rows of cursor.iterate(1)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 2);\n assert.lengthOf(rowBatches[0], 1);\n assert.lengthOf(rowBatches[1], 1);\n });\n\n it('returns all rows at once', async () => {\n const cursor = queryCursor('SELECT * FROM workspaces WHERE id <= 10;', z.unknown());\n const rowBatches = [];\n for await (const rows of (await cursor).iterate(10)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 1);\n assert.lengthOf(rowBatches[0], 10);\n });\n\n it('handles errors', async () => {\n const cursor = await queryCursor('NOT VALID SQL', z.unknown());\n\n async function readAllRows() {\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, Error);\n assert.match(maybeError.message, /syntax error/);\n assert.isDefined((maybeError as any).data);\n assert.equal((maybeError as any).data.sql, 'NOT VALID SQL');\n assert.deepEqual((maybeError as any).data.sqlParams, {});\n assert.isDefined((maybeError as any).data.sqlError);\n assert.equal((maybeError as any).data.sqlError.severity, 'ERROR');\n });\n });\n\n describe('queryCursor', () => {\n const WorkspaceSchema = z.object({\n id: z.string(),\n });\n\n const BadWorkspaceSchema = z.object({\n badProperty: z.string(),\n });\n\n describe('iterator', () => {\n it('validates with provided schema', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n WorkspaceSchema,\n );\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.lengthOf(allRows, 10);\n const workspace = allRows[0] as any;\n assert.equal(workspace.id, '1');\n assert.isUndefined(workspace.state);\n });\n\n it('throws error when validation fails', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n BadWorkspaceSchema,\n );\n\n async function readAllRows() {\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, ZodError);\n assert.lengthOf(maybeError.errors, 10);\n });\n });\n\n describe('stream', () => {\n it('validates with provided schema', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n WorkspaceSchema,\n );\n const stream = cursor.stream(1);\n const allRows = [];\n for await (const row of stream) {\n allRows.push(row);\n }\n\n assert.lengthOf(allRows, 10);\n });\n\n it('emits an error when validation fails', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces ORDER BY id ASC;',\n BadWorkspaceSchema,\n );\n const stream = cursor.stream(1);\n\n async function readAllRows() {\n const allRows = [];\n for await (const row of stream) {\n allRows.push(row);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, ZodError);\n assert.lengthOf(maybeError.errors, 1);\n });\n\n it('closes the cursor when the stream is closed', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces;', WorkspaceSchema);\n const stream = cursor.stream(1);\n\n const rows: any[] = [];\n const ac = new AbortController();\n const writable = new Writable({\n objectMode: true,\n write(chunk, _encoding, callback) {\n rows.push(chunk);\n\n // After receiving the first row, abort the stream. This lets us test\n // that the underlying cursor is closed. If it is *not* closed, this\n // `after` hook will fail with a timeout.\n ac.abort();\n callback();\n },\n });\n\n await expect(pipeline(stream, writable, { signal: ac.signal })).rejects.toThrow();\n assert.lengthOf(rows, 1);\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Writable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\n\nimport { afterAll, assert, beforeAll, describe, expect, it } from 'vitest';\nimport { ZodError, z } from 'zod';\n\nimport {\n callOptionalRow,\n callOptionalScalar,\n callRow,\n callRows,\n callScalar,\n callScalars,\n execute,\n queryCursor,\n queryOptionalRow,\n queryOptionalScalar,\n queryRow,\n queryRows,\n queryScalar,\n queryScalars,\n} from './default-pool.js';\nimport { makePostgresTestUtils } from './test-utils.js';\n\nconst postgresTestUtils = makePostgresTestUtils({\n database: 'prairielearn_postgres',\n});\n\nconst WorkspaceSchema = z.object({\n id: z.string(),\n created_at: z.date(),\n});\n\nconst SprocTwoColumnsSchema = z.object({\n id: z.string(),\n negative: z.number(),\n});\n\ndescribe('@prairielearn/postgres', function () {\n beforeAll(async () => {\n await postgresTestUtils.createDatabase();\n await execute(\n 'CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP);',\n );\n await execute('INSERT INTO workspaces (id) SELECT s FROM generate_series(1, 100) AS s');\n await execute(\n 'CREATE FUNCTION test_sproc_one_column(num_entries INT) RETURNS TABLE (id BIGINT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id FROM generate_series(1, num_entries) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_two_columns(num_entries INT) RETURNS TABLE (id BIGINT, negative INT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id, -s AS negative FROM generate_series(1, num_entries) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_one_column_ten_rows() RETURNS TABLE (id BIGINT) AS $$ BEGIN RETURN QUERY SELECT s::BIGINT AS id FROM generate_series(1, 10) AS s; END; $$ LANGUAGE plpgsql;',\n );\n await execute(\n 'CREATE FUNCTION test_sproc_one_column_one_row(OUT id BIGINT) AS $$ BEGIN id = 1; END; $$ LANGUAGE plpgsql;',\n );\n });\n\n afterAll(async () => {\n await postgresTestUtils.dropDatabase();\n });\n\n describe('paramsToArray', () => {\n it('enforces SQL must be a string', async () => {\n // @ts-expect-error SQL must be a string\n const rows = execute({ invalid: true }, {});\n await expect(rows).rejects.toThrow('SQL must be a string');\n });\n\n it('enforces params must be array or object', async () => {\n // @ts-expect-error params must be an array or object\n const rows = execute('SELECT 33;', 33);\n await expect(rows).rejects.toThrow('params must be array or object');\n });\n\n it('rejects missing parameters', async () => {\n const rows = execute('SELECT $missing;', {});\n await expect(rows).rejects.toThrow('Missing parameter');\n });\n\n it('rejects unused parameters in testing', async () => {\n const rows = execute('SELECT 33;', { unsed_parameter: true });\n await expect(rows).rejects.toThrow('Unused parameter');\n });\n });\n\n describe('queryRows', () => {\n it('handles single column', async () => {\n const rows = await queryRows(\n 'SELECT id FROM workspaces WHERE id <= 10;',\n z.object({ id: z.string() }),\n );\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const rows = await queryRows('SELECT * FROM workspaces WHERE id <= 10;', WorkspaceSchema);\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n assert.isNotNull(rows[0].created_at);\n });\n\n it('handles parameters', async () => {\n const rows = await queryRows(\n 'SELECT * FROM workspaces WHERE id <= $1;',\n [10],\n WorkspaceSchema,\n );\n assert.lengthOf(rows, 10);\n });\n });\n\n describe('queryRow', () => {\n it('handles single column', async () => {\n const row = await queryRow(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await queryRow('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n assert.equal(row.id, '1');\n assert.isNotNull(row.created_at);\n });\n\n it('handles parameters', async () => {\n const row = await queryRow('SELECT * FROM workspaces WHERE id = $1;', [1], WorkspaceSchema);\n assert.equal(row.id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const rows = queryRow('SELECT * FROM workspaces WHERE id = -1;', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = queryRow('SELECT * FROM workspaces', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('queryOptionalRow', () => {\n it('handles single column', async () => {\n const row = await queryRow(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await queryOptionalRow('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n assert.isNotNull(row?.created_at);\n });\n\n it('handles parameters', async () => {\n const row = await queryOptionalRow(\n 'SELECT * FROM workspaces WHERE id = $1;',\n [1],\n WorkspaceSchema,\n );\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n });\n\n it('handles missing result', async () => {\n const row = await queryOptionalRow(\n 'SELECT * FROM workspaces WHERE id = -1;',\n WorkspaceSchema,\n );\n assert.isNull(row);\n });\n\n it('rejects with multiple rows', async () => {\n const rows = queryOptionalRow('SELECT * FROM workspaces', WorkspaceSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('callRows', () => {\n it('handles single column', async () => {\n const rows = await callRows('test_sproc_one_column_ten_rows', z.object({ id: z.string() }));\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles parameters', async () => {\n const rows = await callRows('test_sproc_one_column', [10], z.object({ id: z.string() }));\n assert.lengthOf(rows, 10);\n assert.equal(rows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const rows = await callRows('test_sproc_two_columns', [20], SprocTwoColumnsSchema);\n assert.lengthOf(rows, 20);\n assert.equal(rows[0].id, '1');\n assert.equal(rows[0].negative, -1);\n assert.equal(rows[19].id, '20');\n assert.equal(rows[19].negative, -20);\n });\n });\n\n describe('callRow', () => {\n it('handles single column', async () => {\n const row = await callRow('test_sproc_one_column_one_row', z.object({ id: z.string() }));\n assert.equal(row.id, '1');\n });\n\n it('handles parameters', async () => {\n const row = await callRow('test_sproc_one_column', [1], z.object({ id: z.string() }));\n assert.equal(row.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await callRow('test_sproc_two_columns', [1], SprocTwoColumnsSchema);\n assert.equal(row.id, '1');\n assert.equal(row.negative, -1);\n });\n\n it('rejects results with zero rows', async () => {\n const row = callRow('test_sproc_two_columns', [0], SprocTwoColumnsSchema);\n await expect(row).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = callRow('test_sproc_two_columns', [100], SprocTwoColumnsSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('callOptionalRow', () => {\n it('handles single column', async () => {\n const row = await callOptionalRow(\n 'test_sproc_one_column_one_row',\n z.object({ id: z.string() }),\n );\n assert.equal(row?.id, '1');\n });\n\n it('handles parameters', async () => {\n const row = await callOptionalRow('test_sproc_one_column', [1], z.object({ id: z.string() }));\n assert.equal(row?.id, '1');\n });\n\n it('handles multiple columns', async () => {\n const row = await callOptionalRow('test_sproc_two_columns', [1], SprocTwoColumnsSchema);\n assert.isNotNull(row);\n assert.equal(row?.id, '1');\n assert.equal(row?.negative, -1);\n });\n\n it('handles results with zero rows', async () => {\n const row = await callOptionalRow('test_sproc_two_columns', [0], SprocTwoColumnsSchema);\n assert.isNull(row);\n });\n\n it('rejects results with multiple rows', async () => {\n const rows = callOptionalRow('test_sproc_two_columns', [100], SprocTwoColumnsSchema);\n await expect(rows).rejects.toThrow('Incorrect rowCount: 100');\n });\n });\n\n describe('queryScalars', () => {\n it('returns all scalar values', async () => {\n const ids = await queryScalars(\n 'SELECT id FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n z.string(),\n );\n assert.lengthOf(ids, 10);\n assert.equal(ids[0], '1');\n assert.equal(ids[9], '10');\n });\n\n it('handles parameters', async () => {\n const ids = await queryScalars(\n 'SELECT id FROM workspaces WHERE id <= $1 ORDER BY id ASC;',\n [5],\n z.string(),\n );\n assert.lengthOf(ids, 5);\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryScalars('SELECT * FROM workspaces WHERE id <= 10;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryScalar', () => {\n it('returns a single scalar value', async () => {\n const id = await queryScalar('SELECT id FROM workspaces WHERE id = 1;', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await queryScalar('SELECT id FROM workspaces WHERE id = $1;', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const result = queryScalar('SELECT id FROM workspaces WHERE id = -1;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const result = queryScalar('SELECT id FROM workspaces;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryScalar('SELECT * FROM workspaces WHERE id = 1;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryOptionalScalar', () => {\n it('returns a scalar value when present', async () => {\n const id = await queryOptionalScalar('SELECT id FROM workspaces WHERE id = 1;', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await queryOptionalScalar(\n 'SELECT id FROM workspaces WHERE id = $1;',\n [1],\n z.string(),\n );\n assert.equal(id, '1');\n });\n\n it('returns null for zero rows', async () => {\n const id = await queryOptionalScalar('SELECT id FROM workspaces WHERE id = -1;', z.string());\n assert.isNull(id);\n });\n\n it('rejects results with multiple rows', async () => {\n const result = queryOptionalScalar('SELECT id FROM workspaces;', z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column queries', async () => {\n const result = queryOptionalScalar('SELECT * FROM workspaces WHERE id = 1;', z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callScalars', () => {\n it('returns all scalar values', async () => {\n const ids = await callScalars('test_sproc_one_column', [10], z.string());\n assert.lengthOf(ids, 10);\n assert.equal(ids[0], '1');\n });\n\n it('handles no parameters', async () => {\n const ids = await callScalars('test_sproc_one_column_ten_rows', z.string());\n assert.lengthOf(ids, 10);\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callScalars('test_sproc_two_columns', [10], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callScalar', () => {\n it('returns a single scalar value', async () => {\n const id = await callScalar('test_sproc_one_column_one_row', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await callScalar('test_sproc_one_column', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('rejects results with zero rows', async () => {\n const result = callScalar('test_sproc_one_column', [0], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 0');\n });\n\n it('rejects results with multiple rows', async () => {\n const result = callScalar('test_sproc_one_column', [100], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callScalar('test_sproc_two_columns', [1], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('callOptionalScalar', () => {\n it('returns a scalar value when present', async () => {\n const id = await callOptionalScalar('test_sproc_one_column_one_row', z.string());\n assert.equal(id, '1');\n });\n\n it('handles parameters', async () => {\n const id = await callOptionalScalar('test_sproc_one_column', [1], z.string());\n assert.equal(id, '1');\n });\n\n it('returns null for zero rows', async () => {\n const id = await callOptionalScalar('test_sproc_one_column', [0], z.string());\n assert.isNull(id);\n });\n\n it('rejects results with multiple rows', async () => {\n const result = callOptionalScalar('test_sproc_one_column', [100], z.string());\n await expect(result).rejects.toThrow('Incorrect rowCount: 100');\n });\n\n it('rejects multi-column sprocs', async () => {\n const result = callOptionalScalar('test_sproc_two_columns', [1], z.string());\n await expect(result).rejects.toThrow('Expected exactly one column');\n });\n });\n\n describe('queryCursor', () => {\n it('handles single column', async () => {\n const cursor = await queryCursor(\n 'SELECT id FROM workspaces WHERE id = 1;',\n z.object({ id: z.string() }),\n );\n const allRows: { id: string }[] = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.equal(allRows[0].id, '1');\n });\n\n it('handles multiple columns', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);\n const allRows: z.infer<typeof WorkspaceSchema>[] = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.equal(allRows[0].id, '1');\n assert.isNotNull(allRows[0].created_at);\n });\n it('returns zero rows', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id = 10000;', z.unknown());\n const rowBatches = [];\n for await (const rows of cursor.iterate(10)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 0);\n });\n\n it('returns one row at a time', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces WHERE id <= 2;', z.unknown());\n const rowBatches = [];\n for await (const rows of cursor.iterate(1)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 2);\n assert.lengthOf(rowBatches[0], 1);\n assert.lengthOf(rowBatches[1], 1);\n });\n\n it('returns all rows at once', async () => {\n const cursor = queryCursor('SELECT * FROM workspaces WHERE id <= 10;', z.unknown());\n const rowBatches = [];\n for await (const rows of (await cursor).iterate(10)) {\n rowBatches.push(rows);\n }\n assert.lengthOf(rowBatches, 1);\n assert.lengthOf(rowBatches[0], 10);\n });\n\n it('handles errors', async () => {\n const cursor = await queryCursor('NOT VALID SQL', z.unknown());\n\n async function readAllRows() {\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, Error);\n assert.match(maybeError.message, /syntax error/);\n assert.isDefined((maybeError as any).data);\n assert.equal((maybeError as any).data.sql, 'NOT VALID SQL');\n assert.deepEqual((maybeError as any).data.sqlParams, {});\n assert.isDefined((maybeError as any).data.sqlError);\n assert.equal((maybeError as any).data.sqlError.severity, 'ERROR');\n });\n });\n\n describe('queryCursor', () => {\n const WorkspaceSchema = z.object({\n id: z.string(),\n });\n\n const BadWorkspaceSchema = z.object({\n badProperty: z.string(),\n });\n\n describe('iterator', () => {\n it('validates with provided schema', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n WorkspaceSchema,\n );\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n assert.lengthOf(allRows, 10);\n const workspace = allRows[0] as any;\n assert.equal(workspace.id, '1');\n assert.isUndefined(workspace.state);\n });\n\n it('throws error when validation fails', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n BadWorkspaceSchema,\n );\n\n async function readAllRows() {\n const allRows = [];\n for await (const rows of cursor.iterate(10)) {\n allRows.push(...rows);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, ZodError);\n assert.lengthOf(maybeError.issues, 10);\n });\n });\n\n describe('stream', () => {\n it('validates with provided schema', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;',\n WorkspaceSchema,\n );\n const stream = cursor.stream(1);\n const allRows = [];\n for await (const row of stream) {\n allRows.push(row);\n }\n\n assert.lengthOf(allRows, 10);\n });\n\n it('emits an error when validation fails', async () => {\n const cursor = await queryCursor(\n 'SELECT * FROM workspaces ORDER BY id ASC;',\n BadWorkspaceSchema,\n );\n const stream = cursor.stream(1);\n\n async function readAllRows() {\n const allRows = [];\n for await (const row of stream) {\n allRows.push(row);\n }\n return allRows;\n }\n\n const maybeError = await readAllRows().catch((err) => err);\n assert.instanceOf(maybeError, ZodError);\n assert.lengthOf(maybeError.issues, 1);\n });\n\n it('closes the cursor when the stream is closed', async () => {\n const cursor = await queryCursor('SELECT * FROM workspaces;', WorkspaceSchema);\n const stream = cursor.stream(1);\n\n const rows: any[] = [];\n const ac = new AbortController();\n const writable = new Writable({\n objectMode: true,\n write(chunk, _encoding, callback) {\n rows.push(chunk);\n\n // After receiving the first row, abort the stream. This lets us test\n // that the underlying cursor is closed. If it is *not* closed, this\n // `after` hook will fail with a timeout.\n ac.abort();\n callback();\n },\n });\n\n await expect(pipeline(stream, writable, { signal: ac.signal })).rejects.toThrow();\n assert.lengthOf(rows, 1);\n });\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/postgres",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,28 +11,28 @@
|
|
|
11
11
|
"node": ">=24.0.0"
|
|
12
12
|
},
|
|
13
13
|
"main": "./dist/index.js",
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsgo",
|
|
16
|
-
"dev": "tsgo --watch --preserveWatchOutput",
|
|
17
|
-
"test": "vitest run --coverage"
|
|
18
|
-
},
|
|
19
14
|
"dependencies": {
|
|
20
15
|
"debug": "^4.4.3",
|
|
21
|
-
"es-toolkit": "^1.
|
|
16
|
+
"es-toolkit": "^1.47.0",
|
|
22
17
|
"multipipe": "^4.0.0",
|
|
23
|
-
"pg": "^8.
|
|
24
|
-
"pg-cursor": "^2.
|
|
25
|
-
"zod": "^3.
|
|
18
|
+
"pg": "^8.21.0",
|
|
19
|
+
"pg-cursor": "^2.20.0",
|
|
20
|
+
"zod": "^4.3.0"
|
|
26
21
|
},
|
|
27
22
|
"devDependencies": {
|
|
28
|
-
"@prairielearn/tsconfig": "^2.1.0",
|
|
29
23
|
"@types/debug": "^4.1.13",
|
|
30
24
|
"@types/multipipe": "^3.0.5",
|
|
31
|
-
"@types/node": "^24.12.
|
|
25
|
+
"@types/node": "^24.12.4",
|
|
32
26
|
"@types/pg": "^8.20.0",
|
|
33
27
|
"@types/pg-cursor": "^2.7.2",
|
|
34
28
|
"@typescript/native-preview": "beta",
|
|
35
|
-
"@vitest/coverage-v8": "^4.1.
|
|
36
|
-
"vitest": "^4.1.
|
|
29
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
30
|
+
"vitest": "^4.1.7",
|
|
31
|
+
"@prairielearn/tsconfig": "^2.1.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsgo",
|
|
35
|
+
"dev": "tsgo --watch --preserveWatchOutput",
|
|
36
|
+
"test": "vitest run --coverage"
|
|
37
37
|
}
|
|
38
|
-
}
|
|
38
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { type PoolClient } from 'pg';
|
|
2
2
|
|
|
3
3
|
export { loadSql, loadSqlEquiv } from './loader.js';
|
|
4
|
-
export {
|
|
4
|
+
export { PostgresPool, type PostgresPoolConfig } from './pool.js';
|
|
5
5
|
|
|
6
6
|
export * from './default-pool.js';
|
|
7
7
|
|
package/src/pool.test.ts
CHANGED
|
@@ -537,7 +537,7 @@ describe('@prairielearn/postgres', function () {
|
|
|
537
537
|
|
|
538
538
|
const maybeError = await readAllRows().catch((err) => err);
|
|
539
539
|
assert.instanceOf(maybeError, ZodError);
|
|
540
|
-
assert.lengthOf(maybeError.
|
|
540
|
+
assert.lengthOf(maybeError.issues, 10);
|
|
541
541
|
});
|
|
542
542
|
});
|
|
543
543
|
|
|
@@ -573,7 +573,7 @@ describe('@prairielearn/postgres', function () {
|
|
|
573
573
|
|
|
574
574
|
const maybeError = await readAllRows().catch((err) => err);
|
|
575
575
|
assert.instanceOf(maybeError, ZodError);
|
|
576
|
-
assert.lengthOf(maybeError.
|
|
576
|
+
assert.lengthOf(maybeError.issues, 1);
|
|
577
577
|
});
|
|
578
578
|
|
|
579
579
|
it('closes the cursor when the stream is closed', async () => {
|
package/src/pool.ts
CHANGED
|
@@ -10,23 +10,6 @@ import { z } from 'zod';
|
|
|
10
10
|
|
|
11
11
|
export type QueryParams = Record<string, any> | any[];
|
|
12
12
|
|
|
13
|
-
/**
|
|
14
|
-
* Type constraint for row schemas accepted by query functions.
|
|
15
|
-
* Accepts `z.object(...)`, unions/intersections/discriminated unions of objects,
|
|
16
|
-
* transforms/refinements of any of those, branded variants, and `z.unknown()`
|
|
17
|
-
* as an escape hatch.
|
|
18
|
-
*/
|
|
19
|
-
type AnyObjectLikeSchema =
|
|
20
|
-
| z.AnyZodObject
|
|
21
|
-
| z.ZodEffects<AnyObjectLikeSchema, any, any>
|
|
22
|
-
| z.ZodIntersection<AnyObjectLikeSchema, AnyObjectLikeSchema>
|
|
23
|
-
| z.ZodUnion<Readonly<[AnyObjectLikeSchema, ...AnyObjectLikeSchema[]]>>
|
|
24
|
-
| z.ZodDiscriminatedUnion<string, z.AnyZodObject[]>;
|
|
25
|
-
export type AnyRowSchema =
|
|
26
|
-
| AnyObjectLikeSchema
|
|
27
|
-
| z.ZodBranded<AnyObjectLikeSchema, any>
|
|
28
|
-
| z.ZodUnknown;
|
|
29
|
-
|
|
30
13
|
export interface CursorIterator<T> {
|
|
31
14
|
iterate: (batchSize: number) => AsyncGenerator<T[]>;
|
|
32
15
|
stream: (batchSize: number) => NodeJS.ReadWriteStream;
|
|
@@ -652,8 +635,8 @@ export class PostgresPool {
|
|
|
652
635
|
return result;
|
|
653
636
|
}
|
|
654
637
|
|
|
655
|
-
async queryRows<Model extends
|
|
656
|
-
async queryRows<Model extends
|
|
638
|
+
async queryRows<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>[]>;
|
|
639
|
+
async queryRows<Model extends z.ZodType>(
|
|
657
640
|
sql: string,
|
|
658
641
|
params: QueryParams,
|
|
659
642
|
model: Model,
|
|
@@ -662,7 +645,7 @@ export class PostgresPool {
|
|
|
662
645
|
* Executes a query with the specified parameters. Returns an array of rows
|
|
663
646
|
* that conform to the given Zod schema.
|
|
664
647
|
*/
|
|
665
|
-
async queryRows<Model extends
|
|
648
|
+
async queryRows<Model extends z.ZodType>(
|
|
666
649
|
sql: string,
|
|
667
650
|
paramsOrSchema: QueryParams | Model,
|
|
668
651
|
maybeModel?: Model,
|
|
@@ -673,8 +656,8 @@ export class PostgresPool {
|
|
|
673
656
|
return z.array(model).parse(results.rows);
|
|
674
657
|
}
|
|
675
658
|
|
|
676
|
-
async queryRow<Model extends
|
|
677
|
-
async queryRow<Model extends
|
|
659
|
+
async queryRow<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>>;
|
|
660
|
+
async queryRow<Model extends z.ZodType>(
|
|
678
661
|
sql: string,
|
|
679
662
|
params: QueryParams,
|
|
680
663
|
model: Model,
|
|
@@ -682,7 +665,7 @@ export class PostgresPool {
|
|
|
682
665
|
/**
|
|
683
666
|
* Executes a query with the specified parameters. Returns exactly one row that conforms to the given Zod schema.
|
|
684
667
|
*/
|
|
685
|
-
async queryRow<Model extends
|
|
668
|
+
async queryRow<Model extends z.ZodType>(
|
|
686
669
|
sql: string,
|
|
687
670
|
paramsOrSchema: QueryParams | Model,
|
|
688
671
|
maybeModel?: Model,
|
|
@@ -693,11 +676,11 @@ export class PostgresPool {
|
|
|
693
676
|
return model.parse(results.rows[0]);
|
|
694
677
|
}
|
|
695
678
|
|
|
696
|
-
async queryOptionalRow<Model extends
|
|
679
|
+
async queryOptionalRow<Model extends z.ZodType>(
|
|
697
680
|
sql: string,
|
|
698
681
|
model: Model,
|
|
699
682
|
): Promise<z.infer<Model> | null>;
|
|
700
|
-
async queryOptionalRow<Model extends
|
|
683
|
+
async queryOptionalRow<Model extends z.ZodType>(
|
|
701
684
|
sql: string,
|
|
702
685
|
params: QueryParams,
|
|
703
686
|
model: Model,
|
|
@@ -706,7 +689,7 @@ export class PostgresPool {
|
|
|
706
689
|
* Executes a query with the specified parameters. Returns either null or a
|
|
707
690
|
* single row that conforms to the given Zod schema, and errors otherwise.
|
|
708
691
|
*/
|
|
709
|
-
async queryOptionalRow<Model extends
|
|
692
|
+
async queryOptionalRow<Model extends z.ZodType>(
|
|
710
693
|
sql: string,
|
|
711
694
|
paramsOrSchema: QueryParams | Model,
|
|
712
695
|
maybeModel?: Model,
|
|
@@ -720,8 +703,8 @@ export class PostgresPool {
|
|
|
720
703
|
return model.parse(results.rows[0]);
|
|
721
704
|
}
|
|
722
705
|
|
|
723
|
-
async callRows<Model extends
|
|
724
|
-
async callRows<Model extends
|
|
706
|
+
async callRows<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>[]>;
|
|
707
|
+
async callRows<Model extends z.ZodType>(
|
|
725
708
|
sql: string,
|
|
726
709
|
params: any[],
|
|
727
710
|
model: Model,
|
|
@@ -730,7 +713,7 @@ export class PostgresPool {
|
|
|
730
713
|
* Calls the given sproc with the specified parameters.
|
|
731
714
|
* Errors if the sproc does not return anything.
|
|
732
715
|
*/
|
|
733
|
-
async callRows<Model extends
|
|
716
|
+
async callRows<Model extends z.ZodType>(
|
|
734
717
|
sql: string,
|
|
735
718
|
paramsOrSchema: any[] | Model,
|
|
736
719
|
maybeModel?: Model,
|
|
@@ -741,8 +724,8 @@ export class PostgresPool {
|
|
|
741
724
|
return z.array(model).parse(results.rows);
|
|
742
725
|
}
|
|
743
726
|
|
|
744
|
-
async callRow<Model extends
|
|
745
|
-
async callRow<Model extends
|
|
727
|
+
async callRow<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>>;
|
|
728
|
+
async callRow<Model extends z.ZodType>(
|
|
746
729
|
sql: string,
|
|
747
730
|
params: any[],
|
|
748
731
|
model: Model,
|
|
@@ -751,7 +734,7 @@ export class PostgresPool {
|
|
|
751
734
|
* Calls the given sproc with the specified parameters.
|
|
752
735
|
* Returns exactly one row from the sproc that conforms to the given Zod schema.
|
|
753
736
|
*/
|
|
754
|
-
async callRow<Model extends
|
|
737
|
+
async callRow<Model extends z.ZodType>(
|
|
755
738
|
sql: string,
|
|
756
739
|
paramsOrSchema: any[] | Model,
|
|
757
740
|
maybeModel?: Model,
|
|
@@ -762,11 +745,11 @@ export class PostgresPool {
|
|
|
762
745
|
return model.parse(results.rows[0]);
|
|
763
746
|
}
|
|
764
747
|
|
|
765
|
-
async callOptionalRow<Model extends
|
|
748
|
+
async callOptionalRow<Model extends z.ZodType>(
|
|
766
749
|
sql: string,
|
|
767
750
|
model: Model,
|
|
768
751
|
): Promise<z.infer<Model> | null>;
|
|
769
|
-
async callOptionalRow<Model extends
|
|
752
|
+
async callOptionalRow<Model extends z.ZodType>(
|
|
770
753
|
sql: string,
|
|
771
754
|
params: any[],
|
|
772
755
|
model: Model,
|
|
@@ -775,7 +758,7 @@ export class PostgresPool {
|
|
|
775
758
|
* Calls the given sproc with the specified parameters. Returns either null
|
|
776
759
|
* or a single row that conforms to the given Zod schema.
|
|
777
760
|
*/
|
|
778
|
-
async callOptionalRow<Model extends
|
|
761
|
+
async callOptionalRow<Model extends z.ZodType>(
|
|
779
762
|
sql: string,
|
|
780
763
|
paramsOrSchema: any[] | Model,
|
|
781
764
|
maybeModel?: Model,
|
|
@@ -789,11 +772,8 @@ export class PostgresPool {
|
|
|
789
772
|
return model.parse(results.rows[0]);
|
|
790
773
|
}
|
|
791
774
|
|
|
792
|
-
async queryScalars<Model extends z.
|
|
793
|
-
|
|
794
|
-
model: Model,
|
|
795
|
-
): Promise<z.infer<Model>[]>;
|
|
796
|
-
async queryScalars<Model extends z.ZodTypeAny>(
|
|
775
|
+
async queryScalars<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>[]>;
|
|
776
|
+
async queryScalars<Model extends z.ZodType>(
|
|
797
777
|
sql: string,
|
|
798
778
|
params: QueryParams,
|
|
799
779
|
model: Model,
|
|
@@ -802,7 +782,7 @@ export class PostgresPool {
|
|
|
802
782
|
* Executes a query and returns all values from a single column, validated
|
|
803
783
|
* against the given Zod schema. Errors if the query returns more than one column.
|
|
804
784
|
*/
|
|
805
|
-
async queryScalars<Model extends z.
|
|
785
|
+
async queryScalars<Model extends z.ZodType>(
|
|
806
786
|
sql: string,
|
|
807
787
|
paramsOrSchema: QueryParams | Model,
|
|
808
788
|
maybeModel?: Model,
|
|
@@ -814,8 +794,8 @@ export class PostgresPool {
|
|
|
814
794
|
return z.array(model).parse(results.rows.map((row) => row[columnName]));
|
|
815
795
|
}
|
|
816
796
|
|
|
817
|
-
async queryScalar<Model extends z.
|
|
818
|
-
async queryScalar<Model extends z.
|
|
797
|
+
async queryScalar<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>>;
|
|
798
|
+
async queryScalar<Model extends z.ZodType>(
|
|
819
799
|
sql: string,
|
|
820
800
|
params: QueryParams,
|
|
821
801
|
model: Model,
|
|
@@ -825,7 +805,7 @@ export class PostgresPool {
|
|
|
825
805
|
* against the given Zod schema. Errors if the query does not return exactly
|
|
826
806
|
* one row or returns more than one column.
|
|
827
807
|
*/
|
|
828
|
-
async queryScalar<Model extends z.
|
|
808
|
+
async queryScalar<Model extends z.ZodType>(
|
|
829
809
|
sql: string,
|
|
830
810
|
paramsOrSchema: QueryParams | Model,
|
|
831
811
|
maybeModel?: Model,
|
|
@@ -837,11 +817,11 @@ export class PostgresPool {
|
|
|
837
817
|
return model.parse(results.rows[0][columnName]);
|
|
838
818
|
}
|
|
839
819
|
|
|
840
|
-
async queryOptionalScalar<Model extends z.
|
|
820
|
+
async queryOptionalScalar<Model extends z.ZodType>(
|
|
841
821
|
sql: string,
|
|
842
822
|
model: Model,
|
|
843
823
|
): Promise<z.infer<Model> | null>;
|
|
844
|
-
async queryOptionalScalar<Model extends z.
|
|
824
|
+
async queryOptionalScalar<Model extends z.ZodType>(
|
|
845
825
|
sql: string,
|
|
846
826
|
params: QueryParams,
|
|
847
827
|
model: Model,
|
|
@@ -851,7 +831,7 @@ export class PostgresPool {
|
|
|
851
831
|
* if no rows are returned. Validated against the given Zod schema. Errors if
|
|
852
832
|
* the query returns more than one row or more than one column.
|
|
853
833
|
*/
|
|
854
|
-
async queryOptionalScalar<Model extends z.
|
|
834
|
+
async queryOptionalScalar<Model extends z.ZodType>(
|
|
855
835
|
sql: string,
|
|
856
836
|
paramsOrSchema: QueryParams | Model,
|
|
857
837
|
maybeModel?: Model,
|
|
@@ -866,11 +846,8 @@ export class PostgresPool {
|
|
|
866
846
|
return model.parse(results.rows[0][columnName]);
|
|
867
847
|
}
|
|
868
848
|
|
|
869
|
-
async callScalars<Model extends z.
|
|
870
|
-
|
|
871
|
-
model: Model,
|
|
872
|
-
): Promise<z.infer<Model>[]>;
|
|
873
|
-
async callScalars<Model extends z.ZodTypeAny>(
|
|
849
|
+
async callScalars<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>[]>;
|
|
850
|
+
async callScalars<Model extends z.ZodType>(
|
|
874
851
|
sql: string,
|
|
875
852
|
params: any[],
|
|
876
853
|
model: Model,
|
|
@@ -879,7 +856,7 @@ export class PostgresPool {
|
|
|
879
856
|
* Calls the given sproc and returns all values from a single column, validated
|
|
880
857
|
* against the given Zod schema. Errors if the sproc returns more than one column.
|
|
881
858
|
*/
|
|
882
|
-
async callScalars<Model extends z.
|
|
859
|
+
async callScalars<Model extends z.ZodType>(
|
|
883
860
|
sql: string,
|
|
884
861
|
paramsOrSchema: any[] | Model,
|
|
885
862
|
maybeModel?: Model,
|
|
@@ -891,8 +868,8 @@ export class PostgresPool {
|
|
|
891
868
|
return z.array(model).parse(results.rows.map((row) => row[columnName]));
|
|
892
869
|
}
|
|
893
870
|
|
|
894
|
-
async callScalar<Model extends z.
|
|
895
|
-
async callScalar<Model extends z.
|
|
871
|
+
async callScalar<Model extends z.ZodType>(sql: string, model: Model): Promise<z.infer<Model>>;
|
|
872
|
+
async callScalar<Model extends z.ZodType>(
|
|
896
873
|
sql: string,
|
|
897
874
|
params: any[],
|
|
898
875
|
model: Model,
|
|
@@ -902,7 +879,7 @@ export class PostgresPool {
|
|
|
902
879
|
* against the given Zod schema. Errors if the sproc does not return exactly
|
|
903
880
|
* one row or returns more than one column.
|
|
904
881
|
*/
|
|
905
|
-
async callScalar<Model extends z.
|
|
882
|
+
async callScalar<Model extends z.ZodType>(
|
|
906
883
|
sql: string,
|
|
907
884
|
paramsOrSchema: any[] | Model,
|
|
908
885
|
maybeModel?: Model,
|
|
@@ -914,11 +891,11 @@ export class PostgresPool {
|
|
|
914
891
|
return model.parse(results.rows[0][columnName]);
|
|
915
892
|
}
|
|
916
893
|
|
|
917
|
-
async callOptionalScalar<Model extends z.
|
|
894
|
+
async callOptionalScalar<Model extends z.ZodType>(
|
|
918
895
|
sql: string,
|
|
919
896
|
model: Model,
|
|
920
897
|
): Promise<z.infer<Model> | null>;
|
|
921
|
-
async callOptionalScalar<Model extends z.
|
|
898
|
+
async callOptionalScalar<Model extends z.ZodType>(
|
|
922
899
|
sql: string,
|
|
923
900
|
params: any[],
|
|
924
901
|
model: Model,
|
|
@@ -928,7 +905,7 @@ export class PostgresPool {
|
|
|
928
905
|
* null if no rows are returned. Validated against the given Zod schema.
|
|
929
906
|
* Errors if the sproc returns more than one row or more than one column.
|
|
930
907
|
*/
|
|
931
|
-
async callOptionalScalar<Model extends z.
|
|
908
|
+
async callOptionalScalar<Model extends z.ZodType>(
|
|
932
909
|
sql: string,
|
|
933
910
|
paramsOrSchema: any[] | Model,
|
|
934
911
|
maybeModel?: Model,
|
|
@@ -981,12 +958,12 @@ export class PostgresPool {
|
|
|
981
958
|
return client.query(new Cursor(processedSql, paramsArray));
|
|
982
959
|
}
|
|
983
960
|
|
|
984
|
-
async queryCursor<Model extends
|
|
961
|
+
async queryCursor<Model extends z.ZodType>(
|
|
985
962
|
sql: string,
|
|
986
963
|
model: Model,
|
|
987
964
|
): Promise<CursorIterator<z.infer<Model>>>;
|
|
988
965
|
|
|
989
|
-
async queryCursor<Model extends
|
|
966
|
+
async queryCursor<Model extends z.ZodType>(
|
|
990
967
|
sql: string,
|
|
991
968
|
params: QueryParams,
|
|
992
969
|
model: Model,
|
|
@@ -997,7 +974,7 @@ export class PostgresPool {
|
|
|
997
974
|
* results of the query in batches, which is useful for large result sets.
|
|
998
975
|
* Each row will be parsed by the given Zod schema.
|
|
999
976
|
*/
|
|
1000
|
-
async queryCursor<Model extends
|
|
977
|
+
async queryCursor<Model extends z.ZodType>(
|
|
1001
978
|
sql: string,
|
|
1002
979
|
paramsOrSchema: Model | QueryParams,
|
|
1003
980
|
maybeModel?: Model,
|
|
@@ -1007,7 +984,7 @@ export class PostgresPool {
|
|
|
1007
984
|
return this.queryCursorInternal(sql, params, model);
|
|
1008
985
|
}
|
|
1009
986
|
|
|
1010
|
-
private async queryCursorInternal<Model extends
|
|
987
|
+
private async queryCursorInternal<Model extends z.ZodType>(
|
|
1011
988
|
sql: string,
|
|
1012
989
|
params: QueryParams,
|
|
1013
990
|
model?: Model,
|