@prairielearn/postgres 1.6.0 → 1.7.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/CHANGELOG.md +12 -0
- package/dist/default-pool.d.ts +12 -0
- package/dist/default-pool.js +5 -2
- package/dist/default-pool.js.map +1 -1
- package/dist/loader.js +1 -1
- package/dist/loader.js.map +1 -1
- package/dist/pool.d.ts +6 -0
- package/dist/pool.js +67 -12
- package/dist/pool.js.map +1 -1
- package/dist/pool.test.js +142 -57
- package/dist/pool.test.js.map +1 -1
- package/package.json +11 -6
- package/src/default-pool.ts +3 -0
- package/src/loader.ts +1 -1
- package/src/pool.test.ts +201 -75
- package/src/pool.ts +100 -12
- package/tsconfig.json +1 -1
package/dist/pool.test.js
CHANGED
|
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const chai_1 = __importDefault(require("chai"));
|
|
7
7
|
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
8
|
+
const node_stream_1 = require("node:stream");
|
|
9
|
+
const promises_1 = require("node:stream/promises");
|
|
8
10
|
const zod_1 = require("zod");
|
|
9
11
|
const default_pool_1 = require("./default-pool");
|
|
10
12
|
const test_utils_1 = require("./test-utils");
|
|
@@ -13,22 +15,88 @@ const { assert } = chai_1.default;
|
|
|
13
15
|
const postgresTestUtils = (0, test_utils_1.makePostgresTestUtils)({
|
|
14
16
|
database: 'prairielearn_postgres',
|
|
15
17
|
});
|
|
18
|
+
const WorkspaceSchema = zod_1.z.object({
|
|
19
|
+
id: zod_1.z.string(),
|
|
20
|
+
created_at: zod_1.z.date(),
|
|
21
|
+
});
|
|
16
22
|
describe('@prairielearn/postgres', function () {
|
|
17
23
|
before(async () => {
|
|
18
24
|
await postgresTestUtils.createDatabase();
|
|
19
|
-
await (0, default_pool_1.queryAsync)('CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY,
|
|
20
|
-
await (0, default_pool_1.queryAsync)(
|
|
21
|
-
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (2, 'stopped');", {});
|
|
22
|
-
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (3, 'launching');", {});
|
|
23
|
-
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (4, 'running');", {});
|
|
25
|
+
await (0, default_pool_1.queryAsync)('CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP);', {});
|
|
26
|
+
await (0, default_pool_1.queryAsync)('INSERT INTO workspaces (id) SELECT s FROM generate_series(1, 100) AS s', {});
|
|
24
27
|
});
|
|
25
28
|
after(async () => {
|
|
26
29
|
await postgresTestUtils.dropDatabase();
|
|
27
30
|
});
|
|
31
|
+
describe('queryRows', () => {
|
|
32
|
+
it('handles single column', async () => {
|
|
33
|
+
const rows = await (0, default_pool_1.queryRows)('SELECT id FROM workspaces WHERE id <= 10;', zod_1.z.string());
|
|
34
|
+
assert.lengthOf(rows, 10);
|
|
35
|
+
assert.equal(rows[0], '1');
|
|
36
|
+
});
|
|
37
|
+
it('handles multiple columns', async () => {
|
|
38
|
+
const rows = await (0, default_pool_1.queryRows)('SELECT * FROM workspaces WHERE id <= 10;', WorkspaceSchema);
|
|
39
|
+
assert.lengthOf(rows, 10);
|
|
40
|
+
assert.equal(rows[0].id, '1');
|
|
41
|
+
assert.isNotNull(rows[0].created_at);
|
|
42
|
+
});
|
|
43
|
+
it('handles parameters', async () => {
|
|
44
|
+
const rows = await (0, default_pool_1.queryRows)('SELECT * FROM workspaces WHERE id <= $1;', [10], WorkspaceSchema);
|
|
45
|
+
assert.lengthOf(rows, 10);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('queryRow', () => {
|
|
49
|
+
it('handles single column', async () => {
|
|
50
|
+
const row = await (0, default_pool_1.queryRow)('SELECT id FROM workspaces WHERE id = 1;', zod_1.z.string());
|
|
51
|
+
assert.equal(row, '1');
|
|
52
|
+
});
|
|
53
|
+
it('handles multiple columns', async () => {
|
|
54
|
+
const row = await (0, default_pool_1.queryRow)('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);
|
|
55
|
+
assert.equal(row.id, '1');
|
|
56
|
+
assert.isNotNull(row.created_at);
|
|
57
|
+
});
|
|
58
|
+
it('handles parameters', async () => {
|
|
59
|
+
const row = await (0, default_pool_1.queryRow)('SELECT * FROM workspaces WHERE id = $1;', [1], WorkspaceSchema);
|
|
60
|
+
assert.equal(row.id, '1');
|
|
61
|
+
});
|
|
62
|
+
it('rejects results with zero rows', async () => {
|
|
63
|
+
const rows = (0, default_pool_1.queryRow)('SELECT * FROM workspaces WHERE id = -1;', WorkspaceSchema);
|
|
64
|
+
await assert.isRejected(rows, 'Incorrect rowCount: 0');
|
|
65
|
+
});
|
|
66
|
+
it('rejects results with multiple rows', async () => {
|
|
67
|
+
const rows = (0, default_pool_1.queryRow)('SELECT * FROM workspaces', WorkspaceSchema);
|
|
68
|
+
await assert.isRejected(rows, 'Incorrect rowCount: 100');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('queryOptionalRow', () => {
|
|
72
|
+
it('handles single column', async () => {
|
|
73
|
+
const row = await (0, default_pool_1.queryRow)('SELECT id FROM workspaces WHERE id = 1;', zod_1.z.string());
|
|
74
|
+
assert.equal(row, '1');
|
|
75
|
+
});
|
|
76
|
+
it('handles multiple columns', async () => {
|
|
77
|
+
const row = await (0, default_pool_1.queryOptionalRow)('SELECT * FROM workspaces WHERE id = 1;', WorkspaceSchema);
|
|
78
|
+
assert.isNotNull(row);
|
|
79
|
+
assert.equal(row?.id, '1');
|
|
80
|
+
assert.isNotNull(row?.created_at);
|
|
81
|
+
});
|
|
82
|
+
it('handles parameters', async () => {
|
|
83
|
+
const row = await (0, default_pool_1.queryOptionalRow)('SELECT * FROM workspaces WHERE id = $1;', [1], WorkspaceSchema);
|
|
84
|
+
assert.isNotNull(row);
|
|
85
|
+
assert.equal(row?.id, '1');
|
|
86
|
+
});
|
|
87
|
+
it('handles missing result', async () => {
|
|
88
|
+
const row = await (0, default_pool_1.queryOptionalRow)('SELECT * FROM workspaces WHERE id = -1;', WorkspaceSchema);
|
|
89
|
+
assert.isNull(row);
|
|
90
|
+
});
|
|
91
|
+
it('rejects with multiple rows', async () => {
|
|
92
|
+
const rows = (0, default_pool_1.queryOptionalRow)('SELECT * FROM workspaces', WorkspaceSchema);
|
|
93
|
+
await assert.isRejected(rows, 'Incorrect rowCount: 100');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
28
96
|
describe('queryCursor', () => {
|
|
29
97
|
it('returns zero rows', async () => {
|
|
30
|
-
const cursor = await (0, default_pool_1.queryCursor)('SELECT * FROM workspaces WHERE id =
|
|
31
|
-
|
|
98
|
+
const cursor = await (0, default_pool_1.queryCursor)('SELECT * FROM workspaces WHERE id = 10000;', {});
|
|
99
|
+
const rowBatches = [];
|
|
32
100
|
for await (const rows of cursor.iterate(10)) {
|
|
33
101
|
rowBatches.push(rows);
|
|
34
102
|
}
|
|
@@ -45,13 +113,13 @@ describe('@prairielearn/postgres', function () {
|
|
|
45
113
|
assert.lengthOf(rowBatches[1], 1);
|
|
46
114
|
});
|
|
47
115
|
it('returns all rows at once', async () => {
|
|
48
|
-
const cursor = (0, default_pool_1.queryCursor)('SELECT * FROM workspaces;', {});
|
|
116
|
+
const cursor = (0, default_pool_1.queryCursor)('SELECT * FROM workspaces WHERE id <= 10;', {});
|
|
49
117
|
const rowBatches = [];
|
|
50
118
|
for await (const rows of (await cursor).iterate(10)) {
|
|
51
119
|
rowBatches.push(rows);
|
|
52
120
|
}
|
|
53
121
|
assert.lengthOf(rowBatches, 1);
|
|
54
|
-
assert.lengthOf(rowBatches[0],
|
|
122
|
+
assert.lengthOf(rowBatches[0], 10);
|
|
55
123
|
});
|
|
56
124
|
it('handles errors', async () => {
|
|
57
125
|
const cursor = await (0, default_pool_1.queryCursor)('NOT VALID SQL', { foo: 'bar' });
|
|
@@ -73,64 +141,81 @@ describe('@prairielearn/postgres', function () {
|
|
|
73
141
|
});
|
|
74
142
|
});
|
|
75
143
|
describe('queryValidatedCursor', () => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
assert.lengthOf(allRows, 4);
|
|
86
|
-
const workspace = allRows[0];
|
|
87
|
-
assert.equal(workspace.id, '1');
|
|
88
|
-
assert.isUndefined(workspace.state);
|
|
89
|
-
});
|
|
90
|
-
it('throws error when validation fails', async () => {
|
|
91
|
-
const BadWorkspaceSchema = zod_1.z.object({
|
|
92
|
-
badProperty: zod_1.z.string(),
|
|
93
|
-
});
|
|
94
|
-
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, BadWorkspaceSchema);
|
|
95
|
-
async function readAllRows() {
|
|
144
|
+
const WorkspaceSchema = zod_1.z.object({
|
|
145
|
+
id: zod_1.z.string(),
|
|
146
|
+
});
|
|
147
|
+
const BadWorkspaceSchema = zod_1.z.object({
|
|
148
|
+
badProperty: zod_1.z.string(),
|
|
149
|
+
});
|
|
150
|
+
describe('iterator', () => {
|
|
151
|
+
it('validates with provided schema', async () => {
|
|
152
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;', {}, WorkspaceSchema);
|
|
96
153
|
const allRows = [];
|
|
97
154
|
for await (const rows of cursor.iterate(10)) {
|
|
98
155
|
allRows.push(...rows);
|
|
99
156
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
assert.lengthOf(maybeError.errors, 4);
|
|
105
|
-
});
|
|
106
|
-
it('returns a stream', async () => {
|
|
107
|
-
const WorkspaceSchema = zod_1.z.object({
|
|
108
|
-
id: zod_1.z.string(),
|
|
157
|
+
assert.lengthOf(allRows, 10);
|
|
158
|
+
const workspace = allRows[0];
|
|
159
|
+
assert.equal(workspace.id, '1');
|
|
160
|
+
assert.isUndefined(workspace.state);
|
|
109
161
|
});
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
162
|
+
it('throws error when validation fails', async () => {
|
|
163
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;', {}, BadWorkspaceSchema);
|
|
164
|
+
async function readAllRows() {
|
|
165
|
+
const allRows = [];
|
|
166
|
+
for await (const rows of cursor.iterate(10)) {
|
|
167
|
+
allRows.push(...rows);
|
|
168
|
+
}
|
|
169
|
+
return allRows;
|
|
170
|
+
}
|
|
171
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
172
|
+
assert.instanceOf(maybeError, zod_1.ZodError);
|
|
173
|
+
assert.lengthOf(maybeError.errors, 10);
|
|
121
174
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
async
|
|
175
|
+
});
|
|
176
|
+
describe('stream', () => {
|
|
177
|
+
it('validates with provided schema', async () => {
|
|
178
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces WHERE id <= 10 ORDER BY id ASC;', {}, WorkspaceSchema);
|
|
179
|
+
const stream = cursor.stream(1);
|
|
125
180
|
const allRows = [];
|
|
126
181
|
for await (const row of stream) {
|
|
127
182
|
allRows.push(row);
|
|
128
183
|
}
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
184
|
+
assert.lengthOf(allRows, 10);
|
|
185
|
+
});
|
|
186
|
+
it('emits an error when validation fails', async () => {
|
|
187
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, BadWorkspaceSchema);
|
|
188
|
+
const stream = cursor.stream(1);
|
|
189
|
+
async function readAllRows() {
|
|
190
|
+
const allRows = [];
|
|
191
|
+
for await (const row of stream) {
|
|
192
|
+
allRows.push(row);
|
|
193
|
+
}
|
|
194
|
+
return allRows;
|
|
195
|
+
}
|
|
196
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
197
|
+
assert.instanceOf(maybeError, zod_1.ZodError);
|
|
198
|
+
assert.lengthOf(maybeError.errors, 1);
|
|
199
|
+
});
|
|
200
|
+
it('closes the cursor when the stream is closed', async () => {
|
|
201
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces;', {}, WorkspaceSchema);
|
|
202
|
+
const stream = cursor.stream(1);
|
|
203
|
+
const rows = [];
|
|
204
|
+
const ac = new AbortController();
|
|
205
|
+
const writable = new node_stream_1.Writable({
|
|
206
|
+
objectMode: true,
|
|
207
|
+
write: function (chunk, _encoding, callback) {
|
|
208
|
+
rows.push(chunk);
|
|
209
|
+
// After receiving the first row, abort the stream. This lets us test
|
|
210
|
+
// that the underlying cursor is closed. If it is *not* closed, this
|
|
211
|
+
// `after` hook will fail with a timeout.
|
|
212
|
+
ac.abort();
|
|
213
|
+
callback();
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
await assert.isRejected((0, promises_1.pipeline)(stream, writable, { signal: ac.signal }));
|
|
217
|
+
assert.lengthOf(rows, 1);
|
|
218
|
+
});
|
|
134
219
|
});
|
|
135
220
|
});
|
|
136
221
|
});
|
package/dist/pool.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,wEAA8C;AAC9C,6BAAkC;AAElC,
|
|
1
|
+
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/postgres",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/PrairieLearn/PrairieLearn.git",
|
|
8
|
+
"directory": "packages/postgres"
|
|
9
|
+
},
|
|
5
10
|
"scripts": {
|
|
6
11
|
"build": "tsc",
|
|
7
12
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
8
13
|
"test": "mocha --no-config --require ts-node/register src/*.test.ts"
|
|
9
14
|
},
|
|
10
15
|
"devDependencies": {
|
|
11
|
-
"@prairielearn/tsconfig": "
|
|
16
|
+
"@prairielearn/tsconfig": "^0.0.0",
|
|
12
17
|
"@types/mocha": "^10.0.1",
|
|
13
18
|
"@types/multipipe": "^3.0.1",
|
|
14
|
-
"@types/node": "^18.
|
|
19
|
+
"@types/node": "^18.16.3",
|
|
15
20
|
"mocha": "^10.2.0",
|
|
16
21
|
"ts-node": "^10.9.1",
|
|
17
|
-
"typescript": "^
|
|
22
|
+
"typescript": "^5.0.4"
|
|
18
23
|
},
|
|
19
24
|
"dependencies": {
|
|
20
25
|
"@types/debug": "^4.1.7",
|
|
21
|
-
"@types/lodash": "^4.14.
|
|
26
|
+
"@types/lodash": "^4.14.194",
|
|
22
27
|
"@types/pg-cursor": "^2.7.0",
|
|
23
28
|
"multipipe": "^4.0.0",
|
|
24
29
|
"pg": "^8.10.0",
|
|
25
30
|
"pg-cursor": "^2.9.0",
|
|
26
31
|
"pg-pool": "^3.6.0",
|
|
27
|
-
"zod": "^3.
|
|
32
|
+
"zod": "^3.21.4"
|
|
28
33
|
}
|
|
29
34
|
}
|
package/src/default-pool.ts
CHANGED
|
@@ -62,6 +62,9 @@ export const queryValidatedSingleColumnZeroOrOneRow =
|
|
|
62
62
|
export const callValidatedRows = defaultPool.callValidatedRows.bind(defaultPool);
|
|
63
63
|
export const callValidatedOneRow = defaultPool.callValidatedOneRow.bind(defaultPool);
|
|
64
64
|
export const callValidatedZeroOrOneRow = defaultPool.callValidatedZeroOrOneRow.bind(defaultPool);
|
|
65
|
+
export const queryRows = defaultPool.queryRows.bind(defaultPool);
|
|
66
|
+
export const queryRow = defaultPool.queryRow.bind(defaultPool);
|
|
67
|
+
export const queryOptionalRow = defaultPool.queryOptionalRow.bind(defaultPool);
|
|
65
68
|
export const queryCursorWithClient = defaultPool.queryCursorWithClient.bind(defaultPool);
|
|
66
69
|
export const queryCursor = defaultPool.queryCursor.bind(defaultPool);
|
|
67
70
|
export const queryValidatedCursor = defaultPool.queryValidatedCursor.bind(defaultPool);
|
package/src/loader.ts
CHANGED
|
@@ -11,7 +11,7 @@ export function loadSql(filename: string): SqlFile {
|
|
|
11
11
|
const blockRE = /^ *-- *BLOCK +([^ ]+) *$/;
|
|
12
12
|
let blockName: string | null = null;
|
|
13
13
|
lines.forEach((line) => {
|
|
14
|
-
|
|
14
|
+
const result = blockRE.exec(line);
|
|
15
15
|
if (result) {
|
|
16
16
|
blockName = result[1];
|
|
17
17
|
if (sql[blockName]) throw new Error(`${filename}: duplicate BLOCK name: ${blockName}`);
|