From ecca1754c6a9de0b9c1bd981cc0fadb57a392fe7 Mon Sep 17 00:00:00 2001
From: MrBBot <bcoll@cloudflare.com>
Date: Fri, 15 Mar 2024 18:21:48 +0000
Subject: [PATCH] chore: bump `esbuild` to `0.18.20` (#5213)

---
 .changeset/empty-kids-agree.md                |  15 +
 .prettierignore                               |   4 +
 .../additional-modules/test/index.test.ts     |   6 +-
 .../src/explicit-resource-management.js       |  24 ++
 fixtures/worker-app/src/index.js              |   7 +
 fixtures/worker-app/tests/index.test.ts       |  16 +
 package.json                                  |   2 +-
 packages/cli/package.json                     |   2 +-
 packages/miniflare/package.json               |   2 +-
 packages/miniflare/scripts/build.mjs          |  32 +-
 packages/vitest-pool-workers/package.json     |   2 +-
 packages/wrangler/package.json                |   2 +-
 .../wrangler/src/__tests__/deploy.test.ts     |   7 +-
 .../wrangler/src/__tests__/middleware.test.ts |  10 +-
 .../src/__tests__/pages/deploy.test.ts        |  79 ++---
 .../__tests__/pages/functions-build.test.ts   |  15 +
 .../src/deployment-bundle/bundle-reporter.ts  |   8 +-
 .../wrangler/src/deployment-bundle/bundle.ts  |   6 +
 packages/wrangler/templates/symbol-dispose.js |   6 +
 pnpm-lock.yaml                                | 326 +++---------------
 20 files changed, 227 insertions(+), 344 deletions(-)
 create mode 100644 .changeset/empty-kids-agree.md
 create mode 100644 fixtures/worker-app/src/explicit-resource-management.js
 create mode 100644 packages/wrangler/templates/symbol-dispose.js

diff --git a/.changeset/empty-kids-agree.md b/.changeset/empty-kids-agree.md
new file mode 100644
index 0000000000000..88fec8dd41644
--- /dev/null
+++ b/.changeset/empty-kids-agree.md
@@ -0,0 +1,15 @@
+---
+"wrangler": major
+---
+
+feature: bump `esbuild` to [`0.18.20`](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md#01820)
+
+Previously, Wrangler used `esbuild@0.17.19` when bundling your Worker. Notable changes include:
+
+- [Breaking changes](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md#0180) to `tsconfig.json` support
+- Support for [auto-accessors](https://github.com/tc39/proposal-grouped-and-auto-accessors?tab=readme-ov-file#auto-accessors)
+- Support for [explicit resource management](https://github.com/tc39/proposal-explicit-resource-management) with `using` declarations
+
+Note `esbuild` only transforms `using` syntax by default, relying on runtime support for `Symbol.dispose` and `Symbol.asyncDispose`. The Workers runtime doesn't provide these symbols yet, so Wrangler automatically injects polyfills for them. This allows you to use `using` without any additional changes.
+
+Unfortunately, we currently aren't able to bump to [`0.19.0`](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md#0190) and above. This version changes how dynamic `import()`s are handled in a way that's incompatible with Wrangler's own module collection behaviour. We're currently investigating potential workarounds.
diff --git a/.prettierignore b/.prettierignore
index 869dc7c3ac899..5f1757f36563a 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -53,3 +53,7 @@ packages/create-cloudflare/templates/**/*.*
 # support this syntax so exclude those files.
 fixtures/vitest-pool-workers-examples/basics-unit-integration-self/src/index.ts
 fixtures/vitest-pool-workers-examples/queues/src/index.ts
+
+# Prettier 2 doesn't support `using` syntax. We'd like to test this syntax works
+# so ignore files containing it until we upgrade to Prettier 3.
+fixtures/worker-app/src/explicit-resource-management.js
diff --git a/fixtures/additional-modules/test/index.test.ts b/fixtures/additional-modules/test/index.test.ts
index d2e06519e0094..2fe144df524ae 100644
--- a/fixtures/additional-modules/test/index.test.ts
+++ b/fixtures/additional-modules/test/index.test.ts
@@ -166,7 +166,11 @@ describe("find_additional_modules deploy", () => {
 		const bundledEntryPath = path.join(outDir, "index.js");
 		const bundledEntry = await fs.readFile(bundledEntryPath, "utf8");
 		expect(bundledEntry).toMatchInlineSnapshot(`
-			"// src/index.ts
+			"// ../../packages/wrangler/templates/symbol-dispose.js
+			Symbol.dispose ??= Symbol("Symbol.dispose");
+			Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
+
+			// src/index.ts
 			import common from "./common.cjs";
 
 			// src/dep.ts
diff --git a/fixtures/worker-app/src/explicit-resource-management.js b/fixtures/worker-app/src/explicit-resource-management.js
new file mode 100644
index 0000000000000..cffcd2f8f1817
--- /dev/null
+++ b/fixtures/worker-app/src/explicit-resource-management.js
@@ -0,0 +1,24 @@
+/** @param {string[]} logs */
+function connect(logs) {
+	logs.push("Connected");
+	return {
+		send(message) {
+			logs.push(`Sent ${message}`);
+		},
+		[Symbol.dispose]() {
+			logs.push("Disconnected synchronously");
+		},
+		async [Symbol.asyncDispose]() {
+			logs.push("Disconnected asynchronously");
+		},
+	};
+}
+
+/** @param {string[]} logs */
+export async function testExplicitResourceManagement(logs) {
+	using syncConnect = connect(logs);
+		await using asyncConnect = connect(logs);
+
+	syncConnect.send("hello");
+	asyncConnect.send("goodbye");
+}
diff --git a/fixtures/worker-app/src/index.js b/fixtures/worker-app/src/index.js
index e02a2b6d2b244..bab2638e72e2e 100644
--- a/fixtures/worker-app/src/index.js
+++ b/fixtures/worker-app/src/index.js
@@ -1,6 +1,7 @@
 import cookie from "cookie";
 import { randomBytes } from "isomorphic-random-example";
 import { now } from "./dep";
+import { testExplicitResourceManagement } from "./explicit-resource-management";
 import { logErrors } from "./log";
 
 console.log("startup log");
@@ -40,6 +41,12 @@ export default {
 				],
 			});
 
+		if (pathname === "/explicit-resource-management") {
+			const logs = [];
+			await testExplicitResourceManagement(logs);
+			return Response.json(logs);
+		}
+
 		if (request.headers.get("X-Test-URL") !== null) {
 			return new Response(request.url);
 		}
diff --git a/fixtures/worker-app/tests/index.test.ts b/fixtures/worker-app/tests/index.test.ts
index 1356f90e89a87..d99710d949fc9 100644
--- a/fixtures/worker-app/tests/index.test.ts
+++ b/fixtures/worker-app/tests/index.test.ts
@@ -157,4 +157,20 @@ describe("'wrangler dev' correctly renders pages", () => {
 			tag: expect.any(String),
 		});
 	});
+
+	it("uses explicit resource management", async ({ expect }) => {
+		const response = await fetch(
+			`http://${ip}:${port}/explicit-resource-management`
+		);
+		expect(await response.json()).toMatchInlineSnapshot(`
+			[
+			  "Connected",
+			  "Connected",
+			  "Sent hello",
+			  "Sent goodbye",
+			  "Disconnected asynchronously",
+			  "Disconnected synchronously",
+			]
+		`);
+	});
 });
diff --git a/package.json b/package.json
index 955d514bf7343..b7e4b0bcfa8bf 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
 		"@turbo/gen": "^1.10.13",
 		"@vue/compiler-sfc": "^3.3.4",
 		"dotenv-cli": "^7.3.0",
-		"esbuild": "0.17.19",
+		"esbuild": "0.18.20",
 		"turbo": "^1.10.14"
 	},
 	"engines": {
diff --git a/packages/cli/package.json b/packages/cli/package.json
index b2913e588de6d..61ca53f993dac 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -29,7 +29,7 @@
 		"@typescript-eslint/eslint-plugin": "^5.55.0",
 		"@typescript-eslint/parser": "^5.55.0",
 		"chalk": "^2.4.2",
-		"esbuild": "^0.17.12",
+		"esbuild": "0.18.20",
 		"log-update": "^5.0.1",
 		"pnpm": "^8.6.11",
 		"undici": "5.28.3"
diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json
index adcaaa59aff40..0b455c54c005f 100644
--- a/packages/miniflare/package.json
+++ b/packages/miniflare/package.json
@@ -75,7 +75,7 @@
 		"concurrently": "^8.2.2",
 		"devalue": "^4.3.0",
 		"devtools-protocol": "^0.0.1182435",
-		"esbuild": "^0.16.17",
+		"esbuild": "0.18.20",
 		"eslint": "^8.6.0",
 		"eslint-config-prettier": "^9.0.0",
 		"eslint-plugin-es": "^4.1.0",
diff --git a/packages/miniflare/scripts/build.mjs b/packages/miniflare/scripts/build.mjs
index e6979290efc04..383f9fc093f00 100644
--- a/packages/miniflare/scripts/build.mjs
+++ b/packages/miniflare/scripts/build.mjs
@@ -70,9 +70,9 @@ const rewriteNodeToInternalPlugin = {
 };
 
 /**
- * @type {Map<string, esbuild.BuildResult>}
+ * @type {Map<string, esbuild.BuildContext>}
  */
-const workersBuilders = new Map();
+const workerContexts = new Map();
 /**
  * @type {esbuild.Plugin}
  */
@@ -93,9 +93,9 @@ const embedWorkersPlugin = {
 			return { path: result.path, namespace };
 		});
 		build.onLoad({ filter: /.*/, namespace }, async (args) => {
-			let builder = workersBuilders.get(args.path);
-			if (builder === undefined) {
-				builder = await esbuild.build({
+			let context = workerContexts.get(args.path);
+			if (context === undefined) {
+				context = await esbuild.context({
 					platform: "node", // Marks `node:*` imports as external
 					format: "esm",
 					target: "esnext",
@@ -104,7 +104,6 @@ const embedWorkersPlugin = {
 					sourcesContent: false,
 					external: ["miniflare:shared", "miniflare:zod"],
 					metafile: true,
-					incremental: watch, // Allow `rebuild()` calls if watching
 					entryPoints: [args.path],
 					minifySyntax: true,
 					outdir: build.initialOptions.outdir,
@@ -115,22 +114,21 @@ const embedWorkersPlugin = {
 							? [rewriteNodeToInternalPlugin]
 							: [],
 				});
-			} else {
-				builder = await builder.rebuild();
+				workerContexts.set(args.path, context);
 			}
-			workersBuilders.set(args.path, builder);
+			const result = await context.rebuild();
 			await fs.mkdir("worker-metafiles", { recursive: true });
 			await fs.writeFile(
 				path.join(
 					"worker-metafiles",
 					path.basename(args.path) + ".metafile.json"
 				),
-				JSON.stringify(builder.metafile)
+				JSON.stringify(result.metafile)
 			);
 			let outPath = args.path.substring(workersRoot.length + 1);
 			outPath = outPath.substring(0, outPath.lastIndexOf(".")) + ".js";
 			outPath = JSON.stringify(outPath);
-			const watchFiles = Object.keys(builder.metafile.inputs);
+			const watchFiles = Object.keys(result.metafile.inputs);
 			const contents = `
       import fs from "fs";
       import path from "path";
@@ -164,7 +162,7 @@ async function buildPackage() {
 	}
 	const outPath = path.join(pkgRoot, "dist");
 
-	await esbuild.build({
+	const context = await esbuild.context({
 		platform: "node",
 		format: "cjs",
 		target: "esnext",
@@ -187,11 +185,19 @@ async function buildPackage() {
 		],
 		plugins: [embedWorkersPlugin],
 		logLevel: watch ? "info" : "warning",
-		watch,
 		outdir: outPath,
 		outbase: pkgRoot,
 		entryPoints: [indexPath, ...testPaths],
 	});
+	if (watch) {
+		await context.watch();
+	} else {
+		await context.rebuild();
+		await context.dispose();
+		for (const workerContext of workerContexts.values()) {
+			await workerContext.dispose();
+		}
+	}
 }
 
 await buildPackage();
diff --git a/packages/vitest-pool-workers/package.json b/packages/vitest-pool-workers/package.json
index 8080ce34cda00..307fdff73e161 100644
--- a/packages/vitest-pool-workers/package.json
+++ b/packages/vitest-pool-workers/package.json
@@ -64,7 +64,7 @@
 		"birpc": "0.2.14",
 		"cjs-module-lexer": "^1.2.3",
 		"devalue": "^4.3.0",
-		"esbuild": "0.17.19",
+		"esbuild": "0.18.20",
 		"miniflare": "workspace:*",
 		"wrangler": "workspace:*",
 		"zod": "^3.20.6"
diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json
index 6b4c86258ac3b..76222cd153f8d 100644
--- a/packages/wrangler/package.json
+++ b/packages/wrangler/package.json
@@ -106,7 +106,7 @@
 		"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
 		"blake3-wasm": "^2.1.5",
 		"chokidar": "^3.5.3",
-		"esbuild": "0.17.19",
+		"esbuild": "0.18.20",
 		"miniflare": "workspace:*",
 		"nanoid": "^3.3.3",
 		"path-to-regexp": "^6.2.0",
diff --git a/packages/wrangler/src/__tests__/deploy.test.ts b/packages/wrangler/src/__tests__/deploy.test.ts
index 8226a5d0418bd..6ffe46043ad82 100644
--- a/packages/wrangler/src/__tests__/deploy.test.ts
+++ b/packages/wrangler/src/__tests__/deploy.test.ts
@@ -1964,8 +1964,13 @@ addEventListener('fetch', event => {});`
 						}
 					}`
 				);
+				// If this test fails in the future, it's likely the line number of the
+				// `ReferenceError` in `index.js` below is incorrect. To get the new
+				// number, run `wrangler deploy index.ts --dry-run --outdir=dist` with
+				// `index.ts` containing the contents above. Then look in `dist/index.js`
+				// for a line containing `x;`. This is the line number you want.
 				mockDeployWithValidationError(
-					"Uncaught ReferenceError: x is not defined\n  at index.js:2:1\n"
+					"Uncaught ReferenceError: x is not defined\n  at index.js:6:1\n"
 				);
 				mockSubDomainRequest();
 
diff --git a/packages/wrangler/src/__tests__/middleware.test.ts b/packages/wrangler/src/__tests__/middleware.test.ts
index ced288231c810..9da7518302be9 100644
--- a/packages/wrangler/src/__tests__/middleware.test.ts
+++ b/packages/wrangler/src/__tests__/middleware.test.ts
@@ -784,7 +784,11 @@ describe("middleware", () => {
 					.replace(/\/\/ .*/g, "")
 					.trim()
 			).toMatchInlineSnapshot(`
-			"var src_default = {
+			"Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+			Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
+
+			var src_default = {
 			  async fetch(request, env) {
 			    return Response.json(env);
 			  }
@@ -827,7 +831,7 @@ describe("middleware", () => {
 			}
 
 
-			var __Facade_ScheduledController__ = class {
+			var __Facade_ScheduledController__ = class ___Facade_ScheduledController__ {
 			  constructor(scheduledTime, cron, noRetry) {
 			    this.scheduledTime = scheduledTime;
 			    this.cron = cron;
@@ -835,7 +839,7 @@ describe("middleware", () => {
 			  }
 			  #noRetry;
 			  noRetry() {
-			    if (!(this instanceof __Facade_ScheduledController__)) {
+			    if (!(this instanceof ___Facade_ScheduledController__)) {
 			      throw new TypeError(\\"Illegal invocation\\");
 			    }
 			    this.#noRetry();
diff --git a/packages/wrangler/src/__tests__/pages/deploy.test.ts b/packages/wrangler/src/__tests__/pages/deploy.test.ts
index 796d6040c48a8..8c839f3032d8b 100644
--- a/packages/wrangler/src/__tests__/pages/deploy.test.ts
+++ b/packages/wrangler/src/__tests__/pages/deploy.test.ts
@@ -20,6 +20,24 @@ import { normalizeProgressSteps } from "./project-upload.test";
 import type { Project, UploadPayloadFile } from "../../pages/types";
 import type { RestRequest } from "msw";
 
+function normaliseWorkerBundle(bundle: string): string {
+	// some fields in workerBundle, such as the undici form boundary
+	// or the file hashes, are randomly generated. Let's replace these
+	// dynamic values with static ones so we can properly test the
+	// contents of `workerBundle`
+	// see https://jestjs.io/docs/snapshot-testing#property-matchers
+	bundle = bundle.replace(
+		/------formdata-undici-0.[0-9]*/g,
+		"------formdata-undici-0.test"
+	);
+	bundle = bundle.replace(
+		/bundledWorker-0.[0-9]*.mjs/g,
+		"bundledWorker-0.test.mjs"
+	);
+	bundle = bundle.replace(/\/\/.+symbol-dispose\.js/, "// symbol-dispose.js");
+	return bundle;
+}
+
 describe("pages deploy", () => {
 	const std = mockConsoleMethods();
 	const workerHasD1Shim = (contents: string) => contents.includes("D1_ERROR");
@@ -2056,24 +2074,10 @@ and that at least one include rule is provided.
 				            }
 			          `);
 
-					// some fields in workerBundle, such as the undici form boundary
-					// or the file hashes, are randomly generated. Let's replace these
-					// dynamic values with static ones so we can properly test the
-					// contents of `workerBundle`
-					// see https://jestjs.io/docs/snapshot-testing#property-matchers
-					let workerBundleWithConstantData = workerBundle.replace(
-						/------formdata-undici-0.[0-9]*/g,
-						"------formdata-undici-0.test"
-					);
-					workerBundleWithConstantData = workerBundleWithConstantData.replace(
-						/bundledWorker-0.[0-9]*.mjs/g,
-						"bundledWorker-0.test.mjs"
-					);
-
 					// we care about a couple of things here, like the presence of `metadata`,
 					// `bundledWorker`, the wasm import, etc., and since `workerBundle` is
 					// small enough, let's go ahead and snapshot test the whole thing
-					expect(workerBundleWithConstantData).toMatchInlineSnapshot(`
+					expect(normaliseWorkerBundle(workerBundle)).toMatchInlineSnapshot(`
 				"------formdata-undici-0.test
 				Content-Disposition: form-data; name=\\"metadata\\"
 
@@ -2082,6 +2086,10 @@ and that at least one include rule is provided.
 				Content-Disposition: form-data; name=\\"bundledWorker-0.test.mjs\\"; filename=\\"bundledWorker-0.test.mjs\\"
 				Content-Type: application/javascript+module
 
+				// symbol-dispose.js
+				Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+				Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 				// _worker.js
 				var worker_default = {
 				  async fetch(request, env) {
@@ -2380,24 +2388,11 @@ and that at least one include rule is provided.
 				}
 			`);
 
-					// some fields in workerBundle, such as the undici form boundary
-					// or the file hashes, are randomly generated. Let's replace these
-					// dynamic values with static ones so we can properly test the
-					// contents of `workerBundle`
-					// see https://jestjs.io/docs/snapshot-testing#property-matchers
-					let workerBundleWithConstantData = customWorkerBundle.replace(
-						/------formdata-undici-0.[0-9]*/g,
-						"------formdata-undici-0.test"
-					);
-					workerBundleWithConstantData = workerBundleWithConstantData.replace(
-						/bundledWorker-0.[0-9]*.mjs/g,
-						"bundledWorker-0.test.mjs"
-					);
-
 					// we care about a couple of things here, like the presence of `metadata`,
 					// `bundledWorker`, the wasm import, etc., and since `workerBundle` is
 					// small enough, let's go ahead and snapshot test the whole thing
-					expect(workerBundleWithConstantData).toMatchInlineSnapshot(`
+					expect(normaliseWorkerBundle(customWorkerBundle))
+						.toMatchInlineSnapshot(`
 				"------formdata-undici-0.test
 				Content-Disposition: form-data; name=\\"metadata\\"
 
@@ -2406,6 +2401,10 @@ and that at least one include rule is provided.
 				Content-Disposition: form-data; name=\\"bundledWorker-0.test.mjs\\"; filename=\\"bundledWorker-0.test.mjs\\"
 				Content-Type: application/javascript+module
 
+				// symbol-dispose.js
+				Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+				Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 				// _worker.js
 				var worker_default = {
 				  async fetch(request, env) {
@@ -2803,19 +2802,9 @@ async function onRequest() {
 				  "/README.md": "13a03eaf24ae98378acd36ea00f77f2f",
 				}
 			`);
-					// some fields in workerBundle, such as the undici form boundary
-					// or the file hashes, are randomly generated. Let's replace these
-					// dynamic values with static ones so we can properly test the
-					// contents of `workerBundle`
-					// see https://jestjs.io/docs/snapshot-testing#property-matchers
-					let workerBundleWithConstantData = workerBundle.replace(
-						/------formdata-undici-0.[0-9]*/g,
-						"------formdata-undici-0.test"
-					);
-					workerBundleWithConstantData = workerBundleWithConstantData.replace(
-						/bundledWorker-0.[0-9]*.mjs/g,
-						"bundledWorker-0.test.mjs"
-					);
+
+					let workerBundleWithConstantData =
+						normaliseWorkerBundle(workerBundle);
 					workerBundleWithConstantData = workerBundleWithConstantData.replace(
 						/[0-9a-z]*-hello.wasm/g,
 						"test-hello.wasm"
@@ -2837,6 +2826,10 @@ async function onRequest() {
 				Content-Disposition: form-data; name=\\"bundledWorker-0.test.mjs\\"; filename=\\"bundledWorker-0.test.mjs\\"
 				Content-Type: application/javascript+module
 
+				// symbol-dispose.js
+				Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+				Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 				// _worker.js
 				import wasm from \\"./test-hello.wasm\\";
 				import html from \\"./test-hello.html\\";
diff --git a/packages/wrangler/src/__tests__/pages/functions-build.test.ts b/packages/wrangler/src/__tests__/pages/functions-build.test.ts
index 2cdcf2992fea6..484e57153f077 100644
--- a/packages/wrangler/src/__tests__/pages/functions-build.test.ts
+++ b/packages/wrangler/src/__tests__/pages/functions-build.test.ts
@@ -214,6 +214,7 @@ export default {
 			[
 				[/------formdata-undici-0.[0-9]*/g, "------formdata-undici-0.test"],
 				[/functionsWorker-0.[0-9]*.js/g, "functionsWorker-0.test.js"],
+				[/\/\/.+symbol-dispose\.js/, "// symbol-dispose.js"],
 			]
 		);
 
@@ -226,6 +227,10 @@ export default {
 		Content-Disposition: form-data; name=\\"functionsWorker-0.test.js\\"; filename=\\"functionsWorker-0.test.js\\"
 		Content-Type: application/javascript+module
 
+		// symbol-dispose.js
+		Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+		Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 		// ../utils/meaning-of-life.js
 		var MEANING_OF_LIFE = 21;
 
@@ -360,6 +365,7 @@ export default {
 			[
 				[/------formdata-undici-0.[0-9]*/g, "------formdata-undici-0.test"],
 				[/functionsWorker-0.[0-9]*.js/g, "functionsWorker-0.test.js"],
+				[/\/\/.+symbol-dispose\.js/, "// symbol-dispose.js"],
 			]
 		);
 
@@ -372,6 +378,10 @@ export default {
 		Content-Disposition: form-data; name=\\"functionsWorker-0.test.js\\"; filename=\\"functionsWorker-0.test.js\\"
 		Content-Type: application/javascript+module
 
+		// symbol-dispose.js
+		Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+		Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 		// _worker.js
 		var worker_default = {
 		  async fetch(request, env) {
@@ -490,6 +500,7 @@ export const cat = "dog";`
 				[/------formdata-undici-0.[0-9]*/g, "------formdata-undici-0.test"],
 				[/bundledWorker-0.[0-9]*.mjs/g, "bundledWorker-0.test.mjs"],
 				[/bundledWorker-0.[0-9]*.map/g, "bundledWorker-0.test.map"],
+				[/\/\/.+symbol-dispose\.js/, "// symbol-dispose.js"],
 			]
 		);
 
@@ -502,6 +513,10 @@ export const cat = "dog";`
 		Content-Disposition: form-data; name=\\"bundledWorker-0.test.mjs\\"; filename=\\"bundledWorker-0.test.mjs\\"
 		Content-Type: application/javascript+module
 
+		// symbol-dispose.js
+		Symbol.dispose ??= Symbol(\\"Symbol.dispose\\");
+		Symbol.asyncDispose ??= Symbol(\\"Symbol.asyncDispose\\");
+
 		// _worker.js/index.js
 		import { cat } from \\"./cat.js\\";
 		import { dog } from \\"./dog.mjs\\";
diff --git a/packages/wrangler/src/deployment-bundle/bundle-reporter.ts b/packages/wrangler/src/deployment-bundle/bundle-reporter.ts
index 6b700a744e35e..1a21d8b7640c4 100644
--- a/packages/wrangler/src/deployment-bundle/bundle-reporter.ts
+++ b/packages/wrangler/src/deployment-bundle/bundle-reporter.ts
@@ -1,7 +1,9 @@
 import { Blob } from "node:buffer";
+import path from "node:path";
 import { gzipSync } from "node:zlib";
 import chalk from "chalk";
 import { logger } from "../logger";
+import { getBasePath } from "../paths";
 import type { CfModule } from "./worker";
 import type { Metafile } from "esbuild";
 
@@ -53,7 +55,11 @@ export function printOffendingDependencies(
 ) {
 	const warning: string[] = [];
 
-	const dependenciesSorted = Object.entries(dependencies);
+	const basePath = getBasePath();
+	const dependenciesSorted = Object.entries(dependencies).filter(
+		// Ignore internal dependencies (note `dep` may be relative)
+		([dep]) => !path.resolve(dep).includes(basePath)
+	);
 	dependenciesSorted.sort(
 		([_adep, aData], [_bdep, bData]) =>
 			bData.bytesInOutput - aData.bytesInOutput
diff --git a/packages/wrangler/src/deployment-bundle/bundle.ts b/packages/wrangler/src/deployment-bundle/bundle.ts
index 5e7950f2a0aa6..6eabefb15e155 100644
--- a/packages/wrangler/src/deployment-bundle/bundle.ts
+++ b/packages/wrangler/src/deployment-bundle/bundle.ts
@@ -269,6 +269,12 @@ export async function bundleWorker(
 	// imported in this injected module. Importing that module registers watchers.
 	inject.push(path.resolve(getBasePath(), "templates/modules-watch-stub.js"));
 
+	// Whilst `esbuild` includes support for transforming `using` and
+	// `await using` syntax, it doesn't polyfill missing built-in `Symbol`s.
+	// These aren't defined by the version of V8 `workerd` uses at the moment,
+	// so polyfill them if they're not set.
+	inject.push(path.resolve(getBasePath(), "templates/symbol-dispose.js"));
+
 	const buildOptions: esbuild.BuildOptions & { metafile: true } = {
 		// Don't use entryFile here as the file may have been changed when applying the middleware
 		entryPoints: [entry.file],
diff --git a/packages/wrangler/templates/symbol-dispose.js b/packages/wrangler/templates/symbol-dispose.js
new file mode 100644
index 0000000000000..4177581f07f14
--- /dev/null
+++ b/packages/wrangler/templates/symbol-dispose.js
@@ -0,0 +1,6 @@
+// Whilst `esbuild` includes support for transforming `using` and `await using`
+// syntax, it doesn't polyfill missing built-in `Symbol`s. These aren't defined
+// by the version of V8 `workerd` uses at the moment, so polyfill them if
+// they're not set.
+Symbol.dispose ??= Symbol("Symbol.dispose");
+Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5cb0813afe18c..3fd98182b3ab6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -42,7 +42,7 @@ importers:
         version: 7.0.3
       esbuild-register:
         specifier: ^3.5.0
-        version: 3.5.0(esbuild@0.17.19)
+        version: 3.5.0(esbuild@0.18.20)
       ioredis:
         specifier: ^4.28.2
         version: 4.28.4
@@ -90,8 +90,8 @@ importers:
         specifier: ^7.3.0
         version: 7.3.0
       esbuild:
-        specifier: 0.17.19
-        version: 0.17.19
+        specifier: 0.18.20
+        version: 0.18.20
       turbo:
         specifier: ^1.10.14
         version: 1.10.14
@@ -672,7 +672,7 @@ importers:
         version: 20.8.3
       jose:
         specifier: ^5.2.2
-        version: 5.2.2
+        version: 5.2.3
       miniflare:
         specifier: workspace:*
         version: link:../../packages/miniflare
@@ -744,8 +744,8 @@ importers:
         specifier: ^2.4.2
         version: 2.4.2
       esbuild:
-        specifier: ^0.17.12
-        version: 0.17.19
+        specifier: 0.18.20
+        version: 0.18.20
       log-update:
         specifier: ^5.0.1
         version: 5.0.1
@@ -1103,8 +1103,8 @@ importers:
         specifier: ^0.0.1182435
         version: 0.0.1182435
       esbuild:
-        specifier: ^0.16.17
-        version: 0.16.17
+        specifier: 0.18.20
+        version: 0.18.20
       eslint:
         specifier: ^8.6.0
         version: 8.49.0
@@ -1305,8 +1305,8 @@ importers:
         specifier: ^4.3.0
         version: 4.3.2
       esbuild:
-        specifier: 0.17.19
-        version: 0.17.19
+        specifier: 0.18.20
+        version: 0.18.20
       miniflare:
         specifier: workspace:*
         version: link:../miniflare
@@ -1520,10 +1520,10 @@ importers:
         version: link:../kv-asset-handler
       '@esbuild-plugins/node-globals-polyfill':
         specifier: ^0.2.3
-        version: 0.2.3(esbuild@0.17.19)
+        version: 0.2.3(esbuild@0.18.20)
       '@esbuild-plugins/node-modules-polyfill':
         specifier: ^0.2.2
-        version: 0.2.2(esbuild@0.17.19)
+        version: 0.2.2(esbuild@0.18.20)
       blake3-wasm:
         specifier: ^2.1.5
         version: 2.1.5
@@ -1531,8 +1531,8 @@ importers:
         specifier: ^3.5.3
         version: 3.5.3
       esbuild:
-        specifier: 0.17.19
-        version: 0.17.19
+        specifier: 0.18.20
+        version: 0.18.20
       miniflare:
         specifier: workspace:*
         version: link:../miniflare
@@ -1696,7 +1696,7 @@ importers:
         version: 1.3.1
       esbuild-jest:
         specifier: 0.5.0
-        version: 0.5.0(esbuild@0.17.19)(supports-color@9.2.2)
+        version: 0.5.0(esbuild@0.18.20)(supports-color@9.2.2)
       execa:
         specifier: ^6.1.0
         version: 6.1.0
@@ -4266,20 +4266,20 @@ packages:
       get-tsconfig: 4.7.0
     dev: true
 
-  /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19):
+  /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.18.20):
     resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==}
     peerDependencies:
       esbuild: '*'
     dependencies:
-      esbuild: 0.17.19
+      esbuild: 0.18.20
     dev: false
 
-  /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19):
+  /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.18.20):
     resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==}
     peerDependencies:
       esbuild: '*'
     dependencies:
-      esbuild: 0.17.19
+      esbuild: 0.18.20
       escape-string-regexp: 4.0.0
       rollup-plugin-node-polyfills: 0.2.1
     dev: false
@@ -4292,15 +4292,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/android-arm64@0.16.17:
-    resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm64@0.16.3:
     resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==}
     engines: {node: '>=12'}
@@ -4316,6 +4307,7 @@ packages:
     cpu: [arm64]
     os: [android]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/android-arm64@0.17.6:
@@ -4333,7 +4325,6 @@ packages:
     cpu: [arm64]
     os: [android]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/android-arm64@0.19.12:
@@ -4344,15 +4335,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/android-arm@0.16.17:
-    resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm@0.16.3:
     resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==}
     engines: {node: '>=12'}
@@ -4368,6 +4350,7 @@ packages:
     cpu: [arm]
     os: [android]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/android-arm@0.17.6:
@@ -4385,7 +4368,6 @@ packages:
     cpu: [arm]
     os: [android]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/android-arm@0.19.12:
@@ -4396,15 +4378,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/android-x64@0.16.17:
-    resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-x64@0.16.3:
     resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==}
     engines: {node: '>=12'}
@@ -4420,6 +4393,7 @@ packages:
     cpu: [x64]
     os: [android]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/android-x64@0.17.6:
@@ -4437,7 +4411,6 @@ packages:
     cpu: [x64]
     os: [android]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/android-x64@0.19.12:
@@ -4448,15 +4421,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/darwin-arm64@0.16.17:
-    resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/darwin-arm64@0.16.3:
     resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==}
     engines: {node: '>=12'}
@@ -4472,6 +4436,7 @@ packages:
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/darwin-arm64@0.17.6:
@@ -4489,7 +4454,6 @@ packages:
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/darwin-arm64@0.19.12:
@@ -4500,15 +4464,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/darwin-x64@0.16.17:
-    resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/darwin-x64@0.16.3:
     resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==}
     engines: {node: '>=12'}
@@ -4524,6 +4479,7 @@ packages:
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/darwin-x64@0.17.6:
@@ -4541,7 +4497,6 @@ packages:
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/darwin-x64@0.19.12:
@@ -4552,15 +4507,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/freebsd-arm64@0.16.17:
-    resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/freebsd-arm64@0.16.3:
     resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==}
     engines: {node: '>=12'}
@@ -4576,6 +4522,7 @@ packages:
     cpu: [arm64]
     os: [freebsd]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/freebsd-arm64@0.17.6:
@@ -4593,7 +4540,6 @@ packages:
     cpu: [arm64]
     os: [freebsd]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/freebsd-arm64@0.19.12:
@@ -4604,15 +4550,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/freebsd-x64@0.16.17:
-    resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/freebsd-x64@0.16.3:
     resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==}
     engines: {node: '>=12'}
@@ -4628,6 +4565,7 @@ packages:
     cpu: [x64]
     os: [freebsd]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/freebsd-x64@0.17.6:
@@ -4645,7 +4583,6 @@ packages:
     cpu: [x64]
     os: [freebsd]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/freebsd-x64@0.19.12:
@@ -4656,15 +4593,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-arm64@0.16.17:
-    resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-arm64@0.16.3:
     resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==}
     engines: {node: '>=12'}
@@ -4680,6 +4608,7 @@ packages:
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-arm64@0.17.6:
@@ -4697,7 +4626,6 @@ packages:
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-arm64@0.19.12:
@@ -4708,15 +4636,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-arm@0.16.17:
-    resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-arm@0.16.3:
     resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==}
     engines: {node: '>=12'}
@@ -4732,6 +4651,7 @@ packages:
     cpu: [arm]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-arm@0.17.6:
@@ -4749,7 +4669,6 @@ packages:
     cpu: [arm]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-arm@0.19.12:
@@ -4760,15 +4679,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-ia32@0.16.17:
-    resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-ia32@0.16.3:
     resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==}
     engines: {node: '>=12'}
@@ -4784,6 +4694,7 @@ packages:
     cpu: [ia32]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-ia32@0.17.6:
@@ -4801,7 +4712,6 @@ packages:
     cpu: [ia32]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-ia32@0.19.12:
@@ -4812,15 +4722,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-loong64@0.16.17:
-    resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-loong64@0.16.3:
     resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==}
     engines: {node: '>=12'}
@@ -4836,6 +4737,7 @@ packages:
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-loong64@0.17.6:
@@ -4853,7 +4755,6 @@ packages:
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-loong64@0.19.12:
@@ -4864,15 +4765,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-mips64el@0.16.17:
-    resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-mips64el@0.16.3:
     resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==}
     engines: {node: '>=12'}
@@ -4888,6 +4780,7 @@ packages:
     cpu: [mips64el]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-mips64el@0.17.6:
@@ -4905,7 +4798,6 @@ packages:
     cpu: [mips64el]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-mips64el@0.19.12:
@@ -4916,15 +4808,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-ppc64@0.16.17:
-    resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-ppc64@0.16.3:
     resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==}
     engines: {node: '>=12'}
@@ -4940,6 +4823,7 @@ packages:
     cpu: [ppc64]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-ppc64@0.17.6:
@@ -4957,7 +4841,6 @@ packages:
     cpu: [ppc64]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-ppc64@0.19.12:
@@ -4968,15 +4851,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-riscv64@0.16.17:
-    resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-riscv64@0.16.3:
     resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==}
     engines: {node: '>=12'}
@@ -4992,6 +4866,7 @@ packages:
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-riscv64@0.17.6:
@@ -5009,7 +4884,6 @@ packages:
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-riscv64@0.19.12:
@@ -5020,15 +4894,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-s390x@0.16.17:
-    resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-s390x@0.16.3:
     resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==}
     engines: {node: '>=12'}
@@ -5044,6 +4909,7 @@ packages:
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-s390x@0.17.6:
@@ -5061,7 +4927,6 @@ packages:
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-s390x@0.19.12:
@@ -5072,15 +4937,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/linux-x64@0.16.17:
-    resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-x64@0.16.3:
     resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==}
     engines: {node: '>=12'}
@@ -5096,6 +4952,7 @@ packages:
     cpu: [x64]
     os: [linux]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/linux-x64@0.17.6:
@@ -5113,7 +4970,6 @@ packages:
     cpu: [x64]
     os: [linux]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/linux-x64@0.19.12:
@@ -5124,15 +4980,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/netbsd-x64@0.16.17:
-    resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/netbsd-x64@0.16.3:
     resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==}
     engines: {node: '>=12'}
@@ -5148,6 +4995,7 @@ packages:
     cpu: [x64]
     os: [netbsd]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/netbsd-x64@0.17.6:
@@ -5165,7 +5013,6 @@ packages:
     cpu: [x64]
     os: [netbsd]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/netbsd-x64@0.19.12:
@@ -5176,15 +5023,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/openbsd-x64@0.16.17:
-    resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/openbsd-x64@0.16.3:
     resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==}
     engines: {node: '>=12'}
@@ -5200,6 +5038,7 @@ packages:
     cpu: [x64]
     os: [openbsd]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/openbsd-x64@0.17.6:
@@ -5217,7 +5056,6 @@ packages:
     cpu: [x64]
     os: [openbsd]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/openbsd-x64@0.19.12:
@@ -5228,15 +5066,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/sunos-x64@0.16.17:
-    resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/sunos-x64@0.16.3:
     resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==}
     engines: {node: '>=12'}
@@ -5252,6 +5081,7 @@ packages:
     cpu: [x64]
     os: [sunos]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/sunos-x64@0.17.6:
@@ -5269,7 +5099,6 @@ packages:
     cpu: [x64]
     os: [sunos]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/sunos-x64@0.19.12:
@@ -5280,15 +5109,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/win32-arm64@0.16.17:
-    resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-arm64@0.16.3:
     resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==}
     engines: {node: '>=12'}
@@ -5304,6 +5124,7 @@ packages:
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/win32-arm64@0.17.6:
@@ -5321,7 +5142,6 @@ packages:
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/win32-arm64@0.19.12:
@@ -5332,15 +5152,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/win32-ia32@0.16.17:
-    resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-ia32@0.16.3:
     resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==}
     engines: {node: '>=12'}
@@ -5356,6 +5167,7 @@ packages:
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/win32-ia32@0.17.6:
@@ -5373,7 +5185,6 @@ packages:
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/win32-ia32@0.19.12:
@@ -5384,15 +5195,6 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@esbuild/win32-x64@0.16.17:
-    resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-x64@0.16.3:
     resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==}
     engines: {node: '>=12'}
@@ -5408,6 +5210,7 @@ packages:
     cpu: [x64]
     os: [win32]
     requiresBuild: true
+    dev: true
     optional: true
 
   /@esbuild/win32-x64@0.17.6:
@@ -5425,7 +5228,6 @@ packages:
     cpu: [x64]
     os: [win32]
     requiresBuild: true
-    dev: true
     optional: true
 
   /@esbuild/win32-x64@0.19.12:
@@ -11223,7 +11025,7 @@ packages:
     resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==}
     dev: true
 
-  /esbuild-jest@0.5.0(esbuild@0.17.19)(supports-color@9.2.2):
+  /esbuild-jest@0.5.0(esbuild@0.18.20)(supports-color@9.2.2):
     resolution: {integrity: sha512-AMZZCdEpXfNVOIDvURlqYyHwC8qC1/BFjgsrOiSL1eyiIArVtHL8YAC83Shhn16cYYoAWEW17yZn0W/RJKJKHQ==}
     peerDependencies:
       esbuild: '>=0.8.50'
@@ -11231,7 +11033,7 @@ packages:
       '@babel/core': 7.22.5(supports-color@9.2.2)
       '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5)
       babel-jest: 26.6.3(@babel/core@7.22.5)(supports-color@9.2.2)
-      esbuild: 0.17.19
+      esbuild: 0.18.20
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -11257,47 +11059,17 @@ packages:
       - supports-color
     dev: true
 
-  /esbuild-register@3.5.0(esbuild@0.17.19):
+  /esbuild-register@3.5.0(esbuild@0.18.20):
     resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==}
     peerDependencies:
       esbuild: '>=0.12 <1'
     dependencies:
       debug: 4.3.4(supports-color@9.2.2)
-      esbuild: 0.17.19
+      esbuild: 0.18.20
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /esbuild@0.16.17:
-    resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      '@esbuild/android-arm': 0.16.17
-      '@esbuild/android-arm64': 0.16.17
-      '@esbuild/android-x64': 0.16.17
-      '@esbuild/darwin-arm64': 0.16.17
-      '@esbuild/darwin-x64': 0.16.17
-      '@esbuild/freebsd-arm64': 0.16.17
-      '@esbuild/freebsd-x64': 0.16.17
-      '@esbuild/linux-arm': 0.16.17
-      '@esbuild/linux-arm64': 0.16.17
-      '@esbuild/linux-ia32': 0.16.17
-      '@esbuild/linux-loong64': 0.16.17
-      '@esbuild/linux-mips64el': 0.16.17
-      '@esbuild/linux-ppc64': 0.16.17
-      '@esbuild/linux-riscv64': 0.16.17
-      '@esbuild/linux-s390x': 0.16.17
-      '@esbuild/linux-x64': 0.16.17
-      '@esbuild/netbsd-x64': 0.16.17
-      '@esbuild/openbsd-x64': 0.16.17
-      '@esbuild/sunos-x64': 0.16.17
-      '@esbuild/win32-arm64': 0.16.17
-      '@esbuild/win32-ia32': 0.16.17
-      '@esbuild/win32-x64': 0.16.17
-    dev: true
-
   /esbuild@0.16.3:
     resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==}
     engines: {node: '>=12'}
@@ -11356,6 +11128,7 @@ packages:
       '@esbuild/win32-arm64': 0.17.19
       '@esbuild/win32-ia32': 0.17.19
       '@esbuild/win32-x64': 0.17.19
+    dev: true
 
   /esbuild@0.17.6:
     resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==}
@@ -11415,7 +11188,6 @@ packages:
       '@esbuild/win32-arm64': 0.18.20
       '@esbuild/win32-ia32': 0.18.20
       '@esbuild/win32-x64': 0.18.20
-    dev: true
 
   /esbuild@0.19.12:
     resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
@@ -14944,8 +14716,8 @@ packages:
     resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
     dev: true
 
-  /jose@5.2.2:
-    resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==}
+  /jose@5.2.3:
+    resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==}
     dev: true
 
   /js-levenshtein@1.1.6:
@@ -20452,7 +20224,7 @@ packages:
     dependencies:
       '@types/node': 20.1.7
       esbuild: 0.17.19
-      postcss: 8.4.24
+      postcss: 8.4.38
       rollup: 3.25.1
     optionalDependencies:
       fsevents: 2.3.3