From f9d0614f47a2ce0713f0a48d689bf6108bcf41cd Mon Sep 17 00:00:00 2001
From: Yadd <yadd@debian.org>
Date: Mon, 28 Oct 2024 07:50:54 +0100
Subject: [PATCH] New upstream version 8.13.1+~cs35.16.30

---
 .devcontainer/Dockerfile                      |   6 +-
 .devcontainer/devcontainer.json               |  33 +-
 .devcontainer/docker-compose.yml              |  13 +-
 .eslintrc                                     |   8 +-
 .github/CODEOWNERS                            |   1 +
 .github/workflows/ci.yml                      |   9 +-
 CHANGELOG.md                                  |  10 +-
 README.md                                     |  10 +-
 docs/pages/announcements.mdx                  |   6 +-
 docs/pages/apis/result.mdx                    |   2 +-
 packages/pg-cloudflare/README.md              |  26 +-
 packages/pg-connection-string/package.json    |   4 +-
 packages/pg-connection-string/test/parse.js   |   1 -
 packages/pg-cursor/package.json               |   6 +-
 packages/pg-native/package.json               |   7 +-
 packages/pg-native/test/cancel.js             |  10 +-
 packages/pg-native/test/domains.js            |   2 +-
 packages/pg-native/test/many-connections.js   |  13 +-
 packages/pg-native/test/query-sync.js         |   2 +-
 packages/pg-pool/package.json                 |   6 +-
 packages/pg-pool/test/lifetime-timeout.js     |   1 -
 packages/pg-pool/test/max-uses.js             |   1 -
 packages/pg-pool/test/releasing-clients.js    |   1 -
 packages/pg-protocol/package.json             |   6 +-
 packages/pg-protocol/src/b.ts                 |   3 -
 .../pg-protocol/src/inbound-parser.test.ts    |  11 -
 packages/pg-protocol/src/index.ts             |   2 +-
 packages/pg-protocol/src/parser.ts            |   1 -
 packages/pg-query-stream/package.json         |  10 +-
 .../pg-query-stream/test/async-iterator.ts    |   2 +
 packages/pg-query-stream/test/pauses.ts       |   2 +-
 packages/pg/lib/client.js                     |  15 +-
 packages/pg/lib/connection.js                 |   1 -
 packages/pg/lib/native/client.js              |   2 +-
 packages/pg/lib/query.js                      |   2 +-
 packages/pg/lib/stream.js                     |  85 ++-
 packages/pg/package.json                      |  10 +-
 packages/pg/script/create-test-tables.js      |  57 +-
 packages/pg/script/list-db-types.js           |  10 -
 .../pg/test/integration/client/api-tests.js   |  16 +
 .../test/integration/client/appname-tests.js  |   2 +-
 .../pg/test/integration/client/array-tests.js |   1 +
 .../client/big-simple-query-tests.js          |   4 +-
 .../integration/client/configuration-tests.js |   2 +
 .../client/connection-timeout-tests.js        |   1 +
 .../integration/client/custom-types-tests.js  |  16 +
 .../integration/client/empty-query-tests.js   |   1 +
 .../client/error-handling-tests.js            |   6 +-
 .../integration/client/huge-numeric-tests.js  |   1 +
 ...le_in_transaction_session_timeout-tests.js |   1 +
 .../client/multiple-results-tests.js          |   2 +-
 .../client/network-partition-tests.js         |   1 +
 .../test/integration/client/no-data-tests.js  |   5 +-
 .../integration/client/no-row-result-tests.js |   1 +
 .../integration/client/parse-int-8-tests.js   |   1 +
 .../client/prepared-statement-tests.js        |   4 +-
 .../integration/client/promise-api-tests.js   |   1 +
 .../client/query-as-promise-tests.js          |   1 +
 .../client/query-column-names-tests.js        |   1 +
 ...error-handling-prepared-statement-tests.js |   3 +-
 .../client/query-error-handling-tests.js      |  10 +-
 .../client/result-metadata-tests.js           |   3 +-
 .../client/results-as-array-tests.js          |   6 +-
 .../row-description-on-results-tests.js       |   6 +-
 .../integration/client/sasl-scram-tests.js    |   1 +
 .../integration/client/simple-query-tests.js  |   4 +
 .../pg/test/integration/client/ssl-tests.js   |  25 +-
 .../client/statement_timeout-tests.js         |   1 +
 .../test/integration/client/timezone-tests.js |   7 +-
 .../integration/client/transaction-tests.js   |   1 +
 .../integration/client/type-coercion-tests.js |   7 +-
 .../client/type-parser-override-tests.js      |   1 +
 .../connection-pool-size-tests.js             |   2 +-
 .../connection-pool/error-tests.js            |   2 +-
 .../connection-pool/idle-timeout-tests.js     |   1 +
 .../connection-pool/native-instance-tests.js  |   1 +
 .../connection-pool/yield-support-tests.js    |   1 +
 .../connection/bound-command-tests.js         |  58 --
 .../test/integration/connection/copy-tests.js |  43 --
 .../connection/dynamic-password-tests.js      | 119 ----
 .../connection/notification-tests.js          |  16 -
 .../integration/connection/query-tests.js     |  26 -
 .../integration/connection/test-helper.js     |  41 --
 packages/pg/test/integration/domain-tests.js  |   4 +-
 .../test/integration/gh-issues/1105-tests.js  |   1 -
 .../test/integration/gh-issues/130-tests.js   |   1 +
 .../test/integration/gh-issues/131-tests.js   |   1 +
 .../test/integration/gh-issues/1542-tests.js  |   2 +-
 .../test/integration/gh-issues/199-tests.js   |   1 +
 .../test/integration/gh-issues/2064-tests.js  |   1 -
 .../test/integration/gh-issues/2303-tests.js  |   1 -
 .../test/integration/gh-issues/2307-tests.js  |   1 +
 .../test/integration/gh-issues/2416-tests.js  |   1 +
 .../test/integration/gh-issues/2627-tests.js  |   1 +
 .../test/integration/gh-issues/3174-tests.js  | 167 +++++
 .../test/integration/gh-issues/507-tests.js   |   1 +
 .../test/integration/gh-issues/600-tests.js   |   1 +
 .../test/integration/gh-issues/699-tests.js   |   1 -
 packages/pg/test/integration/test-helper.js   |   2 +
 packages/pg/test/native/callback-api-tests.js |   1 +
 packages/pg/test/native/evented-api-tests.js  |   3 +
 .../native/native-connection-string-tests.js  |   1 +
 packages/pg/test/native/stress-tests.js       |   8 +-
 packages/pg/test/test-helper.js               |  16 +-
 .../unit/client/cleartext-password-tests.js   |  45 +-
 .../test/unit/client/configuration-tests.js   |   5 +-
 .../unit/client/early-disconnect-tests.js     |   3 +-
 packages/pg/test/unit/client/escape-tests.js  |  11 +-
 .../pg/test/unit/client/md5-password-tests.js |   3 +
 .../pg/test/unit/client/notification-tests.js |   4 +-
 .../unit/client/prepared-statement-tests.js   |   7 +-
 .../pg/test/unit/client/query-queue-tests.js  |  42 +-
 .../test/unit/client/result-metadata-tests.js |   5 +-
 .../pg/test/unit/client/sasl-scram-tests.js   |   1 +
 .../test/unit/client/set-keepalives-tests.js  |   1 +
 .../pg/test/unit/client/simple-query-tests.js |  11 +-
 ...tream-and-query-error-interaction-tests.js |   6 +-
 packages/pg/test/unit/client/test-helper.js   |   1 +
 .../unit/client/throw-in-type-parser-tests.js |   8 +-
 .../connection-parameters/creation-tests.js   |   1 -
 .../environment-variable-tests.js             |   1 -
 .../connection-pool/configuration-tests.js    |   3 +-
 .../pg/test/unit/connection/error-tests.js    |   2 +
 .../unit/connection/inbound-parser-tests.js   | 510 --------------
 .../pg/test/unit/connection/startup-tests.js  |   6 +-
 packages/pg/test/unit/test-helper.js          |   4 +-
 packages/pg/test/unit/utils-tests.js          |  22 +-
 packages/pg/test/worker/src/index.test.js     |   1 +
 pg-native/package.json                        |   9 +-
 pg-native/test/cancel.js                      |  10 +-
 pg-native/test/domains.js                     |   2 +-
 pg-native/test/many-connections.js            |  13 +-
 pg-native/test/query-sync.js                  |   2 +-
 yarn.lock                                     | 655 ++++++------------
 134 files changed, 847 insertions(+), 1613 deletions(-)
 create mode 100644 .github/CODEOWNERS
 delete mode 100644 packages/pg/script/list-db-types.js
 delete mode 100644 packages/pg/test/integration/connection/bound-command-tests.js
 delete mode 100644 packages/pg/test/integration/connection/copy-tests.js
 delete mode 100644 packages/pg/test/integration/connection/dynamic-password-tests.js
 delete mode 100644 packages/pg/test/integration/connection/notification-tests.js
 delete mode 100644 packages/pg/test/integration/connection/query-tests.js
 delete mode 100644 packages/pg/test/integration/connection/test-helper.js
 create mode 100644 packages/pg/test/integration/gh-issues/3174-tests.js
 delete mode 100644 packages/pg/test/unit/connection/inbound-parser-tests.js

diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index d60b0cc..c642538 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -16,9 +16,11 @@ ARG USERNAME=node
 ARG USER_UID=1000
 ARG USER_GID=$USER_UID
 
+RUN echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list
+
 # Configure apt and install packages
 RUN apt-get update \
-    && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ 
+    && apt-get -y install --no-install-recommends dialog 2>&1 \ 
     #
     # Verify git and needed tools are installed
     && apt-get -y install git iproute2 procps \
@@ -33,6 +35,7 @@ RUN apt-get update \
     && echo "deb https://dl.yarnpkg.com/$(lsb_release -is | tr '[:upper:]' '[:lower:]')/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
     && apt-get update \
     && apt-get -y install --no-install-recommends yarn tmux locales postgresql \
+    && apt-get install libpq-dev g++ make \
     #
     # Install eslint globally
     && npm install -g eslint \
@@ -47,7 +50,6 @@ RUN apt-get update \
     && apt-get install -y sudo \
     && echo node ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
     && chmod 0440 /etc/sudoers.d/$USERNAME \
-    #
     # Clean up
     && apt-get autoremove -y \
     && apt-get clean -y \
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 14fb673..b282fd7 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -4,28 +4,13 @@
 	"dockerComposeFile": "docker-compose.yml",
 	"service": "web",
 	"workspaceFolder": "/workspace",
-
-	// Use 'settings' to set *default* container specific settings.json values on container create. 
-	// You can edit these settings after create using File > Preferences > Settings > Remote.
-	"settings": { 
-		"terminal.integrated.shell.linux": "/bin/bash"
-	},
-
-	// Uncomment the next line if you want start specific services in your Docker Compose config.
-	// "runServices": [],
-
-	// Uncomment the line below if you want to keep your containers running after VS Code shuts down.
-	// "shutdownAction": "none",
-
-	// Uncomment the next line to run commands after the container is created.
-	// "postCreateCommand": "npm install",
-
-	// Uncomment the next line to have VS Code connect as an existing non-root user in the container. See
-	// https://aka.ms/vscode-remote/containers/non-root for details on adding a non-root user if none exist.
-	// "remoteUser": "node",
-
 	// Add the IDs of extensions you want installed when the container is created in the array below.
-	"extensions": [
-		"dbaeumer.vscode-eslint"
-	]
-}
\ No newline at end of file
+	"customizations":{
+		"vscode": {
+			"extensions": ["dbaeumer.vscode-eslint"],
+			"settings": {
+				"terminal.integrated.shell.linux": "/bin/bash"
+			}
+		}
+	}
+}
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 05475b8..11e6520 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -3,7 +3,7 @@
 # Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
 #-------------------------------------------------------------------------------------------------------------
 
-version: '3'
+version: '3.9'
 services:
   web:
     # Uncomment the next line to use a non-root user for all processes. You can also
@@ -32,16 +32,21 @@ services:
     # Overrides default command so things don't shut down after the process ends.
     command: sleep infinity
 
-    links:
+    depends_on:
       - db
 
+    links:
+      - db:db
+
   db:
-    image: postgres
+    image: postgres:14-alpine
     restart: unless-stopped
     ports: 
       - 5432:5432
+    command: postgres -c password_encryption=md5
     environment:
+      POSTGRES_HOST_AUTH_METHOD: trust
+      POSTGRES_INITDB_ARGS: "--auth-local=md5"
       POSTGRES_PASSWORD: pass
       POSTGRES_USER: user
       POSTGRES_DB: data
- 
diff --git a/.eslintrc b/.eslintrc
index bb77004..fd9bb8d 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,5 +1,5 @@
 {
-  "plugins": ["prettier"],
+  "plugins": ["@typescript-eslint", "prettier"],
   "parser": "@typescript-eslint/parser",
   "extends": ["plugin:prettier/recommended", "prettier"],
   "ignorePatterns": ["node_modules", "coverage", "packages/pg-protocol/dist/**/*", "packages/pg-query-stream/dist/**/*"],
@@ -11,5 +11,11 @@
     "node": true,
     "es6": true,
     "mocha": true
+  },
+  "rules": {
+    "@typescript-eslint/no-unused-vars": ["error", {
+      "args": "none"
+    }],
+    "no-unused-vars": "off"
   }
 }
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..7434a61
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+/packages/pg-connection-string @hjr3
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aab0e5f..f6e93d7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,11 +21,11 @@ jobs:
       - run: yarn install --frozen-lockfile
       - run: yarn lint
   build:
-    timeout-minutes: 10
+    timeout-minutes: 15
     needs: lint
     services:
       postgres:
-        image: postgres:11
+        image: ghcr.io/railwayapp-templates/postgres-ssl
         env:
           POSTGRES_USER: postgres
           POSTGRES_PASSWORD: postgres
@@ -44,8 +44,8 @@ jobs:
           - '22'
         os:
           - ubuntu-latest
-    name: Node.js ${{ matrix.node }} (${{ matrix.os }})
-    runs-on: ${{ matrix.os }}
+    name: Node.js ${{ matrix.node }}
+    runs-on: ubuntu-latest
     env:
       PGUSER: postgres
       PGPASSWORD: postgres
@@ -71,5 +71,4 @@ jobs:
           node-version: ${{ matrix.node }}
           cache: yarn
       - run: yarn install --frozen-lockfile
-      # TODO(bmc): get ssl tests working in ci
       - run: yarn test
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf05426..dc70bc9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,14 @@ For richer information consult the commit log on github with referenced pull req
 
 We do not include break-fix version release in this file.
 
+## pg@8.13.0
+
+- Add ability to specify query timeout on [per-query basis](https://github.com/brianc/node-postgres/pull/3074).
+
+## pg@8.12.0
+
+- Add `queryMode` config option to [force use of the extended query protocol](https://github.com/brianc/node-postgres/pull/3214) on queries without any parameters.
+
 ## pg-pool@8.10.0
 
 - Emit `release` event when client is returned to [the pool](https://github.com/brianc/node-postgres/pull/2845).
@@ -64,7 +72,7 @@ We do not include break-fix version release in this file.
 
 ### pg@8.2.0
 
-- Switch internal protocol parser & serializer to [pg-protocol](https://github.com/brianc/node-postgres/tree/master/packages/pg-protocol). The change is backwards compatible but results in a significant performance improvement across the board, with some queries as much as 50% faster. This is the first work to land in an on-going performance improvment initiative I'm working on. Stay tuned as things are set to get much faster still! :rocket:
+- Switch internal protocol parser & serializer to [pg-protocol](https://github.com/brianc/node-postgres/tree/master/packages/pg-protocol). The change is backwards compatible but results in a significant performance improvement across the board, with some queries as much as 50% faster. This is the first work to land in an on-going performance improvement initiative I'm working on. Stay tuned as things are set to get much faster still! :rocket:
 
 ### pg-cursor@2.2.0
 
diff --git a/README.md b/README.md
index 35d3380..132fb59 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ This repo is a monorepo which contains the core [pg](https://github.com/brianc/n
 
 - [pg](https://github.com/brianc/node-postgres/tree/master/packages/pg)
 - [pg-pool](https://github.com/brianc/node-postgres/tree/master/packages/pg-pool)
+- [pg-native](https://github.com/brianc/node-postgres/tree/master/packages/pg-native)
 - [pg-cursor](https://github.com/brianc/node-postgres/tree/master/packages/pg-cursor)
 - [pg-query-stream](https://github.com/brianc/node-postgres/tree/master/packages/pg-query-stream)
 - [pg-connection-string](https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string)
@@ -74,10 +75,11 @@ If your change involves breaking backwards compatibility please please point tha
 ### Setting up for local development
 
 1. Clone the repo
-2. From your workspace root run `yarn` and then `yarn lerna bootstrap`
-3. Ensure you have a PostgreSQL instance running with SSL enabled and an empty database for tests
-4. Ensure you have the proper environment variables configured for connecting to the instance
-5. Run `yarn test` to run all the tests
+2. Ensure you have installed libpq-dev in your system.
+3. From your workspace root run `yarn` and then `yarn lerna bootstrap`
+4. Ensure you have a PostgreSQL instance running with SSL enabled and an empty database for tests
+5. Ensure you have the proper environment variables configured for connecting to the instance
+6. Run `yarn test` to run all the tests
 
 ## Troubleshooting and FAQ
 
diff --git a/docs/pages/announcements.mdx b/docs/pages/announcements.mdx
index 8792973..d6a17c2 100644
--- a/docs/pages/announcements.mdx
+++ b/docs/pages/announcements.mdx
@@ -47,11 +47,11 @@ new Client({
 
 - drop support for versions of node older than 8.0
 
-Node@6.0 has been out of LTS for quite some time now, and I've removed it from our test matrix. `pg@8.0` _may_ still work on older versions of node, but it isn't a goal of the project anymore. Node@8.0 is actually no longer in the LTS support line, but pg will continue to test against and support 8.0 until there is a compelling reason to drop support for it. Any security vulnerability issues which come up I will back-port fixes to the `pg@7.x` line and do a release, but any other fixes or improvments will not be back ported.
+Node@6.0 has been out of LTS for quite some time now, and I've removed it from our test matrix. `pg@8.0` _may_ still work on older versions of node, but it isn't a goal of the project anymore. Node@8.0 is actually no longer in the LTS support line, but pg will continue to test against and support 8.0 until there is a compelling reason to drop support for it. Any security vulnerability issues which come up I will back-port fixes to the `pg@7.x` line and do a release, but any other fixes or improvements will not be back ported.
 
 - prevent password from being logged accidentally
 
-`pg@8.0` makes the password field on the pool and client non-enumerable. This means when you do `console.log(client)` you wont have your database password printed out unintenionally. You can still do `console.log(client.password)` if you really want to see it!
+`pg@8.0` makes the password field on the pool and client non-enumerable. This means when you do `console.log(client)` you wont have your database password printed out unintentionally. You can still do `console.log(client.password)` if you really want to see it!
 
 - make `pg.native` non-enumerable
 
@@ -113,7 +113,7 @@ pg@7.1.2
 
 ### Example
 
-To demonstrate the issue & see if you are vunerable execute the following in node:
+To demonstrate the issue & see if you are vulnerable execute the following in node:
 
 ```js
 import pg from 'pg'
diff --git a/docs/pages/apis/result.mdx b/docs/pages/apis/result.mdx
index 8a23e69..da26adc 100644
--- a/docs/pages/apis/result.mdx
+++ b/docs/pages/apis/result.mdx
@@ -42,7 +42,7 @@ The command type last executed: `INSERT` `UPDATE` `CREATE` `SELECT` etc.
 
 The number of rows processed by the last command. Can be `null` for commands that never affect rows, such as the `LOCK`-command. More specifically, some commands, including `LOCK`, only return a command tag of the form `COMMAND`, without any `[ROWS]`-field to parse. For such commands `rowCount` will be `null`.
 
-_note: this does not reflect the number of rows __returned__ from a query.  e.g. an update statement could update many rows (so high `result.rowCount` value) but `result.rows.length` would be zero.  To check for an empty query reponse on a `SELECT` query use `result.rows.length === 0`_.
+_note: this does not reflect the number of rows __returned__ from a query.  e.g. an update statement could update many rows (so high `result.rowCount` value) but `result.rows.length` would be zero.  To check for an empty query response on a `SELECT` query use `result.rows.length === 0`_.
 
 [@sehrope](https://github.com/brianc/node-postgres/issues/2182#issuecomment-620553915) has a good explanation:
 
diff --git a/packages/pg-cloudflare/README.md b/packages/pg-cloudflare/README.md
index 8496faa..b2d6b99 100644
--- a/packages/pg-cloudflare/README.md
+++ b/packages/pg-cloudflare/README.md
@@ -1,13 +1,35 @@
 # pg-cloudflare
 
-A socket implementation that can run on Cloudflare Workers using native TCP connections.
+`pg-cloudflare` makes it easier to take an existing package that relies on `tls` and `net`, and make it work in environments where only `connect()` is supported, such as Cloudflare Workers.
 
-## install
+`pg-cloudflare` wraps `connect()`, the [TCP Socket API](https://github.com/wintercg/proposal-sockets-api) proposed within WinterCG, and implemented in [Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/), and exposes an interface with methods similar to what the `net` and `tls` modules in Node.js expose. (ex: `net.connect(path[, options][, callback])`). This minimizes the number of changes needed in order to make an existing package work across JavaScript runtimes.
+
+## Installation
 
 ```
 npm i --save-dev pg-cloudflare
 ```
 
+## How to use conditionally, in non-Node.js environments
+
+As implemented in `pg` [here](https://github.com/brianc/node-postgres/commit/07553428e9c0eacf761a5d4541a3300ff7859578#diff-34588ad868ebcb232660aba7ee6a99d1e02f4bc93f73497d2688c3f074e60533R5-R13), a typical use case might look as follows, where in a Node.js environment the `net` module is used, while in a non-Node.js environment, where `net` is unavailable, `pg-cloudflare` is used instead, providing an equivalent interface:
+
+```js
+module.exports.getStream = function getStream(ssl = false) {
+  const net = require('net')
+  if (typeof net.Socket === 'function') {
+    return net.Socket()
+  }
+  const { CloudflareSocket } = require('pg-cloudflare')
+  return new CloudflareSocket(ssl);
+}
+```
+
+## Node.js implementation of the Socket API proposal
+
+If you're looking for a way to rely on `connect()` as the interface you use to interact with raw sockets, but need this interface to be availble in a Node.js environment, [`@arrowood.dev/socket`](https://github.com/Ethan-Arrowood/socket) provides a Node.js implementation of the Socket API.
+
+
 ### license
 
 The MIT License (MIT)
diff --git a/packages/pg-connection-string/package.json b/packages/pg-connection-string/package.json
index d04e669..113311f 100644
--- a/packages/pg-connection-string/package.json
+++ b/packages/pg-connection-string/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-connection-string",
-  "version": "2.6.4",
+  "version": "2.7.0",
   "description": "Functions for dealing with a PostgresSQL connection string",
   "main": "./index.js",
   "types": "./index.d.ts",
@@ -30,7 +30,7 @@
     "chai": "^4.1.1",
     "coveralls": "^3.0.4",
     "istanbul": "^0.4.5",
-    "mocha": "^7.1.2"
+    "mocha": "^10.5.2"
   },
   "files": [
     "index.js",
diff --git a/packages/pg-connection-string/test/parse.js b/packages/pg-connection-string/test/parse.js
index 6018f83..59f16a6 100644
--- a/packages/pg-connection-string/test/parse.js
+++ b/packages/pg-connection-string/test/parse.js
@@ -1,7 +1,6 @@
 'use strict'
 
 var chai = require('chai')
-var expect = chai.expect
 chai.should()
 
 var parse = require('../').parse
diff --git a/packages/pg-cursor/package.json b/packages/pg-cursor/package.json
index 84feb2d..01b28f9 100644
--- a/packages/pg-cursor/package.json
+++ b/packages/pg-cursor/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-cursor",
-  "version": "2.11.0",
+  "version": "2.12.1",
   "description": "Query cursor extension for node-postgres",
   "main": "index.js",
   "directories": {
@@ -17,8 +17,8 @@
   "author": "Brian M. Carlson",
   "license": "MIT",
   "devDependencies": {
-    "mocha": "^7.1.2",
-    "pg": "^8.12.0"
+    "mocha": "^10.5.2",
+    "pg": "^8.13.1"
   },
   "peerDependencies": {
     "pg": "^8"
diff --git a/packages/pg-native/package.json b/packages/pg-native/package.json
index 0b1a0d8..bf259a9 100644
--- a/packages/pg-native/package.json
+++ b/packages/pg-native/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-native",
-  "version": "3.1.0",
+  "version": "3.2.0",
   "description": "A slightly nicer interface to Postgres over node-libpq",
   "main": "index.js",
   "scripts": {
@@ -23,15 +23,14 @@
   "homepage": "https://github.com/brianc/node-pg-native",
   "dependencies": {
     "libpq": "1.8.13",
-    "pg-types": "^1.12.1",
-    "readable-stream": "1.0.31"
+    "pg-types": "^1.12.1"
   },
   "devDependencies": {
     "async": "^0.9.0",
     "concat-stream": "^1.4.6",
     "generic-pool": "^2.1.1",
     "lodash": "^2.4.1",
-    "mocha": "3.4.2",
+    "mocha": "10.5.2",
     "node-gyp": ">=10.x",
     "okay": "^0.3.0",
     "semver": "^4.1.0"
diff --git a/packages/pg-native/test/cancel.js b/packages/pg-native/test/cancel.js
index 35c5f5a..80b1494 100644
--- a/packages/pg-native/test/cancel.js
+++ b/packages/pg-native/test/cancel.js
@@ -5,13 +5,15 @@ describe('cancel query', function () {
   it('works', function (done) {
     var client = new Client()
     client.connectSync()
-    client.query('SELECT pg_sleep(100);', function (err) {
+    client.query('SELECT pg_sleep(1000);', function (err) {
       assert(err instanceof Error)
       client.end(done)
     })
-    client.cancel(function (err) {
-      assert.ifError(err)
-    })
+    setTimeout(() => {
+      client.cancel(function (err) {
+        assert.ifError(err)
+      })
+    }, 100)
   })
 
   it('does not raise error if no active query', function (done) {
diff --git a/packages/pg-native/test/domains.js b/packages/pg-native/test/domains.js
index 67254ba..90ae4d5 100644
--- a/packages/pg-native/test/domains.js
+++ b/packages/pg-native/test/domains.js
@@ -6,7 +6,7 @@ var checkDomain = function (domain, when) {
   assert.strictEqual(process.domain, domain, 'Domain switched after ' + when)
 }
 
-describe('domains', function (done) {
+describe('domains', function () {
   it('remains bound after a query', function (done) {
     var domain = require('domain').create() // eslint-disable-line
     domain.run(function () {
diff --git a/packages/pg-native/test/many-connections.js b/packages/pg-native/test/many-connections.js
index 2041996..fe32ede 100644
--- a/packages/pg-native/test/many-connections.js
+++ b/packages/pg-native/test/many-connections.js
@@ -6,7 +6,7 @@ var bytes = require('crypto').pseudoRandomBytes
 describe('many connections', function () {
   describe('async', function () {
     var test = function (count, times) {
-      it('connecting ' + count + ' clients ' + times, function (done) {
+      it(`connecting ${count} clients ${times} times`, function (done) {
         this.timeout(200000)
 
         var connectClient = function (n, cb) {
@@ -38,20 +38,9 @@ describe('many connections', function () {
     }
 
     test(1, 1)
-    test(1, 1)
-    test(1, 1)
-    test(5, 5)
     test(5, 5)
-    test(5, 5)
-    test(5, 5)
-    test(10, 10)
     test(10, 10)
-    test(10, 10)
-    test(20, 20)
-    test(20, 20)
     test(20, 20)
     test(30, 10)
-    test(30, 10)
-    test(30, 10)
   })
 })
diff --git a/packages/pg-native/test/query-sync.js b/packages/pg-native/test/query-sync.js
index f7a0ad0..7bd86d8 100644
--- a/packages/pg-native/test/query-sync.js
+++ b/packages/pg-native/test/query-sync.js
@@ -1,7 +1,7 @@
 var Client = require('../')
 var assert = require('assert')
 
-describe('query sync', function (done) {
+describe('query sync', function () {
   before(function () {
     this.client = Client()
     this.client.connectSync()
diff --git a/packages/pg-pool/package.json b/packages/pg-pool/package.json
index c33124f..ddd4122 100644
--- a/packages/pg-pool/package.json
+++ b/packages/pg-pool/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-pool",
-  "version": "3.6.2",
+  "version": "3.7.0",
   "description": "Connection pool for node-postgres",
   "main": "index.js",
   "directories": {
@@ -27,11 +27,11 @@
   },
   "homepage": "https://github.com/brianc/node-pg-pool#readme",
   "devDependencies": {
-    "bluebird": "3.4.1",
+    "bluebird": "3.7.2",
     "co": "4.6.0",
     "expect.js": "0.3.1",
     "lodash": "^4.17.11",
-    "mocha": "^7.1.2",
+    "mocha": "^10.5.2",
     "pg-cursor": "^1.3.0"
   },
   "peerDependencies": {
diff --git a/packages/pg-pool/test/lifetime-timeout.js b/packages/pg-pool/test/lifetime-timeout.js
index 3e69042..4eac107 100644
--- a/packages/pg-pool/test/lifetime-timeout.js
+++ b/packages/pg-pool/test/lifetime-timeout.js
@@ -4,7 +4,6 @@ const expect = require('expect.js')
 
 const describe = require('mocha').describe
 const it = require('mocha').it
-const path = require('path')
 
 const Pool = require('../')
 
diff --git a/packages/pg-pool/test/max-uses.js b/packages/pg-pool/test/max-uses.js
index c94ddec..42375c0 100644
--- a/packages/pg-pool/test/max-uses.js
+++ b/packages/pg-pool/test/max-uses.js
@@ -1,6 +1,5 @@
 const expect = require('expect.js')
 const co = require('co')
-const _ = require('lodash')
 
 const describe = require('mocha').describe
 const it = require('mocha').it
diff --git a/packages/pg-pool/test/releasing-clients.js b/packages/pg-pool/test/releasing-clients.js
index da8e09c..ddfb44a 100644
--- a/packages/pg-pool/test/releasing-clients.js
+++ b/packages/pg-pool/test/releasing-clients.js
@@ -1,7 +1,6 @@
 const Pool = require('../')
 
 const expect = require('expect.js')
-const net = require('net')
 
 describe('releasing clients', () => {
   it('removes a client which cannot be queried', async () => {
diff --git a/packages/pg-protocol/package.json b/packages/pg-protocol/package.json
index 962af31..d922564 100644
--- a/packages/pg-protocol/package.json
+++ b/packages/pg-protocol/package.json
@@ -1,17 +1,17 @@
 {
   "name": "pg-protocol",
-  "version": "1.6.1",
+  "version": "1.7.0",
   "description": "The postgres client/server binary protocol, implemented in TypeScript",
   "main": "dist/index.js",
   "types": "dist/index.d.ts",
   "license": "MIT",
   "devDependencies": {
     "@types/chai": "^4.2.7",
-    "@types/mocha": "^5.2.7",
+    "@types/mocha": "^10.0.7",
     "@types/node": "^12.12.21",
     "chai": "^4.2.0",
     "chunky": "^0.0.0",
-    "mocha": "^7.1.2",
+    "mocha": "^10.5.2",
     "ts-node": "^8.5.4",
     "typescript": "^4.0.3"
   },
diff --git a/packages/pg-protocol/src/b.ts b/packages/pg-protocol/src/b.ts
index 028b763..088ca18 100644
--- a/packages/pg-protocol/src/b.ts
+++ b/packages/pg-protocol/src/b.ts
@@ -1,13 +1,10 @@
 // file for microbenchmarking
 
-import { Writer } from './buffer-writer'
-import { serialize } from './index'
 import { BufferReader } from './buffer-reader'
 
 const LOOPS = 1000
 let count = 0
 let start = Date.now()
-const writer = new Writer()
 
 const reader = new BufferReader()
 const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0])
diff --git a/packages/pg-protocol/src/inbound-parser.test.ts b/packages/pg-protocol/src/inbound-parser.test.ts
index 364bd8d..0c905c5 100644
--- a/packages/pg-protocol/src/inbound-parser.test.ts
+++ b/packages/pg-protocol/src/inbound-parser.test.ts
@@ -14,17 +14,6 @@ var parseCompleteBuffer = buffers.parseComplete()
 var bindCompleteBuffer = buffers.bindComplete()
 var portalSuspendedBuffer = buffers.portalSuspended()
 
-var addRow = function (bufferList: BufferList, name: string, offset: number) {
-  return bufferList
-    .addCString(name) // field name
-    .addInt32(offset++) // table id
-    .addInt16(offset++) // attribute of column number
-    .addInt32(offset++) // objectId of field's data type
-    .addInt16(offset++) // datatype size
-    .addInt32(offset++) // type modifier
-    .addInt16(0) // format code, 0 => text
-}
-
 var row1 = {
   name: 'id',
   tableID: 1,
diff --git a/packages/pg-protocol/src/index.ts b/packages/pg-protocol/src/index.ts
index 00491ff..703ff2e 100644
--- a/packages/pg-protocol/src/index.ts
+++ b/packages/pg-protocol/src/index.ts
@@ -1,4 +1,4 @@
-import { BackendMessage, DatabaseError } from './messages'
+import { DatabaseError } from './messages'
 import { serialize } from './serializer'
 import { Parser, MessageCallback } from './parser'
 
diff --git a/packages/pg-protocol/src/parser.ts b/packages/pg-protocol/src/parser.ts
index 1ad4e3a..5a3b0f6 100644
--- a/packages/pg-protocol/src/parser.ts
+++ b/packages/pg-protocol/src/parser.ts
@@ -27,7 +27,6 @@ import {
   NoticeMessage,
 } from './messages'
 import { BufferReader } from './buffer-reader'
-import assert from 'assert'
 
 // every message is prefixed with a single bye
 const CODE_LENGTH = 1
diff --git a/packages/pg-query-stream/package.json b/packages/pg-query-stream/package.json
index faa366c..94133d0 100644
--- a/packages/pg-query-stream/package.json
+++ b/packages/pg-query-stream/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-query-stream",
-  "version": "4.6.0",
+  "version": "4.7.1",
   "description": "Postgres query result returned as readable stream",
   "main": "./dist/index.js",
   "types": "./dist/index.d.ts",
@@ -30,14 +30,14 @@
   },
   "devDependencies": {
     "@types/chai": "^4.2.13",
-    "@types/mocha": "^8.0.3",
+    "@types/mocha": "^10.0.7",
     "@types/node": "^14.0.0",
     "@types/pg": "^7.14.5",
     "JSONStream": "~1.3.5",
     "concat-stream": "~1.0.1",
     "eslint-plugin-promise": "^6.0.1",
-    "mocha": "^7.1.2",
-    "pg": "^8.12.0",
+    "mocha": "^10.5.2",
+    "pg": "^8.13.1",
     "stream-spec": "~0.3.5",
     "ts-node": "^8.5.4",
     "typescript": "^4.0.3"
@@ -46,6 +46,6 @@
     "pg": "^8"
   },
   "dependencies": {
-    "pg-cursor": "^2.11.0"
+    "pg-cursor": "^2.12.1"
   }
 }
diff --git a/packages/pg-query-stream/test/async-iterator.ts b/packages/pg-query-stream/test/async-iterator.ts
index e2f8a75..227a9ec 100644
--- a/packages/pg-query-stream/test/async-iterator.ts
+++ b/packages/pg-query-stream/test/async-iterator.ts
@@ -122,9 +122,11 @@ if (!process.version.startsWith('v8')) {
       const pool = new pg.Pool({ max: 1 })
       const client = await pool.connect()
 
+      /* eslint-disable @typescript-eslint/no-unused-vars */
       for await (const _ of client.query(new QueryStream('select TRUE', [], { highWaterMark: 1 }))) break
       for await (const _ of client.query(new QueryStream('select TRUE', [], { highWaterMark: 1 }))) break
       for await (const _ of client.query(new QueryStream('select TRUE', [], { highWaterMark: 1 }))) break
+      /* eslint-enable @typescript-eslint/no-unused-vars */
 
       client.release()
       await pool.end()
diff --git a/packages/pg-query-stream/test/pauses.ts b/packages/pg-query-stream/test/pauses.ts
index 75fee57..4906341 100644
--- a/packages/pg-query-stream/test/pauses.ts
+++ b/packages/pg-query-stream/test/pauses.ts
@@ -2,7 +2,7 @@ import helper from './helper'
 import concat from 'concat-stream'
 import JSONStream from 'JSONStream'
 import QueryStream from '../src'
-import { Transform, TransformCallback } from 'stream'
+import { Transform } from 'stream'
 
 class PauseStream extends Transform {
   constructor() {
diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js
index c6aa3da..527f62e 100644
--- a/packages/pg/lib/client.js
+++ b/packages/pg/lib/client.js
@@ -99,7 +99,6 @@ class Client extends EventEmitter {
     }
     this._connecting = true
 
-    this.connectionTimeoutHandle
     if (this._connectionTimeoutMillis > 0) {
       this.connectionTimeoutHandle = setTimeout(() => {
         con._ending = true
@@ -378,11 +377,21 @@ class Client extends EventEmitter {
   }
 
   _handleCommandComplete(msg) {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected commandComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
     // delegate commandComplete to active query
     this.activeQuery.handleCommandComplete(msg, this.connection)
   }
 
-  _handleParseComplete(msg) {
+  _handleParseComplete() {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected parseComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
     // if a prepared statement has a name and properly parses
     // we track that its already been executed so we don't parse
     // it again on the same client
@@ -515,7 +524,7 @@ class Client extends EventEmitter {
         query.callback = query.callback || values
       }
     } else {
-      readTimeout = this.connectionParameters.query_timeout
+      readTimeout = config.query_timeout || this.connectionParameters.query_timeout
       query = new Query(config, values, callback)
       if (!query.callback) {
         result = new this._Promise((resolve, reject) => {
diff --git a/packages/pg/lib/connection.js b/packages/pg/lib/connection.js
index af4b8f1..c426b15 100644
--- a/packages/pg/lib/connection.js
+++ b/packages/pg/lib/connection.js
@@ -1,6 +1,5 @@
 'use strict'
 
-var net = require('net')
 var EventEmitter = require('events').EventEmitter
 
 const { parse, serialize } = require('pg-protocol')
diff --git a/packages/pg/lib/native/client.js b/packages/pg/lib/native/client.js
index 88bf52c..6494375 100644
--- a/packages/pg/lib/native/client.js
+++ b/packages/pg/lib/native/client.js
@@ -167,7 +167,7 @@ Client.prototype.query = function (config, values, callback) {
       config.callback = values
     }
   } else {
-    readTimeout = this.connectionParameters.query_timeout
+    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
     query = new NativeQuery(config, values, callback)
     if (!query.callback) {
       let resolveOut, rejectOut
diff --git a/packages/pg/lib/query.js b/packages/pg/lib/query.js
index 0925960..fbef341 100644
--- a/packages/pg/lib/query.js
+++ b/packages/pg/lib/query.js
@@ -65,7 +65,7 @@ class Query extends EventEmitter {
       if (!Array.isArray(this._results)) {
         this._results = [this._result]
       }
-      this._result = new Result(this._rowMode, this.types)
+      this._result = new Result(this._rowMode, this._result._types)
       this._results.push(this._result)
     }
   }
diff --git a/packages/pg/lib/stream.js b/packages/pg/lib/stream.js
index 67b1b3c..cb08398 100644
--- a/packages/pg/lib/stream.js
+++ b/packages/pg/lib/stream.js
@@ -1,28 +1,81 @@
+const { getStream, getSecureStream } = getStreamFuncs()
+
+module.exports = {
+  /**
+   * Get a socket stream compatible with the current runtime environment.
+   * @returns {Duplex}
+   */
+  getStream,
+  /**
+   * Get a TLS secured socket, compatible with the current environment,
+   * using the socket and other settings given in `options`.
+   * @returns {Duplex}
+   */
+  getSecureStream,
+}
+
 /**
- * Get a socket stream compatible with the current runtime environment.
- * @returns {Duplex}
+ * The stream functions that work in Node.js
  */
-module.exports.getStream = function getStream(ssl) {
-  const net = require('net')
-  if (typeof net.Socket === 'function') {
+function getNodejsStreamFuncs() {
+  function getStream(ssl) {
+    const net = require('net')
     return new net.Socket()
-  } else {
-    const { CloudflareSocket } = require('pg-cloudflare')
-    return new CloudflareSocket(ssl)
+  }
+
+  function getSecureStream(options) {
+    var tls = require('tls')
+    return tls.connect(options)
+  }
+  return {
+    getStream,
+    getSecureStream,
   }
 }
 
 /**
- * Get a TLS secured socket, compatible with the current environment,
- * using the socket and other settings given in `options`.
- * @returns {Duplex}
+ * The stream functions that work in Cloudflare Workers
  */
-module.exports.getSecureStream = function getSecureStream(options) {
-  var tls = require('tls')
-  if (tls.connect) {
-    return tls.connect(options)
-  } else {
+function getCloudflareStreamFuncs() {
+  function getStream(ssl) {
+    const { CloudflareSocket } = require('pg-cloudflare')
+    return new CloudflareSocket(ssl)
+  }
+
+  function getSecureStream(options) {
     options.socket.startTls(options)
     return options.socket
   }
+  return {
+    getStream,
+    getSecureStream,
+  }
+}
+
+/**
+ * Are we running in a Cloudflare Worker?
+ *
+ * @returns true if the code is currently running inside a Cloudflare Worker.
+ */
+function isCloudflareRuntime() {
+  // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers
+  // which means that `navigator.userAgent` will be defined.
+  if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {
+    return navigator.userAgent === 'Cloudflare-Workers'
+  }
+  // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach
+  if (typeof Response === 'function') {
+    const resp = new Response(null, { cf: { thing: true } })
+    if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {
+      return true
+    }
+  }
+  return false
+}
+
+function getStreamFuncs() {
+  if (isCloudflareRuntime()) {
+    return getCloudflareStreamFuncs()
+  }
+  return getNodejsStreamFuncs()
 }
diff --git a/packages/pg/package.json b/packages/pg/package.json
index 43784cb..f33ba8e 100644
--- a/packages/pg/package.json
+++ b/packages/pg/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg",
-  "version": "8.12.0",
+  "version": "8.13.1",
   "description": "PostgreSQL client - pure javascript & libpq with the same API",
   "keywords": [
     "database",
@@ -20,16 +20,16 @@
   "author": "Brian Carlson <brian.m.carlson@gmail.com>",
   "main": "./lib",
   "dependencies": {
-    "pg-connection-string": "^2.6.4",
-    "pg-pool": "^3.6.2",
-    "pg-protocol": "^1.6.1",
+    "pg-connection-string": "^2.7.0",
+    "pg-pool": "^3.7.0",
+    "pg-protocol": "^1.7.0",
     "pg-types": "^2.1.0",
     "pgpass": "1.x"
   },
   "devDependencies": {
     "@cloudflare/workers-types": "^4.20230404.0",
     "async": "2.6.4",
-    "bluebird": "3.5.2",
+    "bluebird": "3.7.2",
     "co": "4.6.0",
     "pg-copy-streams": "0.3.0",
     "typescript": "^4.0.3",
diff --git a/packages/pg/script/create-test-tables.js b/packages/pg/script/create-test-tables.js
index c4ec99f..622b0cd 100644
--- a/packages/pg/script/create-test-tables.js
+++ b/packages/pg/script/create-test-tables.js
@@ -31,41 +31,26 @@ var people = [
   { name: 'Zanzabar', age: 260 },
 ]
 
-var con = new pg.Client({
-  user: args.user,
-  password: args.password,
-  host: args.host,
-  port: args.port,
-  database: args.database,
-})
-
-con.connect((err) => {
-  if (err) {
-    throw err
-  }
-
-  con.query(
-    'DROP TABLE IF EXISTS person;' + ' CREATE TABLE person (id serial, name varchar(10), age integer)',
-    (err) => {
-      if (err) {
-        throw err
-      }
-
-      console.log('Created table person')
-      console.log('Filling it with people')
-
-      con.query(
-        'INSERT INTO person (name, age) VALUES' +
-          people.map((person) => ` ('${person.name}', ${person.age})`).join(','),
-        (err, result) => {
-          if (err) {
-            throw err
-          }
-
-          console.log(`Inserted ${result.rowCount} people`)
-          con.end()
-        }
-      )
-    }
+async function run() {
+  var con = new pg.Client({
+    user: args.user,
+    password: args.password,
+    host: args.host,
+    port: args.port,
+    database: args.database,
+  })
+  console.log('creating test dataset')
+  await con.connect()
+  await con.query('DROP TABLE IF EXISTS person')
+  await con.query('CREATE TABLE person (id serial, name varchar(10), age integer)')
+  await con.query(
+    'INSERT INTO person (name, age) VALUES' + people.map((person) => ` ('${person.name}', ${person.age})`).join(',')
   )
+  await con.end()
+  console.log('created test dataset')
+}
+
+run().catch((e) => {
+  console.log('setup failed', e)
+  process.exit(255)
 })
diff --git a/packages/pg/script/list-db-types.js b/packages/pg/script/list-db-types.js
deleted file mode 100644
index df179af..0000000
--- a/packages/pg/script/list-db-types.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict'
-var helper = require('../test/integration/test-helper')
-var pg = helper.pg
-pg.connect(
-  helper.config,
-  assert.success(function (client) {
-    var query = client.query("select oid, typname from pg_type where typtype = 'b' order by oid")
-    query.on('row', console.log)
-  })
-)
diff --git a/packages/pg/test/integration/client/api-tests.js b/packages/pg/test/integration/client/api-tests.js
index abaab69..686eabb 100644
--- a/packages/pg/test/integration/client/api-tests.js
+++ b/packages/pg/test/integration/client/api-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
@@ -102,6 +103,21 @@ suite.test('query no timeout', (cb) => {
   })
 })
 
+suite.test('query with timeout on query basis', (cb) => {
+  const pool = new pg.Pool()
+  pool.connect().then((client) => {
+    client.query(
+      { text: 'SELECT pg_sleep(20)', query_timeout: 1000 },
+      assert.calls(function (err, result) {
+        assert(err)
+        assert(err.message === 'Query read timeout')
+        client.release()
+        pool.end(cb)
+      })
+    )
+  })
+})
+
 suite.test('callback API', (done) => {
   const client = new helper.Client()
   client.query('CREATE TEMP TABLE peep(name text)')
diff --git a/packages/pg/test/integration/client/appname-tests.js b/packages/pg/test/integration/client/appname-tests.js
index ab7202a..e69f805 100644
--- a/packages/pg/test/integration/client/appname-tests.js
+++ b/packages/pg/test/integration/client/appname-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var Client = helper.Client
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
@@ -27,7 +28,6 @@ function getAppName(conf, cb) {
 }
 
 suite.test('No default appliation_name ', function (done) {
-  var conf = getConInfo()
   getAppName({}, function (res) {
     assert.strictEqual(res, '')
     done()
diff --git a/packages/pg/test/integration/client/array-tests.js b/packages/pg/test/integration/client/array-tests.js
index a321396..ce25bb7 100644
--- a/packages/pg/test/integration/client/array-tests.js
+++ b/packages/pg/test/integration/client/array-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/big-simple-query-tests.js b/packages/pg/test/integration/client/big-simple-query-tests.js
index b0dc252..a7e6770 100644
--- a/packages/pg/test/integration/client/big-simple-query-tests.js
+++ b/packages/pg/test/integration/client/big-simple-query-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var Query = helper.pg.Query
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
@@ -92,8 +93,7 @@ process.on('exit', function () {
 })
 
 var runBigQuery = function (client) {
-  var rows = []
-  var q = client.query(
+  client.query(
     "select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as bla from person where name = $1 or 1 = 1",
     [''],
     function (err, result) {
diff --git a/packages/pg/test/integration/client/configuration-tests.js b/packages/pg/test/integration/client/configuration-tests.js
index cf15c08..a4b0790 100644
--- a/packages/pg/test/integration/client/configuration-tests.js
+++ b/packages/pg/test/integration/client/configuration-tests.js
@@ -1,6 +1,8 @@
 'use strict'
 var helper = require('./test-helper')
 var pg = helper.pg
+const assert = require('assert')
+const { Client } = helper
 
 var suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/connection-timeout-tests.js b/packages/pg/test/integration/client/connection-timeout-tests.js
index 316e076..3d6b836 100644
--- a/packages/pg/test/integration/client/connection-timeout-tests.js
+++ b/packages/pg/test/integration/client/connection-timeout-tests.js
@@ -2,6 +2,7 @@
 const net = require('net')
 const buffers = require('../../test-buffers')
 const helper = require('./test-helper')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/custom-types-tests.js b/packages/pg/test/integration/client/custom-types-tests.js
index d1dd2ee..eb5fa89 100644
--- a/packages/pg/test/integration/client/custom-types-tests.js
+++ b/packages/pg/test/integration/client/custom-types-tests.js
@@ -2,6 +2,7 @@
 const helper = require('./test-helper')
 const Client = helper.pg.Client
 const suite = new helper.Suite()
+const assert = require('assert')
 
 const customTypes = {
   getTypeParser: () => () => 'okay!',
@@ -21,6 +22,21 @@ suite.test('custom type parser in client config', (done) => {
   })
 })
 
+suite.test('custom type parser in client config with multiple results', (done) => {
+  const client = new Client({ types: customTypes })
+
+  client.connect().then(() => {
+    client.query(
+      `SELECT 'foo'::text as name; SELECT 'bar'::text as baz`,
+      assert.success(function (res) {
+        assert.equal(res[0].rows[0].name, 'okay!')
+        assert.equal(res[1].rows[0].baz, 'okay!')
+        client.end().then(done)
+      })
+    )
+  })
+})
+
 // Custom type-parsers per query are not supported in native
 if (!helper.args.native) {
   suite.test('custom type parser in query', (done) => {
diff --git a/packages/pg/test/integration/client/empty-query-tests.js b/packages/pg/test/integration/client/empty-query-tests.js
index d887885..458a6f3 100644
--- a/packages/pg/test/integration/client/empty-query-tests.js
+++ b/packages/pg/test/integration/client/empty-query-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 const suite = new helper.Suite()
+const assert = require('assert')
 
 suite.test('empty query message handling', function (done) {
   const client = helper.client()
diff --git a/packages/pg/test/integration/client/error-handling-tests.js b/packages/pg/test/integration/client/error-handling-tests.js
index 4e879c9..0cf7dfa 100644
--- a/packages/pg/test/integration/client/error-handling-tests.js
+++ b/packages/pg/test/integration/client/error-handling-tests.js
@@ -1,9 +1,9 @@
 'use strict'
 
 var helper = require('./test-helper')
-var util = require('util')
 
 var pg = helper.pg
+const assert = require('assert')
 const Client = pg.Client
 const DatabaseError = pg.DatabaseError
 
@@ -113,7 +113,7 @@ var ensureFuture = function (testClient, done) {
 suite.test('when query is parsing', (done) => {
   var client = createErorrClient()
 
-  var q = client.query({ text: 'CREATE TEMP TABLE boom(age integer); INSERT INTO boom (age) VALUES (28);' })
+  client.query({ text: 'CREATE TEMP TABLE boom(age integer); INSERT INTO boom (age) VALUES (28);' })
 
   // this query wont parse since there isn't a table named bang
   var query = client.query(
@@ -131,7 +131,7 @@ suite.test('when query is parsing', (done) => {
 suite.test('when a query is binding', function (done) {
   var client = createErorrClient()
 
-  var q = client.query({ text: 'CREATE TEMP TABLE boom(age integer); INSERT INTO boom (age) VALUES (28);' })
+  client.query({ text: 'CREATE TEMP TABLE boom(age integer); INSERT INTO boom (age) VALUES (28);' })
 
   var query = client.query(
     new pg.Query({
diff --git a/packages/pg/test/integration/client/huge-numeric-tests.js b/packages/pg/test/integration/client/huge-numeric-tests.js
index bdbfac2..719e9b4 100644
--- a/packages/pg/test/integration/client/huge-numeric-tests.js
+++ b/packages/pg/test/integration/client/huge-numeric-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 const pool = new helper.pg.Pool()
+const assert = require('assert')
 
 pool.connect(
   assert.success(function (client, done) {
diff --git a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js
index f970faa..1e32749 100644
--- a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js
+++ b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var Client = helper.Client
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/multiple-results-tests.js b/packages/pg/test/integration/client/multiple-results-tests.js
index c272951..89c9f00 100644
--- a/packages/pg/test/integration/client/multiple-results-tests.js
+++ b/packages/pg/test/integration/client/multiple-results-tests.js
@@ -33,7 +33,7 @@ suite.test(
 
     // TODO should be text or sql?
     try {
-      const results = yield client.query({
+      yield client.query({
         text: `SELECT 'foo'::text as name; SELECT 'bar'::text as baz`,
         queryMode: 'extended',
       })
diff --git a/packages/pg/test/integration/client/network-partition-tests.js b/packages/pg/test/integration/client/network-partition-tests.js
index 8397821..589ae12 100644
--- a/packages/pg/test/integration/client/network-partition-tests.js
+++ b/packages/pg/test/integration/client/network-partition-tests.js
@@ -2,6 +2,7 @@
 var buffers = require('../../test-buffers')
 var helper = require('./test-helper')
 var suite = new helper.Suite()
+const assert = require('assert')
 
 var net = require('net')
 
diff --git a/packages/pg/test/integration/client/no-data-tests.js b/packages/pg/test/integration/client/no-data-tests.js
index ad0f22b..382b6ff 100644
--- a/packages/pg/test/integration/client/no-data-tests.js
+++ b/packages/pg/test/integration/client/no-data-tests.js
@@ -1,11 +1,12 @@
 'use strict'
 var helper = require('./test-helper')
 const suite = new helper.Suite()
+const assert = require('assert')
 
 suite.test('noData message handling', function () {
   var client = helper.client()
 
-  var q = client.query({
+  client.query({
     name: 'boom',
     text: 'create temp table boom(id serial, size integer)',
   })
@@ -29,7 +30,7 @@ suite.test('noData message handling', function () {
     values: [101],
   })
 
-  var query = client.query(
+  client.query(
     {
       name: 'fetch',
       text: 'select size from boom where size < $1',
diff --git a/packages/pg/test/integration/client/no-row-result-tests.js b/packages/pg/test/integration/client/no-row-result-tests.js
index 6e8f52c..fa84f1d 100644
--- a/packages/pg/test/integration/client/no-row-result-tests.js
+++ b/packages/pg/test/integration/client/no-row-result-tests.js
@@ -3,6 +3,7 @@ var helper = require('./test-helper')
 var pg = helper.pg
 const suite = new helper.Suite()
 const pool = new pg.Pool()
+const assert = require('assert')
 
 suite.test('can access results when no rows are returned', function (done) {
   var checkResult = function (result) {
diff --git a/packages/pg/test/integration/client/parse-int-8-tests.js b/packages/pg/test/integration/client/parse-int-8-tests.js
index 9f251de..150ee7b 100644
--- a/packages/pg/test/integration/client/parse-int-8-tests.js
+++ b/packages/pg/test/integration/client/parse-int-8-tests.js
@@ -3,6 +3,7 @@
 var helper = require('../test-helper')
 var pg = helper.pg
 const suite = new helper.Suite()
+const assert = require('assert')
 
 const pool = new pg.Pool(helper.config)
 suite.test('ability to turn on and off parser', function () {
diff --git a/packages/pg/test/integration/client/prepared-statement-tests.js b/packages/pg/test/integration/client/prepared-statement-tests.js
index ebc1f73..0d01007 100644
--- a/packages/pg/test/integration/client/prepared-statement-tests.js
+++ b/packages/pg/test/integration/client/prepared-statement-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 var Query = helper.pg.Query
 
+const assert = require('assert')
 var suite = new helper.Suite()
 
 ;(function () {
@@ -9,7 +10,6 @@ var suite = new helper.Suite()
   client.on('drain', client.end.bind(client))
 
   var queryName = 'user by age and like name'
-  var parseCount = 0
 
   suite.test('first named prepared statement', function (done) {
     var query = client.query(
@@ -89,7 +89,7 @@ var suite = new helper.Suite()
   var client2 = helper.client()
 
   suite.test('client 1 execution', function (done) {
-    var query = client1.query(
+    client1.query(
       {
         name: statementName,
         text: statement1,
diff --git a/packages/pg/test/integration/client/promise-api-tests.js b/packages/pg/test/integration/client/promise-api-tests.js
index d8128cf..a536ce4 100644
--- a/packages/pg/test/integration/client/promise-api-tests.js
+++ b/packages/pg/test/integration/client/promise-api-tests.js
@@ -2,6 +2,7 @@
 
 const helper = require('./test-helper')
 const pg = helper.pg
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/query-as-promise-tests.js b/packages/pg/test/integration/client/query-as-promise-tests.js
index 30c106f..beb17b1 100644
--- a/packages/pg/test/integration/client/query-as-promise-tests.js
+++ b/packages/pg/test/integration/client/query-as-promise-tests.js
@@ -2,6 +2,7 @@
 var bluebird = require('bluebird')
 var helper = require('../test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 process.on('unhandledRejection', function (e) {
   console.error(e, e.stack)
diff --git a/packages/pg/test/integration/client/query-column-names-tests.js b/packages/pg/test/integration/client/query-column-names-tests.js
index a109209..fe537a9 100644
--- a/packages/pg/test/integration/client/query-column-names-tests.js
+++ b/packages/pg/test/integration/client/query-column-names-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 new helper.Suite().test('support for complex column names', function () {
   const pool = new pg.Pool()
diff --git a/packages/pg/test/integration/client/query-error-handling-prepared-statement-tests.js b/packages/pg/test/integration/client/query-error-handling-prepared-statement-tests.js
index adef58d..6b8af70 100644
--- a/packages/pg/test/integration/client/query-error-handling-prepared-statement-tests.js
+++ b/packages/pg/test/integration/client/query-error-handling-prepared-statement-tests.js
@@ -1,7 +1,8 @@
 'use strict'
 var helper = require('./test-helper')
 var Query = helper.pg.Query
-var util = require('util')
+const { Client } = helper
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/client/query-error-handling-tests.js b/packages/pg/test/integration/client/query-error-handling-tests.js
index 3ede5d9..c7af6bd 100644
--- a/packages/pg/test/integration/client/query-error-handling-tests.js
+++ b/packages/pg/test/integration/client/query-error-handling-tests.js
@@ -1,10 +1,12 @@
 'use strict'
 var helper = require('./test-helper')
-var util = require('util')
 var Query = helper.pg.Query
 var DatabaseError = helper.pg.DatabaseError
+const assert = require('assert')
+const { Client } = helper
+const suite = new helper.Suite()
 
-test('error during query execution', function () {
+suite.test('error during query execution', function () {
   var client = new Client(helper.args)
   client.connect(
     assert.success(function () {
@@ -61,7 +63,7 @@ if (helper.config.native) {
   return
 }
 
-test('9.3 column error fields', function () {
+suite.test('9.3 column error fields', function () {
   var client = new Client(helper.args)
   client.connect(
     assert.success(function () {
@@ -90,7 +92,7 @@ test('9.3 column error fields', function () {
   )
 })
 
-test('9.3 constraint error fields', function () {
+suite.test('9.3 constraint error fields', function () {
   var client = new Client(helper.args)
   client.connect(
     assert.success(function () {
diff --git a/packages/pg/test/integration/client/result-metadata-tests.js b/packages/pg/test/integration/client/result-metadata-tests.js
index 66d9ac4..fbd375e 100644
--- a/packages/pg/test/integration/client/result-metadata-tests.js
+++ b/packages/pg/test/integration/client/result-metadata-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 const pool = new pg.Pool()
 new helper.Suite().test('should return insert metadata', function () {
@@ -19,7 +20,7 @@ new helper.Suite().test('should return insert metadata', function () {
               assert.equal(result.oid, null)
               assert.equal(result.command, 'CREATE')
 
-              var q = client.query(
+              client.query(
                 "INSERT INTO zugzug(name) VALUES('more work?')",
                 assert.calls(function (err, result) {
                   assert(!err)
diff --git a/packages/pg/test/integration/client/results-as-array-tests.js b/packages/pg/test/integration/client/results-as-array-tests.js
index 5ebb2a9..3e30e97 100644
--- a/packages/pg/test/integration/client/results-as-array-tests.js
+++ b/packages/pg/test/integration/client/results-as-array-tests.js
@@ -1,12 +1,14 @@
 'use strict'
 var util = require('util')
 var helper = require('./test-helper')
+const assert = require('assert')
+const suite = new helper.Suite()
 
 var Client = helper.Client
 
 var conInfo = helper.config
 
-test('returns results as array', function () {
+suite.test('returns results as array', function () {
   var client = new Client(conInfo)
   var checkRow = function (row) {
     assert(util.isArray(row), 'row should be an array')
@@ -23,7 +25,7 @@ test('returns results as array', function () {
         values: ['hai'],
         rowMode: 'array',
       }
-      var query = client.query(
+      client.query(
         config,
         assert.success(function (result) {
           assert.equal(result.rows.length, 1)
diff --git a/packages/pg/test/integration/client/row-description-on-results-tests.js b/packages/pg/test/integration/client/row-description-on-results-tests.js
index 688b96e..deb9a21 100644
--- a/packages/pg/test/integration/client/row-description-on-results-tests.js
+++ b/packages/pg/test/integration/client/row-description-on-results-tests.js
@@ -1,5 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
+const assert = require('assert')
+const suite = new helper.Suite()
 
 var Client = helper.Client
 
@@ -17,7 +19,7 @@ var checkResult = function (result) {
   assert.equal(fields[2].dataTypeID, 25)
 }
 
-test('row descriptions on result object', function () {
+suite.test('row descriptions on result object', function () {
   var client = new Client(conInfo)
   client.connect(
     assert.success(function () {
@@ -33,7 +35,7 @@ test('row descriptions on result object', function () {
   )
 })
 
-test('row description on no rows', function () {
+suite.test('row description on no rows', function () {
   var client = new Client(conInfo)
   client.connect(
     assert.success(function () {
diff --git a/packages/pg/test/integration/client/sasl-scram-tests.js b/packages/pg/test/integration/client/sasl-scram-tests.js
index 8e1a121..2428287 100644
--- a/packages/pg/test/integration/client/sasl-scram-tests.js
+++ b/packages/pg/test/integration/client/sasl-scram-tests.js
@@ -3,6 +3,7 @@ const helper = require('./../test-helper')
 const pg = helper.pg
 const suite = new helper.Suite()
 const { native } = helper.args
+const assert = require('assert')
 
 /**
  * This test only executes if the env variables SCRAM_TEST_PGUSER and
diff --git a/packages/pg/test/integration/client/simple-query-tests.js b/packages/pg/test/integration/client/simple-query-tests.js
index d22d747..93d859b 100644
--- a/packages/pg/test/integration/client/simple-query-tests.js
+++ b/packages/pg/test/integration/client/simple-query-tests.js
@@ -1,6 +1,9 @@
 'use strict'
 var helper = require('./test-helper')
 var Query = helper.pg.Query
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 // before running this test make sure you run the script create-test-tables
 test('simple query interface', function () {
@@ -18,6 +21,7 @@ test('simple query interface', function () {
   query.once('row', function (row) {
     test('Can iterate through columns', function () {
       var columnCount = 0
+      // eslint-disable-next-line @typescript-eslint/no-unused-vars
       for (var column in row) {
         columnCount++
       }
diff --git a/packages/pg/test/integration/client/ssl-tests.js b/packages/pg/test/integration/client/ssl-tests.js
index 97aa594..bece48f 100644
--- a/packages/pg/test/integration/client/ssl-tests.js
+++ b/packages/pg/test/integration/client/ssl-tests.js
@@ -1,19 +1,22 @@
 'use strict'
-var pg = require('../../../lib')
-var config = require('./test-helper').config
-test('can connect with ssl', function () {
-  return false
-  config.ssl = {
-    rejectUnauthorized: false,
+const helper = require('./test-helper')
+const assert = require('assert')
+const suite = new helper.Suite()
+
+suite.test('can connect with ssl', function () {
+  const config = {
+    ...helper.config,
+    ssl: {
+      rejectUnauthorized: false,
+    },
   }
-  pg.connect(
-    config,
-    assert.success(function (client) {
-      return false
+  const client = new helper.pg.Client(config)
+  client.connect(
+    assert.success(function () {
       client.query(
         'SELECT NOW()',
         assert.success(function () {
-          pg.end()
+          client.end()
         })
       )
     })
diff --git a/packages/pg/test/integration/client/statement_timeout-tests.js b/packages/pg/test/integration/client/statement_timeout-tests.js
index e0898cc..fc67a7c 100644
--- a/packages/pg/test/integration/client/statement_timeout-tests.js
+++ b/packages/pg/test/integration/client/statement_timeout-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 var Client = helper.Client
 
+const assert = require('assert')
 var suite = new helper.Suite()
 
 var conInfo = helper.config
diff --git a/packages/pg/test/integration/client/timezone-tests.js b/packages/pg/test/integration/client/timezone-tests.js
index c9f6a8c..f005990 100644
--- a/packages/pg/test/integration/client/timezone-tests.js
+++ b/packages/pg/test/integration/client/timezone-tests.js
@@ -1,6 +1,6 @@
 'use strict'
 var helper = require('./../test-helper')
-var exec = require('child_process').exec
+const assert = require('assert')
 
 var oldTz = process.env.TZ
 process.env.TZ = 'Europe/Berlin'
@@ -21,6 +21,11 @@ pool.connect(function (err, client, done) {
     })
   })
 
+  suite.testAsync('date comes out as a date', async function () {
+    const { rows } = await client.query('SELECT NOW()::DATE AS date')
+    assert(rows[0].date instanceof Date)
+  })
+
   suite.test('timestamp with time zone', function (cb) {
     client.query('SELECT CAST($1 AS TIMESTAMP WITH TIME ZONE) AS "val"', [date], function (err, result) {
       assert(!err)
diff --git a/packages/pg/test/integration/client/transaction-tests.js b/packages/pg/test/integration/client/transaction-tests.js
index 18f8ff0..11cffe2 100644
--- a/packages/pg/test/integration/client/transaction-tests.js
+++ b/packages/pg/test/integration/client/transaction-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 const suite = new helper.Suite()
 const pg = helper.pg
+const assert = require('assert')
 
 const client = new pg.Client()
 client.connect(
diff --git a/packages/pg/test/integration/client/type-coercion-tests.js b/packages/pg/test/integration/client/type-coercion-tests.js
index 3bc6273..587a28c 100644
--- a/packages/pg/test/integration/client/type-coercion-tests.js
+++ b/packages/pg/test/integration/client/type-coercion-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 var pg = helper.pg
 const suite = new helper.Suite()
+const assert = require('assert')
 
 var testForTypeCoercion = function (type) {
   const pool = new pg.Pool()
@@ -14,7 +15,7 @@ var testForTypeCoercion = function (type) {
           assert(!err)
 
           type.values.forEach(function (val) {
-            var insertQuery = client.query(
+            client.query(
               'insert into test_type(col) VALUES($1)',
               [val],
               assert.calls(function (err, result) {
@@ -135,13 +136,11 @@ if (helper.config.binary) {
   })
 }
 
-var valueCount = 0
-
 types.forEach(function (type) {
   testForTypeCoercion(type)
 })
 
-suite.test('timestampz round trip', function (cb) {
+suite.test('timestamptz round trip', function (cb) {
   var now = new Date()
   var client = helper.client()
   client.query('create temp table date_tests(name varchar(10), tstz timestamptz(3))')
diff --git a/packages/pg/test/integration/client/type-parser-override-tests.js b/packages/pg/test/integration/client/type-parser-override-tests.js
index 42c3daf..5f7216a 100644
--- a/packages/pg/test/integration/client/type-parser-override-tests.js
+++ b/packages/pg/test/integration/client/type-parser-override-tests.js
@@ -1,5 +1,6 @@
 'use strict'
 var helper = require('./test-helper')
+const assert = require('assert')
 
 function testTypeParser(client, expectedResult, done) {
   var boolValue = true
diff --git a/packages/pg/test/integration/connection-pool/connection-pool-size-tests.js b/packages/pg/test/integration/connection-pool/connection-pool-size-tests.js
index 1d87584..2d16fe4 100644
--- a/packages/pg/test/integration/connection-pool/connection-pool-size-tests.js
+++ b/packages/pg/test/integration/connection-pool/connection-pool-size-tests.js
@@ -5,7 +5,7 @@ const assert = require('assert')
 const suite = new helper.Suite()
 
 const testPoolSize = function (max) {
-  suite.testAsync(`test ${max} queries executed on a pool rapidly`, () => {
+  suite.testAsync(`test ${max} queries executed on a pool rapidly`, async () => {
     const pool = new helper.pg.Pool({ max: 10 })
 
     let count = 0
diff --git a/packages/pg/test/integration/connection-pool/error-tests.js b/packages/pg/test/integration/connection-pool/error-tests.js
index f3f9cdc..9f20aa4 100644
--- a/packages/pg/test/integration/connection-pool/error-tests.js
+++ b/packages/pg/test/integration/connection-pool/error-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 const pg = helper.pg
 const native = helper.args.native
+const assert = require('assert')
 
 const suite = new helper.Suite()
 suite.test('connecting to invalid port', (cb) => {
@@ -18,7 +19,6 @@ suite.test('errors emitted on checked-out clients', (cb) => {
       client.query('SELECT NOW()', function () {
         pool.connect(
           assert.success(function (client2, done2) {
-            var pidColName = 'procpid'
             helper.versionGTE(
               client2,
               90200,
diff --git a/packages/pg/test/integration/connection-pool/idle-timeout-tests.js b/packages/pg/test/integration/connection-pool/idle-timeout-tests.js
index f36b693..2bfe8e4 100644
--- a/packages/pg/test/integration/connection-pool/idle-timeout-tests.js
+++ b/packages/pg/test/integration/connection-pool/idle-timeout-tests.js
@@ -1,5 +1,6 @@
 'use strict'
 var helper = require('./test-helper')
+const assert = require('assert')
 
 new helper.Suite().test('idle timeout', function () {
   const config = Object.assign({}, helper.config, { idleTimeoutMillis: 50 })
diff --git a/packages/pg/test/integration/connection-pool/native-instance-tests.js b/packages/pg/test/integration/connection-pool/native-instance-tests.js
index a981503..8cd494e 100644
--- a/packages/pg/test/integration/connection-pool/native-instance-tests.js
+++ b/packages/pg/test/integration/connection-pool/native-instance-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./../test-helper')
 var pg = helper.pg
 var native = helper.args.native
+const assert = require('assert')
 
 var pool = new pg.Pool()
 
diff --git a/packages/pg/test/integration/connection-pool/yield-support-tests.js b/packages/pg/test/integration/connection-pool/yield-support-tests.js
index 00508f5..cc3d270 100644
--- a/packages/pg/test/integration/connection-pool/yield-support-tests.js
+++ b/packages/pg/test/integration/connection-pool/yield-support-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('./test-helper')
 var co = require('co')
+const assert = require('assert')
 
 const pool = new helper.pg.Pool()
 new helper.Suite().test(
diff --git a/packages/pg/test/integration/connection/bound-command-tests.js b/packages/pg/test/integration/connection/bound-command-tests.js
deleted file mode 100644
index 15f4f79..0000000
--- a/packages/pg/test/integration/connection/bound-command-tests.js
+++ /dev/null
@@ -1,58 +0,0 @@
-'use strict'
-var helper = require('./test-helper')
-// http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
-
-test('flushing once', function () {
-  helper.connect(function (con) {
-    con.parse({
-      text: 'select * from ids',
-    })
-
-    con.bind()
-    con.execute()
-    con.flush()
-
-    assert.emits(con, 'parseComplete')
-    assert.emits(con, 'bindComplete')
-    assert.emits(con, 'dataRow')
-    assert.emits(con, 'commandComplete', function () {
-      con.sync()
-    })
-    assert.emits(con, 'readyForQuery', function () {
-      con.end()
-    })
-  })
-})
-
-test('sending many flushes', function () {
-  helper.connect(function (con) {
-    assert.emits(con, 'parseComplete', function () {
-      con.bind()
-      con.flush()
-    })
-
-    assert.emits(con, 'bindComplete', function () {
-      con.execute()
-      con.flush()
-    })
-
-    assert.emits(con, 'dataRow', function (msg) {
-      assert.equal(msg.fields[0], 1)
-      assert.emits(con, 'dataRow', function (msg) {
-        assert.equal(msg.fields[0], 2)
-        assert.emits(con, 'commandComplete', function () {
-          con.sync()
-        })
-        assert.emits(con, 'readyForQuery', function () {
-          con.end()
-        })
-      })
-    })
-
-    con.parse({
-      text: 'select * from ids order by id',
-    })
-
-    con.flush()
-  })
-})
diff --git a/packages/pg/test/integration/connection/copy-tests.js b/packages/pg/test/integration/connection/copy-tests.js
deleted file mode 100644
index 177009d..0000000
--- a/packages/pg/test/integration/connection/copy-tests.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict'
-var helper = require('./test-helper')
-var assert = require('assert')
-
-test('COPY FROM events check', function () {
-  helper.connect(function (con) {
-    var stdinStream = con.query('COPY person FROM STDIN')
-    con.on('copyInResponse', function () {
-      con.endCopyFrom()
-    })
-    assert.emits(
-      con,
-      'copyInResponse',
-      function () {
-        con.endCopyFrom()
-      },
-      'backend should  emit copyInResponse after COPY FROM query'
-    )
-    assert.emits(
-      con,
-      'commandComplete',
-      function () {
-        con.end()
-      },
-      'backend should emit commandComplete after COPY FROM stream ends'
-    )
-  })
-})
-test('COPY TO events check', function () {
-  helper.connect(function (con) {
-    var stdoutStream = con.query('COPY person TO STDOUT')
-    assert.emits(con, 'copyOutResponse', function () {}, 'backend should emit copyOutResponse after COPY TO query')
-    assert.emits(con, 'copyData', function () {}, 'backend should emit copyData on every data row')
-    assert.emits(
-      con,
-      'copyDone',
-      function () {
-        con.end()
-      },
-      'backend should emit copyDone after all data rows'
-    )
-  })
-})
diff --git a/packages/pg/test/integration/connection/dynamic-password-tests.js b/packages/pg/test/integration/connection/dynamic-password-tests.js
deleted file mode 100644
index 3ab39d0..0000000
--- a/packages/pg/test/integration/connection/dynamic-password-tests.js
+++ /dev/null
@@ -1,119 +0,0 @@
-'use strict'
-const assert = require('assert')
-const helper = require('./../test-helper')
-const suite = new helper.Suite()
-const pg = require('../../../lib/index')
-const Client = pg.Client
-
-const password = process.env.PGPASSWORD || null
-const sleep = (millis) => new Promise((resolve) => setTimeout(resolve, millis))
-
-if (!password) {
-  // skip these tests; no password will be requested
-  return
-}
-
-suite.testAsync('Get password from a sync function', () => {
-  let wasCalled = false
-  function getPassword() {
-    wasCalled = true
-    return password
-  }
-  const client = new Client({
-    password: getPassword,
-  })
-  return client.connect().then(() => {
-    assert.ok(wasCalled, 'Our password function should have been called')
-    return client.end()
-  })
-})
-
-suite.testAsync('Throw error from a sync function', () => {
-  let wasCalled = false
-  const myError = new Error('Oops!')
-  function getPassword() {
-    wasCalled = true
-    throw myError
-  }
-  const client = new Client({
-    password: getPassword,
-  })
-  let wasThrown = false
-  return client
-    .connect()
-    .catch((err) => {
-      assert.equal(err, myError, 'Our sync error should have been thrown')
-      wasThrown = true
-    })
-    .then(() => {
-      assert.ok(wasCalled, 'Our password function should have been called')
-      assert.ok(wasThrown, 'Our error should have been thrown')
-      return client.end()
-    })
-})
-
-suite.testAsync('Get password from a function asynchronously', () => {
-  let wasCalled = false
-  function getPassword() {
-    wasCalled = true
-    return sleep(100).then(() => password)
-  }
-  const client = new Client({
-    password: getPassword,
-  })
-  return client.connect().then(() => {
-    assert.ok(wasCalled, 'Our password function should have been called')
-    return client.end()
-  })
-})
-
-suite.testAsync('Throw error from an async function', () => {
-  let wasCalled = false
-  const myError = new Error('Oops!')
-  function getPassword() {
-    wasCalled = true
-    return sleep(100).then(() => {
-      throw myError
-    })
-  }
-  const client = new Client({
-    password: getPassword,
-  })
-  let wasThrown = false
-  return client
-    .connect()
-    .catch((err) => {
-      assert.equal(err, myError, 'Our async error should have been thrown')
-      wasThrown = true
-    })
-    .then(() => {
-      assert.ok(wasCalled, 'Our password function should have been called')
-      assert.ok(wasThrown, 'Our error should have been thrown')
-      return client.end()
-    })
-})
-
-suite.testAsync('Password function must return a string', () => {
-  let wasCalled = false
-  function getPassword() {
-    wasCalled = true
-    // Return a password that is not a string
-    return 12345
-  }
-  const client = new Client({
-    password: getPassword,
-  })
-  let wasThrown = false
-  return client
-    .connect()
-    .catch((err) => {
-      assert.ok(err instanceof TypeError, 'A TypeError should have been thrown')
-      assert.equal(err.message, 'Password must be a string')
-      wasThrown = true
-    })
-    .then(() => {
-      assert.ok(wasCalled, 'Our password function should have been called')
-      assert.ok(wasThrown, 'Our error should have been thrown')
-      return client.end()
-    })
-})
diff --git a/packages/pg/test/integration/connection/notification-tests.js b/packages/pg/test/integration/connection/notification-tests.js
deleted file mode 100644
index 534106d..0000000
--- a/packages/pg/test/integration/connection/notification-tests.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict'
-var helper = require('./test-helper')
-// http://www.postgresql.org/docs/8.3/static/libpq-notify.html
-test('recieves notification from same connection with no payload', function () {
-  helper.connect(function (con) {
-    con.query('LISTEN boom')
-    assert.emits(con, 'readyForQuery', function () {
-      con.query('NOTIFY boom')
-      assert.emits(con, 'notification', function (msg) {
-        assert.equal(msg.payload, '')
-        assert.equal(msg.channel, 'boom')
-        con.end()
-      })
-    })
-  })
-})
diff --git a/packages/pg/test/integration/connection/query-tests.js b/packages/pg/test/integration/connection/query-tests.js
deleted file mode 100644
index 4105bb7..0000000
--- a/packages/pg/test/integration/connection/query-tests.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict'
-var helper = require('./test-helper')
-var assert = require('assert')
-
-var rows = []
-// testing the low level 1-1 mapping api of client to postgres messages
-// it's cumbersome to use the api this way
-test('simple query', function () {
-  helper.connect(function (con) {
-    con.query('select * from ids')
-    assert.emits(con, 'dataRow')
-    con.on('dataRow', function (msg) {
-      rows.push(msg.fields)
-    })
-    assert.emits(con, 'readyForQuery', function () {
-      con.end()
-    })
-  })
-})
-
-process.on('exit', function () {
-  assert.equal(rows.length, 2)
-  assert.equal(rows[0].length, 1)
-  assert.strictEqual(String(rows[0][0]), '1')
-  assert.strictEqual(String(rows[1][0]), '2')
-})
diff --git a/packages/pg/test/integration/connection/test-helper.js b/packages/pg/test/integration/connection/test-helper.js
deleted file mode 100644
index 475f303..0000000
--- a/packages/pg/test/integration/connection/test-helper.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict'
-var net = require('net')
-var helper = require('../test-helper')
-var Connection = require('../../../lib/connection')
-var utils = require('../../../lib/utils')
-const crypto = require('../../../lib/crypto/utils')
-var connect = function (callback) {
-  var username = helper.args.user
-  var database = helper.args.database
-  var con = new Connection({ stream: new net.Stream() })
-  con.on('error', function (error) {
-    console.log(error)
-    throw new Error('Connection error')
-  })
-  con.connect(helper.args.port || '5432', helper.args.host || 'localhost')
-  con.once('connect', function () {
-    con.startup({
-      user: username,
-      database: database,
-    })
-    con.once('authenticationCleartextPassword', function () {
-      con.password(helper.args.password)
-    })
-    con.once('authenticationMD5Password', async function (msg) {
-      con.password(await crypto.postgresMd5PasswordHash(helper.args.user, helper.args.password, msg.salt))
-    })
-    con.once('readyForQuery', function () {
-      con.query('create temp table ids(id integer)')
-      con.once('readyForQuery', function () {
-        con.query('insert into ids(id) values(1); insert into ids(id) values(2);')
-        con.once('readyForQuery', function () {
-          callback(con)
-        })
-      })
-    })
-  })
-}
-
-module.exports = {
-  connect: connect,
-}
diff --git a/packages/pg/test/integration/domain-tests.js b/packages/pg/test/integration/domain-tests.js
index ce46eb8..78c7663 100644
--- a/packages/pg/test/integration/domain-tests.js
+++ b/packages/pg/test/integration/domain-tests.js
@@ -1,10 +1,10 @@
 'use strict'
-var async = require('async')
 
 var helper = require('./test-helper')
 var Query = helper.pg.Query
 var suite = new helper.Suite()
 
+const assert = require('assert')
 const Pool = helper.pg.Pool
 
 suite.test('no domain', function (cb) {
@@ -30,7 +30,7 @@ suite.test('with domain', function (cb) {
       assert.success(function (client, done) {
         assert(process.domain, 'no domain exists in connect callback')
         assert.equal(startingDomain, process.domain, 'domain was lost when checking out a client')
-        var query = client.query(
+        client.query(
           'SELECT NOW()',
           assert.success(function () {
             assert(process.domain, 'no domain exists in query callback')
diff --git a/packages/pg/test/integration/gh-issues/1105-tests.js b/packages/pg/test/integration/gh-issues/1105-tests.js
index d9885f8..1e3f74c 100644
--- a/packages/pg/test/integration/gh-issues/1105-tests.js
+++ b/packages/pg/test/integration/gh-issues/1105-tests.js
@@ -1,4 +1,3 @@
-const pg = require('../../../lib')
 const helper = require('../test-helper')
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/gh-issues/130-tests.js b/packages/pg/test/integration/gh-issues/130-tests.js
index fb86b5b..00aae42 100644
--- a/packages/pg/test/integration/gh-issues/130-tests.js
+++ b/packages/pg/test/integration/gh-issues/130-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var exec = require('child_process').exec
+const assert = require('assert')
 
 helper.pg.defaults.poolIdleTimeout = 1000
 
diff --git a/packages/pg/test/integration/gh-issues/131-tests.js b/packages/pg/test/integration/gh-issues/131-tests.js
index 5838067..b169849 100644
--- a/packages/pg/test/integration/gh-issues/131-tests.js
+++ b/packages/pg/test/integration/gh-issues/131-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 var suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/gh-issues/1542-tests.js b/packages/pg/test/integration/gh-issues/1542-tests.js
index f65aa3f..6ad075b 100644
--- a/packages/pg/test/integration/gh-issues/1542-tests.js
+++ b/packages/pg/test/integration/gh-issues/1542-tests.js
@@ -17,6 +17,6 @@ suite.testAsync('BoundPool can be subclassed', async () => {
 suite.test('calling pg.Pool without new throws', () => {
   const Pool = helper.pg.Pool
   assert.throws(() => {
-    const pool = Pool()
+    Pool()
   })
 })
diff --git a/packages/pg/test/integration/gh-issues/199-tests.js b/packages/pg/test/integration/gh-issues/199-tests.js
index 2710020..78d4cd3 100644
--- a/packages/pg/test/integration/gh-issues/199-tests.js
+++ b/packages/pg/test/integration/gh-issues/199-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var client = helper.client()
+const assert = require('assert')
 
 client.query('CREATE TEMP TABLE arrtest (n integer, s varchar)')
 client.query("INSERT INTO arrtest VALUES (4, 'foo'), (5, 'bar'), (6, 'baz');")
diff --git a/packages/pg/test/integration/gh-issues/2064-tests.js b/packages/pg/test/integration/gh-issues/2064-tests.js
index 6118ca2..0878b79 100644
--- a/packages/pg/test/integration/gh-issues/2064-tests.js
+++ b/packages/pg/test/integration/gh-issues/2064-tests.js
@@ -25,7 +25,6 @@ suite.test('Password should not exist in util.inspect output', () => {
 suite.test('Password should not exist in json.stringfy output', () => {
   const pool = new helper.pg.Pool({ password })
   const client = new helper.pg.Client({ password })
-  const depth = 20
   assert(JSON.stringify(pool).indexOf(password) === -1)
   assert(JSON.stringify(client).indexOf(password) === -1)
 })
diff --git a/packages/pg/test/integration/gh-issues/2303-tests.js b/packages/pg/test/integration/gh-issues/2303-tests.js
index 7496a6f..533ae16 100644
--- a/packages/pg/test/integration/gh-issues/2303-tests.js
+++ b/packages/pg/test/integration/gh-issues/2303-tests.js
@@ -25,7 +25,6 @@ suite.test('SSL Key should not exist in util.inspect output', () => {
 suite.test('SSL Key should not exist in json.stringfy output', () => {
   const pool = new helper.pg.Pool({ ssl: { key: secret_value } })
   const client = new helper.pg.Client({ ssl: { key: secret_value } })
-  const depth = 20
   assert(JSON.stringify(pool).indexOf(secret_value) === -1)
   assert(JSON.stringify(client).indexOf(secret_value) === -1)
 })
diff --git a/packages/pg/test/integration/gh-issues/2307-tests.js b/packages/pg/test/integration/gh-issues/2307-tests.js
index d5f7c05..240ac13 100644
--- a/packages/pg/test/integration/gh-issues/2307-tests.js
+++ b/packages/pg/test/integration/gh-issues/2307-tests.js
@@ -2,6 +2,7 @@
 
 const pg = require('../../../lib')
 const helper = require('../test-helper')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/gh-issues/2416-tests.js b/packages/pg/test/integration/gh-issues/2416-tests.js
index 669eb77..1bb5aef 100644
--- a/packages/pg/test/integration/gh-issues/2416-tests.js
+++ b/packages/pg/test/integration/gh-issues/2416-tests.js
@@ -1,4 +1,5 @@
 const helper = require('../test-helper')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/gh-issues/2627-tests.js b/packages/pg/test/integration/gh-issues/2627-tests.js
index 83e09b9..19f07f8 100644
--- a/packages/pg/test/integration/gh-issues/2627-tests.js
+++ b/packages/pg/test/integration/gh-issues/2627-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 const net = require('net')
 const helper = require('./../test-helper')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js
new file mode 100644
index 0000000..49ac590
--- /dev/null
+++ b/packages/pg/test/integration/gh-issues/3174-tests.js
@@ -0,0 +1,167 @@
+const net = require('net')
+const buffers = require('../../test-buffers')
+const helper = require('../test-helper')
+const assert = require('assert')
+const cli = require('../../cli')
+
+const suite = new helper.Suite()
+
+const options = {
+  host: 'localhost',
+  port: Math.floor(Math.random() * 2000) + 2000,
+  connectionTimeoutMillis: 2000,
+  user: 'not',
+  database: 'existing',
+}
+
+const startMockServer = (port, badBuffer, callback) => {
+  const sockets = new Set()
+
+  const server = net.createServer((socket) => {
+    sockets.add(socket)
+    socket.once('end', () => sockets.delete(socket))
+
+    socket.on('data', (data) => {
+      // deny request for SSL
+      if (data.length === 8) {
+        socket.write(Buffer.from('N', 'utf8'))
+        return
+        // consider all authentication requests as good
+      }
+      // the initial message coming in has a 0 message type for authentication negotiation
+      if (!data[0]) {
+        socket.write(buffers.authenticationOk())
+        // send ReadyForQuery `timeout` ms after authentication
+        socket.write(buffers.readyForQuery())
+        return
+        // respond with our canned response
+      }
+      const code = data.toString('utf8', 0, 1)
+      switch (code) {
+        // parse
+        case 'P':
+          socket.write(buffers.parseComplete())
+          socket.write(buffers.bindComplete())
+          socket.write(buffers.rowDescription())
+          socket.write(buffers.dataRow())
+          socket.write(buffers.commandComplete('FOO BAR'))
+          socket.write(buffers.readyForQuery())
+          // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer
+          setImmediate(() => {
+            socket.write(badBuffer)
+          })
+          break
+        case 'Q':
+          socket.write(buffers.rowDescription())
+          socket.write(buffers.dataRow())
+          socket.write(buffers.commandComplete('FOO BAR'))
+          socket.write(buffers.readyForQuery())
+          // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer
+          setImmediate(() => {
+            socket.write(badBuffer)
+          })
+        default:
+        // console.log('got code', code)
+      }
+    })
+  })
+
+  const closeServer = () => {
+    for (const socket of sockets) {
+      socket.destroy()
+    }
+    return new Promise((resolve) => {
+      server.close(resolve)
+    })
+  }
+
+  server.listen(port, options.host, () => callback(closeServer))
+}
+
+const delay = (ms) =>
+  new Promise((resolve) => {
+    setTimeout(resolve, ms)
+  })
+
+const testErrorBuffer = (bufferName, errorBuffer) => {
+  suite.testAsync(`Out of order ${bufferName} on simple query is catchable`, async () => {
+    const closeServer = await new Promise((resolve, reject) => {
+      return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer))
+    })
+    const client = new helper.Client(options)
+    await client.connect()
+
+    let errorHit = false
+    client.on('error', () => {
+      errorHit = true
+    })
+
+    await client.query('SELECT NOW()')
+    await delay(50)
+
+    // the native client only emits a notice message and keeps on its merry way
+    if (!cli.native) {
+      assert(errorHit)
+      // further queries on the client should fail since its in an invalid state
+      await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject')
+    }
+
+    await closeServer()
+  })
+
+  suite.testAsync(`Out of order ${bufferName} on extended query is catchable`, async () => {
+    const closeServer = await new Promise((resolve, reject) => {
+      return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer))
+    })
+    const client = new helper.Client(options)
+    await client.connect()
+
+    let errorHit = false
+    client.on('error', () => {
+      errorHit = true
+    })
+
+    await client.query('SELECT $1', ['foo'])
+    await delay(40)
+
+    // the native client only emits a notice message and keeps on its merry way
+    if (!cli.native) {
+      assert(errorHit)
+      // further queries on the client should fail since its in an invalid state
+      await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject')
+    }
+
+    await client.end()
+
+    await closeServer()
+  })
+
+  suite.testAsync(`Out of order ${bufferName} on pool is catchable`, async () => {
+    const closeServer = await new Promise((resolve, reject) => {
+      return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer))
+    })
+    const pool = new helper.pg.Pool(options)
+
+    let errorHit = false
+    pool.on('error', () => {
+      errorHit = true
+    })
+
+    await pool.query('SELECT $1', ['foo'])
+    await delay(100)
+
+    if (!cli.native) {
+      assert(errorHit)
+      assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients')
+      assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients')
+    }
+
+    await pool.end()
+    await closeServer()
+  })
+}
+
+if (!helper.args.native) {
+  testErrorBuffer('parseComplete', buffers.parseComplete())
+  testErrorBuffer('commandComplete', buffers.commandComplete('f'))
+}
diff --git a/packages/pg/test/integration/gh-issues/507-tests.js b/packages/pg/test/integration/gh-issues/507-tests.js
index f77d1f8..19fa67f 100644
--- a/packages/pg/test/integration/gh-issues/507-tests.js
+++ b/packages/pg/test/integration/gh-issues/507-tests.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var pg = helper.pg
+const assert = require('assert')
 
 new helper.Suite().test('parsing array results', function (cb) {
   const pool = new pg.Pool()
diff --git a/packages/pg/test/integration/gh-issues/600-tests.js b/packages/pg/test/integration/gh-issues/600-tests.js
index af679ee..586db15 100644
--- a/packages/pg/test/integration/gh-issues/600-tests.js
+++ b/packages/pg/test/integration/gh-issues/600-tests.js
@@ -2,6 +2,7 @@
 var async = require('async')
 var helper = require('../test-helper')
 const suite = new helper.Suite()
+const assert = require('assert')
 
 var db = helper.client()
 
diff --git a/packages/pg/test/integration/gh-issues/699-tests.js b/packages/pg/test/integration/gh-issues/699-tests.js
index c9be63b..6ec99a5 100644
--- a/packages/pg/test/integration/gh-issues/699-tests.js
+++ b/packages/pg/test/integration/gh-issues/699-tests.js
@@ -1,6 +1,5 @@
 'use strict'
 var helper = require('../test-helper')
-var assert = require('assert')
 var copyFrom = require('pg-copy-streams').from
 
 if (helper.args.native) return
diff --git a/packages/pg/test/integration/test-helper.js b/packages/pg/test/integration/test-helper.js
index 9b8b58c..654b2f7 100644
--- a/packages/pg/test/integration/test-helper.js
+++ b/packages/pg/test/integration/test-helper.js
@@ -1,5 +1,7 @@
 'use strict'
 var helper = require('./../test-helper')
+let { Client } = helper
+const assert = require('assert')
 
 if (helper.args.native) {
   Client = require('./../../lib/native')
diff --git a/packages/pg/test/native/callback-api-tests.js b/packages/pg/test/native/callback-api-tests.js
index 80fdcdf..8ee5e69 100644
--- a/packages/pg/test/native/callback-api-tests.js
+++ b/packages/pg/test/native/callback-api-tests.js
@@ -3,6 +3,7 @@ var domain = require('domain')
 var helper = require('./../test-helper')
 var Client = require('./../../lib/native')
 const suite = new helper.Suite()
+const assert = require('assert')
 
 suite.test('fires callback with results', function (done) {
   var client = new Client(helper.config)
diff --git a/packages/pg/test/native/evented-api-tests.js b/packages/pg/test/native/evented-api-tests.js
index ba0496e..5db9e29 100644
--- a/packages/pg/test/native/evented-api-tests.js
+++ b/packages/pg/test/native/evented-api-tests.js
@@ -2,6 +2,9 @@
 var helper = require('../test-helper')
 var Client = require('../../lib/native')
 var Query = Client.Query
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 var setupClient = function () {
   var client = new Client(helper.config)
diff --git a/packages/pg/test/native/native-connection-string-tests.js b/packages/pg/test/native/native-connection-string-tests.js
index fbd6cb9..fe814de 100644
--- a/packages/pg/test/native/native-connection-string-tests.js
+++ b/packages/pg/test/native/native-connection-string-tests.js
@@ -2,6 +2,7 @@
 var helper = require('../test-helper')
 var Client = require('../../lib/native')
 const suite = new helper.Suite()
+const assert = require('assert')
 
 suite.test('respects nativeConnectionString in config', function (done) {
   const realPort = helper.config.port
diff --git a/packages/pg/test/native/stress-tests.js b/packages/pg/test/native/stress-tests.js
index 9d12877..13f03dc 100644
--- a/packages/pg/test/native/stress-tests.js
+++ b/packages/pg/test/native/stress-tests.js
@@ -2,8 +2,10 @@
 var helper = require('../test-helper')
 var Client = require('../../lib/native')
 var Query = Client.Query
+const assert = require('assert')
+const suite = new helper.Suite()
 
-test('many rows', function () {
+suite.test('many rows', function () {
   var client = new Client(helper.config)
   client.connect()
   var q = client.query(new Query('SELECT * FROM person'))
@@ -17,7 +19,7 @@ test('many rows', function () {
   })
 })
 
-test('many queries', function () {
+suite.test('many queries', function () {
   var client = new Client(helper.config)
   client.connect()
   var count = 0
@@ -34,7 +36,7 @@ test('many queries', function () {
   })
 })
 
-test('many clients', function () {
+suite.test('many clients', function () {
   var clients = []
   for (var i = 0; i < 10; i++) {
     clients.push(new Client(helper.config))
diff --git a/packages/pg/test/test-helper.js b/packages/pg/test/test-helper.js
index 15abcd4..7a50aac 100644
--- a/packages/pg/test/test-helper.js
+++ b/packages/pg/test/test-helper.js
@@ -1,12 +1,11 @@
 'use strict'
-// make assert a global...
-global.assert = require('assert')
+const assert = require('assert')
 var sys = require('util')
 
 const Suite = require('./suite')
 const args = require('./cli')
 
-global.Client = require('./../lib').Client
+const Client = require('./../lib').Client
 
 process.on('uncaughtException', function (d) {
   if ('stack' in d && 'message' in d) {
@@ -157,17 +156,6 @@ assert.isNull = function (item, message) {
   assert.ok(item === null, message)
 }
 
-global.test = function (name, action) {
-  test.testCount++
-  test[name] = action
-  var result = test[name]()
-  if (result === false) {
-    process.stdout.write('?')
-  } else {
-    process.stdout.write('.')
-  }
-}
-
 // print out the filename
 process.stdout.write(require('path').basename(process.argv[1]))
 if (args.binary) process.stdout.write(' (binary)')
diff --git a/packages/pg/test/unit/client/cleartext-password-tests.js b/packages/pg/test/unit/client/cleartext-password-tests.js
index 49db22d..0cf0b9f 100644
--- a/packages/pg/test/unit/client/cleartext-password-tests.js
+++ b/packages/pg/test/unit/client/cleartext-password-tests.js
@@ -2,29 +2,30 @@
 
 const helper = require('./test-helper')
 const createClient = require('./test-helper').createClient
+const assert = require('assert')
+const suite = new helper.Suite()
+const { MemoryStream } = helper
 
-test('cleartext password authentication', function () {
-  test('responds with password', function () {
-    var client = createClient()
-    client.password = '!'
-    client.connection.stream.packets = []
-    client.connection.emit('authenticationCleartextPassword')
-    var packets = client.connection.stream.packets
-    assert.lengthIs(packets, 1)
-    var packet = packets[0]
-    assert.equalBuffers(packet, [0x70, 0, 0, 0, 6, 33, 0])
-  })
+suite.test('cleartext password auth responds with password', function () {
+  var client = createClient()
+  client.password = '!'
+  client.connection.stream.packets = []
+  client.connection.emit('authenticationCleartextPassword')
+  var packets = client.connection.stream.packets
+  assert.lengthIs(packets, 1)
+  var packet = packets[0]
+  assert.equalBuffers(packet, [0x70, 0, 0, 0, 6, 33, 0])
+})
 
-  test('does not crash with null password using pg-pass', function () {
-    process.env.PGPASSFILE = `${__dirname}/pgpass.file`
-    var client = new helper.Client({
-      host: 'foo',
-      port: 5432,
-      database: 'bar',
-      user: 'baz',
-      stream: new MemoryStream(),
-    })
-    client.connect()
-    client.connection.emit('authenticationCleartextPassword')
+suite.test('cleartext password auth does not crash with null password using pg-pass', function () {
+  process.env.PGPASSFILE = `${__dirname}/pgpass.file`
+  var client = new helper.Client({
+    host: 'foo',
+    port: 5432,
+    database: 'bar',
+    user: 'baz',
+    stream: new MemoryStream(),
   })
+  client.connect()
+  client.connection.emit('authenticationCleartextPassword')
 })
diff --git a/packages/pg/test/unit/client/configuration-tests.js b/packages/pg/test/unit/client/configuration-tests.js
index b251968..55e14e1 100644
--- a/packages/pg/test/unit/client/configuration-tests.js
+++ b/packages/pg/test/unit/client/configuration-tests.js
@@ -1,6 +1,9 @@
 'use strict'
-require('./test-helper')
+const helper = require('./test-helper')
+const { Client } = helper
 var assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 var pguser = process.env['PGUSER'] || process.env.USER
 var pgdatabase = process.env['PGDATABASE'] || process.env.USER
diff --git a/packages/pg/test/unit/client/early-disconnect-tests.js b/packages/pg/test/unit/client/early-disconnect-tests.js
index 4944828..5e8880c 100644
--- a/packages/pg/test/unit/client/early-disconnect-tests.js
+++ b/packages/pg/test/unit/client/early-disconnect-tests.js
@@ -1,7 +1,8 @@
 'use strict'
-var helper = require('./test-helper')
+require('./test-helper')
 var net = require('net')
 var pg = require('../../../lib/index.js')
+const assert = require('assert')
 
 /* console.log() messages show up in `make test` output. TODO: fix it. */
 var server = net.createServer(function (c) {
diff --git a/packages/pg/test/unit/client/escape-tests.js b/packages/pg/test/unit/client/escape-tests.js
index 64c2ae7..2b5f644 100644
--- a/packages/pg/test/unit/client/escape-tests.js
+++ b/packages/pg/test/unit/client/escape-tests.js
@@ -1,13 +1,10 @@
 'use strict'
 var helper = require('./test-helper')
 var utils = require('../../../lib/utils')
-
-function createClient(callback) {
-  var client = new Client(helper.config)
-  client.connect(function (err) {
-    return callback(client)
-  })
-}
+const assert = require('assert')
+const { Client, Suite } = helper
+const suite = new Suite()
+const test = suite.test.bind(suite)
 
 var testLit = function (testName, input, expected) {
   test(testName, function () {
diff --git a/packages/pg/test/unit/client/md5-password-tests.js b/packages/pg/test/unit/client/md5-password-tests.js
index 8a425fa..e4cb9b3 100644
--- a/packages/pg/test/unit/client/md5-password-tests.js
+++ b/packages/pg/test/unit/client/md5-password-tests.js
@@ -2,6 +2,9 @@
 var helper = require('./test-helper')
 const BufferList = require('../../buffer-list')
 var crypto = require('../../../lib/crypto/utils')
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 test('md5 authentication', async function () {
   var client = helper.createClient()
diff --git a/packages/pg/test/unit/client/notification-tests.js b/packages/pg/test/unit/client/notification-tests.js
index 7143aca..25d0e9f 100644
--- a/packages/pg/test/unit/client/notification-tests.js
+++ b/packages/pg/test/unit/client/notification-tests.js
@@ -1,7 +1,9 @@
 'use strict'
 var helper = require('./test-helper')
+const assert = require('assert')
+const suite = new helper.Suite()
 
-test('passes connection notification', function () {
+suite.test('passes connection notification', function () {
   var client = helper.client()
   assert.emits(client, 'notice', function (msg) {
     assert.equal(msg, 'HAY!!')
diff --git a/packages/pg/test/unit/client/prepared-statement-tests.js b/packages/pg/test/unit/client/prepared-statement-tests.js
index 2499808..ba080dd 100644
--- a/packages/pg/test/unit/client/prepared-statement-tests.js
+++ b/packages/pg/test/unit/client/prepared-statement-tests.js
@@ -1,8 +1,11 @@
 'use strict'
 var helper = require('./test-helper')
 var Query = require('../../../lib/query')
-
+const assert = require('assert')
 var client = helper.client()
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
+
 var con = client.connection
 var parseArg = null
 con.parse = function (arg) {
@@ -90,9 +93,7 @@ test('bound command', function () {
 
 var portalClient = helper.client()
 var portalCon = portalClient.connection
-var portalParseArg = null
 portalCon.parse = function (arg) {
-  portalParseArg = arg
   process.nextTick(function () {
     portalCon.emit('parseComplete')
   })
diff --git a/packages/pg/test/unit/client/query-queue-tests.js b/packages/pg/test/unit/client/query-queue-tests.js
index 0b5eaa5..ede3293 100644
--- a/packages/pg/test/unit/client/query-queue-tests.js
+++ b/packages/pg/test/unit/client/query-queue-tests.js
@@ -1,6 +1,10 @@
 'use strict'
-var helper = require('./test-helper')
+const helper = require('./test-helper')
+const { Client } = helper
 var Connection = require('../../../lib/connection')
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 test('drain', function () {
   var con = new Connection({ stream: 'NO' })
@@ -19,34 +23,16 @@ test('drain', function () {
   client.query('hello')
   client.query('sup')
   client.query('boom')
+  assert.equal(raisedDrain, false)
+  con.emit('readyForQuery')
 
-  test('with pending queries', function () {
-    test('does not emit drain', function () {
-      assert.equal(raisedDrain, false)
-    })
-  })
-
-  test('after some queries executed', function () {
-    con.emit('readyForQuery')
-    test('does not emit drain', function () {
-      assert.equal(raisedDrain, false)
-    })
-  })
-
-  test('when all queries are sent', function () {
-    con.emit('readyForQuery')
-    con.emit('readyForQuery')
-    test('does not emit drain', function () {
-      assert.equal(raisedDrain, false)
-    })
-  })
+  assert.equal(raisedDrain, false)
+  con.emit('readyForQuery')
+  con.emit('readyForQuery')
+  assert.equal(raisedDrain, false)
+  con.emit('readyForQuery')
 
-  test('after last query finishes', function () {
-    con.emit('readyForQuery')
-    test('emits drain', function () {
-      process.nextTick(function () {
-        assert.ok(raisedDrain)
-      })
-    })
+  process.nextTick(function () {
+    assert.ok(raisedDrain)
   })
 })
diff --git a/packages/pg/test/unit/client/result-metadata-tests.js b/packages/pg/test/unit/client/result-metadata-tests.js
index a5e6542..e372098 100644
--- a/packages/pg/test/unit/client/result-metadata-tests.js
+++ b/packages/pg/test/unit/client/result-metadata-tests.js
@@ -1,12 +1,15 @@
 'use strict'
 var helper = require('./test-helper')
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 var testForTag = function (tagText, callback) {
   test('includes command tag data for tag ' + tagText, function () {
     var client = helper.client()
     client.connection.emit('readyForQuery')
 
-    var query = client.query(
+    client.query(
       'whatever',
       assert.calls((err, result) => {
         assert.ok(result != null, 'should pass something to this event')
diff --git a/packages/pg/test/unit/client/sasl-scram-tests.js b/packages/pg/test/unit/client/sasl-scram-tests.js
index 5ccf170..2e1ed6a 100644
--- a/packages/pg/test/unit/client/sasl-scram-tests.js
+++ b/packages/pg/test/unit/client/sasl-scram-tests.js
@@ -1,5 +1,6 @@
 'use strict'
 const helper = require('./test-helper')
+const assert = require('assert')
 
 var sasl = require('../../../lib/crypto/sasl')
 
diff --git a/packages/pg/test/unit/client/set-keepalives-tests.js b/packages/pg/test/unit/client/set-keepalives-tests.js
index 3fef0c0..cae6846 100644
--- a/packages/pg/test/unit/client/set-keepalives-tests.js
+++ b/packages/pg/test/unit/client/set-keepalives-tests.js
@@ -2,6 +2,7 @@
 const net = require('net')
 const pg = require('../../../lib/index.js')
 const helper = require('./test-helper')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
diff --git a/packages/pg/test/unit/client/simple-query-tests.js b/packages/pg/test/unit/client/simple-query-tests.js
index 2c3ea5e..3fecc14 100644
--- a/packages/pg/test/unit/client/simple-query-tests.js
+++ b/packages/pg/test/unit/client/simple-query-tests.js
@@ -1,6 +1,9 @@
 'use strict'
 var helper = require('./test-helper')
 var Query = require('../../../lib/query')
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 test('executing query', function () {
   test('queing query', function () {
@@ -112,14 +115,6 @@ test('executing query', function () {
 
     test('removes itself after another readyForQuery message', function () {
       return false
-      assert.emits(query, 'end', function (msg) {
-        // TODO do we want to check the complete messages?
-      })
-      con.emit('readyForQuery')
-      // this would never actually happen
-      ;['dataRow', 'rowDescription', 'commandComplete'].forEach(function (msg) {
-        assert.equal(con.emit(msg), false, "Should no longer be picking up '" + msg + "' messages")
-      })
     })
   })
 
diff --git a/packages/pg/test/unit/client/stream-and-query-error-interaction-tests.js b/packages/pg/test/unit/client/stream-and-query-error-interaction-tests.js
index 892d2e8..6f0da61 100644
--- a/packages/pg/test/unit/client/stream-and-query-error-interaction-tests.js
+++ b/packages/pg/test/unit/client/stream-and-query-error-interaction-tests.js
@@ -1,9 +1,11 @@
 'use strict'
-var helper = require('./test-helper')
+const helper = require('./test-helper')
 var Connection = require('../../../lib/connection')
 var Client = require('../../../lib/client')
+const assert = require('assert')
+const suite = new helper.Suite()
 
-test('emits end when not in query', function () {
+suite.test('emits end when not in query', function () {
   var stream = new (require('events').EventEmitter)()
   stream.setNoDelay = () => {}
   stream.connect = function () {
diff --git a/packages/pg/test/unit/client/test-helper.js b/packages/pg/test/unit/client/test-helper.js
index 8d18590..1a89a59 100644
--- a/packages/pg/test/unit/client/test-helper.js
+++ b/packages/pg/test/unit/client/test-helper.js
@@ -1,6 +1,7 @@
 'use strict'
 var helper = require('../test-helper')
 var Connection = require('../../../lib/connection')
+const { Client } = helper
 
 var makeClient = function () {
   var connection = new Connection({ stream: 'no' })
diff --git a/packages/pg/test/unit/client/throw-in-type-parser-tests.js b/packages/pg/test/unit/client/throw-in-type-parser-tests.js
index 8f71fdc..cf1a353 100644
--- a/packages/pg/test/unit/client/throw-in-type-parser-tests.js
+++ b/packages/pg/test/unit/client/throw-in-type-parser-tests.js
@@ -2,6 +2,7 @@
 var helper = require('./test-helper')
 var Query = require('../../../lib/query')
 var types = require('pg-types')
+const assert = require('assert')
 
 const suite = new helper.Suite()
 
@@ -32,7 +33,6 @@ const emitFakeEvents = (con) => {
 }
 
 suite.test('emits error', function (done) {
-  var handled
   var client = helper.client()
   var con = client.connection
   var query = client.query(new Query('whatever'))
@@ -45,14 +45,10 @@ suite.test('emits error', function (done) {
 })
 
 suite.test('calls callback with error', function (done) {
-  var handled
-
-  var callbackCalled = 0
-
   var client = helper.client()
   var con = client.connection
   emitFakeEvents(con)
-  var query = client.query('whatever', function (err) {
+  client.query('whatever', function (err) {
     assert.equal(err, typeParserError)
     done()
   })
diff --git a/packages/pg/test/unit/connection-parameters/creation-tests.js b/packages/pg/test/unit/connection-parameters/creation-tests.js
index a4a837f..5225b97 100644
--- a/packages/pg/test/unit/connection-parameters/creation-tests.js
+++ b/packages/pg/test/unit/connection-parameters/creation-tests.js
@@ -344,7 +344,6 @@ suite.test('ssl is set on client', function () {
       sslrootcert: '/path/root.crt',
     },
   }
-  var Client = require('../../../lib/client')
   var defaults = require('../../../lib/defaults')
   defaults.ssl = true
   var c = new ConnectionParameters(sourceConfig)
diff --git a/packages/pg/test/unit/connection-parameters/environment-variable-tests.js b/packages/pg/test/unit/connection-parameters/environment-variable-tests.js
index b20a793..e4e08eb 100644
--- a/packages/pg/test/unit/connection-parameters/environment-variable-tests.js
+++ b/packages/pg/test/unit/connection-parameters/environment-variable-tests.js
@@ -1,5 +1,4 @@
 'use strict'
-var helper = require('../test-helper')
 const Suite = require('../../suite')
 
 var assert = require('assert')
diff --git a/packages/pg/test/unit/connection-pool/configuration-tests.js b/packages/pg/test/unit/connection-pool/configuration-tests.js
index 10c9918..cfd8f0e 100644
--- a/packages/pg/test/unit/connection-pool/configuration-tests.js
+++ b/packages/pg/test/unit/connection-pool/configuration-tests.js
@@ -2,8 +2,9 @@
 
 const assert = require('assert')
 const helper = require('../test-helper')
+const suite = new helper.Suite()
 
-test('pool with copied settings includes password', () => {
+suite.test('pool with copied settings includes password', () => {
   const original = new helper.pg.Pool({
     password: 'original',
   })
diff --git a/packages/pg/test/unit/connection/error-tests.js b/packages/pg/test/unit/connection/error-tests.js
index 091c13e..b7496ab 100644
--- a/packages/pg/test/unit/connection/error-tests.js
+++ b/packages/pg/test/unit/connection/error-tests.js
@@ -2,8 +2,10 @@
 var helper = require('./test-helper')
 var Connection = require('../../../lib/connection')
 var net = require('net')
+const assert = require('assert')
 
 const suite = new helper.Suite()
+const { MemoryStream } = helper
 
 suite.test('connection emits stream errors', function (done) {
   var con = new Connection({ stream: new MemoryStream() })
diff --git a/packages/pg/test/unit/connection/inbound-parser-tests.js b/packages/pg/test/unit/connection/inbound-parser-tests.js
deleted file mode 100644
index af9385c..0000000
--- a/packages/pg/test/unit/connection/inbound-parser-tests.js
+++ /dev/null
@@ -1,510 +0,0 @@
-'use strict'
-require('./test-helper')
-const BufferList = require('../../buffer-list')
-var Connection = require('../../../lib/connection')
-var buffers = require('../../test-buffers')
-var PARSE = function (buffer) {
-  return new Parser(buffer).parse()
-}
-
-var authOkBuffer = buffers.authenticationOk()
-var paramStatusBuffer = buffers.parameterStatus('client_encoding', 'UTF8')
-var readyForQueryBuffer = buffers.readyForQuery()
-var backendKeyDataBuffer = buffers.backendKeyData(1, 2)
-var commandCompleteBuffer = buffers.commandComplete('SELECT 3')
-var parseCompleteBuffer = buffers.parseComplete()
-var bindCompleteBuffer = buffers.bindComplete()
-var portalSuspendedBuffer = buffers.portalSuspended()
-
-var addRow = function (bufferList, name, offset) {
-  return bufferList
-    .addCString(name) // field name
-    .addInt32(offset++) // table id
-    .addInt16(offset++) // attribute of column number
-    .addInt32(offset++) // objectId of field's data type
-    .addInt16(offset++) // datatype size
-    .addInt32(offset++) // type modifier
-    .addInt16(0) // format code, 0 => text
-}
-
-var row1 = {
-  name: 'id',
-  tableID: 1,
-  attributeNumber: 2,
-  dataTypeID: 3,
-  dataTypeSize: 4,
-  typeModifier: 5,
-  formatCode: 0,
-}
-var oneRowDescBuff = new buffers.rowDescription([row1])
-row1.name = 'bang'
-
-var twoRowBuf = new buffers.rowDescription([
-  row1,
-  {
-    name: 'whoah',
-    tableID: 10,
-    attributeNumber: 11,
-    dataTypeID: 12,
-    dataTypeSize: 13,
-    typeModifier: 14,
-    formatCode: 0,
-  },
-])
-
-var emptyRowFieldBuf = new BufferList().addInt16(0).join(true, 'D')
-
-var emptyRowFieldBuf = buffers.dataRow()
-
-var oneFieldBuf = new BufferList()
-  .addInt16(1) // number of fields
-  .addInt32(5) // length of bytes of fields
-  .addCString('test')
-  .join(true, 'D')
-
-var oneFieldBuf = buffers.dataRow(['test'])
-
-var expectedAuthenticationOkayMessage = {
-  name: 'authenticationOk',
-  length: 8,
-}
-
-var expectedParameterStatusMessage = {
-  name: 'parameterStatus',
-  parameterName: 'client_encoding',
-  parameterValue: 'UTF8',
-  length: 25,
-}
-
-var expectedBackendKeyDataMessage = {
-  name: 'backendKeyData',
-  processID: 1,
-  secretKey: 2,
-}
-
-var expectedReadyForQueryMessage = {
-  name: 'readyForQuery',
-  length: 5,
-  status: 'I',
-}
-
-var expectedCommandCompleteMessage = {
-  length: 13,
-  text: 'SELECT 3',
-}
-var emptyRowDescriptionBuffer = new BufferList()
-  .addInt16(0) // number of fields
-  .join(true, 'T')
-
-var expectedEmptyRowDescriptionMessage = {
-  name: 'rowDescription',
-  length: 6,
-  fieldCount: 0,
-}
-var expectedOneRowMessage = {
-  name: 'rowDescription',
-  length: 27,
-  fieldCount: 1,
-}
-
-var expectedTwoRowMessage = {
-  name: 'rowDescription',
-  length: 53,
-  fieldCount: 2,
-}
-
-var testForMessage = function (buffer, expectedMessage) {
-  var lastMessage = {}
-  test('recieves and parses ' + expectedMessage.name, function () {
-    var stream = new MemoryStream()
-    var client = new Connection({
-      stream: stream,
-    })
-    client.connect()
-
-    client.on('message', function (msg) {
-      lastMessage = msg
-    })
-
-    client.on(expectedMessage.name, function () {
-      client.removeAllListeners(expectedMessage.name)
-    })
-
-    stream.emit('data', buffer)
-    assert.same(lastMessage, expectedMessage)
-  })
-  return lastMessage
-}
-
-var plainPasswordBuffer = buffers.authenticationCleartextPassword()
-var md5PasswordBuffer = buffers.authenticationMD5Password()
-var SASLBuffer = buffers.authenticationSASL()
-var SASLContinueBuffer = buffers.authenticationSASLContinue()
-var SASLFinalBuffer = buffers.authenticationSASLFinal()
-
-var expectedPlainPasswordMessage = {
-  name: 'authenticationCleartextPassword',
-}
-
-var expectedMD5PasswordMessage = {
-  name: 'authenticationMD5Password',
-}
-
-var expectedSASLMessage = {
-  name: 'authenticationSASL',
-}
-
-var expectedSASLContinueMessage = {
-  name: 'authenticationSASLContinue',
-  data: 'data',
-}
-
-var expectedSASLFinalMessage = {
-  name: 'authenticationSASLFinal',
-  data: 'data',
-}
-
-var notificationResponseBuffer = buffers.notification(4, 'hi', 'boom')
-var expectedNotificationResponseMessage = {
-  name: 'notification',
-  processId: 4,
-  channel: 'hi',
-  payload: 'boom',
-}
-
-test('Connection', function () {
-  testForMessage(authOkBuffer, expectedAuthenticationOkayMessage)
-  testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage)
-  var msgMD5 = testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage)
-  test('md5 has right salt', function () {
-    assert.equalBuffers(msgMD5.salt, Buffer.from([1, 2, 3, 4]))
-  })
-
-  var msgSASL = testForMessage(SASLBuffer, expectedSASLMessage)
-  test('SASL has the right mechanisms', function () {
-    assert.deepStrictEqual(msgSASL.mechanisms, ['SCRAM-SHA-256'])
-  })
-  testForMessage(SASLContinueBuffer, expectedSASLContinueMessage)
-  testForMessage(SASLFinalBuffer, expectedSASLFinalMessage)
-
-  testForMessage(paramStatusBuffer, expectedParameterStatusMessage)
-  testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage)
-  testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage)
-  testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage)
-  testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage)
-  test('empty row message', function () {
-    var message = testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage)
-    test('has no fields', function () {
-      assert.equal(message.fields.length, 0)
-    })
-  })
-
-  test('no data message', function () {
-    testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
-      name: 'noData',
-    })
-  })
-
-  test('one row message', function () {
-    var message = testForMessage(oneRowDescBuff, expectedOneRowMessage)
-    test('has one field', function () {
-      assert.equal(message.fields.length, 1)
-    })
-    test('has correct field info', function () {
-      assert.same(message.fields[0], {
-        name: 'id',
-        tableID: 1,
-        columnID: 2,
-        dataTypeID: 3,
-        dataTypeSize: 4,
-        dataTypeModifier: 5,
-        format: 'text',
-      })
-    })
-  })
-
-  test('two row message', function () {
-    var message = testForMessage(twoRowBuf, expectedTwoRowMessage)
-    test('has two fields', function () {
-      assert.equal(message.fields.length, 2)
-    })
-    test('has correct first field', function () {
-      assert.same(message.fields[0], {
-        name: 'bang',
-        tableID: 1,
-        columnID: 2,
-        dataTypeID: 3,
-        dataTypeSize: 4,
-        dataTypeModifier: 5,
-        format: 'text',
-      })
-    })
-    test('has correct second field', function () {
-      assert.same(message.fields[1], {
-        name: 'whoah',
-        tableID: 10,
-        columnID: 11,
-        dataTypeID: 12,
-        dataTypeSize: 13,
-        dataTypeModifier: 14,
-        format: 'text',
-      })
-    })
-  })
-
-  test('parsing rows', function () {
-    test('parsing empty row', function () {
-      var message = testForMessage(emptyRowFieldBuf, {
-        name: 'dataRow',
-        fieldCount: 0,
-      })
-      test('has 0 fields', function () {
-        assert.equal(message.fields.length, 0)
-      })
-    })
-
-    test('parsing data row with fields', function () {
-      var message = testForMessage(oneFieldBuf, {
-        name: 'dataRow',
-        fieldCount: 1,
-      })
-      test('has 1 field', function () {
-        assert.equal(message.fields.length, 1)
-      })
-
-      test('field is correct', function () {
-        assert.equal(message.fields[0], 'test')
-      })
-    })
-  })
-
-  test('notice message', function () {
-    // this uses the same logic as error message
-    var buff = buffers.notice([{ type: 'C', value: 'code' }])
-    testForMessage(buff, {
-      name: 'notice',
-      code: 'code',
-    })
-  })
-
-  test('error messages', function () {
-    test('with no fields', function () {
-      var msg = testForMessage(buffers.error(), {
-        name: 'error',
-      })
-    })
-
-    test('with all the fields', function () {
-      var buffer = buffers.error([
-        {
-          type: 'S',
-          value: 'ERROR',
-        },
-        {
-          type: 'C',
-          value: 'code',
-        },
-        {
-          type: 'M',
-          value: 'message',
-        },
-        {
-          type: 'D',
-          value: 'details',
-        },
-        {
-          type: 'H',
-          value: 'hint',
-        },
-        {
-          type: 'P',
-          value: '100',
-        },
-        {
-          type: 'p',
-          value: '101',
-        },
-        {
-          type: 'q',
-          value: 'query',
-        },
-        {
-          type: 'W',
-          value: 'where',
-        },
-        {
-          type: 'F',
-          value: 'file',
-        },
-        {
-          type: 'L',
-          value: 'line',
-        },
-        {
-          type: 'R',
-          value: 'routine',
-        },
-        {
-          type: 'Z', // ignored
-          value: 'alsdkf',
-        },
-      ])
-
-      testForMessage(buffer, {
-        name: 'error',
-        severity: 'ERROR',
-        code: 'code',
-        message: 'message',
-        detail: 'details',
-        hint: 'hint',
-        position: '100',
-        internalPosition: '101',
-        internalQuery: 'query',
-        where: 'where',
-        file: 'file',
-        line: 'line',
-        routine: 'routine',
-      })
-    })
-  })
-
-  test('parses parse complete command', function () {
-    testForMessage(parseCompleteBuffer, {
-      name: 'parseComplete',
-    })
-  })
-
-  test('parses bind complete command', function () {
-    testForMessage(bindCompleteBuffer, {
-      name: 'bindComplete',
-    })
-  })
-
-  test('parses portal suspended message', function () {
-    testForMessage(portalSuspendedBuffer, {
-      name: 'portalSuspended',
-    })
-  })
-
-  test('parses replication start message', function () {
-    testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
-      name: 'replicationStart',
-      length: 4,
-    })
-  })
-})
-
-// since the data message on a stream can randomly divide the incomming
-// tcp packets anywhere, we need to make sure we can parse every single
-// split on a tcp message
-test('split buffer, single message parsing', function () {
-  var fullBuffer = buffers.dataRow([null, 'bang', 'zug zug', null, '!'])
-  var stream = new MemoryStream()
-  var client = new Connection({
-    stream: stream,
-  })
-  client.connect()
-  var message = null
-  client.on('message', function (msg) {
-    message = msg
-  })
-
-  test('parses when full buffer comes in', function () {
-    stream.emit('data', fullBuffer)
-    assert.lengthIs(message.fields, 5)
-    assert.equal(message.fields[0], null)
-    assert.equal(message.fields[1], 'bang')
-    assert.equal(message.fields[2], 'zug zug')
-    assert.equal(message.fields[3], null)
-    assert.equal(message.fields[4], '!')
-  })
-
-  var testMessageRecievedAfterSpiltAt = function (split) {
-    var firstBuffer = Buffer.alloc(fullBuffer.length - split)
-    var secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
-    fullBuffer.copy(firstBuffer, 0, 0)
-    fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
-    stream.emit('data', firstBuffer)
-    stream.emit('data', secondBuffer)
-    assert.lengthIs(message.fields, 5)
-    assert.equal(message.fields[0], null)
-    assert.equal(message.fields[1], 'bang')
-    assert.equal(message.fields[2], 'zug zug')
-    assert.equal(message.fields[3], null)
-    assert.equal(message.fields[4], '!')
-  }
-
-  test('parses when split in the middle', function () {
-    testMessageRecievedAfterSpiltAt(6)
-  })
-
-  test('parses when split at end', function () {
-    testMessageRecievedAfterSpiltAt(2)
-  })
-
-  test('parses when split at beginning', function () {
-    testMessageRecievedAfterSpiltAt(fullBuffer.length - 2)
-    testMessageRecievedAfterSpiltAt(fullBuffer.length - 1)
-    testMessageRecievedAfterSpiltAt(fullBuffer.length - 5)
-  })
-})
-
-test('split buffer, multiple message parsing', function () {
-  var dataRowBuffer = buffers.dataRow(['!'])
-  var readyForQueryBuffer = buffers.readyForQuery()
-  var fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length)
-  dataRowBuffer.copy(fullBuffer, 0, 0)
-  readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0)
-
-  var messages = []
-  var stream = new MemoryStream()
-  var client = new Connection({
-    stream: stream,
-  })
-  client.connect()
-  client.on('message', function (msg) {
-    messages.push(msg)
-  })
-
-  var verifyMessages = function () {
-    assert.lengthIs(messages, 2)
-    assert.same(messages[0], {
-      name: 'dataRow',
-      fieldCount: 1,
-    })
-    assert.equal(messages[0].fields[0], '!')
-    assert.same(messages[1], {
-      name: 'readyForQuery',
-    })
-    messages = []
-  }
-  // sanity check
-  test('recieves both messages when packet is not split', function () {
-    stream.emit('data', fullBuffer)
-    verifyMessages()
-  })
-  var splitAndVerifyTwoMessages = function (split) {
-    var firstBuffer = Buffer.alloc(fullBuffer.length - split)
-    var secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
-    fullBuffer.copy(firstBuffer, 0, 0)
-    fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
-    stream.emit('data', firstBuffer)
-    stream.emit('data', secondBuffer)
-  }
-
-  test('recieves both messages when packet is split', function () {
-    test('in the middle', function () {
-      splitAndVerifyTwoMessages(11)
-    })
-    test('at the front', function () {
-      splitAndVerifyTwoMessages(fullBuffer.length - 1)
-      splitAndVerifyTwoMessages(fullBuffer.length - 4)
-      splitAndVerifyTwoMessages(fullBuffer.length - 6)
-    })
-
-    test('at the end', function () {
-      splitAndVerifyTwoMessages(8)
-      splitAndVerifyTwoMessages(1)
-    })
-  })
-})
diff --git a/packages/pg/test/unit/connection/startup-tests.js b/packages/pg/test/unit/connection/startup-tests.js
index d5d30d5..eaedfba 100644
--- a/packages/pg/test/unit/connection/startup-tests.js
+++ b/packages/pg/test/unit/connection/startup-tests.js
@@ -1,6 +1,10 @@
 'use strict'
-require('./test-helper')
+const helper = require('./test-helper')
+const assert = require('assert')
 var Connection = require('../../../lib/connection')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
+const { MemoryStream } = helper
 test('connection can take existing stream', function () {
   var stream = new MemoryStream()
   var con = new Connection({ stream: stream })
diff --git a/packages/pg/test/unit/test-helper.js b/packages/pg/test/unit/test-helper.js
index 407dbf2..757c986 100644
--- a/packages/pg/test/unit/test-helper.js
+++ b/packages/pg/test/unit/test-helper.js
@@ -3,8 +3,9 @@ var EventEmitter = require('events').EventEmitter
 
 var helper = require('../test-helper')
 var Connection = require('../../lib/connection')
+const { Client } = helper
 
-global.MemoryStream = function () {
+const MemoryStream = function () {
   EventEmitter.call(this)
   this.packets = []
 }
@@ -45,4 +46,5 @@ const createClient = function () {
 
 module.exports = Object.assign({}, helper, {
   createClient: createClient,
+  MemoryStream: MemoryStream,
 })
diff --git a/packages/pg/test/unit/utils-tests.js b/packages/pg/test/unit/utils-tests.js
index 5eca717..d514f5a 100644
--- a/packages/pg/test/unit/utils-tests.js
+++ b/packages/pg/test/unit/utils-tests.js
@@ -2,6 +2,9 @@
 var helper = require('./test-helper')
 var utils = require('./../../lib/utils')
 var defaults = require('./../../lib').defaults
+const assert = require('assert')
+const suite = new helper.Suite()
+const test = suite.test.bind(suite)
 
 test('ensure types is exported on root object', function () {
   var pg = require('../../lib')
@@ -10,23 +13,6 @@ test('ensure types is exported on root object', function () {
   assert(pg.types.setTypeParser)
 })
 
-// this tests the monkey patching
-// to ensure comptability with older
-// versions of node
-test('EventEmitter.once', function (t) {
-  // an event emitter
-  var stream = new MemoryStream()
-
-  var callCount = 0
-  stream.once('single', function () {
-    callCount++
-  })
-
-  stream.emit('single')
-  stream.emit('single')
-  assert.equal(callCount, 1)
-})
-
 test('normalizing query configs', function () {
   var config
   var callback = function () {}
@@ -183,7 +169,6 @@ test('prepareValue: Uint8Array array prepared properly', function () {
 })
 
 test('prepareValue: objects with complex toPostgres prepared properly', function () {
-  var buf = Buffer.from('zomgcustom!')
   var customType = {
     toPostgres: function () {
       return [1, 2]
@@ -214,7 +199,6 @@ test('prepareValue: objects with toPostgres receive prepareValue', function () {
 })
 
 test('prepareValue: objects with circular toPostgres rejected', function () {
-  var buf = Buffer.from('zomgcustom!')
   var customType = {
     toPostgres: function () {
       return {
diff --git a/packages/pg/test/worker/src/index.test.js b/packages/pg/test/worker/src/index.test.js
index 08de60a..2bfe50c 100644
--- a/packages/pg/test/worker/src/index.test.js
+++ b/packages/pg/test/worker/src/index.test.js
@@ -6,6 +6,7 @@ const path = require('path')
 const { unstable_dev } = require('wrangler')
 
 var suite = new helper.Suite()
+const assert = require('assert')
 
 suite.testAsync('Can run in Cloudflare Worker?', test())
 
diff --git a/pg-native/package.json b/pg-native/package.json
index 2e4c55e..f95ebe8 100644
--- a/pg-native/package.json
+++ b/pg-native/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pg-native",
-  "version": "3.1.0",
+  "version": "3.2.0",
   "description": "A slightly nicer interface to Postgres over node-libpq",
   "main": "index.js",
   "scripts": {
@@ -23,18 +23,17 @@
   "homepage": "https://github.com/brianc/node-pg-native",
   "dependencies": {
     "libpq": "1.8.13",
-    "pg-types": "^1.12.1",
-    "readable-stream": "1.0.31"
+    "pg-types": "^1.12.1"
   },
   "devDependencies": {
     "async": "^0.9.0",
     "concat-stream": "^1.4.6",
     "generic-pool": "^2.1.1",
     "lodash": "^2.4.1",
-    "mocha": "3.4.2",
+    "mocha": "10.5.2",
     "node-gyp": ">=10.x",
     "okay": "^0.3.0",
     "semver": "^4.1.0"
   },
-  "gitHead": "0f42880861951970e193d31359508d460a67d25a"
+  "gitHead": "92cb640fd316972e323ced6256b2acd89b1b58e0"
 }
diff --git a/pg-native/test/cancel.js b/pg-native/test/cancel.js
index 35c5f5a..80b1494 100644
--- a/pg-native/test/cancel.js
+++ b/pg-native/test/cancel.js
@@ -5,13 +5,15 @@ describe('cancel query', function () {
   it('works', function (done) {
     var client = new Client()
     client.connectSync()
-    client.query('SELECT pg_sleep(100);', function (err) {
+    client.query('SELECT pg_sleep(1000);', function (err) {
       assert(err instanceof Error)
       client.end(done)
     })
-    client.cancel(function (err) {
-      assert.ifError(err)
-    })
+    setTimeout(() => {
+      client.cancel(function (err) {
+        assert.ifError(err)
+      })
+    }, 100)
   })
 
   it('does not raise error if no active query', function (done) {
diff --git a/pg-native/test/domains.js b/pg-native/test/domains.js
index 67254ba..90ae4d5 100644
--- a/pg-native/test/domains.js
+++ b/pg-native/test/domains.js
@@ -6,7 +6,7 @@ var checkDomain = function (domain, when) {
   assert.strictEqual(process.domain, domain, 'Domain switched after ' + when)
 }
 
-describe('domains', function (done) {
+describe('domains', function () {
   it('remains bound after a query', function (done) {
     var domain = require('domain').create() // eslint-disable-line
     domain.run(function () {
diff --git a/pg-native/test/many-connections.js b/pg-native/test/many-connections.js
index 2041996..fe32ede 100644
--- a/pg-native/test/many-connections.js
+++ b/pg-native/test/many-connections.js
@@ -6,7 +6,7 @@ var bytes = require('crypto').pseudoRandomBytes
 describe('many connections', function () {
   describe('async', function () {
     var test = function (count, times) {
-      it('connecting ' + count + ' clients ' + times, function (done) {
+      it(`connecting ${count} clients ${times} times`, function (done) {
         this.timeout(200000)
 
         var connectClient = function (n, cb) {
@@ -38,20 +38,9 @@ describe('many connections', function () {
     }
 
     test(1, 1)
-    test(1, 1)
-    test(1, 1)
-    test(5, 5)
     test(5, 5)
-    test(5, 5)
-    test(5, 5)
-    test(10, 10)
     test(10, 10)
-    test(10, 10)
-    test(20, 20)
-    test(20, 20)
     test(20, 20)
     test(30, 10)
-    test(30, 10)
-    test(30, 10)
   })
 })
diff --git a/pg-native/test/query-sync.js b/pg-native/test/query-sync.js
index f7a0ad0..7bd86d8 100644
--- a/pg-native/test/query-sync.js
+++ b/pg-native/test/query-sync.js
@@ -1,7 +1,7 @@
 var Client = require('../')
 var assert = require('assert')
 
-describe('query sync', function (done) {
+describe('query sync', function () {
   before(function () {
     this.client = Client()
     this.client.connectSync()
diff --git a/yarn.lock b/yarn.lock
index b39e4c5..d37fb4f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1269,15 +1269,10 @@
   resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz"
   integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
 
-"@types/mocha@^5.2.7":
-  version "5.2.7"
-  resolved "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz"
-  integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==
-
-"@types/mocha@^8.0.3":
-  version "8.0.3"
-  resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz"
-  integrity sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==
+"@types/mocha@^10.0.7":
+  version "10.0.7"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.7.tgz#4c620090f28ca7f905a94b706f74dc5b57b44f2f"
+  integrity sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==
 
 "@types/node@*", "@types/node@>= 8":
   version "12.12.21"
@@ -1541,10 +1536,10 @@ amdefine@>=0.0.4:
   resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz"
   integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
 
-ansi-colors@3.2.3:
-  version "3.2.3"
-  resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz"
-  integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+ansi-colors@4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
 
 ansi-escapes@^3.2.0:
   version "3.2.0"
@@ -1600,14 +1595,6 @@ any-promise@^1.0.0:
   resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz"
   integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
 
-anymatch@~3.1.1:
-  version "3.1.1"
-  resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz"
-  integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
-  dependencies:
-    normalize-path "^3.0.0"
-    picomatch "^2.0.4"
-
 anymatch@~3.1.2:
   version "3.1.3"
   resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
@@ -1836,17 +1823,7 @@ blake3-wasm@^2.1.5:
   resolved "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz"
   integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==
 
-bluebird@3.4.1:
-  version "3.4.1"
-  resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz"
-  integrity sha1-tzHd9I4t077awudeEhWhG8uR+gc=
-
-bluebird@3.5.2:
-  version "3.5.2"
-  resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz"
-  integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==
-
-bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
+bluebird@3.7.2, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
   version "3.7.2"
   resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
   integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -1897,11 +1874,6 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-browser-stdout@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
-  integrity sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==
-
 browser-stdout@1.3.1:
   version "1.3.1"
   resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
@@ -2056,6 +2028,11 @@ camelcase@^5.0.0, camelcase@^5.3.1:
   resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
+camelcase@^6.0.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+  integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
 capnp-ts@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.7.0.tgz#16fd8e76b667d002af8fcf4bf92bf15d1a7b54a9"
@@ -2099,6 +2076,14 @@ chalk@^4.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
+chalk@^4.1.0:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
 chardet@^0.7.0:
   version "0.7.0"
   resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
@@ -2109,21 +2094,6 @@ check-error@^1.0.2:
   resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz"
   integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
 
-chokidar@3.3.0:
-  version "3.3.0"
-  resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz"
-  integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
-  dependencies:
-    anymatch "~3.1.1"
-    braces "~3.0.2"
-    glob-parent "~5.1.0"
-    is-binary-path "~2.1.0"
-    is-glob "~4.0.1"
-    normalize-path "~3.0.0"
-    readdirp "~3.2.0"
-  optionalDependencies:
-    fsevents "~2.1.1"
-
 chokidar@^3.5.3:
   version "3.5.3"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
@@ -2195,6 +2165,15 @@ cliui@^5.0.0:
     strip-ansi "^5.2.0"
     wrap-ansi "^5.1.0"
 
+cliui@^7.0.2:
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+  integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^7.0.0"
+
 clone-deep@^4.0.1:
   version "4.0.1"
   resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
@@ -2266,13 +2245,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
-  integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
 compare-func@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz"
@@ -2518,13 +2490,6 @@ dateformat@^3.0.0:
   resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz"
   integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
 
-debug@2.6.0:
-  version "2.6.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
-  integrity sha512-XMYwiKKX0jdij1QRlpYn0O6gks0hW3iYUsx/h/RLPKouDGVeun2wlMYl29C85KBjnv1vw2vj+yti1ziHsXd7cg==
-  dependencies:
-    ms "0.7.2"
-
 debug@3.1.0:
   version "3.1.0"
   resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
@@ -2532,14 +2497,7 @@ debug@3.1.0:
   dependencies:
     ms "2.0.0"
 
-debug@3.2.6, debug@^3.1.0:
-  version "3.2.6"
-  resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
-  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
-  dependencies:
-    ms "^2.1.1"
-
-debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+debug@4, debug@4.3.4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
   integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -2553,6 +2511,13 @@ debug@^2.2.0, debug@^2.3.3:
   dependencies:
     ms "2.0.0"
 
+debug@^3.1.0:
+  version "3.2.6"
+  resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
+  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+  dependencies:
+    ms "^2.1.1"
+
 debuglog@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
@@ -2571,6 +2536,11 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
   resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decamelize@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+  integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
@@ -2600,7 +2570,7 @@ defaults@^1.0.3:
   dependencies:
     clone "^1.0.2"
 
-define-properties@^1.1.2, define-properties@^1.1.3:
+define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
   integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@@ -2657,15 +2627,10 @@ dezalgo@^1.0.0:
     asap "^2.0.0"
     wrappy "1"
 
-diff@3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
-  integrity sha512-597ykPFhtJYaXqPq6fF7Vl1fXTKgPdLOntyxpmdzUOKiYGqK7zcnbplj5088+8qJnWdzXhyeau5iVr8HVo9dgg==
-
-diff@3.5.0:
-  version "3.5.0"
-  resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz"
-  integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+diff@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+  integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
 
 diff@^4.0.1:
   version "4.0.2"
@@ -2875,16 +2840,21 @@ esbuild@0.17.19:
     "@esbuild/win32-ia32" "0.17.19"
     "@esbuild/win32-x64" "0.17.19"
 
-escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
-  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+escalade@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+  integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
 
-escape-string-regexp@^4.0.0:
+escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
 escodegen@1.8.x:
   version "1.8.1"
   resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz"
@@ -3247,12 +3217,13 @@ fill-range@^7.0.1:
   dependencies:
     to-regex-range "^5.0.1"
 
-find-up@3.0.0, find-up@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
-  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+find-up@5.0.0, find-up@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+  integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
   dependencies:
-    locate-path "^3.0.0"
+    locate-path "^6.0.0"
+    path-exists "^4.0.0"
 
 find-up@^1.0.0:
   version "1.1.2"
@@ -3269,6 +3240,13 @@ find-up@^2.0.0:
   dependencies:
     locate-path "^2.0.0"
 
+find-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
+  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+  dependencies:
+    locate-path "^3.0.0"
+
 find-up@^4.1.0:
   version "4.1.0"
   resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
@@ -3277,14 +3255,6 @@ find-up@^4.1.0:
     locate-path "^5.0.0"
     path-exists "^4.0.0"
 
-find-up@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
-  integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
-  dependencies:
-    locate-path "^6.0.0"
-    path-exists "^4.0.0"
-
 flat-cache@^3.0.4:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
@@ -3294,12 +3264,10 @@ flat-cache@^3.0.4:
     keyv "^4.5.3"
     rimraf "^3.0.2"
 
-flat@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz"
-  integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==
-  dependencies:
-    is-buffer "~2.0.3"
+flat@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+  integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
 
 flatted@^3.2.9:
   version "3.2.9"
@@ -3401,11 +3369,6 @@ fs.realpath@^1.0.0:
   resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
   integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fsevents@~2.1.1:
-  version "2.1.3"
-  resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz"
-  integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
-
 fsevents@~2.3.2:
   version "2.3.2"
   resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
@@ -3445,7 +3408,7 @@ genfun@^5.0.0:
   resolved "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz"
   integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
 
-get-caller-file@^2.0.1:
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   version "2.0.5"
   resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -3560,7 +3523,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2:
+glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -3584,29 +3547,16 @@ glob-to-regexp@^0.4.1:
   resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
   integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
 
-glob@7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
-  integrity sha512-mRyN/EsN2SyNhKWykF3eEGhDpeNplMWaW18Bmh76tnOqk5TbELAVwFAYOCmKVssOYFrYvvLMguiA+NXO3ZTuVA==
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@7.1.3:
-  version "7.1.3"
-  resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz"
-  integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+glob@8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+  integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
   dependencies:
     fs.realpath "^1.0.0"
     inflight "^1.0.4"
     inherits "2"
-    minimatch "^3.0.4"
+    minimatch "^5.0.1"
     once "^1.3.0"
-    path-is-absolute "^1.0.0"
 
 glob@^10.2.2, glob@^10.3.10:
   version "10.4.1"
@@ -3675,36 +3625,16 @@ globby@^9.2.0:
     pify "^4.0.1"
     slash "^2.0.0"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
-  version "4.2.4"
-  resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz"
-  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
-
-graceful-fs@^4.2.6:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.6:
   version "4.2.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
   integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
 
-"graceful-readlink@>= 1.0.0":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-  integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==
-
 graphemer@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
   integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
 
-growl@1.10.5:
-  version "1.10.5"
-  resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz"
-  integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
-
-growl@1.9.2:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
-  integrity sha512-RTBwDHhNuOx4F0hqzItc/siXCasGfC4DeWcBamclWd+6jWtBaeB/SGbMkGf0eiQoW7ib8JpvOgnUsmgMHI3Mfw==
-
 handlebars@^4.0.1, handlebars@^4.7.6:
   version "4.7.7"
   resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz"
@@ -3750,7 +3680,7 @@ has-flag@^4.0.0:
   resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
-has-symbols@^1.0.0, has-symbols@^1.0.1:
+has-symbols@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz"
   integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
@@ -3968,7 +3898,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4055,11 +3985,6 @@ is-buffer@^1.1.5:
   resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
 
-is-buffer@~2.0.3:
-  version "2.0.4"
-  resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz"
-  integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
-
 is-callable@^1.1.4, is-callable@^1.2.2:
   version "1.2.2"
   resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz"
@@ -4216,6 +4141,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
   resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
   integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
 
+is-plain-obj@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+  integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
 is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   version "2.0.4"
   resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
@@ -4266,6 +4196,11 @@ is-typedarray@~1.0.0:
   resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
   integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
+is-unicode-supported@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+  integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
 is-utf8@^0.2.0:
   version "0.2.1"
   resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
@@ -4276,11 +4211,6 @@ is-windows@^1.0.0, is-windows@^1.0.2:
   resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
   integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
-isarray@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-  integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
-
 isarray@1.0.0, isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
@@ -4347,14 +4277,6 @@ js-tokens@^4.0.0:
   resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@3.13.1:
-  version "3.13.1"
-  resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz"
-  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
 js-yaml@3.x, js-yaml@^3.13.1:
   version "3.14.0"
   resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz"
@@ -4363,7 +4285,7 @@ js-yaml@3.x, js-yaml@^3.13.1:
     argparse "^1.0.7"
     esprima "^4.0.0"
 
-js-yaml@^4.1.0:
+js-yaml@4.1.0, js-yaml@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
   integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
@@ -4415,11 +4337,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
   resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
   integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
 
-json3@3.3.2:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
-  integrity sha512-I5YLeauH3rIaE99EE++UeH2M2gSYo8/2TqDac7oZEH6D/DSQ4Woa628Qrfj1X9/OY5Mk5VvIDQaKCDchXaKrmA==
-
 jsonfile@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
@@ -4593,34 +4510,6 @@ locate-path@^6.0.0:
   dependencies:
     p-locate "^5.0.0"
 
-lodash._baseassign@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
-  integrity sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash.keys "^3.0.0"
-
-lodash._basecopy@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-  integrity sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==
-
-lodash._basecreate@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
-  integrity sha512-EDem6C9iQpn7fxnGdmhXmqYGjCkStmDXT4AeyB2Ph8WKbglg4aJZczNkQglj+zWXcOEEkViK8THuV2JvugW47g==
-
-lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-  integrity sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==
-
-lodash._isiterateecall@^3.0.0:
-  version "3.0.9"
-  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
-  integrity sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==
-
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz"
@@ -4631,44 +4520,16 @@ lodash.clonedeep@^4.5.0:
   resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
   integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
-lodash.create@3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
-  integrity sha512-IUfOYwDEbI8JbhW6psW+Ig01BOVK67dTSCUAbS58M0HBkPcAv/jHuxD+oJVP2tUCo3H9L6f/8GM6rxwY+oc7/w==
-  dependencies:
-    lodash._baseassign "^3.0.0"
-    lodash._basecreate "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-
 lodash.get@^4.4.2:
   version "4.4.2"
   resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz"
   integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
 
-lodash.isarguments@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
-  integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==
-
-lodash.isarray@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
-  integrity sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==
-
 lodash.ismatch@^4.4.0:
   version "4.4.0"
   resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz"
   integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
 
-lodash.keys@^3.0.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
-  integrity sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==
-  dependencies:
-    lodash._getnative "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -4719,12 +4580,13 @@ log-driver@^1.2.7:
   resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz"
   integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
 
-log-symbols@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz"
-  integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+log-symbols@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+  integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
   dependencies:
-    chalk "^2.4.2"
+    chalk "^4.1.0"
+    is-unicode-supported "^0.1.0"
 
 loud-rejection@^1.0.0:
   version "1.6.0"
@@ -4753,13 +4615,6 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
-lru-cache@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
-  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
-  dependencies:
-    yallist "^4.0.0"
-
 macgyver@~1.10:
   version "1.10.1"
   resolved "https://registry.npmjs.org/macgyver/-/macgyver-1.10.1.tgz"
@@ -4984,19 +4839,19 @@ miniflare@3.20240524.1:
     youch "^3.2.2"
     zod "^3.20.6"
 
-"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
+"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
   dependencies:
     brace-expansion "^1.1.7"
 
-minimatch@3.0.4:
-  version "3.0.4"
-  resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
-  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+minimatch@5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
+  integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
   dependencies:
-    brace-expansion "^1.1.7"
+    brace-expansion "^2.0.1"
 
 minimatch@9.0.3:
   version "9.0.3"
@@ -5005,6 +4860,13 @@ minimatch@9.0.3:
   dependencies:
     brace-expansion "^2.0.1"
 
+minimatch@^5.0.1:
+  version "5.1.6"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+  integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimatch@^9.0.4:
   version "9.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
@@ -5029,11 +4891,6 @@ minimist-options@^3.0.1:
     arrify "^1.0.1"
     is-plain-obj "^1.1.0"
 
-minimist@0.0.8:
-  version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-  integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==
-
 minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
   version "1.2.6"
   resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz"
@@ -5154,66 +5011,38 @@ mkdirp@*, mkdirp@^1.0.3:
   resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-mkdirp@0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
-  integrity sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==
-  dependencies:
-    minimist "0.0.8"
-
-mkdirp@0.5.5, mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5:
+mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5:
   version "0.5.5"
   resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
   dependencies:
     minimist "^1.2.5"
 
-mocha@3.4.2:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594"
-  integrity sha512-19d+WPNPG+gCDZvyw8zMcn1MPl72yfZKuTjC/reTOVOFx3VBHXEwxxJyvi9B4G0RV49jjXs0huLKcG58X9S84Q==
-  dependencies:
-    browser-stdout "1.3.0"
-    commander "2.9.0"
-    debug "2.6.0"
-    diff "3.2.0"
-    escape-string-regexp "1.0.5"
-    glob "7.1.1"
-    growl "1.9.2"
-    json3 "3.3.2"
-    lodash.create "3.1.1"
-    mkdirp "0.5.1"
-    supports-color "3.1.2"
-
-mocha@^7.1.2:
-  version "7.2.0"
-  resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz"
-  integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+mocha@10.5.2, mocha@^10.5.2:
+  version "10.5.2"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.5.2.tgz#0a3481fb67c0a7fc144a909b2d6a9fec35ec5989"
+  integrity sha512-9btlN3JKCefPf+vKd/kcKz2SXxi12z6JswkGfaAF0saQvnsqLJk504ZmbxhSoENge08E9dsymozKgFMTl5PQsA==
   dependencies:
-    ansi-colors "3.2.3"
+    ansi-colors "4.1.1"
     browser-stdout "1.3.1"
-    chokidar "3.3.0"
-    debug "3.2.6"
-    diff "3.5.0"
-    escape-string-regexp "1.0.5"
-    find-up "3.0.0"
-    glob "7.1.3"
-    growl "1.10.5"
+    chokidar "^3.5.3"
+    debug "4.3.4"
+    diff "5.0.0"
+    escape-string-regexp "4.0.0"
+    find-up "5.0.0"
+    glob "8.1.0"
     he "1.2.0"
-    js-yaml "3.13.1"
-    log-symbols "3.0.0"
-    minimatch "3.0.4"
-    mkdirp "0.5.5"
-    ms "2.1.1"
-    node-environment-flags "1.0.6"
-    object.assign "4.1.0"
-    strip-json-comments "2.0.1"
-    supports-color "6.0.0"
-    which "1.3.1"
-    wide-align "1.1.3"
-    yargs "13.3.2"
-    yargs-parser "13.1.2"
-    yargs-unparser "1.6.0"
+    js-yaml "4.1.0"
+    log-symbols "4.1.0"
+    minimatch "5.0.1"
+    ms "2.1.3"
+    serialize-javascript "6.0.0"
+    strip-json-comments "3.1.1"
+    supports-color "8.1.1"
+    workerpool "6.2.1"
+    yargs "16.2.0"
+    yargs-parser "20.2.4"
+    yargs-unparser "2.0.0"
 
 modify-values@^1.0.0:
   version "1.0.1"
@@ -5232,26 +5061,21 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
-ms@0.7.2:
-  version "0.7.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
-  integrity sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
   integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
-ms@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"
-  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
-ms@2.1.2, ms@^2.0.0, ms@^2.1.1:
+ms@2.1.2:
   version "2.1.2"
   resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
 multimatch@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz"
@@ -5333,14 +5157,6 @@ nice-try@^1.0.4:
   resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
-node-environment-flags@1.0.6:
-  version "1.0.6"
-  resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz"
-  integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
-  dependencies:
-    object.getownpropertydescriptors "^2.0.3"
-    semver "^5.7.0"
-
 node-fetch-npm@^2.0.2:
   version "2.0.4"
   resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz"
@@ -5363,9 +5179,9 @@ node-forge@^1:
   integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
 
 node-gyp@>=10.x:
-  version "10.1.0"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.1.0.tgz#75e6f223f2acb4026866c26a2ead6aab75a8ca7e"
-  integrity sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==
+  version "10.2.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86"
+  integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==
   dependencies:
     env-paths "^2.2.0"
     exponential-backoff "^3.1.1"
@@ -5373,9 +5189,9 @@ node-gyp@>=10.x:
     graceful-fs "^4.2.6"
     make-fetch-happen "^13.0.0"
     nopt "^7.0.0"
-    proc-log "^3.0.0"
+    proc-log "^4.1.0"
     semver "^7.3.5"
-    tar "^6.1.2"
+    tar "^6.2.1"
     which "^4.0.0"
 
 node-gyp@^5.0.2:
@@ -5537,7 +5353,7 @@ object-inspect@^1.8.0:
   resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz"
   integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
 
-object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.0.12, object-keys@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -5549,16 +5365,6 @@ object-visit@^1.0.0:
   dependencies:
     isobject "^3.0.0"
 
-object.assign@4.1.0:
-  version "4.1.0"
-  resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz"
-  integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
-  dependencies:
-    define-properties "^1.1.2"
-    function-bind "^1.1.1"
-    has-symbols "^1.0.0"
-    object-keys "^1.0.11"
-
 object.assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz"
@@ -6069,12 +5875,7 @@ printable-characters@^1.0.42:
   resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8"
   integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==
 
-proc-log@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8"
-  integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==
-
-proc-log@^4.2.0:
+proc-log@^4.1.0, proc-log@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034"
   integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==
@@ -6184,6 +5985,13 @@ quick-lru@^4.0.1:
   resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
+randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
 read-cmd-shim@^1.0.1:
   version "1.0.5"
   resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz"
@@ -6283,16 +6091,6 @@ read@1, read@~1.0.1:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readable-stream@1.0.31:
-  version "1.0.31"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.31.tgz#8f2502e0bc9e3b0da1b94520aabb4e2603ecafae"
-  integrity sha512-tco/Dwv1f/sgIgN6CWdj/restacPKNskK6yps1981ivH2ZmLYcs5o5rVzL3qaO/cSkhN8hYOMWs7+glzOLSgRg==
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
 "readable-stream@2 || 3", readable-stream@^3.0.2:
   version "3.6.0"
   resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
@@ -6312,13 +6110,6 @@ readdir-scoped-modules@^1.0.0:
     graceful-fs "^4.1.2"
     once "^1.3.0"
 
-readdirp@~3.2.0:
-  version "3.2.0"
-  resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz"
-  integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
-  dependencies:
-    picomatch "^2.0.4"
-
 readdirp@~3.6.0:
   version "3.6.0"
   resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
@@ -6553,7 +6344,7 @@ rxjs@^6.4.0:
   dependencies:
     tslib "^1.9.0"
 
-safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -6597,17 +6388,17 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0:
   resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.3.5:
+semver@^7.3.5, semver@^7.5.4:
   version "7.6.2"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
   integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
 
-semver@^7.5.4:
-  version "7.5.4"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
-  integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+serialize-javascript@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+  integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
   dependencies:
-    lru-cache "^6.0.0"
+    randombytes "^2.1.0"
 
 set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
@@ -6978,7 +6769,7 @@ string-width@^3.0.0, string-width@^3.1.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
-string-width@^4.1.0:
+string-width@^4.1.0, string-width@^4.2.0:
   version "4.2.3"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
   integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -7019,11 +6810,6 @@ string_decoder@^1.1.1:
   dependencies:
     safe-buffer "~5.2.0"
 
-string_decoder@~0.10.x:
-  version "0.10.31"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-  integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
-
 string_decoder@~1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
@@ -7109,12 +6895,7 @@ strip-indent@^3.0.0:
   dependencies:
     min-indent "^1.0.0"
 
-strip-json-comments@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
-  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
-strip-json-comments@^3.1.1:
+strip-json-comments@3.1.1, strip-json-comments@^3.1.1:
   version "3.1.1"
   resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
   integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -7128,19 +6909,12 @@ strong-log-transformer@^2.0.0:
     minimist "^1.2.0"
     through "^2.3.4"
 
-supports-color@3.1.2:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
-  integrity sha512-F8dvPrZJtNzvDRX26eNXT4a7AecAvTGljmmnI39xEgSpbHKhQ7N0dO/NTxUExd0wuLHp4zbwYY7lvHq0aKpwrA==
+supports-color@8.1.1:
+  version "8.1.1"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+  integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
   dependencies:
-    has-flag "^1.0.0"
-
-supports-color@6.0.0:
-  version "6.0.0"
-  resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz"
-  integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
-  dependencies:
-    has-flag "^3.0.0"
+    has-flag "^4.0.0"
 
 supports-color@^3.1.0:
   version "3.2.3"
@@ -7189,7 +6963,7 @@ tar@^4.4.10, tar@^4.4.12, tar@^4.4.8:
     safe-buffer "^5.2.1"
     yallist "^3.1.1"
 
-tar@^6.1.11, tar@^6.1.2:
+tar@^6.1.11, tar@^6.2.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
   integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
@@ -7626,7 +7400,7 @@ which-module@^2.0.0:
   resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1:
+which@^1.1.1, which@^1.2.9, which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -7647,7 +7421,7 @@ which@^4.0.0:
   dependencies:
     isexe "^3.1.1"
 
-wide-align@1.1.3, wide-align@^1.1.0:
+wide-align@^1.1.0:
   version "1.1.3"
   resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz"
   integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
@@ -7693,6 +7467,11 @@ workerd@^1.20230419.0:
     "@cloudflare/workerd-linux-arm64" "1.20240529.0"
     "@cloudflare/workerd-windows-64" "1.20240529.0"
 
+workerpool@6.2.1:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
+  integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
+
 wrangler@3.58.0:
   version "3.58.0"
   resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-3.58.0.tgz#b2ce3ac2d2b86f31f3b33a496ef9c9656f41f2ea"
@@ -7733,6 +7512,15 @@ wrap-ansi@^5.1.0:
     string-width "^3.0.0"
     strip-ansi "^5.0.0"
 
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrap-ansi@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
@@ -7808,6 +7596,11 @@ y18n@^4.0.0:
   resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz"
   integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==
 
+y18n@^5.0.5:
+  version "5.0.8"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+  integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
 yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
   version "3.1.1"
   resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
@@ -7818,13 +7611,10 @@ yallist@^4.0.0:
   resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
 
-yargs-parser@13.1.2, yargs-parser@^13.1.2:
-  version "13.1.2"
-  resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz"
-  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
-  dependencies:
-    camelcase "^5.0.0"
-    decamelize "^1.2.0"
+yargs-parser@20.2.4:
+  version "20.2.4"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+  integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
 
 yargs-parser@^15.0.1:
   version "15.0.1"
@@ -7842,30 +7632,33 @@ yargs-parser@^18.1.3:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-unparser@1.6.0:
-  version "1.6.0"
-  resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz"
-  integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
-  dependencies:
-    flat "^4.1.0"
-    lodash "^4.17.15"
-    yargs "^13.3.0"
+yargs-parser@^20.2.2:
+  version "20.2.9"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+  integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
 
-yargs@13.3.2, yargs@^13.3.0:
-  version "13.3.2"
-  resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz"
-  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
-  dependencies:
-    cliui "^5.0.0"
-    find-up "^3.0.0"
-    get-caller-file "^2.0.1"
+yargs-unparser@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+  integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+  dependencies:
+    camelcase "^6.0.0"
+    decamelize "^4.0.0"
+    flat "^5.0.2"
+    is-plain-obj "^2.1.0"
+
+yargs@16.2.0:
+  version "16.2.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+  integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+  dependencies:
+    cliui "^7.0.2"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
     require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^3.0.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^13.1.2"
+    string-width "^4.2.0"
+    y18n "^5.0.5"
+    yargs-parser "^20.2.2"
 
 yargs@^14.2.2:
   version "14.2.3"
-- 
GitLab