From 6a83021f8e791c6dfb65fa2c0a6c3e476130b67e Mon Sep 17 00:00:00 2001 From: turbocrime Date: Thu, 4 Jul 2024 17:57:48 -0700 Subject: [PATCH] fulfill injection state interfaces --- apps/extension/package.json | 2 +- .../injected-penumbra-global.ts | 211 ++++++++++++------ pnpm-lock.yaml | 190 ++++++++-------- 3 files changed, 242 insertions(+), 161 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index ae5df464..3c4c78b2 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -21,7 +21,7 @@ "@connectrpc/connect-web": "^1.4.0", "@penumbra-labs/registry": "10.0.0", "@penumbra-zone/bech32m": "^6.1.1", - "@penumbra-zone/client": "^11.0.1", + "@penumbra-zone/client": "^11.1.0", "@penumbra-zone/crypto-web": "^13.0.0", "@penumbra-zone/getters": "^11.0.0", "@penumbra-zone/keys": "^4.2.1", diff --git a/apps/extension/src/content-scripts/injected-penumbra-global.ts b/apps/extension/src/content-scripts/injected-penumbra-global.ts index e779374e..9d94d664 100644 --- a/apps/extension/src/content-scripts/injected-penumbra-global.ts +++ b/apps/extension/src/content-scripts/injected-penumbra-global.ts @@ -4,7 +4,7 @@ * to them. * * The global is identified by `Symbol.for('penumbra')` and consists of a record - * with string keys referring to `PenumbraInjection` objects that contain a + * with string keys referring to `PenumbraProvider` objects that contain a * simple API. The identifiers on this record should be unique, and correspond * to a browser extension id. Providers should provide a link to their extension * manifest in their record entry. @@ -17,8 +17,10 @@ * connections. */ -import { PenumbraInjection, PenumbraSymbol } from '@penumbra-zone/client'; +import { PenumbraProvider, PenumbraState, PenumbraSymbol } from '@penumbra-zone/client'; +import { PenumbraStateEvent } from '@penumbra-zone/client/event'; +import { PraxConnection } from '../message/prax'; import { isPraxFailureMessageEvent, isPraxPortMessageEvent, @@ -26,8 +28,6 @@ import { unwrapPraxMessageEvent, } from './message-event'; -import { PraxConnection } from '../message/prax'; - type PromiseSettledResultStatus = PromiseSettledResult['status']; class PraxInjection { @@ -46,21 +46,41 @@ class PraxInjection { private requestState?: PromiseSettledResultStatus; private disconnectState?: PromiseSettledResultStatus; - private injection: Readonly = Object.freeze({ - disconnect: () => this.endConnection(), - connect: () => (this.state() !== false ? this._connect.promise : this.connectionFailure), - isConnected: () => this.state(), - request: () => this.postRequest(), - manifest: String(this.manifestUrl), - state: () => { - throw new Error('not yet implemented'); + private connectCalled = false; + private requestCalled = false; + private disconnectCalled = false; + + private stateEvents = new EventTarget(); + + private injection: Readonly = Object.freeze({ + connect: () => { + this.connectCalled = true; + return this.reduceConnectionState() !== false + ? this._connect.promise + : this.connectionFailure(); }, - addEventListener: () => { - throw new Error('not yet implemented'); + + disconnect: () => { + this.disconnectCalled = true; + return this.endConnection(); }, - removeEventListener: () => { - throw new Error('not yet implemented'); + + request: () => { + this.requestCalled = true; + return this.postRequest(); }, + + isConnected: () => this.reduceConnectionState(), + + state: () => this.reduceInjectionState(), + + manifest: String(this.manifestUrl), + + addEventListener: ((...params) => + this.stateEvents.addEventListener(...params)) as EventTarget['addEventListener'], + + removeEventListener: ((...params) => + this.stateEvents.removeEventListener(...params)) as EventTarget['removeEventListener'], }); private constructor() { @@ -69,35 +89,45 @@ class PraxInjection { } window.addEventListener('message', this.connectionListener); + void this._connect.promise.finally(() => + window.removeEventListener('message', this.connectionListener), + ); + + const dispatchStateEvent = () => + this.stateEvents.dispatchEvent( + new PenumbraStateEvent(PRAX_ORIGIN, this.reduceInjectionState()), + ); void this._connect.promise .then( () => (this.connectState ??= 'fulfilled'), () => (this.connectState ??= 'rejected'), ) - .finally(() => window.removeEventListener('message', this.connectionListener)); + .finally(dispatchStateEvent); - void this._disconnect.promise.then( - () => (this.disconnectState = 'fulfilled'), - () => (this.disconnectState = 'rejected'), - ); + void this._disconnect.promise + .then( + () => (this.disconnectState ??= 'fulfilled'), + () => (this.disconnectState ??= 'rejected'), + ) + .finally(dispatchStateEvent); - void this._request.promise.then( - () => (this.requestState = 'fulfilled'), - () => (this.requestState = 'rejected'), - ); + void this._request.promise + .then( + () => (this.requestState ??= 'fulfilled'), + () => (this.requestState ??= 'rejected'), + ) + .finally(dispatchStateEvent); } - /** - * Calling this function will synchronously return a unified - * true/false/undefined answer to the page connection state of this provider. - * - * `true` indicates active connection. - * `false` indicates connection is closed or rejected. - * `undefined` indicates connection may be attempted. + /** Synchronously return the true/false/undefined page connection state of this + * provider, without respect to what methods have been called. + * - `true` indicates active connection. + * - `false` indicates connection is closed or rejected. + * - `undefined` indicates connection may be attempted. */ - private state(): boolean | undefined { - if (this.disconnectState !== undefined) { + private reduceConnectionState(): boolean | undefined { + if (this.disconnectState) { return false; } if (this.requestState === 'rejected') { @@ -113,8 +143,42 @@ class PraxInjection { } } - // this listener will resolve the connection promise AND request promise when - // the isolated content script injected-connection-port sends a `MessagePort` + /** Returns a single overall injection state. */ + private reduceInjectionState(): PenumbraState { + if ( + this.disconnectState === 'rejected' || + this.connectState === 'rejected' || + this.requestState === 'rejected' + ) { + return PenumbraState.Failed; + } + switch (this.disconnectCalled && this.disconnectState) { + case false: + break; + default: + return PenumbraState.Disconnected; + } + switch (this.connectCalled && this.connectState) { + case false: + break; + case 'fulfilled': + return PenumbraState.Connected; + case undefined: + return PenumbraState.ConnectPending; + } + switch (this.requestCalled && this.requestState) { + case false: + break; + case 'fulfilled': + return PenumbraState.Requested; + case undefined: + return PenumbraState.RequestPending; + } + return PenumbraState.Present; + } + + /** this listener will resolve the connection promise AND request promise when + * the isolated content script injected-connection-port sends a `MessagePort` */ private connectionListener = (msg: MessageEvent) => { if (msg.origin === window.origin && isPraxPortMessageEvent(msg)) { const praxPort = unwrapPraxMessageEvent(msg); @@ -123,8 +187,9 @@ class PraxInjection { } }; - // this listener only rejects the request promise. success of the request - // promise is indicated by the connection promise being resolved. + /** this listener only rejects the request promise. success of the request + * promise is indicated by the connection promise being resolved. + */ private requestFailureListener = (msg: MessageEvent) => { if (msg.origin === window.origin && isPraxFailureMessageEvent(msg)) { const cause = unwrapPraxMessageEvent(msg); @@ -133,11 +198,12 @@ class PraxInjection { } }; - // always reject with the most important reason at time of access - // 1. disconnect - // 2. connection failure - // 3. request - private get connectionFailure() { + /** rejects with the most relevant reason + * - disconnect + * - connection failure + * - request failure + */ + private connectionFailure(): Promise { // Promise.race checks in order of the list index. so if more than one // promise in the list is already settled, it responds with the result of // the earlier index @@ -149,33 +215,29 @@ class PraxInjection { // rejects with previous failure, or 'Disconnected' if request was successful this._request.promise.then(() => Promise.reject(Error('Disconnected'))), // this should be unreachable - Promise.reject(Error('Unknown failure')), + Promise.resolve(null as never), ]); } private postRequest() { - const state = this.state(); - if (state === true) { - // connection is already active - this._request.resolve(); - } else if (state === false) { - // connection is already failed - const failure = this.connectionFailure; - failure.catch((u: unknown) => this._request.reject(u)); - // a previous request may have succeeded, so return the failure directly - return failure; - } else { - // no request made yet. attach listener and emit - window.addEventListener('message', this.requestFailureListener); - void this._request.promise.finally(() => - window.removeEventListener('message', this.requestFailureListener), - ); - window.postMessage( - { - [PRAX]: PraxConnection.Request, - } satisfies PraxMessage, - window.origin, - ); + switch (this.reduceConnectionState()) { + case true: // connection is already active + this._request.resolve(); + break; + case false: // connection is already failed + void this.connectionFailure().catch((u: unknown) => this._request.reject(u)); + // a previous request may have succeeded, so also return the failure directly + return this.connectionFailure(); + case undefined: // no request made yet. attach listener and emit + window.addEventListener('message', this.requestFailureListener); + void this._request.promise.finally(() => + window.removeEventListener('message', this.requestFailureListener), + ); + window.postMessage( + { [PRAX]: PraxConnection.Request } satisfies PraxMessage, + window.origin, + ); + break; } return this._request.promise; @@ -198,13 +260,16 @@ class PraxInjection { ); // resolve the promise by state - const state = this.state(); - if (state === true) { - this._disconnect.resolve(); - } else if (state === false) { - this._disconnect.reject(Error('Connection already inactive')); - } else { - this._disconnect.reject(Error('Connection not yet active')); + switch (this.reduceConnectionState()) { + case true: // connection was active, will now become now disconnected + this._disconnect.resolve(); + break; + case false: // connection was already inactive. can't disconnect in this state + this._disconnect.reject(Error('Connection already inactive')); + break; + case undefined: // connection was never attempted. can't disconnect in this state + this._disconnect.reject(Error('Connection not yet active')); + break; } return this._disconnect.promise; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ab70d7c..03fec531 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,8 +117,8 @@ importers: specifier: ^6.1.1 version: 6.1.1 '@penumbra-zone/client': - specifier: ^11.0.1 - version: 11.0.1(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@5.4.0(@buf/cosmos_ibc.bufbuild_es@1.10.0-20240703151202-d7191877c701.1(@bufbuild/protobuf@1.10.0))(@buf/cosmos_ibc.connectrpc_es@1.4.0-20240703151202-d7191877c701.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@buf/penumbra-zone_penumbra.bufbuild_es@1.10.0-20240703080008-312294d02bf9.1(@bufbuild/protobuf@1.10.0))(@buf/penumbra-zone_penumbra.connectrpc_es@1.4.0-20240703080008-312294d02bf9.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.2.2) + specifier: ^11.1.0 + version: 11.1.0(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@5.4.0(@buf/cosmos_ibc.bufbuild_es@1.10.0-20240703151202-d7191877c701.1(@bufbuild/protobuf@1.10.0))(@buf/cosmos_ibc.connectrpc_es@1.4.0-20240703151202-d7191877c701.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@buf/penumbra-zone_penumbra.bufbuild_es@1.10.0-20240703080008-312294d02bf9.1(@bufbuild/protobuf@1.10.0))(@buf/penumbra-zone_penumbra.connectrpc_es@1.4.0-20240703080008-312294d02bf9.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.2.2) '@penumbra-zone/crypto-web': specifier: ^13.0.0 version: 13.0.0(@penumbra-zone/types@15.1.0(aku33ui5pr7hqvw5mjd4hoxe4u)) @@ -218,7 +218,7 @@ importers: version: 18.3.0 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.6.13)(webpack-cli@5.1.4(webpack@5.92.1)) + version: 5.28.5(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4(webpack@5.92.1)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.39) @@ -227,31 +227,31 @@ importers: version: 6.0.3 copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 12.0.2(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) css-loader: specifier: ^7.1.1 - version: 7.1.2(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 7.1.2(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 html-webpack-plugin: specifier: ^5.6.0 - version: 5.6.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) postcss: specifier: ^8.4.38 version: 8.4.39 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 8.1.1(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 4.0.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.4.4 version: 3.4.4(ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.5.3)) ts-loader: specifier: ^9.5.1 - version: 9.5.1(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.5.3) @@ -260,7 +260,7 @@ importers: version: 8.2.0(body-parser@1.20.2)(express@4.19.2) webpack: specifier: ^5.91.0 - version: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + version: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(webpack@5.92.1) @@ -269,7 +269,7 @@ importers: version: 5.10.0 webpack-watch-external-files-plugin: specifier: ^3.1.0 - version: 3.1.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + version: 3.1.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) apps/prax-marketing-site: dependencies: @@ -372,7 +372,7 @@ importers: version: 2.29.1(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.6.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.2) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.3) eslint-plugin-react: specifier: 7.34.1 version: 7.34.1(eslint@9.6.0) @@ -1229,6 +1229,10 @@ packages: resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.8': + resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.7': resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} @@ -2068,8 +2072,8 @@ packages: '@types/react': optional: true - '@mui/core-downloads-tracker@5.16.0': - resolution: {integrity: sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==} + '@mui/core-downloads-tracker@5.16.1': + resolution: {integrity: sha512-62Jq7ACYi/55Kjkh/nVfEL3F3ytTYTsdB8MGJ9iI+eRQv+Aoem5CPUAzQihUo25qqh1VkVu9/jQn3dFbyrXHgw==} '@mui/material@5.16.0': resolution: {integrity: sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==} @@ -2088,8 +2092,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@5.16.0': - resolution: {integrity: sha512-sYpubkO1MZOnxNyVOClrPNOTs0MfuRVVnAvCeMaOaXt6GimgQbnUcshYv2pSr6PFj+Mqzdff/FYOBceK8u5QgA==} + '@mui/private-theming@5.16.1': + resolution: {integrity: sha512-2EGCKnAlq9vRIFj61jNWNXlKAxXp56577OVvsts7fAqRx+G1y6F+N7Q198SBaz8jYQeGKSz8ZMXK/M3FqjdEyw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2098,8 +2102,8 @@ packages: '@types/react': optional: true - '@mui/styled-engine@5.15.14': - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + '@mui/styled-engine@5.16.1': + resolution: {integrity: sha512-JwWUBaYR8HHCFefSeos0z6JoTbu0MnjAuNHu4QoDgPxl2EE70XH38CsKay66Iy0QkNWmGTRXVU2sVFgUOPL/Dw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -2111,8 +2115,8 @@ packages: '@emotion/styled': optional: true - '@mui/system@5.16.0': - resolution: {integrity: sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==} + '@mui/system@5.16.1': + resolution: {integrity: sha512-VaFcClC+uhvIEzhzcNmh9FRBvrG9IPjsOokhj6U1HPZsFnLzHV7AD7dJcT6LxWoiIZj9Ej0GK+MGh/b8+BtSlQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2127,16 +2131,16 @@ packages: '@types/react': optional: true - '@mui/types@7.2.14': - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + '@mui/types@7.2.15': + resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@5.16.0': - resolution: {integrity: sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==} + '@mui/utils@5.16.1': + resolution: {integrity: sha512-4UQzK46tAEYs2xZv79hRiIc3GxZScd00kGPDadNrGztAEZlmSaUY8cb9ITd2xCiTfzsx5AN6DH8aaQ8QEKJQeQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2186,8 +2190,8 @@ packages: '@penumbra-zone/bech32m@6.1.1': resolution: {integrity: sha512-LlN7P66kmH7e/jvTUppw3au4eh9ib1t4ejKZDRmHO9KvTm61E1aiGRt8x6wwWsOkgQ6t89H5s4VhNBjWgx1P1A==} - '@penumbra-zone/client@11.0.1': - resolution: {integrity: sha512-bLlJDPpBmm6k8Ky1DpLHttaG6CnZMPlxfEjUdG42letU5144xrOiKhbSJ+gZ5ltQojaj8c3ZVxwbrVLQ+SWZ2Q==} + '@penumbra-zone/client@11.1.0': + resolution: {integrity: sha512-/CrBiQWtWflg57tw8aEyq14G2e/I7qB+V+DRoff0hIqns3xhg8eR50tSxNnvzRiGK9d5JLZEhyq0RW/yRTcCcg==} peerDependencies: '@connectrpc/connect': ^1.4.0 '@penumbra-zone/protobuf': 5.4.0 @@ -7946,6 +7950,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -10724,6 +10733,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.24.8': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -11676,10 +11689,10 @@ snapshots: '@mui/base@5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.1(@types/react@18.3.3)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 @@ -11688,16 +11701,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/core-downloads-tracker@5.16.0': {} + '@mui/core-downloads-tracker@5.16.1': {} '@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/core-downloads-tracker': 5.16.0 - '@mui/system': 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@mui/core-downloads-tracker': 5.16.1 + '@mui/system': 5.16.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.1(@types/react@18.3.3)(react@18.3.1) '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 @@ -11711,18 +11724,18 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/private-theming@5.16.0(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@5.16.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.24.8 + '@mui/utils': 5.16.1(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.3 - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -11731,13 +11744,13 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/system@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@5.16.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 - '@mui/private-theming': 5.16.0(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.24.8 + '@mui/private-theming': 5.16.1(@types/react@18.3.3)(react@18.3.1) + '@mui/styled-engine': 5.16.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.1(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -11747,13 +11760,13 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/types@7.2.14(@types/react@18.3.3)': + '@mui/types@7.2.15(@types/react@18.3.3)': optionalDependencies: '@types/react': 18.3.3 - '@mui/utils@5.16.0(@types/react@18.3.3)(react@18.3.1)': + '@mui/utils@5.16.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 '@types/prop-types': 15.7.12 prop-types: 15.8.1 react: 18.3.1 @@ -11807,7 +11820,7 @@ snapshots: dependencies: bech32: 2.0.0 - '@penumbra-zone/client@11.0.1(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@5.4.0(@buf/cosmos_ibc.bufbuild_es@1.10.0-20240703151202-d7191877c701.1(@bufbuild/protobuf@1.10.0))(@buf/cosmos_ibc.connectrpc_es@1.4.0-20240703151202-d7191877c701.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@buf/penumbra-zone_penumbra.bufbuild_es@1.10.0-20240703080008-312294d02bf9.1(@bufbuild/protobuf@1.10.0))(@buf/penumbra-zone_penumbra.connectrpc_es@1.4.0-20240703080008-312294d02bf9.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.2.2)': + '@penumbra-zone/client@11.1.0(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@5.4.0(@buf/cosmos_ibc.bufbuild_es@1.10.0-20240703151202-d7191877c701.1(@bufbuild/protobuf@1.10.0))(@buf/cosmos_ibc.connectrpc_es@1.4.0-20240703151202-d7191877c701.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@buf/penumbra-zone_penumbra.bufbuild_es@1.10.0-20240703080008-312294d02bf9.1(@bufbuild/protobuf@1.10.0))(@buf/penumbra-zone_penumbra.connectrpc_es@1.4.0-20240703080008-312294d02bf9.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.2.2)': dependencies: '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/protobuf': 5.4.0(@buf/cosmos_ibc.bufbuild_es@1.10.0-20240703151202-d7191877c701.1(@bufbuild/protobuf@1.10.0))(@buf/cosmos_ibc.connectrpc_es@1.4.0-20240703151202-d7191877c701.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@buf/penumbra-zone_penumbra.bufbuild_es@1.10.0-20240703080008-312294d02bf9.1(@bufbuild/protobuf@1.10.0))(@buf/penumbra-zone_penumbra.connectrpc_es@1.4.0-20240703080008-312294d02bf9.3(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)))(@bufbuild/protobuf@1.10.0) @@ -13107,7 +13120,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) picomatch: 2.3.1 pkg-dir: 5.0.0 - prettier-fallback: prettier@3.3.2 + prettier-fallback: prettier@3.3.3 pretty-hrtime: 1.0.3 resolve-from: 5.0.0 semver: 7.6.2 @@ -13919,11 +13932,11 @@ snapshots: '@types/uuid@9.0.8': {} - '@types/webpack@5.28.5(@swc/core@1.6.13)(webpack-cli@5.1.4(webpack@5.92.1))': + '@types/webpack@5.28.5(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4(webpack@5.92.1))': dependencies: '@types/node': 20.14.10 tapable: 2.2.1 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -14179,19 +14192,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4))': dependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.92.1) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4))': dependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.92.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4))': dependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.92.1) '@xtuc/ieee754@1.2.0': {} @@ -15161,7 +15174,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + copy-webpack-plugin@12.0.2(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -15169,7 +15182,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) core-js-compat@3.37.1: dependencies: @@ -15263,7 +15276,7 @@ snapshots: semver: 6.3.1 webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2) - css-loader@7.1.2(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + css-loader@7.1.2(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.39) postcss: 8.4.39 @@ -15274,7 +15287,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.2 optionalDependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) css-select@4.3.0: dependencies: @@ -15507,7 +15520,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 csstype: 3.1.3 dom-serializer@1.4.1: @@ -15896,10 +15909,10 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.2): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.3): dependencies: eslint: 9.6.0 - prettier: 3.3.2 + prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 optionalDependencies: @@ -16976,7 +16989,7 @@ snapshots: html-tags@3.3.1: {} - html-webpack-plugin@5.6.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16984,7 +16997,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -18705,14 +18718,14 @@ snapshots: semver: 7.6.2 webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2) - postcss-loader@8.1.1(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + postcss-loader@8.1.1(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 9.0.0(typescript@5.5.3) jiti: 1.21.6 postcss: 8.4.39 semver: 7.6.2 optionalDependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -18814,6 +18827,8 @@ snapshots: prettier@3.3.2: {} + prettier@3.3.3: {} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 @@ -19121,7 +19136,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.8 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -19884,9 +19899,9 @@ snapshots: schema-utils: 2.7.1 webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2) - style-loader@4.0.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + style-loader@4.0.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -20109,28 +20124,29 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.6.13)(esbuild@0.20.2)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)): + terser-webpack-plugin@5.3.10(@swc/core@1.6.13)(esbuild@0.20.2)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.6.13 esbuild: 0.20.2 - terser-webpack-plugin@5.3.10(@swc/core@1.6.13)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.6.13)(esbuild@0.20.2)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2) optionalDependencies: '@swc/core': 1.6.13 + esbuild: 0.20.2 terser@5.31.1: dependencies: @@ -20239,7 +20255,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-loader@9.5.1(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.5.3)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.0 @@ -20247,7 +20263,7 @@ snapshots: semver: 7.6.2 source-map: 0.7.4 typescript: 5.5.3 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) ts-node@10.9.2(@swc/core@1.6.13)(@types/node@20.14.10)(typescript@5.5.3): dependencies: @@ -20750,9 +20766,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.92.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -20761,7 +20777,7 @@ snapshots: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack-merge: 5.10.0 webpack-merge@5.10.0: @@ -20774,11 +20790,11 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack-watch-external-files-plugin@3.1.0(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)): + webpack-watch-external-files-plugin@3.1.0(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)): dependencies: glob: 10.4.2 path: 0.12.7 - webpack: 5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4) + webpack: 5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4) webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2): dependencies: @@ -20811,7 +20827,7 @@ snapshots: - esbuild - uglify-js - webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4): + webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -20834,7 +20850,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.6.13)(webpack@5.92.1(@swc/core@1.6.13)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.6.13)(esbuild@0.20.2)(webpack@5.92.1(@swc/core@1.6.13)(esbuild@0.20.2)(webpack-cli@5.1.4)) watchpack: 2.4.1 webpack-sources: 3.2.3 optionalDependencies: