neon-testing 2.3.1 → 2.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/README.md +73 -0
- package/dist/barrier.d.ts +6 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +19 -0
- package/dist/barrier.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -16
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -0
- package/dist/utils.js.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -11,6 +11,18 @@ Each test file runs against its own isolated PostgreSQL database (Neon branch),
|
|
|
11
11
|
|
|
12
12
|
**Testing against a clone of your production database lets you verify functionality that mocks cannot.**
|
|
13
13
|
|
|
14
|
+
## Table of Contents
|
|
15
|
+
|
|
16
|
+
- [Features](#features)
|
|
17
|
+
- [How it works](#how-it-works)
|
|
18
|
+
- [Quick start](#quick-start)
|
|
19
|
+
- [Drivers](#drivers)
|
|
20
|
+
- [Configuration](#configuration)
|
|
21
|
+
- [Continuous integration](#continuous-integration)
|
|
22
|
+
- [API Reference](#api-reference)
|
|
23
|
+
- [Contributing](#contributing)
|
|
24
|
+
- [Author](#author)
|
|
25
|
+
|
|
14
26
|
## Features
|
|
15
27
|
|
|
16
28
|
- 🔄 **Isolated test environments** - Each test file runs against its own Postgres database with your actual schema and constraints
|
|
@@ -225,6 +237,17 @@ export interface NeonTestingOptions {
|
|
|
225
237
|
* https://neon.com/docs/guides/branch-expiration
|
|
226
238
|
*/
|
|
227
239
|
expiresIn?: number | null;
|
|
240
|
+
/**
|
|
241
|
+
* The database role to connect as (default: project owner role)
|
|
242
|
+
*
|
|
243
|
+
* The role must exist in the parent branch. Roles are automatically
|
|
244
|
+
* copied to test branches when branching.
|
|
245
|
+
*/
|
|
246
|
+
roleName?: string;
|
|
247
|
+
/**
|
|
248
|
+
* The database to connect to (default: project default database)
|
|
249
|
+
*/
|
|
250
|
+
databaseName?: string;
|
|
228
251
|
}
|
|
229
252
|
```
|
|
230
253
|
|
|
@@ -254,6 +277,41 @@ neonTesting({
|
|
|
254
277
|
});
|
|
255
278
|
```
|
|
256
279
|
|
|
280
|
+
### Role selection
|
|
281
|
+
|
|
282
|
+
You can connect as a specific database role using the `roleName` option. This is useful for testing Row-Level Security (RLS) policies with non-privileged roles.
|
|
283
|
+
|
|
284
|
+
```ts
|
|
285
|
+
// Connect as a specific role (must exist in parent branch)
|
|
286
|
+
neonTesting({
|
|
287
|
+
roleName: "test_user",
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Setting up a role for RLS testing:**
|
|
292
|
+
|
|
293
|
+
1. Create a role in your parent branch without `BYPASSRLS`:
|
|
294
|
+
|
|
295
|
+
```sql
|
|
296
|
+
CREATE ROLE test_user WITH LOGIN PASSWORD 'your_password';
|
|
297
|
+
GRANT CONNECT ON DATABASE neondb TO test_user;
|
|
298
|
+
GRANT USAGE ON SCHEMA public TO test_user;
|
|
299
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO test_user;
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
2. The role is automatically copied to test branches when branching.
|
|
303
|
+
|
|
304
|
+
3. Use the role in your tests:
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
neonTesting({ roleName: "test_user" });
|
|
308
|
+
|
|
309
|
+
test("RLS policy enforces user isolation", async () => {
|
|
310
|
+
const sql = neon(process.env.DATABASE_URL!);
|
|
311
|
+
// Now connected as test_user - RLS policies are enforced
|
|
312
|
+
});
|
|
313
|
+
```
|
|
314
|
+
|
|
257
315
|
## Continuous integration
|
|
258
316
|
|
|
259
317
|
It's easy to run Neon integration tests in CI/CD pipelines:
|
|
@@ -347,6 +405,21 @@ This plugin is recommended but not required. Without it, tests might accidentall
|
|
|
347
405
|
|
|
348
406
|
### Utilities (`neon-testing/utils`)
|
|
349
407
|
|
|
408
|
+
#### createBarrier(count)
|
|
409
|
+
|
|
410
|
+
Creates a synchronization barrier that blocks until `count` callers have arrived, then releases all of them simultaneously. Useful for deterministically reproducing race conditions in concurrent database operations.
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
import { createBarrier } from "neon-testing/utils";
|
|
414
|
+
|
|
415
|
+
const barrier = createBarrier(2);
|
|
416
|
+
|
|
417
|
+
// In concurrent operations:
|
|
418
|
+
await barrier(); // blocks until both arrive, then releases simultaneously
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
See the [examples](examples/barriers/) and read more about [harnessing Postgres race conditions](https://www.lirbank.com/harnessing-postgres-race-conditions).
|
|
422
|
+
|
|
350
423
|
#### lazySingleton(factory)
|
|
351
424
|
|
|
352
425
|
Creates a lazy singleton from a factory function. This is useful for managing database connections efficiently:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.d.ts","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,uBAiB1C"}
|
package/dist/barrier.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a synchronization barrier that blocks until `count` callers have
|
|
3
|
+
* arrived, then releases all of them simultaneously
|
|
4
|
+
*/
|
|
5
|
+
export function createBarrier(count) {
|
|
6
|
+
let arrived = 0;
|
|
7
|
+
let release;
|
|
8
|
+
const barrier = new Promise((resolve) => {
|
|
9
|
+
release = resolve;
|
|
10
|
+
});
|
|
11
|
+
return async () => {
|
|
12
|
+
arrived++;
|
|
13
|
+
if (arrived === count) {
|
|
14
|
+
release();
|
|
15
|
+
}
|
|
16
|
+
await barrier;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=barrier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.js","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAmB,CAAC;IAExB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,IAAI,EAAE;QAChB,OAAO,EAAE,CAAC;QAEV,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -58,6 +58,17 @@ export interface NeonTestingOptions {
|
|
|
58
58
|
* https://neon.com/docs/guides/branch-expiration
|
|
59
59
|
*/
|
|
60
60
|
expiresIn?: number | null;
|
|
61
|
+
/**
|
|
62
|
+
* The database role to connect as (default: project owner role)
|
|
63
|
+
*
|
|
64
|
+
* The role must exist in the parent branch. Roles are automatically
|
|
65
|
+
* copied to test branches when branching.
|
|
66
|
+
*/
|
|
67
|
+
roleName?: string;
|
|
68
|
+
/**
|
|
69
|
+
* The database to connect to (default: project default database)
|
|
70
|
+
*/
|
|
71
|
+
databaseName?: string;
|
|
61
72
|
}
|
|
62
73
|
/** Options for overriding test database setup (excludes apiKey) */
|
|
63
74
|
export type NeonTestingOverrides = Omit<Partial<NeonTestingOptions>, "apiKey">;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,0BAA0B,CAAC;AAuBlC,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,kBAAkB;iBAyClD,oBAAoB;;;EA8JnC"}
|
package/dist/index.js
CHANGED
|
@@ -4,18 +4,6 @@
|
|
|
4
4
|
import { createApiClient, EndpointType, } from "@neondatabase/api-client";
|
|
5
5
|
import { afterAll, beforeAll } from "vitest";
|
|
6
6
|
import { neonConfig } from "@neondatabase/serverless";
|
|
7
|
-
/**
|
|
8
|
-
* Creates a PostgreSQL connection URI from connection parameters
|
|
9
|
-
*
|
|
10
|
-
* @param connectionParameters - The connection parameters object
|
|
11
|
-
* @param type - The type of connection to create (pooler or direct)
|
|
12
|
-
* @returns A PostgreSQL connection URI string
|
|
13
|
-
*/
|
|
14
|
-
function createConnectionUri(connectionParameters, type) {
|
|
15
|
-
const { role, password, host, pooler_host, database } = connectionParameters.connection_parameters;
|
|
16
|
-
const hostname = type === "pooler" ? pooler_host : host;
|
|
17
|
-
return `postgresql://${role}:${password}@${hostname}/${database}?sslmode=require`;
|
|
18
|
-
}
|
|
19
7
|
/**
|
|
20
8
|
* Validates the expiresIn option
|
|
21
9
|
*/
|
|
@@ -142,11 +130,38 @@ export function makeNeonTesting(factoryOptions) {
|
|
|
142
130
|
},
|
|
143
131
|
});
|
|
144
132
|
branch = data.branch;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
133
|
+
// Determine role and database (handles multi-role/database projects)
|
|
134
|
+
const targetRole = options.roleName ??
|
|
135
|
+
data.roles?.find((r) => r.name === "neondb_owner")?.name ??
|
|
136
|
+
data.roles?.[0]?.name;
|
|
137
|
+
const targetDatabase = options.databaseName ??
|
|
138
|
+
data.databases?.find((d) => d.name === "neondb")?.name ??
|
|
139
|
+
data.databases?.[0]?.name;
|
|
140
|
+
if (!targetRole) {
|
|
141
|
+
throw new Error("No role available in branch");
|
|
148
142
|
}
|
|
149
|
-
|
|
143
|
+
if (!targetDatabase) {
|
|
144
|
+
throw new Error("No database available in branch");
|
|
145
|
+
}
|
|
146
|
+
// Validate specified role exists
|
|
147
|
+
if (options.roleName &&
|
|
148
|
+
!data.roles?.some((r) => r.name === options.roleName)) {
|
|
149
|
+
throw new Error(`Role not found: ${options.roleName}`);
|
|
150
|
+
}
|
|
151
|
+
// Validate specified database exists
|
|
152
|
+
if (options.databaseName &&
|
|
153
|
+
!data.databases?.some((d) => d.name === options.databaseName)) {
|
|
154
|
+
throw new Error(`Database not found: ${options.databaseName}`);
|
|
155
|
+
}
|
|
156
|
+
// Use getConnectionUri API (works for all cases, including multi-role projects)
|
|
157
|
+
const { data: uriData } = await apiClient.getConnectionUri({
|
|
158
|
+
projectId: options.projectId,
|
|
159
|
+
branch_id: branch.id,
|
|
160
|
+
role_name: targetRole,
|
|
161
|
+
database_name: targetDatabase,
|
|
162
|
+
pooled: options.endpoint !== "direct",
|
|
163
|
+
});
|
|
164
|
+
return uriData.uri;
|
|
150
165
|
}
|
|
151
166
|
/**
|
|
152
167
|
* Delete the test branch
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,eAAe,EACf,YAAY,GAEb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD;;GAEG;AACH,SAAS,iBAAiB,CAAC,SAAoC;IAC7D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AA0ED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,eAAe,CAAC,cAAkC;IAChE,2BAA2B;IAC3B,iBAAiB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAErE;;OAEG;IACH,KAAK,UAAU,qBAAqB;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC;YACnD,SAAS,EAAE,cAAc,CAAC,SAAS;SACpC,CAAC,CAAC;QAEH,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,YAAY,GAChB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAC;YAEpE,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,SAAS,CAAC,mBAAmB,CACjC,cAAc,CAAC,SAAS,EACxB,MAAM,CAAC,EAAE,CACV,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,WAAW,GAAG;IAClB,iDAAiD;IACjD,SAAgC,EAChC,EAAE;QACF,qBAAqB;QACrB,IAAI,SAAS,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACvC,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE,CAAC;QAEpD,yDAAyD;QACzD,IAAI,MAA0B,CAAC;QAE/B,6CAA6C;QAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAa,CAAC;QAEzC,sEAAsE;QACtE,MAAM,iBAAkB,SAAQ,SAAS;YACvC,YAAY,GAAW;gBACrB,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEX,wCAAwC;gBACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAAE,OAAO;gBAEzC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;SACF;QAED;;;;WAIG;QACH,KAAK,UAAU,YAAY;YACzB,qDAAqD;YACrD,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,sBAAsB;YAEnF,MAAM,SAAS,GACb,SAAS,KAAK,IAAI;gBAChB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gBACvD,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE;gBACtE,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ,MAAM,CAAC,UAAU,EAAE,EAAE;oBACnC,SAAS,EAAE,OAAO,CAAC,cAAc;oBACjC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;oBAC3D,UAAU,EAAE,SAAS;iBACtB;gBACD,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC7C,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,MAAM;iBAC3B;aACF,CAAC,CAAC;YAEH,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAErB,qEAAqE;YACrE,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ;gBAChB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,IAAI;gBACxD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACxB,MAAM,cAAc,GAClB,OAAO,CAAC,YAAY;gBACpB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI;gBACtD,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAE5B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YAED,iCAAiC;YACjC,IACE,OAAO,CAAC,QAAQ;gBAChB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,QAAQ,CAAC,EACrD,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,qCAAqC;YACrC,IACE,OAAO,CAAC,YAAY;gBACpB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC,EAC7D,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,gFAAgF;YAChF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC;gBACzD,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,MAAM,CAAC,EAAE;gBACpB,SAAS,EAAE,UAAU;gBACrB,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ;aACtC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC,GAAG,CAAC;QACrB,CAAC;QAED;;WAEG;QACH,KAAK,UAAU,YAAY;YACzB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAED,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBACvD,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAChC,oEAAoE;gBACpE,yDAAyD;gBACzD,UAAU,CAAC,oBAAoB,GAAG,iBAAiB,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;YAErC,0EAA0E;YAC1E,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAChC,qEAAqE;gBACrE,OAAO,CAAC,eAAe,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;gBAEjE,sEAAsE;gBACtE,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;gBACnC,MAAM,YAAY,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;IACtB,CAAC,CAAC;IAEF,mBAAmB;IACnB,WAAW,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;IAC1D,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC;IAE5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,KAAY,EAAE,EAAE;IAC1C,MAAM,aAAa,GACjB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5D,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IAEpD,IAAI,aAAa,EAAE,CAAC;QAClB,kDAAkD;QAClD,OAAO;IACT,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,KAAK,UAAU,SAAS,CACtB,EAAoB,EACpB,OAGC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;YAEvC,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;gBAE7D,OAAO,CAAC,GAAG,CACT,yCAAyC,KAAK,eAAe,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,CAC9F,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE3D,SAAS;YACX,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { neonTesting as neonTestingVite } from "./vite-plugin.js";
|
|
2
2
|
export { lazySingleton } from "./singleton.js";
|
|
3
|
+
export { createBarrier } from "./barrier.js";
|
|
3
4
|
/**
|
|
4
5
|
* @deprecated Import the Vite plugin from "neon-testing/vite" instead. This
|
|
5
6
|
* export will be removed in the next major version.
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,WAAW,wBAAkB,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { neonTesting as neonTestingVite } from "./vite-plugin.js";
|
|
2
2
|
export { lazySingleton } from "./singleton.js";
|
|
3
|
+
export { createBarrier } from "./barrier.js";
|
|
3
4
|
/**
|
|
4
5
|
* @deprecated Import the Vite plugin from "neon-testing/vite" instead. This
|
|
5
6
|
* export will be removed in the next major version.
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neon-testing",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "A Vitest utility for seamless integration tests with Neon Postgres",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"neon",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && tsc && prettier --check . && vitest run",
|
|
37
37
|
"format": "prettier --write .",
|
|
38
38
|
"test": "vitest",
|
|
39
|
+
"skills:update": "bunx skills add neondatabase/agent-skills",
|
|
39
40
|
"clean:soft": "rm -rf node_modules dist && bun install",
|
|
40
41
|
"clean:hard": "rm -rf node_modules dist bun.lock && bun install",
|
|
41
42
|
"release:patch": "bun pm version patch",
|
|
@@ -48,7 +49,7 @@
|
|
|
48
49
|
"postversion": "git push --follow-tags"
|
|
49
50
|
},
|
|
50
51
|
"dependencies": {
|
|
51
|
-
"@neondatabase/api-client": "^2.
|
|
52
|
+
"@neondatabase/api-client": "^2.6.0"
|
|
52
53
|
},
|
|
53
54
|
"peerDependencies": {
|
|
54
55
|
"vite": "^7",
|
|
@@ -56,17 +57,16 @@
|
|
|
56
57
|
},
|
|
57
58
|
"devDependencies": {
|
|
58
59
|
"@neondatabase/serverless": "^1.0.2",
|
|
59
|
-
"@types/pg": "^8.
|
|
60
|
-
"dotenv": "^17.
|
|
61
|
-
"drizzle-orm": "^0.
|
|
62
|
-
"pg": "^8.
|
|
63
|
-
"postgres": "^3.4.
|
|
64
|
-
"prettier": "^3.
|
|
60
|
+
"@types/pg": "^8.16.0",
|
|
61
|
+
"dotenv": "^17.3.1",
|
|
62
|
+
"drizzle-orm": "^0.45.1",
|
|
63
|
+
"pg": "^8.18.0",
|
|
64
|
+
"postgres": "^3.4.8",
|
|
65
|
+
"prettier": "^3.8.1",
|
|
65
66
|
"tiny-invariant": "^1.3.3",
|
|
66
67
|
"typescript": "^5.9.3",
|
|
67
|
-
"vite": "^7.
|
|
68
|
-
"
|
|
69
|
-
"vitest": "^4.0.14"
|
|
68
|
+
"vite": "^7.3.1",
|
|
69
|
+
"vitest": "^4.0.18"
|
|
70
70
|
},
|
|
71
71
|
"browser": {
|
|
72
72
|
"./dist/vite-plugin.js": "./dist/browser-empty.js"
|